diff --git a/aiosocks/protocols.py b/aiosocks/protocols.py index a4a6be1..fa500a3 100644 --- a/aiosocks/protocols.py +++ b/aiosocks/protocols.py @@ -126,6 +126,26 @@ class Socks5Protocol(BaseSocksProtocol): super().__init__(proxy, proxy_auth, dst, remote_resolve, loop) async def socks_request(self, cmd): + await self.authenticate() + + # build and send command + self.write_request([c.SOCKS_VER5, cmd, c.RSV]) + resolved = await self.write_address(self._dst_host, self._dst_port) + + # read/process command response + resp = await self.read_response(3) + + if resp[0] != c.SOCKS_VER5: + raise InvalidServerVersion('SOCKS5 proxy server sent invalid version') + if resp[1] != c.SOCKS5_GRANTED: + error = c.SOCKS5_ERRORS.get(resp[1], 'Unknown error') + raise SocksError('[Errno {0:#04x}]: {1}'.format(resp[1], error)) + + binded = await self.read_address() + + return resolved, binded + + async def authenticate(self): # send available auth methods if self._auth.login and self._auth.password: req = [c.SOCKS_VER5, 0x02, c.SOCKS5_AUTH_ANONYMOUS, c.SOCKS5_AUTH_UNAME_PWD] @@ -157,23 +177,6 @@ class Socks5Protocol(BaseSocksProtocol): else: raise InvalidServerReply('SOCKS5 proxy server sent invalid data') - # build and send command - self.write_request([c.SOCKS_VER5, cmd, c.RSV]) - resolved = await self.write_address(self._dst_host, self._dst_port) - - # read/process command response - resp = await self.read_response(3) - - if resp[0] != c.SOCKS_VER5: - raise InvalidServerVersion('SOCKS5 proxy server sent invalid version') - if resp[1] != c.SOCKS5_GRANTED: - error = c.SOCKS5_ERRORS.get(resp[1], 'Unknown error') - raise SocksError('[Errno {0:#04x}]: {1}'.format(resp[1], error)) - - binded = await self.read_address() - - return resolved, binded - async def write_address(self, host, port): family_to_byte = {socket.AF_INET: c.SOCKS5_ATYP_IPv4, socket.AF_INET6: c.SOCKS5_ATYP_IPv6} port_bytes = struct.pack('>H', port)