def run(self): """ Starts the thread. """ # Creates the socks5 proxy socket self.s = socksocket() self.s.setproxy(PROXY_TYPE_SOCKS5, self.proxy, port=self.proxy_port) # The hostname MUST be SHA1(SID + Requester JID + Target JID) # where the output is hexadecimal-encoded (not binary). digest = sha1() digest.update(self.sid) # SID digest.update(self.requester) # Requester JID digest.update(self.target) # Target JID # Computes the digest in hex. dest = '%s' % digest.hexdigest() # The port MUST be 0. self.s.connect((dest, 0)) log.info('Socket connected.') self.connected.set() # Blocks until the socket need to be closed. self.listen() # Closes the socket. self.s.close() log.info('Socket closed.')
def _connect_proxy(self, sid, requester, target, proxy, proxy_port, peer=None): """ Establishes a connection between the client and the server-side Socks5 proxy. sid : The StreamID. <str> requester : The JID of the requester. <str> target : The JID of the target. <str> proxy_host : The hostname or the IP of the proxy. <str> proxy_port : The port of the proxy. <str> or <int> peer : The JID for the other side of the stream, regardless of target or requester status. """ # Because the xep_0065 plugin uses the proxy_port as string, # the Proxy class accepts the proxy_port argument as a string # or an integer. Here, we force to use the port as an integer. proxy_port = int(proxy_port) sock = socksocket() sock.setproxy(PROXY_TYPE_SOCKS5, proxy, port=proxy_port) # The hostname MUST be SHA1(SID + Requester JID + Target JID) # where the output is hexadecimal-encoded (not binary). digest = sha1() digest.update(sid) digest.update(str(requester)) digest.update(str(target)) dest = digest.hexdigest() # The port MUST be 0. sock.connect((dest, 0)) log.info('Socket connected.') _close = sock.close def close(*args, **kwargs): with self._sessions_lock: if sid in self._sessions: del self._sessions[sid] _close() log.info('Socket closed.') sock.close = close sock.peer_jid = peer sock.self_jid = target if requester == peer else requester self.xmpp.event('socks_connected', sid) return sock
def _connect_proxy(self, sid, requester, target, proxy, proxy_port, peer=None): """ Establishes a connection between the client and the server-side Socks5 proxy. sid : The StreamID. <str> requester : The JID of the requester. <str> target : The JID of the target. <str> proxy_host : The hostname or the IP of the proxy. <str> proxy_port : The port of the proxy. <str> or <int> peer : The JID for the other side of the stream, regardless of target or requester status. """ # Because the xep_0065 plugin uses the proxy_port as string, # the Proxy class accepts the proxy_port argument as a string # or an integer. Here, we force to use the port as an integer. proxy_port = int(proxy_port) sock = socksocket() sock.setproxy(PROXY_TYPE_SOCKS5, proxy, port=proxy_port) # The hostname MUST be SHA1(SID + Requester JID + Target JID) # where the output is hexadecimal-encoded (not binary). digest = sha1() digest.update(sid.encode('utf-8')) digest.update(str(requester).encode('utf-8')) digest.update(str(target).encode('utf-8')) dest = digest.hexdigest() # The port MUST be 0. sock.connect((dest, 0)) log.info('Socket connected.') _close = sock.close def close(*args, **kwargs): with self._sessions_lock: if sid in self._sessions: del self._sessions[sid] _close() log.info('Socket closed.') sock.close = close sock.peer_jid = peer sock.self_jid = target if requester == peer else requester self.xmpp.event('socks_connected', sid) return sock