swarm/api: Remove faulty manifest handling + add rsrc create keycheck

This commit is contained in:
lash 2018-01-23 03:19:00 +01:00
parent 94303aa1be
commit edacd4b7c3
5 changed files with 28 additions and 69 deletions

View file

@ -387,9 +387,10 @@ func (self *Api) ResourceLookup(name string, period uint32, version uint32) (sto
return self.resource.GetContent(name) return self.resource.GetContent(name)
} }
func (self *Api) ResourceCreate(name string, frequency uint64) (err error) { func (self *Api) ResourceCreate(name string, frequency uint64) (storage.Key, error) {
_, err = self.resource.NewResource(name, frequency) rsrc, err := self.resource.NewResource(name, frequency)
return err h := rsrc.NameHash()
return storage.Key(h[:]), err
} }
func (self *Api) ResourceUpdate(name string, data []byte) (storage.Key, uint32, uint32, error) { func (self *Api) ResourceUpdate(name string, data []byte) (storage.Key, uint32, uint32, error) {

View file

@ -299,36 +299,12 @@ func (s *Server) HandlePostResource(w http.ResponseWriter, r *Request) {
s.BadRequest(w, r, fmt.Sprintf("Cannot parse frequency parameter: %v", err)) s.BadRequest(w, r, fmt.Sprintf("Cannot parse frequency parameter: %v", err))
return return
} }
err = s.api.ResourceCreate(r.uri.Addr, frequency) key, err := s.api.ResourceCreate(r.uri.Addr, frequency)
if err != nil { if err != nil {
s.Error(w, r, fmt.Errorf("Resource creation failed: %v", err)) s.Error(w, r, fmt.Errorf("Resource creation failed: %v", err))
return return
} }
manifestKey, err := s.api.NewManifest() outdata = key.Hex()
if err != nil {
s.Error(w, r, fmt.Errorf("create manifest err: %v", err))
return
}
newKey, err := s.updateManifest(manifestKey, func(mw *api.ManifestWriter) error {
key, err := mw.AddEntry(bytes.NewReader([]byte(r.uri.Addr)), &api.ManifestEntry{
Path: r.uri.Addr,
ContentType: api.ResourceContentType,
Mode: 0644,
Size: int64(len(r.uri.Addr)),
ModTime: time.Now(),
})
if err != nil {
return err
}
s.logDebug("resource manifest for for %s stored", key.Log())
return nil
})
if err != nil {
s.Error(w, r, fmt.Errorf("update manifest err: %v", err))
return
}
log.Debug("manifests", "new", newKey, "old", manifestKey)
outdata = fmt.Sprintf("%s", newKey)
} }
data, err := ioutil.ReadAll(r.Body) data, err := ioutil.ReadAll(r.Body)
@ -338,15 +314,17 @@ func (s *Server) HandlePostResource(w http.ResponseWriter, r *Request) {
} }
_, _, _, err = s.api.ResourceUpdate(r.uri.Addr, data) _, _, _, err = s.api.ResourceUpdate(r.uri.Addr, data)
if err != nil { if err != nil {
w.WriteHeader(http.StatusUnauthorized) s.Error(w, r, fmt.Errorf("Update resource failed: %v", err))
return return
} }
w.WriteHeader(http.StatusOK)
if outdata != "" { if outdata != "" {
w.Header().Set("Content-type", "text/plain") w.Header().Add("Content-type", "text/plain")
fmt.Fprintf(w, outdata) w.WriteHeader(http.StatusOK)
fmt.Fprint(w, outdata)
return
} }
w.WriteHeader(http.StatusOK)
} }
// Retrieve mutable resource updates: // Retrieve mutable resource updates:
@ -462,21 +440,6 @@ func (s *Server) HandleGet(w http.ResponseWriter, r *Request) {
switch { switch {
case r.uri.Raw(): case r.uri.Raw():
m := &api.Manifest{}
sz, err := reader.Size(nil)
if err == nil {
b := make([]byte, sz)
reader.Read(b)
err = json.Unmarshal(b, m)
if err == nil {
if len(m.Entries) > 0 {
if m.Entries[0].ContentType == api.ResourceContentType {
s.handleGetResource(w, r, m.Entries[0].Path)
return
}
}
}
}
// allow the request to overwrite the content type using a query // allow the request to overwrite the content type using a query
// parameter // parameter
contentType := "application/octet-stream" contentType := "application/octet-stream"

View file

@ -48,6 +48,9 @@ func TestBzzResource(t *testing.T) {
// our mutable resource "name" // our mutable resource "name"
keybytes := make([]byte, common.HashLength) keybytes := make([]byte, common.HashLength)
copy(keybytes, []byte{42}) copy(keybytes, []byte{42})
srv.Hasher.Reset()
srv.Hasher.Write([]byte(fmt.Sprintf("%x", keybytes)))
keybyteshash := fmt.Sprintf("%x", srv.Hasher.Sum(nil))
// data of update 1 // data of update 1
databytes := make([]byte, 666) databytes := make([]byte, 666)
@ -64,9 +67,11 @@ func TestBzzResource(t *testing.T) {
} else if resp.StatusCode != http.StatusOK { } else if resp.StatusCode != http.StatusOK {
t.Fatalf("err %s", resp.Status) t.Fatalf("err %s", resp.Status)
} }
manifesthash, err := ioutil.ReadAll(resp.Body) b, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} else if !bytes.Equal(b, []byte(keybyteshash)) {
t.Fatalf("resource update hash mismatch, expected '%s' got '%s'", keybyteshash, b)
} }
resp.Body.Close() resp.Body.Close()
@ -78,7 +83,7 @@ func TestBzzResource(t *testing.T) {
} else if resp.StatusCode != http.StatusOK { } else if resp.StatusCode != http.StatusOK {
t.Fatalf("err %s", resp.Status) t.Fatalf("err %s", resp.Status)
} }
b, err := ioutil.ReadAll(resp.Body) b, err = ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} else if !bytes.Equal(databytes, b) { } else if !bytes.Equal(databytes, b) {
@ -96,22 +101,6 @@ func TestBzzResource(t *testing.T) {
t.Fatalf("Update returned %d", resp.Status) t.Fatalf("Update returned %d", resp.Status)
} }
// get latest update (1.2) through swarm manifest
url = fmt.Sprintf("%s/bzz-raw:/%s", srv.URL, manifesthash)
resp, err = http.Get(url)
if err != nil {
t.Fatal(err)
} else if resp.StatusCode != http.StatusOK {
t.Fatalf("err %s", resp.Status)
}
b, err = ioutil.ReadAll(resp.Body)
if err != nil {
t.Fatal(err)
} else if !bytes.Equal(data, b) {
t.Fatalf("Expected body '%x', got '%x'", data, b)
}
resp.Body.Close()
// get latest update (1.2) through resource directly // get latest update (1.2) through resource directly
url = fmt.Sprintf("%s/bzz-resource:/%x", srv.URL, keybytes) url = fmt.Sprintf("%s/bzz-resource:/%x", srv.URL, keybytes)
resp, err = http.Get(url) resp, err = http.Get(url)

