Project

General

Profile

« Previous | Next » 

Revision 6c69435c

Added by jahoti about 2 years ago

Support a custom certificates directory in test/server.py

View differences:

test/proxy_core.py
8 8
Be sure to run this inside your intended certificates directory.
9 9
"""
10 10

  
11
import os, socket, ssl, sys, threading, time
11
import os, socket, ssl, subprocess, sys, threading, time
12 12
from http.server import HTTPServer, BaseHTTPRequestHandler
13 13
from socketserver import ThreadingMixIn
14
from subprocess import Popen, PIPE
15 14

  
16
gen_cert_req, lock = 'openssl req -new -key cert.key -subj /CN=%s', threading.Lock()
17
sign_cert_req = 'openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -set_serial %d -out %s'
15
gen_cert_req, lock = 'openssl req -new -key %scert.key -subj /CN=%s', threading.Lock()
16
sign_cert_req = 'openssl x509 -req -days 3650 -CA %sca.crt -CAkey %sca.key -set_serial %d -out %s'
18 17

  
18
def popen(command, *args, **kwargs):
19
    return subprocess.Popen((command % args).split(' '), **kwargs)
19 20

  
20 21
class ProxyRequestHandler(BaseHTTPRequestHandler):
21 22
	"""Handles a network request made to the proxy"""
23
	certdir = ''
22 24
	
23 25
	def log_error(self, format, *args):
24 26
		# suppress "Request timed out: timeout('timed out',)"
......
29 31

  
30 32
	def do_CONNECT(self):
31 33
		hostname = self.path.split(':')[0]
32
		certpath = '%s.crt' % (hostname if hostname != 'ca' else 'CA')
34
		certpath = '%s%s.crt' % (certdir, hostname if hostname != 'ca' else 'CA')
33 35

  
34 36
		with lock:
35 37
			if not os.path.isfile(certpath):
36
				p1 = Popen((gen_cert_req % hostname).split(' '), stdout=PIPE).stdout
37
				Popen((sign_cert_req % (time.time() * 1000, certpath)).split(' '), stdin=p1, stderr=PIPE).communicate()
38
				p1 = popen(gen_cert_req, certdir, hostname, stdout=subprocess.PIPE).stdout
39
				popen(sign_cert_req, certdir, certdir, time.time() * 1000, certpath, stdin=p1, stderr=subprocess.PIPE).communicate()
38 40

  
39 41
		self.send_response(200)
40 42
		self.end_headers()
41 43

  
42
		self.connection = ssl.wrap_socket(self.connection, keyfile='cert.key', certfile=certpath, server_side=True)
44
		self.connection = ssl.wrap_socket(self.connection, keyfile=certdir+'cert.key', certfile=certpath, server_side=True)
43 45
		self.rfile = self.connection.makefile('rb', self.rbufsize)
44 46
		self.wfile = self.connection.makefile('wb', self.wbufsize)
45 47

  
test/server.py
39 39
}
40 40

  
41 41
class RequestHijacker(ProxyRequestHandler):
42
	certdir = global_certdir
43
	
42 44
	def handle_request(self, req_body):
43 45
		path_components = self.path.split('?', maxsplit=1)
44 46
		path = path_components[0]
......
99 101
		
100 102

  
101 103

  
102
def do_an_internet(port=1337):
104
def do_an_internet(certdir, port):
103 105
	"""Start up the proxy/server"""
106
	global global_certdir
107
	global_certdir = certdir
104 108
	
105 109
	httpd = ThreadingHTTPServer(('', port), RequestHijacker)
106 110
	httpd.serve_forever()

Also available in: Unified diff