Пример #1
0
async def async_test_e2e(loop: asyncio.AbstractEventLoop, password: str):
    local = Local(loop, password, '127.0.0.1', LOCAL_PORT, '127.0.0.1',
                  SERVER_PORT)
    server = Server(loop, password, '127.0.0.1', SERVER_PORT)
    asyncio.ensure_future(local.listen())
    asyncio.ensure_future(server.listen())
    asyncio.ensure_future(remote_listen(loop))

    client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    await loop.sock_connect(client_sock, ('127.0.0.1', LOCAL_PORT))

    # greeting
    client_hello = bytes((0x05, 0x01, 0x00))
    await loop.sock_sendall(client_sock, client_hello)
    server_hello = await loop.sock_recv(client_sock, BUFFER_SIZE)
    assert server_hello == bytes((0x05, 0x00))
    # request: connect to remote 127.0.0.1:34567
    socks_request = bytes(
        (0x05, 0x01, 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x87, 0x07))
    await loop.sock_sendall(client_sock, socks_request)
    socks_response = await loop.sock_recv(client_sock, BUFFER_SIZE)
    assert socks_response == bytes(
        (0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00))
    # pipe
    msg = b'hello world'
    await loop.sock_sendall(client_sock, msg)
    msg_reply = await loop.sock_recv(client_sock, BUFFER_SIZE)
    assert msg_reply == b'Reply: hello world'
Пример #2
0
class TestLocal(unittest.TestCase):
    def setUp(self):
        self.listenAddr = ("127.0.0.1", 11111)
        self.remoteAddr = ("127.0.0.1", 22222)
        self.remoteServer = socket.socket()
        self.remoteServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.remoteServer.bind(self.remoteAddr)
        self.remoteServer.listen(socket.SOMAXCONN)
        self.remoteServer.setblocking(False)
        pwd = randomPwd()
        self.cipher = Cipher.NewCipher(pwd)
        self.loop = asyncio.new_event_loop()
        self.local = Local(
            loop=self.loop,
            pwd=pwd,
            listenAddr=self.listenAddr,
            remoteAddr=self.remoteAddr,
        )
        self.msg = bytearray(b"hello world")
        self.encrypted_msg = self.msg.copy()
        self.cipher.encode(self.encrypted_msg)

    def tearDown(self):
        self.remoteServer.close()
        self.loop.close()

    def test_dialRemote(self):
        async def test():
            with await self.local.dialRemote() as connection:
                await self.loop.sock_sendall(connection, self.msg)
                remoteConn, _ = await self.loop.sock_accept(self.remoteServer)
                received_msg = await self.loop.sock_recv(remoteConn, 1024)
                remoteConn.close()
                self.assertEqual(received_msg, self.msg)

        self.loop.run_until_complete(test())

        with self.assertRaises(ConnectionError):
            self.local.remoteAddr = ("127.0.0.1", 0)
            self.loop.run_until_complete(self.local.dialRemote())

    def test_run(self):
        def didListen(address):
            self.assertEqual(address[0], self.listenAddr[0])
            self.assertEqual(address[1], self.listenAddr[1])
            user_client = socket.create_connection(self.listenAddr)
            user_client.send(b"hello world")
            user_client.close()

            async def call_later():
                conn, _ = await self.loop.sock_accept(self.remoteServer)
                with conn:
                    received_msg = await self.loop.sock_recv(conn, 1024)
                await asyncio.sleep(0.001)
                self.assertEqual(received_msg, self.encrypted_msg)
                self.loop.stop()

            asyncio.ensure_future(call_later(), loop=self.loop)

        with self.assertRaises(RuntimeError):
            self.loop.run_until_complete(self.local.listen(didListen))