Skip to content

Commit 5f3005c

Browse files
committed
Migrated all sockets code to i2p.socket
1 parent b3afbb4 commit 5f3005c

File tree

10 files changed

+105
-601
lines changed

10 files changed

+105
-601
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
**pyc
22
**dat
3+
**txt
4+
**bak
35
**.DS_Store
46
src/build
57
src/dist

src/bitmessagemain.py

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
# The next 3 are used for the API
1717
import singleton
1818
import os
19-
import socket
2019
import ctypes
2120
from struct import pack
2221
import sys
@@ -65,56 +64,6 @@ def connectToStream(streamNumber):
6564
a.setup(streamNumber, selfInitiatedConnections)
6665
a.start()
6766

68-
def _fixWinsock():
69-
if not ('win32' in sys.platform) and not ('win64' in sys.platform):
70-
return
71-
72-
# Python 2 on Windows doesn't define a wrapper for
73-
# socket.inet_ntop but we can make one ourselves using ctypes
74-
if not hasattr(socket, 'inet_ntop'):
75-
addressToString = ctypes.windll.ws2_32.WSAAddressToStringA
76-
def inet_ntop(family, host):
77-
if family == socket.AF_INET:
78-
if len(host) != 4:
79-
raise ValueError("invalid IPv4 host")
80-
host = pack("hH4s8s", socket.AF_INET, 0, host, "\0" * 8)
81-
elif family == socket.AF_INET6:
82-
if len(host) != 16:
83-
raise ValueError("invalid IPv6 host")
84-
host = pack("hHL16sL", socket.AF_INET6, 0, 0, host, 0)
85-
else:
86-
raise ValueError("invalid address family")
87-
buf = "\0" * 64
88-
lengthBuf = pack("I", len(buf))
89-
addressToString(host, len(host), None, buf, lengthBuf)
90-
return buf[0:buf.index("\0")]
91-
socket.inet_ntop = inet_ntop
92-
93-
# Same for inet_pton
94-
if not hasattr(socket, 'inet_pton'):
95-
stringToAddress = ctypes.windll.ws2_32.WSAStringToAddressA
96-
def inet_pton(family, host):
97-
buf = "\0" * 28
98-
lengthBuf = pack("I", len(buf))
99-
if stringToAddress(str(host),
100-
int(family),
101-
None,
102-
buf,
103-
lengthBuf) != 0:
104-
raise socket.error("illegal IP address passed to inet_pton")
105-
if family == socket.AF_INET:
106-
return buf[4:8]
107-
elif family == socket.AF_INET6:
108-
return buf[8:24]
109-
else:
110-
raise ValueError("invalid address family")
111-
socket.inet_pton = inet_pton
112-
113-
# These sockopts are needed on for IPv6 support
114-
if not hasattr(socket, 'IPPROTO_IPV6'):
115-
socket.IPPROTO_IPV6 = 41
116-
if not hasattr(socket, 'IPV6_V6ONLY'):
117-
socket.IPV6_V6ONLY = 27
11867

11968
# This thread, of which there is only one, runs the API.
12069
class singleAPI(threading.Thread):
@@ -139,7 +88,6 @@ def run(self):
13988

14089
class Main:
14190
def start(self, daemon=False):
142-
_fixWinsock()
14391

14492
shared.daemon = daemon
14593
# is the application already running? If yes then exit.

src/class_outgoingSynSender.py

Lines changed: 21 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import random
44
import shared
55
import socks
6-
import socket
6+
from i2p import socket
77
import sys
88
import tr
99

@@ -31,7 +31,12 @@ def _getPeer(self):
3131
peer = shared.trustedPeer
3232
shared.knownNodes[self.streamNumber][peer] = time.time()
3333
else:
34-
peer, = random.sample(shared.knownNodes[self.streamNumber], 1)
34+
try:
35+
peer, = random.sample(shared.knownNodes[self.streamNumber], 1)
36+
except ValueError:
37+
with shared.printLock:
38+
print "knownNodes is empty. Cannot _getPeer"
39+
return None
3540
shared.knownNodesLock.release()
3641

