Randomise node id
- in order to detect if it's connected to to itself, PyBitmessage now uses a per-connection id rather than a global one
This commit is contained in:
parent
bdf61489ae
commit
3941b39136
|
@ -65,6 +65,15 @@ class BMConnectionPool(object):
|
||||||
return self.udpSockets[addr]
|
return self.udpSockets[addr]
|
||||||
raise KeyError
|
raise KeyError
|
||||||
|
|
||||||
|
def isAlreadyConnected(self, nodeid):
|
||||||
|
for i in self.inboundConnections.values() + self.outboundConnections.values():
|
||||||
|
try:
|
||||||
|
if nodeid == i.nodeid:
|
||||||
|
return True
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
return False
|
||||||
|
|
||||||
def addConnection(self, connection):
|
def addConnection(self, connection):
|
||||||
if isinstance(connection, network.udp.UDPSocket):
|
if isinstance(connection, network.udp.UDPSocket):
|
||||||
return
|
return
|
||||||
|
|
|
@ -11,6 +11,7 @@ import traceback
|
||||||
|
|
||||||
from addresses import calculateInventoryHash
|
from addresses import calculateInventoryHash
|
||||||
from debug import logger
|
from debug import logger
|
||||||
|
from helper_random import randomBytes
|
||||||
from inventory import Inventory
|
from inventory import Inventory
|
||||||
import knownnodes
|
import knownnodes
|
||||||
from network.advanceddispatcher import AdvancedDispatcher
|
from network.advanceddispatcher import AdvancedDispatcher
|
||||||
|
@ -47,6 +48,7 @@ class TCPConnection(BMProto, TLSDispatcher):
|
||||||
TLSDispatcher.__init__(self, sock, server_side=True)
|
TLSDispatcher.__init__(self, sock, server_side=True)
|
||||||
self.connectedAt = time.time()
|
self.connectedAt = time.time()
|
||||||
logger.debug("Received connection from %s:%i", self.destination.host, self.destination.port)
|
logger.debug("Received connection from %s:%i", self.destination.host, self.destination.port)
|
||||||
|
self.nodeid = randomBytes(8)
|
||||||
elif address is not None and sock is not None:
|
elif address is not None and sock is not None:
|
||||||
TLSDispatcher.__init__(self, sock, server_side=False)
|
TLSDispatcher.__init__(self, sock, server_side=False)
|
||||||
self.isOutbound = True
|
self.isOutbound = True
|
||||||
|
@ -187,7 +189,9 @@ class TCPConnection(BMProto, TLSDispatcher):
|
||||||
if e.errno in asyncore._DISCONNECTED:
|
if e.errno in asyncore._DISCONNECTED:
|
||||||
logger.debug("%s:%i: Connection failed: %s" % (self.destination.host, self.destination.port, str(e)))
|
logger.debug("%s:%i: Connection failed: %s" % (self.destination.host, self.destination.port, str(e)))
|
||||||
return
|
return
|
||||||
self.append_write_buf(protocol.assembleVersionMessage(self.destination.host, self.destination.port, network.connectionpool.BMConnectionPool().streams, False))
|
self.nodeid = randomBytes(8)
|
||||||
|
self.append_write_buf(protocol.assembleVersionMessage(self.destination.host, self.destination.port, \
|
||||||
|
network.connectionpool.BMConnectionPool().streams, False, nodeid=self.nodeid))
|
||||||
#print "%s:%i: Sending version" % (self.destination.host, self.destination.port)
|
#print "%s:%i: Sending version" % (self.destination.host, self.destination.port)
|
||||||
self.connectedAt = time.time()
|
self.connectedAt = time.time()
|
||||||
receiveDataQueue.put(self.destination)
|
receiveDataQueue.put(self.destination)
|
||||||
|
@ -220,8 +224,9 @@ class Socks5BMConnection(Socks5Connection, TCPConnection):
|
||||||
|
|
||||||
def state_proxy_handshake_done(self):
|
def state_proxy_handshake_done(self):
|
||||||
Socks5Connection.state_proxy_handshake_done(self)
|
Socks5Connection.state_proxy_handshake_done(self)
|
||||||
|
self.nodeid = randomBytes(8)
|
||||||
self.append_write_buf(protocol.assembleVersionMessage(self.destination.host, self.destination.port, \
|
self.append_write_buf(protocol.assembleVersionMessage(self.destination.host, self.destination.port, \
|
||||||
network.connectionpool.BMConnectionPool().streams, False))
|
network.connectionpool.BMConnectionPool().streams, False, nodeid=self.nodeid))
|
||||||
self.set_state("bm_header", expectBytes=protocol.Header.size)
|
self.set_state("bm_header", expectBytes=protocol.Header.size)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -234,8 +239,9 @@ class Socks4aBMConnection(Socks4aConnection, TCPConnection):
|
||||||
|
|
||||||
def state_proxy_handshake_done(self):
|
def state_proxy_handshake_done(self):
|
||||||
Socks4aConnection.state_proxy_handshake_done(self)
|
Socks4aConnection.state_proxy_handshake_done(self)
|
||||||
|
self.nodeid = randomBytes(8)
|
||||||
self.append_write_buf(protocol.assembleVersionMessage(self.destination.host, self.destination.port, \
|
self.append_write_buf(protocol.assembleVersionMessage(self.destination.host, self.destination.port, \
|
||||||
network.connectionpool.BMConnectionPool().streams, False))
|
network.connectionpool.BMConnectionPool().streams, False, nodeid=self.nodeid))
|
||||||
self.set_state("bm_header", expectBytes=protocol.Header.size)
|
self.set_state("bm_header", expectBytes=protocol.Header.size)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
|
@ -186,7 +186,7 @@ def CreatePacket(command, payload=''):
|
||||||
b[Header.size:] = payload
|
b[Header.size:] = payload
|
||||||
return bytes(b)
|
return bytes(b)
|
||||||
|
|
||||||
def assembleVersionMessage(remoteHost, remotePort, participatingStreams, server = False):
|
def assembleVersionMessage(remoteHost, remotePort, participatingStreams, server = False, nodeid = None):
|
||||||
payload = ''
|
payload = ''
|
||||||
payload += pack('>L', 3) # protocol version.
|
payload += pack('>L', 3) # protocol version.
|
||||||
payload += pack('>q', NODE_NETWORK|(NODE_SSL if haveSSL(server) else 0)) # bitflags of the services I offer.
|
payload += pack('>q', NODE_NETWORK|(NODE_SSL if haveSSL(server) else 0)) # bitflags of the services I offer.
|
||||||
|
@ -217,6 +217,9 @@ def assembleVersionMessage(remoteHost, remotePort, participatingStreams, server
|
||||||
payload += pack('>H', BMConfigParser().getint('bitmessagesettings', 'port'))
|
payload += pack('>H', BMConfigParser().getint('bitmessagesettings', 'port'))
|
||||||
|
|
||||||
random.seed()
|
random.seed()
|
||||||
|
if nodeid is not None:
|
||||||
|
payload += nodeid[0:8]
|
||||||
|
else:
|
||||||
payload += eightBytesOfRandomDataUsedToDetectConnectionsToSelf
|
payload += eightBytesOfRandomDataUsedToDetectConnectionsToSelf
|
||||||
userAgent = '/PyBitmessage:' + softwareVersion + '/'
|
userAgent = '/PyBitmessage:' + softwareVersion + '/'
|
||||||
payload += encodeVarint(len(userAgent))
|
payload += encodeVarint(len(userAgent))
|
||||||
|
|
Reference in New Issue
Block a user