[#114] nns: Restrict 'DeleteDomain' to delete domains with subdomains

Signed-off-by: Alexander Chuprov <a.chuprov@yadro.com>
This commit is contained in:
Alexander Chuprov 2024-09-17 21:55:26 +03:00
parent 05e02373e5
commit 03b6f0479d
2 changed files with 50 additions and 6 deletions

View file

@ -565,13 +565,25 @@ func DeleteDomain(name string) {
} }
func deleteDomain(ctx storage.Context, name string) { func deleteDomain(ctx storage.Context, name string) {
nameKey := append([]byte{prefixName}, getTokenKey([]byte(name))...) it := Tokens()
tldBytes := storage.Get(ctx, nameKey) for iterator.Next(it) {
if tldBytes == nil { domain := iterator.Value(it)
return if std.MemorySearch([]byte(domain.(string)), []byte(name)) > 0 {
panic("can't delete a domain that has subdomains")
}
} }
globalDomainRaw := storage.Get(ctx, append([]byte{prefixGlobalDomain}, getTokenKey([]byte(name))...)) nsKey := append([]byte{prefixName}, getTokenKey([]byte(name))...)
nsRaw := storage.Get(ctx, nsKey)
if nsRaw == nil {
panic("domain not found")
}
ns := std.Deserialize(nsRaw.([]byte)).(NameState)
ns.checkAdmin()
globalNSKey := append([]byte{prefixGlobalDomain}, getTokenKey([]byte(name))...)
globalDomainRaw := storage.Get(ctx, globalNSKey)
globalDomain := globalDomainRaw.(string) globalDomain := globalDomainRaw.(string)
if globalDomainRaw != nil && globalDomain != "" { if globalDomainRaw != nil && globalDomain != "" {
deleteDomain(ctx, globalDomain) deleteDomain(ctx, globalDomain)
@ -581,7 +593,7 @@ func deleteDomain(ctx storage.Context, name string) {
deleteRecords(ctx, name, TXT) deleteRecords(ctx, name, TXT)
deleteRecords(ctx, name, A) deleteRecords(ctx, name, A)
deleteRecords(ctx, name, AAAA) deleteRecords(ctx, name, AAAA)
storage.Delete(ctx, nameKey) storage.Delete(ctx, nsKey)
runtime.Notify("DeleteDomain", name) runtime.Notify("DeleteDomain", name)
} }

View file

@ -189,6 +189,38 @@ func TestNNSRegister(t *testing.T) {
c.InvokeFail(t, "token not found", "getRecords", "testdomain.com", int64(nns.SOA)) c.InvokeFail(t, "token not found", "getRecords", "testdomain.com", int64(nns.SOA))
} }
func TestDeleteDomain(t *testing.T) {
c := newNNSInvoker(t, false)
acc1 := c.NewAccount(t)
c1 := c.WithSigners(c.Committee, acc1)
acc2 := c.NewAccount(t)
c2 := c.WithSigners(c.Committee, acc2)
c1.Invoke(t, true, "register",
"com", acc1.ScriptHash(),
"myemail@frostfs.info", defaultRefresh, defaultRetry, defaultExpire, defaultTTL)
c1.Invoke(t, true, "register",
"testdomain.com", acc1.ScriptHash(),
"myemail@frostfs.info", defaultRefresh, defaultRetry, defaultExpire, defaultTTL)
c1.Invoke(t, true, "register",
"domik.testdomain.com", acc1.ScriptHash(),
"myemail@frostfs.info", defaultRefresh, defaultRetry, defaultExpire, defaultTTL)
c1.InvokeFail(t, "domain not found", "deleteDomain", "ru")
c1.InvokeFail(t, "can't delete a domain that has subdomains", "deleteDomain", "testdomain.com")
c1.Invoke(t, stackitem.Null{}, "deleteDomain", "domik.testdomain.com")
c1.Invoke(t, stackitem.Null{}, "deleteDomain", "testdomain.com")
c1.Invoke(t, true, "register",
"cn", acc1.ScriptHash(),
"myemail@frostfs.info", defaultRefresh, defaultRetry, defaultExpire, defaultTTL)
c2.InvokeFail(t, "not witnessed by admin", "deleteDomain", "cn")
}
func TestGlobalDomain(t *testing.T) { func TestGlobalDomain(t *testing.T) {
c := newNNSInvoker(t, false) c := newNNSInvoker(t, false)