View file

@ -52,6 +52,10 @@ func (self *resource) isSynced() bool {
return !self.updated.IsZero() return !self.updated.IsZero()
} }
func (self *resource) NameHash() common.Hash {
return self.nameHash
}
// Implement to activate validation of resource updates // Implement to activate validation of resource updates
// Specifically signing data and verification of signatures // Specifically signing data and verification of signatures
type ResourceValidator interface { type ResourceValidator interface {
@ -178,7 +182,9 @@ func NewResourceHandler(datadir string, cloudStore CloudStore, ethClient ethApi,
defer rh.hashPool.Put(hasher) defer rh.hashPool.Put(hasher)
hasher.Reset() hasher.Reset()
hasher.Write([]byte(name)) hasher.Write([]byte(name))
return common.BytesToHash(hasher.Sum(nil)) hashval := common.BytesToHash(hasher.Sum(nil))
log.Debug("generic namehasher", "name", name, "hash", hashval)
return hashval
} }
} }

View file

@ -82,7 +82,7 @@ func NewTestSwarmServer(t *testing.T) *TestSwarmServer {
Server: srv, Server: srv,
Dpa: dpa, Dpa: dpa,
dir: dir, dir: dir,
hasher: storage.MakeHashFunc(storage.SHA3Hash)(), Hasher: storage.MakeHashFunc(storage.SHA3Hash)(),
cleanup: func() { cleanup: func() {
srv.Close() srv.Close()
rh.Close() rh.Close()
@ -95,7 +95,7 @@ func NewTestSwarmServer(t *testing.T) *TestSwarmServer {
type TestSwarmServer struct { type TestSwarmServer struct {
*httptest.Server *httptest.Server
hasher storage.SwarmHash Hasher storage.SwarmHash
Dpa *storage.DPA Dpa *storage.DPA
dir string dir string
cleanup func() cleanup func()