asyncio: fix off-by-one in ssl_in_socks, style fixes
This commit is contained in:
parent
3ffedf83fc
commit
cfbc4422da
@ -24,6 +24,7 @@
|
|||||||
# SOFTWARE.
|
# SOFTWARE.
|
||||||
import aiosocks
|
import aiosocks
|
||||||
import os
|
import os
|
||||||
|
import stat
|
||||||
import re
|
import re
|
||||||
import ssl
|
import ssl
|
||||||
import sys
|
import sys
|
||||||
@ -41,11 +42,10 @@ import requests
|
|||||||
from aiosocks.errors import SocksError
|
from aiosocks.errors import SocksError
|
||||||
from concurrent.futures import TimeoutError
|
from concurrent.futures import TimeoutError
|
||||||
|
|
||||||
from .util import print_error
|
|
||||||
from .ssl_in_socks import sslInSocksReaderWriter
|
|
||||||
|
|
||||||
ca_path = requests.certs.where()
|
ca_path = requests.certs.where()
|
||||||
|
|
||||||
|
from .util import print_error
|
||||||
|
from .ssl_in_socks import sslInSocksReaderWriter
|
||||||
from . import util
|
from . import util
|
||||||
from . import x509
|
from . import x509
|
||||||
from . import pem
|
from . import pem
|
||||||
@ -135,6 +135,11 @@ class Interface(util.PrintError):
|
|||||||
else:
|
else:
|
||||||
is_new = False
|
is_new = False
|
||||||
ca_certs = temporary_path if is_new else cert_path
|
ca_certs = temporary_path if is_new else cert_path
|
||||||
|
|
||||||
|
size = os.stat(ca_certs)[stat.ST_SIZE]
|
||||||
|
self_signed = size != 0
|
||||||
|
if not self_signed:
|
||||||
|
ca_certs = ca_path
|
||||||
try:
|
try:
|
||||||
if self.addr is not None:
|
if self.addr is not None:
|
||||||
if not self.use_ssl:
|
if not self.use_ssl:
|
||||||
|
|||||||
@ -18,23 +18,14 @@ class AppProto(asyncio.Protocol):
|
|||||||
for idx, val in enumerate(self.buf):
|
for idx, val in enumerate(self.buf):
|
||||||
if NEWLINE == val:
|
if NEWLINE == val:
|
||||||
asyncio.ensure_future(self.receivedQueue.put(bytes(self.buf[:idx+1])))
|
asyncio.ensure_future(self.receivedQueue.put(bytes(self.buf[:idx+1])))
|
||||||
self.buf = self.buf[idx:]
|
self.buf = self.buf[idx+1:]
|
||||||
|
|
||||||
def makeProtocolFactory(receivedQueue, connUpLock, ca_certs):
|
def makeProtocolFactory(receivedQueue, connUpLock, ca_certs):
|
||||||
class MySSLProtocol(SSLProtocol):
|
class MySSLProtocol(SSLProtocol):
|
||||||
def connection_lost(self, data):
|
|
||||||
super().connection_lost(data)
|
|
||||||
def _on_handshake_complete(self, handshake_exc):
|
|
||||||
super()._on_handshake_complete(handshake_exc)
|
|
||||||
if handshake_exc is not None:
|
|
||||||
print("handshake complete", handshake_exc)
|
|
||||||
try:
|
|
||||||
print("cert length", len(self._sslpipe.ssl_object.getpeercert(True)))
|
|
||||||
except ValueError as e:
|
|
||||||
assert str(e) == "handshake not done yet", e
|
|
||||||
print("exception was from on_handshake_complete") # TODO how can this happen? Handshake should be done if callback is called
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
context = interface.get_ssl_context(cert_reqs=ssl.CERT_REQUIRED if ca_certs is None else ssl.CERT_NONE, ca_certs=ca_certs)
|
context = interface.get_ssl_context(\
|
||||||
|
cert_reqs=ssl.CERT_REQUIRED if ca_certs is not None else ssl.CERT_NONE,\
|
||||||
|
ca_certs=ca_certs)
|
||||||
proto = AppProto(receivedQueue, connUpLock)
|
proto = AppProto(receivedQueue, connUpLock)
|
||||||
super().__init__(asyncio.get_event_loop(), proto, context, None)
|
super().__init__(asyncio.get_event_loop(), proto, context, None)
|
||||||
return MySSLProtocol
|
return MySSLProtocol
|
||||||
@ -59,14 +50,22 @@ async def sslInSocksReaderWriter(socksAddr, socksAuth, host, port, ca_certs):
|
|||||||
receivedQueue = asyncio.Queue()
|
receivedQueue = asyncio.Queue()
|
||||||
connUpLock = asyncio.Lock()
|
connUpLock = asyncio.Lock()
|
||||||
await connUpLock.acquire()
|
await connUpLock.acquire()
|
||||||
transport, protocol = await aiosocks.create_connection(makeProtocolFactory(receivedQueue, connUpLock, ca_certs), proxy=socksAddr, proxy_auth=socksAuth, dst=(host, port))
|
transport, protocol = await aiosocks.create_connection(\
|
||||||
|
makeProtocolFactory(receivedQueue, connUpLock, ca_certs),\
|
||||||
|
proxy=socksAddr,\
|
||||||
|
proxy_auth=socksAuth, dst=(host, port))
|
||||||
await connUpLock.acquire()
|
await connUpLock.acquire()
|
||||||
return ReaderEmulator(receivedQueue), WriterEmulator(protocol._app_transport)
|
return ReaderEmulator(receivedQueue), WriterEmulator(protocol._app_transport)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
async def l(fut):
|
async def l(fut):
|
||||||
try:
|
try:
|
||||||
reader, writer = await sslInSocksReaderWriter(aiosocks.Socks4Addr("127.0.0.1", 9050), None, "songbird.bauerj.eu", 50002, None)
|
# aiosocks.Socks4Addr("127.0.0.1", 9050), None, "songbird.bauerj.eu", 50002, None)
|
||||||
|
args = aiosocks.Socks4Addr("127.0.0.1", 9050), None, "electrum.akinbo.org", 51002, None
|
||||||
|
reader, writer = await sslInSocksReaderWriter(*args)
|
||||||
|
writer.write(b'{"id":0,"method":"server.version","args":["3.0.2", "1.1"]}\n')
|
||||||
|
await writer.drain()
|
||||||
|
print(await reader.read(4096))
|
||||||
writer.write(b'{"id":0,"method":"server.version","args":["3.0.2", "1.1"]}\n')
|
writer.write(b'{"id":0,"method":"server.version","args":["3.0.2", "1.1"]}\n')
|
||||||
await writer.drain()
|
await writer.drain()
|
||||||
print(await reader.read(4096))
|
print(await reader.read(4096))
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user