@cryptotaxi247 / kubo / commits / 2298cf66c

test GetPutRecord

validate doesn't work. the peer's public key is not present in the peerstore.

Brian Tiger Chow committed Feb 4, 2015 at 15:17 UTC 2298cf66cf30eb29e528b1a0242e91a90a8c0ab3
2 files changed +71 -1
routing/supernode/server.go
+21 -1
@@ -8,6 +8,7 @@ import (
8 datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
9 peer "github.com/jbenet/go-ipfs/p2p/peer"
10 dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb"
11 + record "github.com/jbenet/go-ipfs/routing/record"
12 proxy "github.com/jbenet/go-ipfs/routing/supernode/proxy"
13 util "github.com/jbenet/go-ipfs/util"
14 errors "github.com/jbenet/go-ipfs/util/debugerror"
@@ -55,7 +56,12 @@ func (s *Server) handleMessage(
56 return p, response
57
58 case dhtpb.Message_PUT_VALUE:
58 - // TODO before merging: verifyRecord(req.GetRecord())
59 + // FIXME: verify complains that the peer's ID is not present in the
60 + // peerstore. Mocknet problem?
61 + // if err := verify(s.peerstore, req.GetRecord()); err != nil {
62 + // log.Event(ctx, "validationFailed", req, p)
63 + // return "", nil
64 + // }
65 putRoutingRecord(s.routingBackend, util.Key(req.GetKey()), req.GetRecord())
66 return p, req
67
@@ -191,3 +197,17 @@ func getRoutingProviders(ds datastore.Datastore, k util.Key) ([]*dhtpb.Message_P
197 func providerKey(k util.Key) datastore.Key {
198 return datastore.KeyWithNamespaces([]string{"routing", "providers", k.String()})
199 }
200 +
201 +func verify(ps peer.Peerstore, r *dhtpb.Record) error {
202 + v := make(record.Validator)
203 + v["pk"] = record.ValidatePublicKeyRecord
204 + p := peer.ID(r.GetAuthor())
205 + pk := ps.PubKey(p)
206 + if pk == nil {
207 + return fmt.Errorf("do not have public key for %s", p)
208 + }
209 + if err := v.VerifyRecord(r, pk); err != nil {
210 + return err
211 + }
212 + return nil
213 +}
test/integration/grandcentral_test.go
+50
@@ -2,6 +2,7 @@ package integrationtest
2
3 import (
4 "bytes"
5 + "fmt"
6 "io"
7 "math"
8 "testing"
@@ -16,6 +17,7 @@ import (
17 "github.com/jbenet/go-ipfs/p2p/peer"
18 "github.com/jbenet/go-ipfs/thirdparty/iter"
19 "github.com/jbenet/go-ipfs/thirdparty/unit"
20 + "github.com/jbenet/go-ipfs/util"
21 ds2 "github.com/jbenet/go-ipfs/util/datastore2"
22 errors "github.com/jbenet/go-ipfs/util/debugerror"
23 testutil "github.com/jbenet/go-ipfs/util/testutil"
@@ -132,3 +134,51 @@ func InitializeSupernodeNetwork(
134 }
135 return servers, clients, nil
136 }
137 +
138 +func TestSupernodePutRecordGetRecord(t *testing.T) {
139 + // create 8 supernode-routing bootstrap nodes
140 + // create 2 supernode-routing clients both bootstrapped to the bootstrap nodes
141 + // let the bootstrap nodes share a single datastore
142 + // add a large file on one node then cat the file from the other
143 + conf := testutil.LatencyConfig{
144 + NetworkLatency: 0,
145 + RoutingLatency: 0,
146 + BlockstoreLatency: 0,
147 + }
148 + if err := RunSupernodePutRecordGetRecord(conf); err != nil {
149 + t.Fatal(err)
150 + }
151 +}
152 +
153 +func RunSupernodePutRecordGetRecord(conf testutil.LatencyConfig) error {
154 + ctx, cancel := context.WithCancel(context.Background())
155 + defer cancel()
156 +
157 + servers, clients, err := InitializeSupernodeNetwork(ctx, 2, 2, conf)
158 + if err != nil {
159 + return err
160 + }
161 + for _, n := range append(servers, clients...) {
162 + defer n.Close()
163 + }
164 +
165 + putter := clients[0]
166 + getter := clients[1]
167 +
168 + k := util.Key("key")
169 + note := []byte("a note from putter")
170 +
171 + if err := putter.Routing.PutValue(ctx, k, note); err != nil {
172 + return fmt.Errorf("failed to put value: %s", err)
173 + }
174 +
175 + received, err := getter.Routing.GetValue(ctx, k)
176 + if err != nil {
177 + return fmt.Errorf("failed to get value: %s", err)
178 + }
179 +
180 + if 0 != bytes.Compare(note, received) {
181 + return errors.New("record doesn't match")
182 + }
183 + return nil
184 +}