@cryptotaxi247 / kubo / commits / 01451c214

fix routing resolver

Jeromy committed Nov 11, 2014 at 16:28 UTC 01451c214ec47c4e677f704fd7e521a008d7899c
5 files changed +55 -7
namesys/publisher.go
+11 -5
@@ -33,34 +33,40 @@ func (p *ipnsPublisher) Publish(k ci.PrivKey, value string) error {
33 // validate `value` is a ref (multihash)
34 _, err := mh.FromB58String(value)
35 if err != nil {
36 + log.Errorf("hash cast failed: %s", value)
37 return fmt.Errorf("publish value must be str multihash. %v", err)
38 }
39
40 ctx := context.TODO()
41 data, err := createRoutingEntryData(k, value)
42 if err != nil {
43 + log.Error("entry creation failed.")
44 return err
45 }
46 pubkey := k.GetPublic()
47 pkbytes, err := pubkey.Bytes()
48 if err != nil {
47 - return nil
49 + log.Error("pubkey getbytes failed.")
50 + return err
51 }
52
53 nameb := u.Hash(pkbytes)
51 - namekey := u.Key(nameb).Pretty()
52 - ipnskey := []byte("/ipns/" + namekey)
54 + namekey := u.Key("/pk/" + string(nameb))
55
56 + log.Debugf("Storing pubkey at: %s", namekey)
57 // Store associated public key
58 timectx, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*4))
56 - err = p.routing.PutValue(timectx, u.Key("/pk/"+string(nameb)), pkbytes)
59 + err = p.routing.PutValue(timectx, namekey, pkbytes)
60 if err != nil {
61 return err
62 }
63
64 + ipnskey := u.Key("/ipns/" + string(nameb))
65 +
66 + log.Debugf("Storing ipns entry at: %s", ipnskey)
67 // Store ipns entry at "/ipns/"+b58(h(pubkey))
68 timectx, _ = context.WithDeadline(ctx, time.Now().Add(time.Second*4))
63 - err = p.routing.PutValue(timectx, u.Key(ipnskey), data)
69 + err = p.routing.PutValue(timectx, ipnskey, data)
70 if err != nil {
71 return err
72 }
namesys/routing.go
+1 -1
@@ -46,7 +46,7 @@ func (r *routingResolver) Resolve(name string) (string, error) {
46
47 // use the routing system to get the name.
48 // /ipns/<name>
49 - h := []byte("/ipns/" + name)
49 + h := []byte("/ipns/" + string(hash))
50
51 ipnsKey := u.Key(h)
52 val, err := r.routing.GetValue(ctx, ipnsKey)
routing/dht/dht.go
+3
@@ -355,10 +355,12 @@ func (dht *IpfsDHT) getFromPeerList(ctx context.Context, key u.Key,
355 func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) {
356 dht.dslock.Lock()
357 defer dht.dslock.Unlock()
358 + log.Debug("getLocal %s", key)
359 v, err := dht.datastore.Get(key.DsKey())
360 if err != nil {
361 return nil, err
362 }
363 + log.Debug("found in db")
364
365 byt, ok := v.([]byte)
366 if !ok {
@@ -374,6 +376,7 @@ func (dht *IpfsDHT) getLocal(key u.Key) ([]byte, error) {
376 if u.Debug {
377 err = dht.verifyRecord(rec)
378 if err != nil {
379 + log.Errorf("local record verify failed: %s", err)
380 return nil, err
381 }
382 }
routing/dht/records.go
+35 -1
@@ -4,8 +4,11 @@ import (
4 "bytes"
5 "errors"
6 "strings"
7 + "time"
8
9 + "code.google.com/p/go.net/context"
10 "code.google.com/p/goprotobuf/proto"
11 + ci "github.com/jbenet/go-ipfs/crypto"
12 "github.com/jbenet/go-ipfs/peer"
13 pb "github.com/jbenet/go-ipfs/routing/dht/pb"
14 u "github.com/jbenet/go-ipfs/util"
@@ -32,6 +35,29 @@ func (dht *IpfsDHT) makePutRecord(key u.Key, value []byte) (*pb.Record, error) {
35 return record, nil
36 }
37
38 +func (dht *IpfsDHT) getPublicKey(pid peer.ID) (ci.PubKey, error) {
39 + log.Debug("getPublicKey for: %s", pid)
40 + p, err := dht.peerstore.Get(pid)
41 + if err == nil {
42 + return p.PubKey(), nil
43 + }
44 +
45 + log.Debug("not in peerstore, searching dht.")
46 + ctxT, _ := context.WithTimeout(dht.ContextCloser.Context(), time.Second*5)
47 + val, err := dht.GetValue(ctxT, u.Key("/pk/"+string(pid)))
48 + if err != nil {
49 + log.Warning("Failed to find requested public key.")
50 + return nil, err
51 + }
52 +
53 + pubkey, err := ci.UnmarshalPublicKey(val)
54 + if err != nil {
55 + log.Errorf("Failed to unmarshal public key: %s", err)
56 + return nil, err
57 + }
58 + return pubkey, nil
59 +}
60 +
61 func (dht *IpfsDHT) verifyRecord(r *pb.Record) error {
62 // First, validate the signature
63 p, err := dht.peerstore.Get(peer.ID(r.GetAuthor()))
@@ -76,6 +102,14 @@ func ValidateIpnsRecord(k u.Key, val []byte) error {
102 }
103
104 func ValidatePublicKeyRecord(k u.Key, val []byte) error {
79 - // TODO:
105 + keyparts := bytes.Split([]byte(k), []byte("/"))
106 + if len(keyparts) < 3 {
107 + return errors.New("invalid key")
108 + }
109 +
110 + pkh := u.Hash(val)
111 + if !bytes.Equal(keyparts[2], pkh) {
112 + return errors.New("public key does not match storage key")
113 + }
114 return nil
115 }
routing/mock/routing.go
+5
@@ -12,6 +12,8 @@ import (
12 u "github.com/jbenet/go-ipfs/util"
13 )
14
15 +var log = u.Logger("mockrouter")
16 +
17 var _ routing.IpfsRouting = &MockRouter{}
18
19 type MockRouter struct {
@@ -33,10 +35,12 @@ func (mr *MockRouter) SetRoutingServer(rs RoutingServer) {
35 }
36
37 func (mr *MockRouter) PutValue(ctx context.Context, key u.Key, val []byte) error {
38 + log.Debugf("PutValue: %s", key)
39 return mr.datastore.Put(key.DsKey(), val)
40 }
41
42 func (mr *MockRouter) GetValue(ctx context.Context, key u.Key) ([]byte, error) {
43 + log.Debugf("GetValue: %s", key)
44 v, err := mr.datastore.Get(key.DsKey())
45 if err != nil {
46 return nil, err
@@ -55,6 +59,7 @@ func (mr *MockRouter) FindProviders(ctx context.Context, key u.Key) ([]peer.Peer
59 }
60
61 func (mr *MockRouter) FindPeer(ctx context.Context, pid peer.ID) (peer.Peer, error) {
62 + log.Debug("FindPeer: %s", pid)
63 return nil, nil
64 }
65