Commit 1eb31086 authored by Jeromy's avatar Jeromy
Browse files

some fixes to make things work with js a little better

parent 97e67744
...@@ -128,6 +128,10 @@ func (c *singleConn) Write(buf []byte) (int, error) { ...@@ -128,6 +128,10 @@ func (c *singleConn) Write(buf []byte) (int, error) {
return c.maconn.Write(buf) return c.maconn.Write(buf)
} }
func (c *singleConn) SetRemotePeer(id peer.ID) {
c.remote = id
}
// ID returns the ID of a given Conn. // ID returns the ID of a given Conn.
func ID(c Conn) string { func ID(c Conn) string {
l := fmt.Sprintf("%s/%s", c.LocalMultiaddr(), c.LocalPeer().Pretty()) l := fmt.Sprintf("%s/%s", c.LocalMultiaddr(), c.LocalPeer().Pretty())
......
...@@ -24,6 +24,7 @@ type PeerConn interface { ...@@ -24,6 +24,7 @@ type PeerConn interface {
RemotePeer() peer.ID RemotePeer() peer.ID
RemotePublicKey() ic.PubKey RemotePublicKey() ic.PubKey
RemoteMultiaddr() ma.Multiaddr RemoteMultiaddr() ma.Multiaddr
SetRemotePeer(peer.ID)
} }
// Conn is a generic message-based Peer-to-Peer connection. // Conn is a generic message-based Peer-to-Peer connection.
......
...@@ -122,3 +122,7 @@ func (c *secureConn) Write(buf []byte) (int, error) { ...@@ -122,3 +122,7 @@ func (c *secureConn) Write(buf []byte) (int, error) {
func (c *secureConn) ReleaseMsg(m []byte) { func (c *secureConn) ReleaseMsg(m []byte) {
c.secure.ReadWriter().ReleaseMsg(m) c.secure.ReadWriter().ReleaseMsg(m)
} }
func (c *secureConn) SetRemotePeer(id peer.ID) {
c.insecure.SetRemotePeer(id)
}
...@@ -147,3 +147,7 @@ func (c *conn) RemotePeer() peer.ID { ...@@ -147,3 +147,7 @@ func (c *conn) RemotePeer() peer.ID {
func (c *conn) RemotePublicKey() ic.PubKey { func (c *conn) RemotePublicKey() ic.PubKey {
return c.remotePubKey return c.remotePubKey
} }
func (c *conn) SetRemotePeer(id peer.ID) {
c.remote = id
}
...@@ -91,6 +91,10 @@ func (c *Conn) Close() error { ...@@ -91,6 +91,10 @@ func (c *Conn) Close() error {
return c.StreamConn().Close() return c.StreamConn().Close()
} }
func (c *Conn) SetRemotePeer(id peer.ID) {
c.RawConn().SetRemotePeer(id)
}
func wrapConn(psc *ps.Conn) (*Conn, error) { func wrapConn(psc *ps.Conn) (*Conn, error) {
// grab the underlying connection. // grab the underlying connection.
if _, ok := psc.NetConn().(conn.Conn); !ok { if _, ok := psc.NetConn().(conn.Conn); !ok {
......
package identify package identify
import ( import (
"fmt"
"strings" "strings"
"sync" "sync"
semver "github.com/coreos/go-semver/semver" semver "github.com/coreos/go-semver/semver"
ggio "github.com/gogo/protobuf/io" ggio "github.com/gogo/protobuf/io"
ci "github.com/ipfs/go-libp2p-crypto"
"github.com/ipfs/go-libp2p-peer"
pstore "github.com/ipfs/go-libp2p-peerstore" pstore "github.com/ipfs/go-libp2p-peerstore"
host "github.com/ipfs/go-libp2p/p2p/host" host "github.com/ipfs/go-libp2p/p2p/host"
mstream "github.com/ipfs/go-libp2p/p2p/metrics/stream" mstream "github.com/ipfs/go-libp2p/p2p/metrics/stream"
...@@ -150,6 +153,16 @@ func (ids *IDService) populateMessage(mes *pb.Identify, c inet.Conn) { ...@@ -150,6 +153,16 @@ func (ids *IDService) populateMessage(mes *pb.Identify, c inet.Conn) {
mes.Protocols[i] = string(p) mes.Protocols[i] = string(p)
} }
if c.RemotePeer() == "" {
pubk := ids.Host.Peerstore().PubKey(ids.Host.ID())
data, err := pubk.Bytes()
if err != nil {
log.Error("marshaling our public key: ", err)
} else {
mes.PublicKey = data
}
}
// observed address so other side is informed of their // observed address so other side is informed of their
// "public" address, at least in relation to us. // "public" address, at least in relation to us.
mes.ObservedAddr = c.RemoteMultiaddr().Bytes() mes.ObservedAddr = c.RemoteMultiaddr().Bytes()
...@@ -169,9 +182,35 @@ func (ids *IDService) populateMessage(mes *pb.Identify, c inet.Conn) { ...@@ -169,9 +182,35 @@ func (ids *IDService) populateMessage(mes *pb.Identify, c inet.Conn) {
mes.AgentVersion = &av mes.AgentVersion = &av
} }
func checkPubKeyID(mes *pb.Identify, c inet.Conn) error {
if len(mes.PublicKey) == 0 {
return fmt.Errorf("remote peer has no ID and no public key was sent")
}
pubk, err := ci.UnmarshalPublicKey(mes.PublicKey)
if err != nil {
return err
}
pid, err := peer.IDFromPublicKey(pubk)
if err != nil {
return err
}
c.SetRemotePeer(pid)
return nil
}
func (ids *IDService) consumeMessage(mes *pb.Identify, c inet.Conn) { func (ids *IDService) consumeMessage(mes *pb.Identify, c inet.Conn) {
p := c.RemotePeer() p := c.RemotePeer()
if p == "" {
err := checkPubKeyID(mes, c)
if err != nil {
log.Warning("no peerID set: ", err)
}
}
// mes.Protocols // mes.Protocols
// mes.ObservedAddr // mes.ObservedAddr
......
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