From 25a1c58ed90f2e040f392e02ca25c41f0bb8acd0 Mon Sep 17 00:00:00 2001 From: lash Date: Sun, 14 Jan 2018 16:30:57 +0100 Subject: [PATCH] swarm/storage: Add ENS owner check on update --- swarm/storage/resource_ens.go | 27 ++++++++++++++++++++++----- swarm/storage/resource_test.go | 13 ++++++++++++- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/swarm/storage/resource_ens.go b/swarm/storage/resource_ens.go index d13e663e1e..2870061bb8 100644 --- a/swarm/storage/resource_ens.go +++ b/swarm/storage/resource_ens.go @@ -46,12 +46,29 @@ func NewENSResourceHandler(privKey *ecdsa.PrivateKey, datadir string, cloudStore } func (self *ENSResourceHandler) NewResource(name string, frequency uint64) (*resource, error) { - owneraddr, err := self.ensapi.Owner(self.RawResourceHandler.nameHashFunc(name)) + ok, err := self.IsOwner(name) if err != nil { - return nil, fmt.Errorf("ENS error: %v", err) - } - if owneraddr != self.addr { - return nil, fmt.Errorf("not owner") + return nil, err + } else if !ok { + return nil, fmt.Errorf("Not Owner") } return self.RawResourceHandler.NewResource(name, frequency) } + +func (self *ENSResourceHandler) Update(name string, data []byte) (Key, error) { + ok, err := self.IsOwner(name) + if err != nil { + return nil, err + } else if !ok { + return nil, fmt.Errorf("Not Owner") + } + return self.RawResourceHandler.Update(name, data) +} + +func (self *ENSResourceHandler) IsOwner(name string) (bool, error) { + owneraddr, err := self.ensapi.Owner(self.RawResourceHandler.nameHashFunc(name)) + if err != nil { + return false, fmt.Errorf("ENS error: %v", err) + } + return owneraddr == self.addr, nil +} diff --git a/swarm/storage/resource_test.go b/swarm/storage/resource_test.go index 5ddef4ab42..5630738a7e 100644 --- a/swarm/storage/resource_test.go +++ b/swarm/storage/resource_test.go @@ -328,7 +328,7 @@ func TestResourceHandler(t *testing.T) { } // create ENS enabled resource update, with and without valid owner -func TestResourceENSNew(t *testing.T) { +func TestResourceENSOwner(t *testing.T) { // privkey for signing updates privkey, err := crypto.GenerateKey() @@ -361,6 +361,12 @@ func TestResourceENSNew(t *testing.T) { teardownTest(t, err) } + // update resource when we are owner = ok + _, err = rh.Update(domainName, []byte("foo")) + if err != nil { + teardownTest(t, err) + } + // create new resource when we are NOT owner = !ok rawrh := rh.(*ENSResourceHandler) rawrh.privKey = privkeytwo @@ -369,6 +375,11 @@ func TestResourceENSNew(t *testing.T) { if err == nil { teardownTest(t, fmt.Errorf("Expected resource create fail due to owner mismatch")) } + // update resource when we are owner = ok + _, err = rh.Update(domainName, []byte("foo")) + if err == nil { + teardownTest(t, fmt.Errorf("Expected resource update fail due to owner mismatch")) + } teardownTest(t, nil) }