3742
return peer
@@ -47,8 +52,10 @@ def run(self):
4752
break
4853
random.seed()
4954
peer = self._getPeer()
55+
if not peer:
56+
break
5057
shared.alreadyAttemptedConnectionsListLock.acquire()
51-
while peer in shared.alreadyAttemptedConnectionsList or peer.host in shared.connectedHostsList:
58+
while peer in shared.alreadyAttemptedConnectionsList or peer.dest in shared.connectedHostsList:
5259
shared.alreadyAttemptedConnectionsListLock.release()
5360
# print 'choosing new sample'
5461
random.seed()
@@ -64,12 +71,9 @@ def run(self):
6471
shared.alreadyAttemptedConnectionsListLock.acquire()
6572
shared.alreadyAttemptedConnectionsList[peer] = 0
6673
shared.alreadyAttemptedConnectionsListLock.release()
67-
if peer.host.find(':') == -1:
68-
address_family = socket.AF_INET
69-
else:
70-
address_family = socket.AF_INET6
74+
7175
try:
72-
sock = socks.socksocket(address_family, socket.SOCK_STREAM)
76+
sock = socks.socksocket(shared.i2psession, socket.SOCK_STREAM)
7377
except:
7478
"""
7579
The line can fail on Windows systems which aren't
@@ -91,65 +95,20 @@ def run(self):
9195
continue
9296
# This option apparently avoids the TIME_WAIT state so that we
9397
# can rebind faster
94-
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
98+
# sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
9599
sock.settimeout(20)
96100
if shared.config.get('bitmessagesettings', 'socksproxytype') == 'none' and shared.verbose >= 2:
97101
with shared.printLock:
98102
print 'Trying an outgoing connection to', peer
99103

100-
# sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
101-
elif shared.config.get('bitmessagesettings', 'socksproxytype') == 'SOCKS4a':
102-
if shared.verbose >= 2:
103-
with shared.printLock:
104-
print '(Using SOCKS4a) Trying an outgoing connection to', peer
105-
106-
proxytype = socks.PROXY_TYPE_SOCKS4
107-
sockshostname = shared.config.get(
108-
'bitmessagesettings', 'sockshostname')
109-
socksport = shared.config.getint(
110-
'bitmessagesettings', 'socksport')
111-
rdns = True # Do domain name lookups through the proxy; though this setting doesn't really matter since we won't be doing any domain name lookups anyway.
112-
if shared.config.getboolean('bitmessagesettings', 'socksauthentication'):
113-
socksusername = shared.config.get(
114-
'bitmessagesettings', 'socksusername')
115-
sockspassword = shared.config.get(
116-
'bitmessagesettings', 'sockspassword')
117-
sock.setproxy(
118-
proxytype, sockshostname, socksport, rdns, socksusername, sockspassword)
119-
else:
120-
sock.setproxy(
121-
proxytype, sockshostname, socksport, rdns)
122-
elif shared.config.get('bitmessagesettings', 'socksproxytype') == 'SOCKS5':
123-
if shared.verbose >= 2:
124-
with shared.printLock:
125-
print '(Using SOCKS5) Trying an outgoing connection to', peer
126-
127-
proxytype = socks.PROXY_TYPE_SOCKS5
128-
sockshostname = shared.config.get(
129-
'bitmessagesettings', 'sockshostname')
130-
socksport = shared.config.getint(
131-
'bitmessagesettings', 'socksport')
132-
rdns = True # Do domain name lookups through the proxy; though this setting doesn't really matter since we won't be doing any domain name lookups anyway.
133-
if shared.config.getboolean('bitmessagesettings', 'socksauthentication'):
134-
socksusername = shared.config.get(
135-
'bitmessagesettings', 'socksusername')
136-
sockspassword = shared.config.get(
137-
'bitmessagesettings', 'sockspassword')
138-
sock.setproxy(
139-
proxytype, sockshostname, socksport, rdns, socksusername, sockspassword)
140-
else:
141-
sock.setproxy(
142-
proxytype, sockshostname, socksport, rdns)
143-
144104
try:
145-
sock.connect((peer.host, peer.port))
105+
sock.connect(peer.dest)
146106
rd = receiveDataThread()
147107
rd.daemon = True # close the main program even if there are threads left
148108
someObjectsOfWhichThisRemoteNodeIsAlreadyAware = {} # This is not necessairly a complete list; we clear it from time to time to save memory.
149109
sendDataThreadQueue = Queue.Queue() # Used to submit information to the send data thread for this connection.
150110
rd.setup(sock,
151-
peer.host,
152-
peer.port,
111+
peer.dest,
153112
self.streamNumber,
154113
someObjectsOfWhichThisRemoteNodeIsAlreadyAware,
155114
self.selfInitiatedConnections,
@@ -160,7 +119,7 @@ def run(self):
160119

161120

162121
sd = sendDataThread(sendDataThreadQueue)
163-
sd.setup(sock, peer.host, peer.port, self.streamNumber,
122+
sd.setup(sock, peer.dest, self.streamNumber,
164123
someObjectsOfWhichThisRemoteNodeIsAlreadyAware)
165124
sd.start()
166125
sd.sendVersionMessage()
@@ -189,22 +148,10 @@ def run(self):
189148
with shared.printLock:
190149
print 'deleting', peer, 'from shared.knownNodes because it is more than 48 hours old and we could not connect to it.'
191150

192-
except socks.Socks5AuthError as err:
193-
shared.UISignalQueue.put((
194-
'updateStatusBar', tr.translateText(
195-
"MainWindow", "SOCKS5 Authentication problem: %1").arg(str(err))))
196-
except socks.Socks5Error as err:
197-
pass
198-
print 'SOCKS5 error. (It is possible that the server wants authentication).)', str(err)
199-
except socks.Socks4Error as err:
200-
print 'Socks4Error:', err
201-
except socket.error as err:
202-
if shared.config.get('bitmessagesettings', 'socksproxytype')[0:5] == 'SOCKS':
203-
print 'Bitmessage MIGHT be having trouble connecting to the SOCKS server. ' + str(err)
204-
else:
205-
if shared.verbose >= 1:
206-
with shared.printLock:
207-
print 'Could NOT connect to', peer, 'during outgoing attempt.', err
151+
except socket.Error as err:
152+
if shared.verbose >= 1:
153+
with shared.printLock:
154+
print 'Could NOT connect to', peer, 'during outgoing attempt.', err
208155

209156
deletedPeer = None
210157
with shared.knownNodesLock:
@@ -231,3 +178,4 @@ def run(self):
231178
import traceback
232179
traceback.print_exc()
233180
time.sleep(0.1)
181+

0 commit comments

Comments
 (0)