Added handling for terminating connections that never fully existed

This commit is contained in:
StephenButtolph 2020-04-04 00:30:28 -04:00
parent 438326b11a
commit dc518f4814
1 changed files with 27 additions and 8 deletions

View File

@ -310,24 +310,26 @@ func (nm *Handshake) connectedToPeer(conn *C.struct_peernetwork_conn_t, addr sal
// If we're enforcing staking, use a peer's certificate to uniquely identify them // If we're enforcing staking, use a peer's certificate to uniquely identify them
// Otherwise, use a hash of their ip to identify them // Otherwise, use a hash of their ip to identify them
cert := ids.ShortID{} cert := ids.ShortID{}
ipCert := toShortID(ip)
if nm.enableStaking { if nm.enableStaking {
cert = getPeerCert(conn) cert = getPeerCert(conn)
} else { } else {
cert = toShortID(ip) cert = ipCert
} }
nm.log.Debug("Connected to %s", ip) nm.log.Debug("Connected to %s", ip)
nm.reconnectTimeout.Remove(cert.LongID()) longCert := cert.LongID()
nm.reconnectTimeout.Remove(longCert)
nm.reconnectTimeout.Remove(ipCert.LongID())
nm.pending.Add(addr, cert) nm.pending.Add(addr, cert)
certID := cert.LongID()
handler := new(func()) handler := new(func())
*handler = func() { *handler = func() {
if nm.pending.ContainsIP(addr) { if nm.pending.ContainsIP(addr) {
nm.SendGetVersion(addr) nm.SendGetVersion(addr)
nm.versionTimeout.Put(certID, *handler) nm.versionTimeout.Put(longCert, *handler)
} }
} }
(*handler)() (*handler)()
@ -345,13 +347,15 @@ func (nm *Handshake) disconnectedFromPeer(addr salticidae.NetAddr) {
nm.log.Info("Disconnected from %s", toIPDesc(addr)) nm.log.Info("Disconnected from %s", toIPDesc(addr))
longCert := cert.LongID()
if nm.vdrs.Contains(cert) { if nm.vdrs.Contains(cert) {
nm.reconnectTimeout.Put(cert.LongID(), func() { nm.reconnectTimeout.Put(longCert, func() {
nm.net.DelPeer(addr) nm.net.DelPeer(addr)
}) })
} else { } else {
nm.net.DelPeer(addr) nm.net.DelPeer(addr)
} }
nm.versionTimeout.Remove(longCert)
if !nm.enableStaking { if !nm.enableStaking {
nm.vdrs.Remove(cert) nm.vdrs.Remove(cert)
@ -386,9 +390,20 @@ func peerHandler(_conn *C.struct_peernetwork_conn_t, connected C.bool, _ unsafe.
// unknownPeerHandler notifies of an unknown peer connection attempt // unknownPeerHandler notifies of an unknown peer connection attempt
//export unknownPeerHandler //export unknownPeerHandler
func unknownPeerHandler(_addr *C.netaddr_t, _cert *C.x509_t, _ unsafe.Pointer) { func unknownPeerHandler(_addr *C.netaddr_t, _cert *C.x509_t, _ unsafe.Pointer) {
addr := salticidae.NetAddrFromC(salticidae.CNetAddr(_addr)) addr := salticidae.NetAddrFromC(salticidae.CNetAddr(_addr)).Copy(true)
ip := toIPDesc(addr) ip := toIPDesc(addr)
HandshakeNet.log.Info("Adding peer %s", ip) HandshakeNet.log.Info("Adding peer %s", ip)
cert := ids.ShortID{}
if HandshakeNet.enableStaking {
cert = getCert(salticidae.X509FromC(salticidae.CX509(_cert)))
} else {
cert = toShortID(ip)
}
HandshakeNet.reconnectTimeout.Put(cert.LongID(), func() {
HandshakeNet.net.DelPeer(addr)
})
HandshakeNet.net.AddPeer(addr) HandshakeNet.net.AddPeer(addr)
} }
@ -551,16 +566,20 @@ func peerList(_msg *C.struct_msg_t, _conn *C.struct_msgnetwork_conn_t, _ unsafe.
cErr := salticidae.NewError() cErr := salticidae.NewError()
for _, ip := range ips { for _, ip := range ips {
HandshakeNet.log.Verbo("Trying to adding peer %s", ip) HandshakeNet.log.Verbo("Trying to adding peer %s", ip)
addr := salticidae.NewNetAddrFromIPPortString(ip.String(), false, &cErr) addr := salticidae.NewNetAddrFromIPPortString(ip.String(), true, &cErr)
if cErr.GetCode() == 0 && !HandshakeNet.myAddr.IsEq(addr) { // Make sure not to connect to myself if cErr.GetCode() == 0 && !HandshakeNet.myAddr.IsEq(addr) { // Make sure not to connect to myself
ip := toIPDesc(addr) ip := toIPDesc(addr)
ipCert := toShortID(ip)
if !HandshakeNet.pending.ContainsIP(addr) && !HandshakeNet.connections.ContainsIP(addr) { if !HandshakeNet.pending.ContainsIP(addr) && !HandshakeNet.connections.ContainsIP(addr) {
HandshakeNet.log.Debug("Adding peer %s", ip) HandshakeNet.log.Debug("Adding peer %s", ip)
HandshakeNet.reconnectTimeout.Put(ipCert.LongID(), func() {
HandshakeNet.net.DelPeer(addr)
})
HandshakeNet.net.AddPeer(addr) HandshakeNet.net.AddPeer(addr)
} }
} }
addr.Free()
} }
} }