mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-17 01:13:45 +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)
|
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) {
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue