import datetime import gzip import os import random import re import schema.update import shutil import string import StringIO import sys import urlparse import zlib from OpenSSL import SSL from pappyproxy import config from pappyproxy import console from pappyproxy import context from pappyproxy import http from pappyproxy import mangle from pappyproxy.util import PappyException from twisted.enterprise import adbapi from twisted.internet import reactor, ssl from twisted.internet.protocol import ClientFactory from twisted.protocols.basic import LineReceiver from twisted.internet import defer from OpenSSL import crypto next_connection_id = 1 cached_certs = {} def get_next_connection_id(): global next_connection_id ret_id = next_connection_id next_connection_id += 1 return ret_id def log(message, id=None, symbol='*', verbosity_level=1): if config.DEBUG_TO_FILE and not os.path.exists(config.DEBUG_DIR): os.makedirs(config.DEBUG_DIR) if id: debug_str = '[%s](%d) %s' % (symbol, id, message) if config.DEBUG_TO_FILE: with open(config.DEBUG_DIR+'/connection_%d.log' % id, 'a') as f: f.write(debug_str+'\n') else: debug_str = '[%s] %s' % (symbol, message) if config.DEBUG_TO_FILE: with open(config.DEBUG_DIR+'/debug.log', 'a') as f: f.write(debug_str+'\n') if config.DEBUG_VERBOSITY >= verbosity_level: print debug_str def log_request(request, id=None, symbol='*', verbosity_level=3): r_split = request.split('\r\n') for l in r_split: log(l, id, symbol, verbosity_level) class ClientTLSContext(ssl.ClientContextFactory): isClient = 1 def getContext(self): return SSL.Context(SSL.TLSv1_METHOD) class ProxyClient(LineReceiver): def __init__(self, request): self.factory = None self._response_sent = False self._sent = False self.request = request self.data_defer = defer.Deferred() self._response_obj = http.Response() def log(self, message, symbol='*', verbosity_level=1): log(message, id=self.factory.connection_id, symbol=symbol, verbosity_level=verbosity_level) def lineReceived(self, *args, **kwargs): line = args[0] if line is None: line = '' self._response_obj.add_line(line) self.log(line, symbol='r<', verbosity_level=3) if self._response_obj.headers_complete: if self._response_obj.complete: self.handle_response_end() return self.log("Headers end, length given, waiting for data", verbosity_level=3) self.setRawMode() def rawDataReceived(self, *args, **kwargs): data = args[0] if not self._response_obj.complete: if data: s = console.printable_data(data) dlines = s.split('\n') for l in dlines: self.log(l, symbol='