swarm/storage: Add ENS owner check on update

This commit is contained in:
lash 2018-01-14 16:30:57 +01:00
parent 0851c2d264
commit 25a1c58ed9
2 changed files with 34 additions and 6 deletions

View file

@ -46,12 +46,29 @@ func NewENSResourceHandler(privKey *ecdsa.PrivateKey, datadir string, cloudStore
} }
func (self *ENSResourceHandler) NewResource(name string, frequency uint64) (*resource, error) { 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 { if err != nil {
return nil, fmt.Errorf("ENS error: %v", err) return nil, err
} } else if !ok {
if owneraddr != self.addr { return nil, fmt.Errorf("Not Owner")
return nil, fmt.Errorf("not owner")
} }
return self.RawResourceHandler.NewResource(name, frequency) 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
}

View file

@ -328,7 +328,7 @@ func TestResourceHandler(t *testing.T) {
} }
// create ENS enabled resource update, with and without valid owner // 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 for signing updates
privkey, err := crypto.GenerateKey() privkey, err := crypto.GenerateKey()
@ -361,6 +361,12 @@ func TestResourceENSNew(t *testing.T) {
teardownTest(t, err) 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 // create new resource when we are NOT owner = !ok
rawrh := rh.(*ENSResourceHandler) rawrh := rh.(*ENSResourceHandler)
rawrh.privKey = privkeytwo rawrh.privKey = privkeytwo
@ -369,6 +375,11 @@ func TestResourceENSNew(t *testing.T) {
if err == nil { if err == nil {
teardownTest(t, fmt.Errorf("Expected resource create fail due to owner mismatch")) 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) teardownTest(t, nil)
} }