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