diff --git a/namesys/routing.go b/namesys/routing.go index 67d96f1f631a7c807a18496dcbfdff5701eab48f..4a9756d00e0046d5b1b92c03edcea1a9a80861af 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -7,8 +7,6 @@ import ( mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" pb "github.com/ipfs/go-ipfs/namesys/internal/pb" - ci "github.com/ipfs/go-ipfs/p2p/crypto" - peer "github.com/ipfs/go-ipfs/p2p/peer" routing "github.com/ipfs/go-ipfs/routing" u "github.com/ipfs/go-ipfs/util" ) @@ -65,31 +63,9 @@ func (r *routingResolver) Resolve(ctx context.Context, name string) (u.Key, erro } // name should be a public key retrievable from ipfs - // /ipfs/<name> - var pubkey ci.PubKey - if dht, ok := r.routing.(routing.PubKeyFetcher); ok { - // If we have a DHT as our routing system, use optimized fetcher - pk, err := dht.GetPublicKey(ctx, peer.ID(hash)) - if err != nil { - log.Warning("RoutingResolve PubKey Get failed.") - return "", err - } - pubkey = pk - } else { - key := u.Key("/pk/" + string(hash)) - pkval, err := r.routing.GetValue(ctx, key) - if err != nil { - log.Warning("RoutingResolve PubKey Get failed.") - return "", err - } - - // get PublicKey from node.Data - pk, err := ci.UnmarshalPublicKey(pkval) - if err != nil { - return "", err - } - - pubkey = pk + pubkey, err := routing.GetPublicKey(r.routing, ctx, hash) + if err != nil { + return "", err } hsh, _ := pubkey.Hash() diff --git a/routing/dht/records.go b/routing/dht/records.go index 3d563ab57255df6c16fae457f88724941d41a7fe..973ceca96b94faf1cc9d55253de86bf0f59b80bd 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -6,18 +6,12 @@ import ( "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" ci "github.com/ipfs/go-ipfs/p2p/crypto" peer "github.com/ipfs/go-ipfs/p2p/peer" + routing "github.com/ipfs/go-ipfs/routing" pb "github.com/ipfs/go-ipfs/routing/dht/pb" record "github.com/ipfs/go-ipfs/routing/record" - u "github.com/ipfs/go-ipfs/util" ctxutil "github.com/ipfs/go-ipfs/util/ctx" ) -// KeyForPublicKey returns the key used to retrieve public keys -// from the dht. -func KeyForPublicKey(id peer.ID) u.Key { - return u.Key("/pk/" + string(id)) -} - func (dht *IpfsDHT) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, error) { log.Debugf("getPublicKey for: %s", p) @@ -40,7 +34,7 @@ func (dht *IpfsDHT) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, err // last ditch effort: let's try the dht. log.Debugf("pk for %s not in peerstore, and peer failed. trying dht.", p) - pkkey := KeyForPublicKey(p) + pkkey := routing.KeyForPublicKey(p) val, err := dht.GetValue(ctxT, pkkey) if err != nil { @@ -65,7 +59,7 @@ func (dht *IpfsDHT) getPublicKeyFromNode(ctx context.Context, p peer.ID) (ci.Pub return pk, nil } - pkkey := KeyForPublicKey(p) + pkkey := routing.KeyForPublicKey(p) pmes, err := dht.getValueSingle(ctx, p, pkkey) if err != nil { return nil, err diff --git a/routing/routing.go b/routing/routing.go index b85b25e2247a0b9160e3387774fca1a806b1c811..c94d813ae7af510d07d57e4c4fddc5227cd5c4d5 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -51,3 +51,25 @@ type IpfsRouting interface { type PubKeyFetcher interface { GetPublicKey(context.Context, peer.ID) (ci.PubKey, error) } + +// KeyForPublicKey returns the key used to retrieve public keys +// from the dht. +func KeyForPublicKey(id peer.ID) u.Key { + return u.Key("/pk/" + string(id)) +} + +func GetPublicKey(r IpfsRouting, ctx context.Context, pkhash []byte) (ci.PubKey, error) { + if dht, ok := r.(PubKeyFetcher); ok { + // If we have a DHT as our routing system, use optimized fetcher + return dht.GetPublicKey(ctx, peer.ID(pkhash)) + } else { + key := u.Key("/pk/" + string(pkhash)) + pkval, err := r.GetValue(ctx, key) + if err != nil { + return nil, err + } + + // get PublicKey from node.Data + return ci.UnmarshalPublicKey(pkval) + } +}