test peer with no auth enc
This commit is contained in:
parent
1d01f6af98
commit
06d219db8e
|
@ -85,13 +85,14 @@ type MConnection struct {
|
||||||
RemoteAddress *NetAddress
|
RemoteAddress *NetAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
// MConnConfig is a MConnection configuration
|
// MConnConfig is a MConnection configuration.
|
||||||
type MConnConfig struct {
|
type MConnConfig struct {
|
||||||
SendRate int64
|
SendRate int64
|
||||||
RecvRate int64
|
RecvRate int64
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultMConnectionConfig() *MConnConfig {
|
// DefaultMConnConfig returns the default config.
|
||||||
|
func DefaultMConnConfig() *MConnConfig {
|
||||||
return &MConnConfig{
|
return &MConnConfig{
|
||||||
SendRate: defaultSendRate,
|
SendRate: defaultSendRate,
|
||||||
RecvRate: defaultRecvRate,
|
RecvRate: defaultRecvRate,
|
||||||
|
@ -105,7 +106,7 @@ func NewMConnection(conn net.Conn, chDescs []*ChannelDescriptor, onReceive recei
|
||||||
chDescs,
|
chDescs,
|
||||||
onReceive,
|
onReceive,
|
||||||
onError,
|
onError,
|
||||||
defaultMConnectionConfig())
|
DefaultMConnConfig())
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMConnectionWithConfig wraps net.Conn and creates multiplex connection with a config
|
// NewMConnectionWithConfig wraps net.Conn and creates multiplex connection with a config
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
hash: 92a49cbcf88a339e4d29559fe291c30e61eacda1020fd04dfcd97de834e18b3e
|
hash: ef8ea7b02d9a133bfbfcf3f4615d43be0956ad2bc9eb0050e0721fca12d09308
|
||||||
updated: 2017-04-10T11:17:14.66226896Z
|
updated: 2017-04-14T08:28:07.579629532Z
|
||||||
imports:
|
imports:
|
||||||
- name: github.com/btcsuite/btcd
|
- name: github.com/btcsuite/btcd
|
||||||
version: 4b348c1d33373d672edd83fc576892d0e46686d2
|
version: 4b348c1d33373d672edd83fc576892d0e46686d2
|
||||||
|
@ -25,9 +25,9 @@ imports:
|
||||||
- name: github.com/tendermint/go-config
|
- name: github.com/tendermint/go-config
|
||||||
version: 620dcbbd7d587cf3599dedbf329b64311b0c307a
|
version: 620dcbbd7d587cf3599dedbf329b64311b0c307a
|
||||||
- name: github.com/tendermint/go-crypto
|
- name: github.com/tendermint/go-crypto
|
||||||
version: 3f47cfac5fcd9e0f1727c7db980b3559913b3e3a
|
version: 750b25c47a5782f5f2b773ed9e706cb82b3ccef4
|
||||||
- name: github.com/tendermint/go-data
|
- name: github.com/tendermint/go-data
|
||||||
version: c955b191240568440ea902e14dad2ce19727543a
|
version: e7fcc6d081ec8518912fcdc103188275f83a3ee5
|
||||||
- name: github.com/tendermint/go-flowrate
|
- name: github.com/tendermint/go-flowrate
|
||||||
version: a20c98e61957faa93b4014fbd902f20ab9317a6a
|
version: a20c98e61957faa93b4014fbd902f20ab9317a6a
|
||||||
subpackages:
|
subpackages:
|
||||||
|
@ -41,7 +41,7 @@ imports:
|
||||||
subpackages:
|
subpackages:
|
||||||
- term
|
- term
|
||||||
- name: golang.org/x/crypto
|
- name: golang.org/x/crypto
|
||||||
version: 9ef620b9ca2f82b55030ffd4f41327fa9e77a92c
|
version: cbc3d0884eac986df6e78a039b8792e869bff863
|
||||||
subpackages:
|
subpackages:
|
||||||
- curve25519
|
- curve25519
|
||||||
- nacl/box
|
- nacl/box
|
||||||
|
|
|
@ -3,8 +3,9 @@ import:
|
||||||
- package: github.com/tendermint/go-common
|
- package: github.com/tendermint/go-common
|
||||||
- package: github.com/tendermint/go-config
|
- package: github.com/tendermint/go-config
|
||||||
- package: github.com/tendermint/go-crypto
|
- package: github.com/tendermint/go-crypto
|
||||||
|
version: develop
|
||||||
- package: github.com/tendermint/go-data
|
- package: github.com/tendermint/go-data
|
||||||
version: c955b191240568440ea902e14dad2ce19727543a
|
version: develop
|
||||||
- package: github.com/tendermint/go-flowrate
|
- package: github.com/tendermint/go-flowrate
|
||||||
subpackages:
|
subpackages:
|
||||||
- flowrate
|
- flowrate
|
||||||
|
@ -16,6 +17,7 @@ import:
|
||||||
- nacl/box
|
- nacl/box
|
||||||
- nacl/secretbox
|
- nacl/secretbox
|
||||||
- ripemd160
|
- ripemd160
|
||||||
|
- package: github.com/pkg/errors
|
||||||
testImport:
|
testImport:
|
||||||
- package: github.com/stretchr/testify
|
- package: github.com/stretchr/testify
|
||||||
subpackages:
|
subpackages:
|
||||||
|
|
23
peer.go
23
peer.go
|
@ -6,6 +6,7 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
cmn "github.com/tendermint/go-common"
|
cmn "github.com/tendermint/go-common"
|
||||||
crypto "github.com/tendermint/go-crypto"
|
crypto "github.com/tendermint/go-crypto"
|
||||||
wire "github.com/tendermint/go-wire"
|
wire "github.com/tendermint/go-wire"
|
||||||
|
@ -49,10 +50,10 @@ type PeerConfig struct {
|
||||||
func DefaultPeerConfig() *PeerConfig {
|
func DefaultPeerConfig() *PeerConfig {
|
||||||
return &PeerConfig{
|
return &PeerConfig{
|
||||||
AuthEnc: true,
|
AuthEnc: true,
|
||||||
Fuzz: false,
|
HandshakeTimeout: 2 * time.Second,
|
||||||
HandshakeTimeout: 20 * time.Second,
|
|
||||||
DialTimeout: 3 * time.Second,
|
DialTimeout: 3 * time.Second,
|
||||||
MConfig: defaultMConnectionConfig(),
|
MConfig: DefaultMConnConfig(),
|
||||||
|
Fuzz: false,
|
||||||
FuzzConfig: DefaultFuzzConnConfig(),
|
FuzzConfig: DefaultFuzzConnConfig(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,7 +65,7 @@ func newOutboundPeer(addr *NetAddress, reactorsByCh map[byte]Reactor, chDescs []
|
||||||
func newOutboundPeerWithConfig(addr *NetAddress, reactorsByCh map[byte]Reactor, chDescs []*ChannelDescriptor, onPeerError func(*Peer, interface{}), ourNodePrivKey crypto.PrivKeyEd25519, config *PeerConfig) (*Peer, error) {
|
func newOutboundPeerWithConfig(addr *NetAddress, reactorsByCh map[byte]Reactor, chDescs []*ChannelDescriptor, onPeerError func(*Peer, interface{}), ourNodePrivKey crypto.PrivKeyEd25519, config *PeerConfig) (*Peer, error) {
|
||||||
conn, err := dial(addr, config)
|
conn, err := dial(addr, config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, errors.Wrap(err, "Error creating peer")
|
||||||
}
|
}
|
||||||
|
|
||||||
peer, err := newPeerFromConnAndConfig(conn, true, reactorsByCh, chDescs, onPeerError, ourNodePrivKey, config)
|
peer, err := newPeerFromConnAndConfig(conn, true, reactorsByCh, chDescs, onPeerError, ourNodePrivKey, config)
|
||||||
|
@ -99,7 +100,7 @@ func newPeerFromConnAndConfig(rawConn net.Conn, outbound bool, reactorsByCh map[
|
||||||
var err error
|
var err error
|
||||||
conn, err = MakeSecretConnection(conn, ourNodePrivKey)
|
conn, err = MakeSecretConnection(conn, ourNodePrivKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, errors.Wrap(err, "Error creating peer")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,10 +158,10 @@ func (p *Peer) HandshakeTimeout(ourNodeInfo *NodeInfo, timeout time.Duration) er
|
||||||
log.Notice("Peer handshake", "peerNodeInfo", peerNodeInfo)
|
log.Notice("Peer handshake", "peerNodeInfo", peerNodeInfo)
|
||||||
})
|
})
|
||||||
if err1 != nil {
|
if err1 != nil {
|
||||||
return err1
|
return errors.Wrap(err1, "Error during handshake/write")
|
||||||
}
|
}
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
return err2
|
return errors.Wrap(err2, "Error during handshake/read")
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.config.AuthEnc {
|
if p.config.AuthEnc {
|
||||||
|
@ -174,7 +175,7 @@ func (p *Peer) HandshakeTimeout(ourNodeInfo *NodeInfo, timeout time.Duration) er
|
||||||
// Remove deadline
|
// Remove deadline
|
||||||
p.conn.SetDeadline(time.Time{})
|
p.conn.SetDeadline(time.Time{})
|
||||||
|
|
||||||
peerNodeInfo.RemoteAddr = p.RemoteAddr().String()
|
peerNodeInfo.RemoteAddr = p.Addr().String()
|
||||||
|
|
||||||
p.NodeInfo = peerNodeInfo
|
p.NodeInfo = peerNodeInfo
|
||||||
p.Key = peerNodeInfo.PubKey.KeyString()
|
p.Key = peerNodeInfo.PubKey.KeyString()
|
||||||
|
@ -182,12 +183,12 @@ func (p *Peer) HandshakeTimeout(ourNodeInfo *NodeInfo, timeout time.Duration) er
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoteAddr returns the remote network address.
|
// Addr returns peer's network address.
|
||||||
func (p *Peer) RemoteAddr() net.Addr {
|
func (p *Peer) Addr() net.Addr {
|
||||||
return p.conn.RemoteAddr()
|
return p.conn.RemoteAddr()
|
||||||
}
|
}
|
||||||
|
|
||||||
// PubKey returns the remote public key.
|
// PubKey returns peer's public key.
|
||||||
func (p *Peer) PubKey() crypto.PubKeyEd25519 {
|
func (p *Peer) PubKey() crypto.PubKeyEd25519 {
|
||||||
if p.config.AuthEnc {
|
if p.config.AuthEnc {
|
||||||
return p.conn.(*SecretConnection).RemotePubKey()
|
return p.conn.(*SecretConnection).RemotePubKey()
|
||||||
|
|
45
peer_test.go
45
peer_test.go
|
@ -12,15 +12,41 @@ import (
|
||||||
crypto "github.com/tendermint/go-crypto"
|
crypto "github.com/tendermint/go-crypto"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestPeerStartStop(t *testing.T) {
|
func TestPeerBasic(t *testing.T) {
|
||||||
assert, require := assert.New(t), require.New(t)
|
assert, require := assert.New(t), require.New(t)
|
||||||
|
|
||||||
// simulate remote peer
|
// simulate remote peer
|
||||||
rp := &remotePeer{PrivKey: crypto.GenPrivKeyEd25519()}
|
rp := &remotePeer{PrivKey: crypto.GenPrivKeyEd25519(), Config: DefaultPeerConfig()}
|
||||||
rp.Start()
|
rp.Start()
|
||||||
defer rp.Stop()
|
defer rp.Stop()
|
||||||
|
|
||||||
p, err := createPeerAndPerformHandshake(rp.RemoteAddr())
|
p, err := createOutboundPeerAndPerformHandshake(rp.Addr(), DefaultPeerConfig())
|
||||||
|
require.Nil(err)
|
||||||
|
|
||||||
|
p.Start()
|
||||||
|
defer p.Stop()
|
||||||
|
|
||||||
|
assert.True(p.IsRunning())
|
||||||
|
assert.True(p.IsOutbound())
|
||||||
|
assert.False(p.IsPersistent())
|
||||||
|
p.makePersistent()
|
||||||
|
assert.True(p.IsPersistent())
|
||||||
|
assert.Equal(rp.Addr().String(), p.Addr().String())
|
||||||
|
assert.Equal(rp.PubKey(), p.PubKey())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPeerWithoutAuthEnc(t *testing.T) {
|
||||||
|
assert, require := assert.New(t), require.New(t)
|
||||||
|
|
||||||
|
config := DefaultPeerConfig()
|
||||||
|
config.AuthEnc = false
|
||||||
|
|
||||||
|
// simulate remote peer
|
||||||
|
rp := &remotePeer{PrivKey: crypto.GenPrivKeyEd25519(), Config: config}
|
||||||
|
rp.Start()
|
||||||
|
defer rp.Stop()
|
||||||
|
|
||||||
|
p, err := createOutboundPeerAndPerformHandshake(rp.Addr(), config)
|
||||||
require.Nil(err)
|
require.Nil(err)
|
||||||
|
|
||||||
p.Start()
|
p.Start()
|
||||||
|
@ -29,13 +55,13 @@ func TestPeerStartStop(t *testing.T) {
|
||||||
assert.True(p.IsRunning())
|
assert.True(p.IsRunning())
|
||||||
}
|
}
|
||||||
|
|
||||||
func createPeerAndPerformHandshake(addr *NetAddress) (*Peer, error) {
|
func createOutboundPeerAndPerformHandshake(addr *NetAddress, config *PeerConfig) (*Peer, error) {
|
||||||
chDescs := []*ChannelDescriptor{
|
chDescs := []*ChannelDescriptor{
|
||||||
&ChannelDescriptor{ID: 0x01, Priority: 1},
|
&ChannelDescriptor{ID: 0x01, Priority: 1},
|
||||||
}
|
}
|
||||||
reactorsByCh := map[byte]Reactor{0x01: NewTestReactor(chDescs, true)}
|
reactorsByCh := map[byte]Reactor{0x01: NewTestReactor(chDescs, true)}
|
||||||
pk := crypto.GenPrivKeyEd25519()
|
pk := crypto.GenPrivKeyEd25519()
|
||||||
p, err := newOutboundPeer(addr, reactorsByCh, chDescs, func(p *Peer, r interface{}) {}, pk)
|
p, err := newOutboundPeerWithConfig(addr, reactorsByCh, chDescs, func(p *Peer, r interface{}) {}, pk, config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -53,14 +79,19 @@ func createPeerAndPerformHandshake(addr *NetAddress) (*Peer, error) {
|
||||||
|
|
||||||
type remotePeer struct {
|
type remotePeer struct {
|
||||||
PrivKey crypto.PrivKeyEd25519
|
PrivKey crypto.PrivKeyEd25519
|
||||||
|
Config *PeerConfig
|
||||||
addr *NetAddress
|
addr *NetAddress
|
||||||
quit chan struct{}
|
quit chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *remotePeer) RemoteAddr() *NetAddress {
|
func (p *remotePeer) Addr() *NetAddress {
|
||||||
return p.addr
|
return p.addr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *remotePeer) PubKey() crypto.PubKeyEd25519 {
|
||||||
|
return p.PrivKey.PubKey().(crypto.PubKeyEd25519)
|
||||||
|
}
|
||||||
|
|
||||||
func (p *remotePeer) Start() {
|
func (p *remotePeer) Start() {
|
||||||
l, e := net.Listen("tcp", "127.0.0.1:0") // any available address
|
l, e := net.Listen("tcp", "127.0.0.1:0") // any available address
|
||||||
if e != nil {
|
if e != nil {
|
||||||
|
@ -81,7 +112,7 @@ func (p *remotePeer) accept(l net.Listener) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
golog.Fatalf("Failed to accept conn: %+v", err)
|
golog.Fatalf("Failed to accept conn: %+v", err)
|
||||||
}
|
}
|
||||||
peer, err := newInboundPeer(conn, make(map[byte]Reactor), make([]*ChannelDescriptor, 0), func(p *Peer, r interface{}) {}, p.PrivKey)
|
peer, err := newInboundPeerWithConfig(conn, make(map[byte]Reactor), make([]*ChannelDescriptor, 0), func(p *Peer, r interface{}) {}, p.PrivKey, p.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
golog.Fatalf("Failed to create a peer: %+v", err)
|
golog.Fatalf("Failed to create a peer: %+v", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,7 +200,7 @@ func (sw *Switch) OnStop() {
|
||||||
// NOTE: This performs a blocking handshake before the peer is added.
|
// NOTE: This performs a blocking handshake before the peer is added.
|
||||||
// CONTRACT: If error is returned, peer is nil, and conn is immediately closed.
|
// CONTRACT: If error is returned, peer is nil, and conn is immediately closed.
|
||||||
func (sw *Switch) AddPeer(peer *Peer) error {
|
func (sw *Switch) AddPeer(peer *Peer) error {
|
||||||
if err := sw.FilterConnByAddr(peer.RemoteAddr()); err != nil {
|
if err := sw.FilterConnByAddr(peer.Addr()); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -376,7 +376,7 @@ func (sw *Switch) Peers() IPeerSet {
|
||||||
// Disconnect from a peer due to external error, retry if it is a persistent peer.
|
// Disconnect from a peer due to external error, retry if it is a persistent peer.
|
||||||
// TODO: make record depending on reason.
|
// TODO: make record depending on reason.
|
||||||
func (sw *Switch) StopPeerForError(peer *Peer, reason interface{}) {
|
func (sw *Switch) StopPeerForError(peer *Peer, reason interface{}) {
|
||||||
addr := NewNetAddress(peer.RemoteAddr())
|
addr := NewNetAddress(peer.Addr())
|
||||||
log.Notice("Stopping peer for error", "peer", peer, "error", reason)
|
log.Notice("Stopping peer for error", "peer", peer, "error", reason)
|
||||||
sw.stopAndRemovePeer(peer, reason)
|
sw.stopAndRemovePeer(peer, reason)
|
||||||
|
|
||||||
|
|
|
@ -238,11 +238,11 @@ func TestSwitchStopsNonPersistentPeerOnError(t *testing.T) {
|
||||||
defer sw.Stop()
|
defer sw.Stop()
|
||||||
|
|
||||||
// simulate remote peer
|
// simulate remote peer
|
||||||
rp := &remotePeer{PrivKey: crypto.GenPrivKeyEd25519()}
|
rp := &remotePeer{PrivKey: crypto.GenPrivKeyEd25519(), Config: DefaultPeerConfig()}
|
||||||
rp.Start()
|
rp.Start()
|
||||||
defer rp.Stop()
|
defer rp.Stop()
|
||||||
|
|
||||||
peer, err := newOutboundPeer(rp.RemoteAddr(), sw.reactorsByCh, sw.chDescs, sw.StopPeerForError, sw.nodePrivKey)
|
peer, err := newOutboundPeer(rp.Addr(), sw.reactorsByCh, sw.chDescs, sw.StopPeerForError, sw.nodePrivKey)
|
||||||
require.Nil(err)
|
require.Nil(err)
|
||||||
err = sw.AddPeer(peer)
|
err = sw.AddPeer(peer)
|
||||||
require.Nil(err)
|
require.Nil(err)
|
||||||
|
@ -264,11 +264,11 @@ func TestSwitchReconnectsToPersistentPeer(t *testing.T) {
|
||||||
defer sw.Stop()
|
defer sw.Stop()
|
||||||
|
|
||||||
// simulate remote peer
|
// simulate remote peer
|
||||||
rp := &remotePeer{PrivKey: crypto.GenPrivKeyEd25519()}
|
rp := &remotePeer{PrivKey: crypto.GenPrivKeyEd25519(), Config: DefaultPeerConfig()}
|
||||||
rp.Start()
|
rp.Start()
|
||||||
defer rp.Stop()
|
defer rp.Stop()
|
||||||
|
|
||||||
peer, err := newOutboundPeer(rp.RemoteAddr(), sw.reactorsByCh, sw.chDescs, sw.StopPeerForError, sw.nodePrivKey)
|
peer, err := newOutboundPeer(rp.Addr(), sw.reactorsByCh, sw.chDescs, sw.StopPeerForError, sw.nodePrivKey)
|
||||||
peer.makePersistent()
|
peer.makePersistent()
|
||||||
require.Nil(err)
|
require.Nil(err)
|
||||||
err = sw.AddPeer(peer)
|
err = sw.AddPeer(peer)
|
||||||
|
|
Loading…
Reference in New Issue