From 552def9322ff7f4fb3332ba6f7e7ae42fe3ba41d Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Mon, 4 Oct 2021 14:47:42 +0300 Subject: [PATCH] [#139] nns: require admin signature for registering subdomain Signed-off-by: Evgenii Stratonikov --- nns/nns_contract.go | 4 ++++ tests/container_test.go | 2 +- tests/nns_test.go | 11 +++++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/nns/nns_contract.go b/nns/nns_contract.go index c8005fa..1be8925 100644 --- a/nns/nns_contract.go +++ b/nns/nns_contract.go @@ -303,6 +303,10 @@ func Register(name string, owner interop.Hash160, email string, refresh, retry, if parentExpired(ctx, 1, fragments) { panic("one of the parent domains has expired") } + parentKey := getTokenKey([]byte(fragments[1])) + nsBytes := storage.Get(ctx, append([]byte{prefixName}, parentKey...)) + ns := std.Deserialize(nsBytes.([]byte)).(NameState) + ns.checkAdmin() } if !isValid(owner) { diff --git a/tests/container_test.go b/tests/container_test.go index 4dcd5e5..2c323d9 100644 --- a/tests/container_test.go +++ b/tests/container_test.go @@ -136,7 +136,7 @@ func TestContainerPut(t *testing.T) { c.id = sha256.Sum256(c.value) t.Run("bad domain owner", func(t *testing.T) { - tx = PrepareInvoke(t, bc, acc, nnsHash, "register", + tx = PrepareInvoke(t, bc, []*wallet.Account{acc, CommitteeAcc}, nnsHash, "register", "baddomain.neofs", acc.Contract.ScriptHash(), "whateveriwant@world.com", int64(0), int64(0), int64(0), int64(0)) AddBlockCheckHalt(t, bc, tx) diff --git a/tests/nns_test.go b/tests/nns_test.go index 95c2b28..665b337 100644 --- a/tests/nns_test.go +++ b/tests/nns_test.go @@ -65,9 +65,10 @@ func TestNNSRegister(t *testing.T) { bc := NewChain(t) h := DeployContract(t, bc, nnsPath, nil) + accTop := NewAccount(t, bc) refresh, retry, expire, ttl := int64(101), int64(102), int64(103), int64(104) - tx := PrepareInvoke(t, bc, CommitteeAcc, h, "register", - "com", CommitteeAcc.Contract.ScriptHash(), + tx := PrepareInvoke(t, bc, []*wallet.Account{CommitteeAcc, accTop}, h, "register", + "com", accTop.Contract.ScriptHash(), "myemail@nspcc.ru", refresh, retry, expire, ttl) AddBlockCheckHalt(t, bc, tx) @@ -75,6 +76,12 @@ func TestNNSRegister(t *testing.T) { tx = PrepareInvoke(t, bc, []*wallet.Account{CommitteeAcc, acc}, h, "register", "testdomain.com", acc.Contract.ScriptHash(), "myemail@nspcc.ru", refresh, retry, expire, ttl) + AddBlock(t, bc, tx) + CheckFault(t, bc, tx.Hash(), "not witnessed by admin") + + tx = PrepareInvoke(t, bc, []*wallet.Account{accTop, acc}, h, "register", + "testdomain.com", acc.Contract.ScriptHash(), + "myemail@nspcc.ru", refresh, retry, expire, ttl) b := AddBlockCheckHalt(t, bc, tx) tx = PrepareInvoke(t, bc, acc, h, "getRecords", "testdomain.com", int64(nns.SOA))