# Copyright (c) 2013 The Chromium OS Authors and the python-socks5 authors. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import subprocess import test # Taken and hacked from https://code.google.com/p/python-socks5/ import socket from threading import Thread from autotest_lib.client.common_lib import error SOCKTIMEOUT=5 RESENDTIMEOUT=300 class Forwarder(Thread): def __init__(self,src,dest): Thread.__init__(self) self.src=src self.dest=dest def __str__(self): return '' % (self.src, self.dest) def run(self): print '%s: starting' % self try: self.forward() except socket.error as e: print '%s: exception %s' % (self, e) self.src.close() self.dest.close() finally: print '%s: exiting' % self def forward(self): BUFSIZE = 1024 data = self.src.recv(BUFSIZE) while data: self.dest.sendall(data) data = self.src.recv(BUFSIZE) self.src.close() self.dest.close() print '%s: client quit normally' % self class ProxyForwarder(Forwarder): def __init__(self, src, dest_addr): Forwarder.__init__(self, src, None) self.dest_addr = dest_addr self.src = src self.dest = None def __str__(self): return '> 8) + chr(port & 0xff) # Turn the textual IP address we were supplied with into a # network-byte-order IP address for SOCKS5 wire protocol network_ip = "".join(chr(int(i)) for i in ip.split(".")) while True: sock = transformer.accept()[0] sock.settimeout(SOCKTIMEOUT) print "Got one client connection" (_, nmethods) = recvbytes(sock, 2) _ = recvbytes(sock, nmethods) sock.sendall(SOCKS5_VER + AUTH_NONE) (_, cmd, _, atyp) = recvbytes(sock, 4) dst_addr = None dst_port = None if atyp == ATYP_DOMAIN: addr_len = recvbytes(sock, 1)[0] dst_addr = "".join([unichr(x) for x in recvbytes(sock, addr_len)]) dst_port = recvshort(sock) else: socket.sendall(SOCKS5_VER + ERR_UNSUPP + network_ip + network_port) print "Proxying to %s:%d" %(dst_addr,dst_port) if cmd == CMD_CONNECT: sock.sendall(SOCKS5_VER + ERR_SUCCESS + "\x00" + "\x01" + network_ip + network_port) print "Starting forwarding thread" ProxyForwarder(sock, (dst_addr, dst_port)).start() else: sock.sendall(SOCKS5_VER + ERR_UNSUPP + network_ip + network_port) sock.close() class ServingThread(Thread): def __init__(self, ip, port): Thread.__init__(self) self.ip = ip self.port = port def run(self): create_server(self.ip, self.port) class platform_TLSDateActual(test.test): version = 1 def tlsdate(self, host, proxy): args = ['/usr/bin/tlsdate', '-v', '-l', '-H', host] if proxy: args += ['-x', proxy] p = subprocess.Popen(args, stderr=subprocess.PIPE) out = p.communicate()[1] print out return p.returncode def run_once(self): t = ServingThread("127.0.0.1", 8083) t.start() r = self.tlsdate('clients3.google.com', None) if r != 0: raise error.TestFail('tlsdate with no proxy to good host failed: %d' % r) r = self.tlsdate('clients3.google.com', 'socks5://127.0.0.1:8083') if r != 0: raise error.TestFail('tlsdate with proxy to good host failed: %d' % r) r = self.tlsdate('invalid-host.example.com', None) if r == 0: raise error.TestFail('tlsdate with no proxy to bad host succeeded') r = self.tlsdate('invalid-host.example.com', 'socks5://127.0.0.1:8083') if r == 0: raise error.TestFail('tlsdate with proxy to bad host succeeded')