peer selector now verifies inbound peers

- after handshake when nodeID is known
- part of verifyPeerHook
- peerSelector.AddPeer now returns error
This commit is contained in:
zelig 2015-01-08 11:46:14 +00:00
parent c8aa9f1e75
commit 44e9ebbf91
3 changed files with 15 additions and 8 deletions

View file

@ -1,6 +1,7 @@
package p2p package p2p
import ( import (
"fmt"
"sync" "sync"
"time" "time"
@ -61,17 +62,18 @@ func (self *Cademlia) Stop() {
self.quitC = nil self.quitC = nil
} }
func (self *Cademlia) AddPeer(peer peerInfo) (needed bool) { func (self *Cademlia) AddPeer(peer peerInfo) (err error) {
index := self.commonPrefixLength(peer.Hash()) index := self.commonPrefixLength(peer.Hash())
row := self.rows[index] row := self.rows[index]
needed = row.insert(&entry{peer: peer}) needed := row.insert(&entry{peer: peer})
if needed { if needed {
if index >= self.depth { if index >= self.depth {
go self.updateDepth() go self.updateDepth()
} }
cadlogger.Infof("accept peer %x...", peer.Hash()[:8]) cadlogger.Infof("accept peer %x...", peer.Hash()[:8])
} else { } else {
cadlogger.Infof("reject peer %x... no worse peer found", peer.Hash()[:8]) err = fmt.Errorf("no worse peer found")
cadlogger.Infof("reject peer %x..: %v", peer.Hash()[:8], err)
} }
return return
} }

View file

@ -16,7 +16,7 @@ type peerInfo interface {
} }
type peerSelector interface { type peerSelector interface {
AddPeer(peer peerInfo) bool AddPeer(peer peerInfo) error
GetPeers(target ...[]byte) []peerInfo GetPeers(target ...[]byte) []peerInfo
Start() error Start() error
Stop() error Stop() error
@ -28,8 +28,8 @@ type BaseSelector struct {
peers []peerInfo peers []peerInfo
} }
func (self *BaseSelector) AddPeer(peer peerInfo) bool { func (self *BaseSelector) AddPeer(peer peerInfo) error {
return true return nil
} }
func (self *BaseSelector) GetPeers(target ...[]byte) []peerInfo { func (self *BaseSelector) GetPeers(target ...[]byte) []peerInfo {

View file

@ -152,7 +152,7 @@ func (srv *Server) AddPeer(addr *peerAddr) (err error) {
lastActiveC: make(chan time.Time), lastActiveC: make(chan time.Time),
lastActive: time.Now().Add(-24 * time.Hour), lastActive: time.Now().Add(-24 * time.Hour),
} }
if srv.PeerSelector.AddPeer(peer) { if err = srv.PeerSelector.AddPeer(peer); err == nil {
srvlog.Infof("peer %v accepted by peer selection", addr) srvlog.Infof("peer %v accepted by peer selection", addr)
err = srv.dialPeer(peer) err = srv.dialPeer(peer)
} else { } else {
@ -436,7 +436,6 @@ func (srv *Server) verifyPeer(peer *Peer) error {
return newPeerError(errSelfConnection, "") return newPeerError(errSelfConnection, "")
} }
srv.lock.RLock() srv.lock.RLock()
defer srv.lock.RUnlock()
for _, peer := range srv.peers { for _, peer := range srv.peers {
if peer != nil { if peer != nil {
id := peer.Identity() id := peer.Identity()
@ -445,6 +444,12 @@ func (srv *Server) verifyPeer(peer *Peer) error {
} }
} }
} }
srv.lock.RUnlock()
if peer.dialAddr == nil {
if err := srv.PeerSelector.AddPeer(peer); err != nil {
return newPeerError(errRejectedPeer, "%v", err)
}
}
return nil return nil
} }