提交 d1f01124 作者: Jeromy 提交者: Juan Batiz-Benet

address comments from the PR #45

上级 2aa2b8c6
...@@ -27,6 +27,9 @@ type Key interface { ...@@ -27,6 +27,9 @@ type Key interface {
// Bytes returns a serialized, storeable representation of this key // Bytes returns a serialized, storeable representation of this key
Bytes() ([]byte, error) Bytes() ([]byte, error)
// Hash returns the hash of this key
Hash() ([]byte, error)
// Equals checks whether two PubKeys are the same // Equals checks whether two PubKeys are the same
Equals(Key) bool Equals(Key) bool
} }
......
...@@ -9,6 +9,7 @@ import ( ...@@ -9,6 +9,7 @@ import (
"errors" "errors"
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto"
u "github.com/jbenet/go-ipfs/util"
) )
type RsaPrivateKey struct { type RsaPrivateKey struct {
...@@ -46,6 +47,14 @@ func (pk *RsaPublicKey) Equals(k Key) bool { ...@@ -46,6 +47,14 @@ func (pk *RsaPublicKey) Equals(k Key) bool {
return KeyEqual(pk, k) 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 { func (sk *RsaPrivateKey) GenSecret() []byte {
buf := make([]byte, 16) buf := make([]byte, 16)
rand.Read(buf) rand.Read(buf)
...@@ -75,6 +84,14 @@ func (sk *RsaPrivateKey) Equals(k Key) bool { ...@@ -75,6 +84,14 @@ func (sk *RsaPrivateKey) Equals(k Key) bool {
return KeyEqual(sk, k) 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) { func UnmarshalRsaPrivateKey(b []byte) (*RsaPrivateKey, error) {
sk, err := x509.ParsePKCS1PrivateKey(b) sk, err := x509.ParsePKCS1PrivateKey(b)
if err != nil { if err != nil {
......
...@@ -230,7 +230,7 @@ func (s *SecurePipe) handleSecureIn(hashType string, tIV, tCKey, tMKey []byte) { ...@@ -230,7 +230,7 @@ func (s *SecurePipe) handleSecureIn(hashType string, tIV, tCKey, tMKey []byte) {
data, ok := <-s.insecure.In data, ok := <-s.insecure.In
if !ok { if !ok {
u.DOut("Closing incoming proxy.\n") u.DOut("Closing incoming proxy.\n")
close(secureIn) close(s.In)
return return
} }
...@@ -268,7 +268,7 @@ func (s *SecurePipe) handleSecureOut(hashType string, mIV, mCKey, mMKey []byte) ...@@ -268,7 +268,7 @@ func (s *SecurePipe) handleSecureOut(hashType string, mIV, mCKey, mMKey []byte)
data, ok := <-s.Out data, ok := <-s.Out
if !ok { if !ok {
u.DOut("Closing outgoing proxy.\n") u.DOut("Closing outgoing proxy.\n")
close(secureOut) close(s.Out)
return return
} }
......
...@@ -12,6 +12,10 @@ type DNSResolver struct { ...@@ -12,6 +12,10 @@ type DNSResolver struct {
// cache would need a timeout // cache would need a timeout
} }
func (r *DNSResolver) Matches(name string) bool {
return strings.Contains(name, ".")
}
func (r *DNSResolver) Resolve(name string) (string, error) { func (r *DNSResolver) Resolve(name string) (string, error) {
txt, err := net.LookupTXT(name) txt, err := net.LookupTXT(name)
if err != nil { if err != nil {
......
...@@ -2,4 +2,5 @@ package namesys ...@@ -2,4 +2,5 @@ package namesys
type Resolver interface { type Resolver interface {
Resolve(string) (string, error) Resolve(string) (string, error)
Matches(string) bool
} }
...@@ -10,6 +10,11 @@ var _ = proquint.Encode ...@@ -10,6 +10,11 @@ var _ = proquint.Encode
type ProquintResolver struct{} 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) { func (r *ProquintResolver) Resolve(name string) (string, error) {
ok, err := proquint.IsProquint(name) ok, err := proquint.IsProquint(name)
if err != nil { if err != nil {
......
...@@ -32,7 +32,7 @@ func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error { ...@@ -32,7 +32,7 @@ func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error {
} }
namekey := u.Key(nameb).Pretty() namekey := u.Key(nameb).Pretty()
ipnskey, err := u.Hash([]byte("ipns:" + namekey)) ipnskey, err := u.Hash([]byte("/ipns/" + namekey))
if err != nil { if err != nil {
return err return err
} }
...@@ -43,7 +43,7 @@ func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error { ...@@ -43,7 +43,7 @@ func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error {
return err 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) err = p.routing.PutValue(u.Key(ipnskey), data)
if err != nil { if err != nil {
return err return err
......
package namesys package namesys
import ( import (
"strings" "errors"
mdag "github.com/jbenet/go-ipfs/merkledag" mdag "github.com/jbenet/go-ipfs/merkledag"
"github.com/jbenet/go-ipfs/routing" "github.com/jbenet/go-ipfs/routing"
) )
var ErrCouldntResolve = errors.New("could not resolve name.")
type MasterResolver struct { type MasterResolver struct {
dns *DNSResolver res []Resolver
routing *RoutingResolver
pro *ProquintResolver
} }
func NewMasterResolver(r routing.IpfsRouting, dag *mdag.DAGService) *MasterResolver { func NewMasterResolver(r routing.IpfsRouting, dag *mdag.DAGService) *MasterResolver {
mr := new(MasterResolver) mr := new(MasterResolver)
mr.dns = new(DNSResolver) mr.res = []Resolver{
mr.pro = new(ProquintResolver) new(DNSResolver),
mr.routing = NewRoutingResolver(r, dag) new(ProquintResolver),
NewRoutingResolver(r, dag),
}
return mr return mr
} }
func (mr *MasterResolver) Resolve(name string) (string, error) { func (mr *MasterResolver) Resolve(name string) (string, error) {
if strings.Contains(name, ".") { for _, r := range mr.res {
return mr.dns.Resolve(name) if r.Matches(name) {
return r.Resolve(name)
}
} }
return "", ErrCouldntResolve
}
if strings.Contains(name, "-") { func (mr *MasterResolver) Matches(name string) bool {
return mr.pro.Resolve(name) for _, r := range mr.res {
if r.Matches(name) {
return true
}
} }
return false
return mr.routing.Resolve(name)
} }
...@@ -26,6 +26,11 @@ func NewRoutingResolver(route routing.IpfsRouting, dagservice *mdag.DAGService) ...@@ -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) { func (r *RoutingResolver) Resolve(name string) (string, error) {
hash, err := mh.FromB58String(name) hash, err := mh.FromB58String(name)
if err != nil { if err != nil {
...@@ -36,13 +41,13 @@ func (r *RoutingResolver) Resolve(name string) (string, error) { ...@@ -36,13 +41,13 @@ func (r *RoutingResolver) Resolve(name string) (string, error) {
// use the routing system to get the name. // use the routing system to get the name.
// /ipns/<name> // /ipns/<name>
h, err := u.Hash([]byte("ipns:" + name)) h, err := u.Hash([]byte("/ipns/" + name))
if err != nil { if err != nil {
return "", err return "", err
} }
inpsKey := u.Key(h) ipnsKey := u.Key(h)
val, err := r.routing.GetValue(inpsKey, time.Second*10) val, err := r.routing.GetValue(ipnsKey, time.Second*10)
if err != nil { if err != nil {
u.DOut("RoutingResolve get failed.\n") u.DOut("RoutingResolve get failed.\n")
return "", err return "", err
...@@ -70,7 +75,7 @@ func (r *RoutingResolver) Resolve(name string) (string, error) { ...@@ -70,7 +75,7 @@ func (r *RoutingResolver) Resolve(name string) (string, error) {
} }
// check sig with pk // 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) return "", fmt.Errorf("Invalid value. Not signed by PrivateKey corresponding to %v", pk)
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论