From 898a548ad149f24b297869a67b1f4abbaea031e4 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 14 Aug 2018 11:48:18 +0200 Subject: [PATCH] swarm/storage: move validation from localstore to validator --- swarm/storage/localstore.go | 9 +-------- swarm/storage/mru/handler.go | 10 ++++------ swarm/storage/types.go | 4 ++++ 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/swarm/storage/localstore.go b/swarm/storage/localstore.go index bb71d3ba6f..baf9dbfd6a 100644 --- a/swarm/storage/localstore.go +++ b/swarm/storage/localstore.go @@ -24,7 +24,6 @@ import ( "sync" "github.com/ethereum/go-ethereum/metrics" - cp "github.com/ethereum/go-ethereum/swarm/chunk" "github.com/ethereum/go-ethereum/swarm/log" "github.com/ethereum/go-ethereum/swarm/storage/mock" ) @@ -99,12 +98,6 @@ func NewTestLocalStoreForAddr(params *LocalStoreParams) (*LocalStore, error) { // After the LDBStore.Put, it is ensured that the MemStore // contains the chunk with the same data, but nil ReqC channel. func (ls *LocalStore) Put(ctx context.Context, chunk *Chunk) { - if l := len(chunk.SData); l < 9 || l > cp.DefaultSize+8 { - log.Debug("invalid chunk data", "addr", chunk.Addr, "len", l) - chunk.SetErrored(ErrChunkInvalid) - chunk.markAsStored() - return - } valid := true for _, v := range ls.Validators { if valid = v.Validate(chunk.Addr, chunk.SData); valid { @@ -112,7 +105,7 @@ func (ls *LocalStore) Put(ctx context.Context, chunk *Chunk) { } } if !valid { - log.Trace("invalid content address", "addr", chunk.Addr) + log.Trace("invalid chunk", "addr", chunk.Addr, "len", len(chunk.SData)) chunk.SetErrored(ErrChunkInvalid) chunk.markAsStored() return diff --git a/swarm/storage/mru/handler.go b/swarm/storage/mru/handler.go index 32f43d5029..93e730a34f 100644 --- a/swarm/storage/mru/handler.go +++ b/swarm/storage/mru/handler.go @@ -21,7 +21,6 @@ package mru import ( "bytes" "context" - "fmt" "sync" "time" "unsafe" @@ -94,7 +93,6 @@ func (h *Handler) SetStore(store *storage.NetStore) { // If it looks like a resource update, the chunk address is checked against the ownerAddr of the update's signature // It implements the storage.ChunkValidator interface func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { - dataLength := len(data) if dataLength < minimumChunkLength { return false @@ -106,7 +104,7 @@ func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { rootAddr, _ := metadataHash(data) valid := bytes.Equal(chunkAddr, rootAddr) if !valid { - log.Debug(fmt.Sprintf("Invalid root metadata chunk with address: %s", chunkAddr.Hex())) + log.Debug("Invalid root metadata chunk with address", "addr", chunkAddr.Hex()) } return valid } @@ -118,7 +116,7 @@ func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { // First, deserialize the chunk var r SignedResourceUpdate if err := r.fromChunk(chunkAddr, data); err != nil { - log.Debug("Invalid resource chunk with address %s: %s ", chunkAddr.Hex(), err.Error()) + log.Debug("Invalid resource chunk", "addr", chunkAddr.Hex(), "err", err.Error()) return false } @@ -126,7 +124,7 @@ func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { // that was used to retrieve this chunk // if this validation fails, someone forged a chunk. if !bytes.Equal(chunkAddr, r.updateHeader.UpdateAddr()) { - log.Debug("period,version,rootAddr contained in update chunk do not match updateAddr %s", chunkAddr.Hex()) + log.Debug("period,version,rootAddr contained in update chunk do not match updateAddr", "addr", chunkAddr.Hex()) return false } @@ -134,7 +132,7 @@ func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { // If it fails, it means either the signature is not valid, data is corrupted // or someone is trying to update someone else's resource. if err := r.Verify(); err != nil { - log.Debug("Invalid signature: %v", err) + log.Debug("Invalid signature", "err", err) return false } diff --git a/swarm/storage/types.go b/swarm/storage/types.go index 3d0cf2caf2..53e3af485a 100644 --- a/swarm/storage/types.go +++ b/swarm/storage/types.go @@ -348,6 +348,10 @@ func NewContentAddressValidator(hasher SwarmHasher) *ContentAddressValidator { // Validate that the given key is a valid content address for the given data func (v *ContentAddressValidator) Validate(addr Address, data []byte) bool { + if l := len(data); l < 9 || l > chunk.DefaultSize+8 { + return false + } + hasher := v.Hasher() hasher.ResetWithLength(data[:8]) hasher.Write(data[8:])