@ -123,6 +123,9 @@ trustedPeer = None
# For UPnP
extPort = None
# for Tor hidden service
socksIP = None
#Compiled struct for packing/unpacking headers
#New code should use CreatePacket instead of Header.pack
Header = Struct ( ' !L12sL4s ' )
@ -243,6 +246,14 @@ def haveSSL(server = False):
elif sys . version_info > = ( 2 , 7 , 9 ) :
return True
return False
def checkSocksIP ( host ) :
try :
if socksIP is None or not socksIP :
socksIP = socket . gethostbyname ( config . get ( " bitmessagesettings " , " sockshostname " ) )
except NameError :
socksIP = socket . gethostbyname ( config . get ( " bitmessagesettings " , " sockshostname " ) )
return socksIP == host
def assembleVersionMessage ( remoteHost , remotePort , myStreamNumber , server = False ) :
payload = ' '
@ -258,9 +269,16 @@ def assembleVersionMessage(remoteHost, remotePort, myStreamNumber, server = Fals
payload + = pack ( ' >q ' , 1 ) # bitflags of the services I offer.
payload + = ' \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \xFF \xFF ' + pack (
' >L ' , 2130706433 ) # = 127.0.0.1. This will be ignored by the remote host. The actual remote connected IP will be used.
if safeConfigGetBoolean ( ' bitmessagesettings ' , ' upnp ' ) and extPort :
# we have a separate extPort and
# incoming over clearnet or
# outgoing through clearnet
if safeConfigGetBoolean ( ' bitmessagesettings ' , ' upnp ' ) and extPort \
and ( ( server and not checkSocksIP ( remoteHost ) ) or \
( config . get ( " bitmessagesettings " , " socksproxytype " ) == " none " and not server ) ) :
payload + = pack ( ' >H ' , extPort )
else :
elif checkSocksIP ( remoteHost ) and server : # incoming connection over Tor
payload + = pack ( ' >H ' , shared . config . getint ( ' bitmessagesettings ' , ' onionport ' ) )
else : # no extPort and not incoming over Tor
payload + = pack ( ' >H ' , shared . config . getint ( ' bitmessagesettings ' , ' port ' ) )
random . seed ( )