Commit d1f01124 authored by Jeromy's avatar Jeromy Committed by Juan Batiz-Benet

address comments from the PR #45

parent 2aa2b8c6
......@@ -27,6 +27,9 @@ type Key interface {
// Bytes returns a serialized, storeable representation of this key
Bytes() ([]byte, error)
// Hash returns the hash of this key
Hash() ([]byte, error)
// Equals checks whether two PubKeys are the same
Equals(Key) bool
}
......
......@@ -9,6 +9,7 @@ import (
"errors"
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto"
u "github.com/jbenet/go-ipfs/util"
)
type RsaPrivateKey struct {
......@@ -46,6 +47,14 @@ func (pk *RsaPublicKey) Equals(k Key) bool {
return KeyEqual(pk, k)
}
func (pk *RsaPublicKey) Hash() ([]byte, error) {
pkb, err := pk.Bytes()
if err != nil {
return nil, err
}
return u.Hash(pkb)
}
func (sk *RsaPrivateKey) GenSecret() []byte {
buf := make([]byte, 16)
rand.Read(buf)
......@@ -75,6 +84,14 @@ func (sk *RsaPrivateKey) Equals(k Key) bool {
return KeyEqual(sk, k)
}
func (sk *RsaPrivateKey) Hash() ([]byte, error) {
skb, err := sk.Bytes()
if err != nil {
return nil, err
}
return u.Hash(skb)
}
func UnmarshalRsaPrivateKey(b []byte) (*RsaPrivateKey, error) {
sk, err := x509.ParsePKCS1PrivateKey(b)
if err != nil {
......
......@@ -230,7 +230,7 @@ func (s *SecurePipe) handleSecureIn(hashType string, tIV, tCKey, tMKey []byte) {
data, ok := <-s.insecure.In
if !ok {
u.DOut("Closing incoming proxy.\n")
close(secureIn)
close(s.In)
return
}
......@@ -268,7 +268,7 @@ func (s *SecurePipe) handleSecureOut(hashType string, mIV, mCKey, mMKey []byte)
data, ok := <-s.Out
if !ok {
u.DOut("Closing outgoing proxy.\n")
close(secureOut)
close(s.Out)
return
}
......
......@@ -12,6 +12,10 @@ type DNSResolver struct {
// cache would need a timeout
}
func (r *DNSResolver) Matches(name string) bool {
return strings.Contains(name, ".")
}
func (r *DNSResolver) Resolve(name string) (string, error) {
txt, err := net.LookupTXT(name)
if err != nil {
......
......@@ -2,4 +2,5 @@ package namesys
type Resolver interface {
Resolve(string) (string, error)
Matches(string) bool
}
......@@ -10,6 +10,11 @@ var _ = proquint.Encode
type ProquintResolver struct{}
func (r *ProquintResolver) Matches(name string) bool {
ok, err := proquint.IsProquint(name)
return err == nil && ok
}
func (r *ProquintResolver) Resolve(name string) (string, error) {
ok, err := proquint.IsProquint(name)
if err != nil {
......
......@@ -32,7 +32,7 @@ func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error {
}
namekey := u.Key(nameb).Pretty()
ipnskey, err := u.Hash([]byte("ipns:" + namekey))
ipnskey, err := u.Hash([]byte("/ipns/" + namekey))
if err != nil {
return err
}
......@@ -43,7 +43,7 @@ func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error {
return err
}
// Store ipns entry at h("ipns:"+b58(h(pubkey)))
// Store ipns entry at h("/ipns/"+b58(h(pubkey)))
err = p.routing.PutValue(u.Key(ipnskey), data)
if err != nil {
return err
......
package namesys
import (
"strings"
"errors"
mdag "github.com/jbenet/go-ipfs/merkledag"
"github.com/jbenet/go-ipfs/routing"
)
var ErrCouldntResolve = errors.New("could not resolve name.")
type MasterResolver struct {
dns *DNSResolver
routing *RoutingResolver
pro *ProquintResolver
res []Resolver
}
func NewMasterResolver(r routing.IpfsRouting, dag *mdag.DAGService) *MasterResolver {
mr := new(MasterResolver)
mr.dns = new(DNSResolver)
mr.pro = new(ProquintResolver)
mr.routing = NewRoutingResolver(r, dag)
mr.res = []Resolver{
new(DNSResolver),
new(ProquintResolver),
NewRoutingResolver(r, dag),
}
return mr
}
func (mr *MasterResolver) Resolve(name string) (string, error) {
if strings.Contains(name, ".") {
return mr.dns.Resolve(name)
for _, r := range mr.res {
if r.Matches(name) {
return r.Resolve(name)
}
}
return "", ErrCouldntResolve
}
if strings.Contains(name, "-") {
return mr.pro.Resolve(name)
func (mr *MasterResolver) Matches(name string) bool {
for _, r := range mr.res {
if r.Matches(name) {
return true
}
}
return mr.routing.Resolve(name)
return false
}
......@@ -26,6 +26,11 @@ func NewRoutingResolver(route routing.IpfsRouting, dagservice *mdag.DAGService)
}
}
func (r *RoutingResolver) Matches(name string) bool {
_, err := mh.FromB58String(name)
return err == nil
}
func (r *RoutingResolver) Resolve(name string) (string, error) {
hash, err := mh.FromB58String(name)
if err != nil {
......@@ -36,13 +41,13 @@ func (r *RoutingResolver) Resolve(name string) (string, error) {
// use the routing system to get the name.
// /ipns/<name>
h, err := u.Hash([]byte("ipns:" + name))
h, err := u.Hash([]byte("/ipns/" + name))
if err != nil {
return "", err
}
inpsKey := u.Key(h)
val, err := r.routing.GetValue(inpsKey, time.Second*10)
ipnsKey := u.Key(h)
val, err := r.routing.GetValue(ipnsKey, time.Second*10)
if err != nil {
u.DOut("RoutingResolve get failed.\n")
return "", err
......@@ -70,7 +75,7 @@ func (r *RoutingResolver) Resolve(name string) (string, error) {
}
// check sig with pk
if ok, err := pk.Verify(entry.GetValue(), entry.GetSignature()); err != nil && ok {
if ok, err := pk.Verify(entry.GetValue(), entry.GetSignature()); err != nil || !ok {
return "", fmt.Errorf("Invalid value. Not signed by PrivateKey corresponding to %v", pk)
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment