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)
}
func (self *Api) ResourceCreate(name string, frequency uint64) (err error) {
_, err = self.resource.NewResource(name, frequency)
return err
func (self *Api) ResourceCreate(name string, frequency uint64) (storage.Key, error) {
rsrc, err := self.resource.NewResource(name, frequency)
h := rsrc.NameHash()
return storage.Key(h[:]), err
}
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))
return
}
err = s.api.ResourceCreate(r.uri.Addr, frequency)
key, err := s.api.ResourceCreate(r.uri.Addr, frequency)
if err != nil {
s.Error(w, r, fmt.Errorf("Resource creation failed: %v", err))
return
}
manifestKey, err := s.api.NewManifest()
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)
outdata = key.Hex()
}
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)
if err != nil {
w.WriteHeader(http.StatusUnauthorized)
s.Error(w, r, fmt.Errorf("Update resource failed: %v", err))
return
}
w.WriteHeader(http.StatusOK)
if outdata != "" {
w.Header().Set("Content-type", "text/plain")
fmt.Fprintf(w, outdata)
w.Header().Add("Content-type", "text/plain")
w.WriteHeader(http.StatusOK)
fmt.Fprint(w, outdata)
return
}
w.WriteHeader(http.StatusOK)
}
// Retrieve mutable resource updates:
@ -462,21 +440,6 @@ func (s *Server) HandleGet(w http.ResponseWriter, r *Request) {
switch {
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
// parameter
contentType := "application/octet-stream"

View file

@ -48,6 +48,9 @@ func TestBzzResource(t *testing.T) {
// our mutable resource "name"
keybytes := make([]byte, common.HashLength)
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
databytes := make([]byte, 666)
@ -64,9 +67,11 @@ func TestBzzResource(t *testing.T) {
} else if resp.StatusCode != http.StatusOK {
t.Fatalf("err %s", resp.Status)
}
manifesthash, err := ioutil.ReadAll(resp.Body)
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
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()
@ -78,7 +83,7 @@ func TestBzzResource(t *testing.T) {
} else if resp.StatusCode != http.StatusOK {
t.Fatalf("err %s", resp.Status)
}
b, err := ioutil.ReadAll(resp.Body)
b, err = ioutil.ReadAll(resp.Body)
if err != nil {
t.Fatal(err)
} else if !bytes.Equal(databytes, b) {
@ -96,22 +101,6 @@ func TestBzzResource(t *testing.T) {
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
url = fmt.Sprintf("%s/bzz-resource:/%x", srv.URL, keybytes)
resp, err = http.Get(url)

View file

@ -52,6 +52,10 @@ func (self *resource) isSynced() bool {
return !self.updated.IsZero()
}
func (self *resource) NameHash() common.Hash {
return self.nameHash
}
// Implement to activate validation of resource updates
// Specifically signing data and verification of signatures
type ResourceValidator interface {
@ -178,7 +182,9 @@ func NewResourceHandler(datadir string, cloudStore CloudStore, ethClient ethApi,
defer rh.hashPool.Put(hasher)
hasher.Reset()
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,
Dpa: dpa,
dir: dir,
hasher: storage.MakeHashFunc(storage.SHA3Hash)(),
Hasher: storage.MakeHashFunc(storage.SHA3Hash)(),
cleanup: func() {
srv.Close()
rh.Close()
@ -95,7 +95,7 @@ func NewTestSwarmServer(t *testing.T) *TestSwarmServer {
type TestSwarmServer struct {
*httptest.Server
hasher storage.SwarmHash
Hasher storage.SwarmHash
Dpa *storage.DPA
dir string
cleanup func()