mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-17 17:33:47 +00:00
swarm/api: Remove faulty manifest handling + add rsrc create keycheck
This commit is contained in:
parent
94303aa1be
commit
edacd4b7c3
5 changed files with 28 additions and 69 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Reference in a new issue