Skip to content

Commit

Permalink
Merge pull request ipfs#113 from libp2p/fix/no-arbitrary-data
Browse files Browse the repository at this point in the history
ensure we don't store arbitrary data
  • Loading branch information
Stebalien authored Jan 20, 2018
2 parents 3fc048d + 8177153 commit d2378be
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 0 deletions.
13 changes: 13 additions & 0 deletions handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,18 @@ func (dht *IpfsDHT) checkLocalDatastore(k string) (*recpb.Record, error) {
return rec, nil
}

// Cleans the record (to avoid storing arbitrary data).
func cleanRecord(rec *recpb.Record) {
rec.XXX_unrecognized = nil
rec.TimeReceived = nil

// Only include the author if there's a signature (otherwise, it's
// unvalidated and could be anything).
if len(rec.Signature) == 0 {
rec.Author = nil
}
}

// Store a value in this peer local storage
func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Message) (_ *pb.Message, err error) {
eip := log.EventBegin(ctx, "handlePutValue", p)
Expand All @@ -169,6 +181,7 @@ func (dht *IpfsDHT) handlePutValue(ctx context.Context, p peer.ID, pmes *pb.Mess
log.Infof("Got nil record from: %s", p.Pretty())
return nil, errors.New("nil record")
}
cleanRecord(rec)

if err = dht.verifyRecordLocally(rec); err != nil {
log.Warningf("Bad dht record in PUT from: %s. %s", peer.ID(pmes.GetRecord().GetAuthor()), err)
Expand Down
65 changes: 65 additions & 0 deletions handlers_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package dht

import (
"bytes"
"testing"

proto "github.com/gogo/protobuf/proto"
recpb "github.com/libp2p/go-libp2p-record/pb"
)

func TestCleanRecordSigned(t *testing.T) {
actual := new(recpb.Record)
actual.TimeReceived = proto.String("time")
actual.XXX_unrecognized = []byte("extra data")
actual.Signature = []byte("signature")
actual.Author = proto.String("author")
actual.Value = []byte("value")
actual.Key = proto.String("key")

cleanRecord(actual)
actualBytes, err := proto.Marshal(actual)
if err != nil {
t.Fatal(err)
}

expected := new(recpb.Record)
expected.Signature = []byte("signature")
expected.Author = proto.String("author")
expected.Value = []byte("value")
expected.Key = proto.String("key")
expectedBytes, err := proto.Marshal(expected)
if err != nil {
t.Fatal(err)
}

if !bytes.Equal(actualBytes, expectedBytes) {
t.Error("failed to clean record")
}
}

func TestCleanRecord(t *testing.T) {
actual := new(recpb.Record)
actual.TimeReceived = proto.String("time")
actual.XXX_unrecognized = []byte("extra data")
actual.Key = proto.String("key")
actual.Value = []byte("value")

cleanRecord(actual)
actualBytes, err := proto.Marshal(actual)
if err != nil {
t.Fatal(err)
}

expected := new(recpb.Record)
expected.Key = proto.String("key")
expected.Value = []byte("value")
expectedBytes, err := proto.Marshal(expected)
if err != nil {
t.Fatal(err)
}

if !bytes.Equal(actualBytes, expectedBytes) {
t.Error("failed to clean record")
}
}

0 comments on commit d2378be

Please sign in to comment.