예제 #1
0
def gen_mangle_macro(modified_req=None, modified_rsp=None,
                     drop_req=False, drop_rsp=False):
    macro = mock.MagicMock()
    if modified_req or drop_req:
        macro.async_req = True
        macro.do_req = True
        if drop_req:
            newreq = None
        else:
            newreq = http.Request(modified_req)
        macro.async_mangle_request.return_value = mock_deferred(newreq)
    else:
        macro.do_req = False

    if modified_rsp or drop_rsp:
        macro.async_rsp = True
        macro.do_rsp = True
        if drop_rsp:
            newrsp = None
        else:
            newrsp = http.Response(modified_rsp)
        macro.async_mangle_response.return_value = mock_deferred(newrsp)
    else:
        macro.do_rsp = False
    return macro
예제 #2
0
def test_proxy_client_factory_prepare_reqs_simple(mocker, freeze):
    import datetime
    freeze.freeze(datetime.datetime(2015, 1, 1, 3, 30, 15, 50))

    req = http.Request('GET / HTTP/1.1\r\n\r\n')

    rsave = mocker.patch.object(pappyproxy.http.Request,
                                'async_deep_save',
                                autospec=True,
                                side_effect=mock_req_async_save)
    rsave.return_value = mock_deferred()
    mocker.patch('pappyproxy.context.in_scope').return_value = True
    mocker.patch(
        'pappyproxy.macros.mangle_request').return_value = mock_deferred(
            (req, False))

    cf = ProxyClientFactory(req,
                            save_all=False,
                            stream_response=False,
                            return_transport=None)
    yield cf.prepare_request()
    assert req.time_start == datetime.datetime(2015, 1, 1, 3, 30, 15, 50)
    assert req.reqid is None
    assert not rsave.called
    assert len(rsave.mock_calls) == 0
예제 #3
0
def gen_mangle_macro(modified_req=None,
                     modified_rsp=None,
                     drop_req=False,
                     drop_rsp=False):
    macro = mock.MagicMock()
    if modified_req or drop_req:
        macro.async_req = True
        macro.do_req = True
        if drop_req:
            newreq = None
        else:
            newreq = http.Request(modified_req)
        macro.async_mangle_request.return_value = mock_deferred(newreq)
    else:
        macro.do_req = False

    if modified_rsp or drop_rsp:
        macro.async_rsp = True
        macro.do_rsp = True
        if drop_rsp:
            newrsp = None
        else:
            newrsp = http.Response(modified_rsp)
        macro.async_mangle_response.return_value = mock_deferred(newrsp)
    else:
        macro.do_rsp = False
    return macro
예제 #4
0
def test_proxy_server_create_client_factory(mocker, server_protocol):
    mfactory = mock.MagicMock()
    mfactory_class = mocker.patch('pappyproxy.proxy.ProxyClientFactory')
    mfactory_class.return_value = mfactory

    mocker.patch('pappyproxy.proxy.ProxyServer._make_remote_connection')

    mfactory.prepare_request.return_value = mock_deferred(None)
    full_req = ('POST /fooo HTTP/1.1\r\n'
                'Test-Header: foo\r\n'
                'Content-Length: 4\r\n'
                '\r\n'
                'ABCD')
    server_protocol.connection_id = 100

    server_protocol.dataReceived(full_req)
    # Make sure we created a ClientFactory with the right arguments
    f_args, f_kwargs = mfactory_class.call_args
    assert len(f_args) == 1

    # Make sure the request got to the client class
    req = f_args[0]
    assert req.full_message == full_req

    # Make sure the correct settings got to the proxy
    assert f_kwargs['stream_response'] == True
    assert f_kwargs['save_all'] == True

    # Make sure we initialized the client factory
    assert mfactory.prepare_request.called
    assert mfactory.connection_id == 100
    assert server_protocol._make_remote_connection.called  # should be immediately called because mock deferred
예제 #5
0
def test_proxy_server_create_client_factory(mocker, server_protocol):
    mfactory = mock.MagicMock()
    mfactory_class = mocker.patch('pappyproxy.proxy.ProxyClientFactory')
    mfactory_class.return_value = mfactory

    mocker.patch('pappyproxy.proxy.ProxyServer._make_remote_connection')

    mfactory.prepare_request.return_value = mock_deferred(None)
    full_req = ('POST /fooo HTTP/1.1\r\n'
                'Test-Header: foo\r\n'
                'Content-Length: 4\r\n'
                '\r\n'
                'ABCD')
    server_protocol.connection_id = 100

    server_protocol.dataReceived(full_req)
    # Make sure we created a ClientFactory with the right arguments
    f_args, f_kwargs = mfactory_class.call_args
    assert len(f_args) == 1

    # Make sure the request got to the client class
    req = f_args[0]
    assert req.full_message == full_req

    # Make sure the correct settings got to the proxy
    assert f_kwargs['stream_response'] == True
    assert f_kwargs['save_all'] == True

    # Make sure we initialized the client factory
    assert mfactory.prepare_request.called
    assert mfactory.connection_id == 100
    assert server_protocol._make_remote_connection.called # should be immediately called because mock deferred
예제 #6
0
def test_submit_request_fail(mocker, http_request):
    mocker.patch.object(pappyproxy.http.Request, 'submit_request', new=mock_loader_fail())
    mocker.patch('pappyproxy.http.Request.async_deep_save').return_value = mock_deferred()

    comm_data = {"action": "submit"}
    comm_data['full_message'] = base64.b64encode('HELLO THIS IS REQUEST\r\nWHAT IS HEADER FORMAT\r\n')
    v = json.loads(perform_comm(json.dumps(comm_data)))
    print v

    assert v['success'] == False
    assert 'message' in v
예제 #7
0
def test_proxy_client_factory_prepare_reqs_simple(mocker, freeze):
    import datetime
    freeze.freeze(datetime.datetime(2015, 1, 1, 3, 30, 15, 50))

    req = http.Request('GET / HTTP/1.1\r\n\r\n')

    rsave = mocker.patch.object(pappyproxy.http.Request, 'async_deep_save', autospec=True, side_effect=mock_req_async_save)
    rsave.return_value = mock_deferred()
    mocker.patch('pappyproxy.context.in_scope').return_value = True
    mocker.patch('pappyproxy.macros.mangle_request').return_value = mock_deferred((req, False))

    cf = ProxyClientFactory(req,
                            save_all=False,
                            stream_response=False,
                            return_transport=None)
    yield cf.prepare_request()
    assert req.time_start == datetime.datetime(2015, 1, 1, 3, 30, 15, 50)
    assert req.reqid is None
    assert not rsave.called
    assert len(rsave.mock_calls) == 0
예제 #8
0
def test_submit_request_fail(mocker, http_request):
    mocker.patch.object(pappyproxy.http.Request,
                        'submit_request',
                        new=mock_loader_fail())
    mocker.patch('pappyproxy.http.Request.async_deep_save'
                 ).return_value = mock_deferred()

    comm_data = {"action": "submit"}
    comm_data['full_message'] = base64.b64encode(
        'HELLO THIS IS REQUEST\r\nWHAT IS HEADER FORMAT\r\n')
    v = json.loads(perform_comm(json.dumps(comm_data)))
    print v

    assert v['success'] == False
    assert 'message' in v
예제 #9
0
def test_proxy_server_make_ssl_connection(mocker, server_protocol):
    mssle_class = mocker.patch("twisted.internet.endpoints.SSL4ClientEndpoint")
    mssle_class.return_value = mssle = mock.MagicMock()
    mssle.connect.return_value = mock_deferred()

    server_protocol._client_factory = mock.MagicMock() # We already tested that this gets set up correctly

    req = http.Request("GET / HTTP/1.1\r\n\r\n", is_ssl=True)
    req.host = 'Foo.Bar.Brazzers'
    req.port = 80085
    server_protocol._request_obj = req

    yield server_protocol._make_remote_connection(req)
    targs, tkwargs =  mssle_class.call_args
    assert targs[1] == 'Foo.Bar.Brazzers'
    assert targs[2] == 80085
    assert tkwargs == {}
    mssle.connect.assert_called_once_with(server_protocol._client_factory)
예제 #10
0
def test_proxy_server_make_ssl_connection(mocker, server_protocol):
    mssle_class = mocker.patch("twisted.internet.endpoints.SSL4ClientEndpoint")
    mssle_class.return_value = mssle = mock.MagicMock()
    mssle.connect.return_value = mock_deferred()

    server_protocol._client_factory = mock.MagicMock(
    )  # We already tested that this gets set up correctly

    req = http.Request("GET / HTTP/1.1\r\n\r\n", is_ssl=True)
    req.host = 'Foo.Bar.Brazzers'
    req.port = 80085
    server_protocol._request_obj = req

    yield server_protocol._make_remote_connection(req)
    targs, tkwargs = mssle_class.call_args
    assert targs[1] == 'Foo.Bar.Brazzers'
    assert targs[2] == 80085
    assert tkwargs == {}
    mssle.connect.assert_called_once_with(server_protocol._client_factory)
예제 #11
0
def test_proxy_server_no_streaming_with_int_macros(mocker):
    mfactory = mock.MagicMock()
    mfactory_class = mocker.patch('pappyproxy.proxy.ProxyClientFactory')
    mfactory_class.return_value = mfactory

    mocker.patch('pappyproxy.proxy.ProxyServer._make_remote_connection')

    mfactory.prepare_request.return_value = mock_deferred(None)
    full_req = ('POST /fooo HTTP/1.1\r\n'
                'Test-Header: foo\r\n'
                'Content-Length: 4\r\n'
                '\r\n'
                'ABCD')

    int_macros = [{'mockmacro': mock_int_macro(modified_req='GET / HTTP/1.1\r\n\r\n')}]
    server_protocol = gen_server_protocol(int_macros=int_macros)
    server_protocol.dataReceived(full_req)
    f_args, f_kwargs = mfactory_class.call_args
    assert f_kwargs['stream_response'] == False
예제 #12
0
def test_submit_request(mocker, http_request):
    rsp = Response('HTTP/1.1 200 OK\r\n\r\n')
    mocker.patch.object(pappyproxy.http.Request, 'submit_request', new=mock_submitter(rsp))
    mocker.patch('pappyproxy.http.Request.async_deep_save').return_value = mock_deferred()

    comm_data = {"action": "submit"}
    comm_data['host'] = http_request.host
    comm_data['port'] = http_request.port
    comm_data['is_ssl'] = http_request.is_ssl
    comm_data['full_message'] = base64.b64encode(http_request.full_message)
    comm_data['tags'] = ['footag']
    v = perform_comm(json.dumps(comm_data))

    expected_data = {}
    expected_data[u'request'] = json.loads(http_request.to_json())
    expected_data[u'response'] = json.loads(http_request.response.to_json())
    expected_data[u'success'] = True
    expected_data[u'request'][u'tags'] = [u'footag']
    assert json.loads(v) == expected_data
예제 #13
0
def test_proxy_client_factory_prepare_reqs_360_noscope(mocker, freeze):
    import datetime
    freeze.freeze(datetime.datetime(2015, 1, 1, 3, 30, 15, 50))

    req = http.Request('GET / HTTP/1.1\r\n\r\n')

    rsave = mocker.patch('pappyproxy.http.Request.async_deep_save')
    rsave.return_value = mock_deferred()
    mocker.patch('pappyproxy.context.in_scope').return_value = False
    mocker.patch('pappyproxy.macros.mangle_request', new=func_deleted)

    cf = ProxyClientFactory(req,
                            save_all=True,
                            stream_response=False,
                            return_transport=None)
    yield cf.prepare_request()
    assert req.time_start == None
    assert req.reqid is None
    assert not rsave.called
    assert len(rsave.mock_calls) == 0
예제 #14
0
def test_proxy_client_factory_prepare_reqs_360_noscope(mocker, freeze):
    import datetime
    freeze.freeze(datetime.datetime(2015, 1, 1, 3, 30, 15, 50))

    req = http.Request('GET / HTTP/1.1\r\n\r\n')

    rsave = mocker.patch('pappyproxy.http.Request.async_deep_save')
    rsave.return_value = mock_deferred()
    mocker.patch('pappyproxy.context.in_scope').return_value = False
    mocker.patch('pappyproxy.macros.mangle_request', new=func_deleted)

    cf = ProxyClientFactory(req,
                            save_all=True,
                            stream_response=False,
                            return_transport=None)
    yield cf.prepare_request()
    assert req.time_start == None
    assert req.reqid is None
    assert not rsave.called
    assert len(rsave.mock_calls) == 0
예제 #15
0
def test_proxy_server_no_streaming_with_int_macros(mocker):
    mfactory = mock.MagicMock()
    mfactory_class = mocker.patch('pappyproxy.proxy.ProxyClientFactory')
    mfactory_class.return_value = mfactory

    mocker.patch('pappyproxy.proxy.ProxyServer._make_remote_connection')

    mfactory.prepare_request.return_value = mock_deferred(None)
    full_req = ('POST /fooo HTTP/1.1\r\n'
                'Test-Header: foo\r\n'
                'Content-Length: 4\r\n'
                '\r\n'
                'ABCD')

    int_macros = [{
        'mockmacro':
        mock_int_macro(modified_req='GET / HTTP/1.1\r\n\r\n')
    }]
    server_protocol = gen_server_protocol(int_macros=int_macros)
    server_protocol.dataReceived(full_req)
    f_args, f_kwargs = mfactory_class.call_args
    assert f_kwargs['stream_response'] == False
예제 #16
0
def test_submit_request(mocker, http_request):
    rsp = Response('HTTP/1.1 200 OK\r\n\r\n')
    mocker.patch.object(pappyproxy.http.Request,
                        'submit_request',
                        new=mock_submitter(rsp))
    mocker.patch('pappyproxy.http.Request.async_deep_save'
                 ).return_value = mock_deferred()

    comm_data = {"action": "submit"}
    comm_data['host'] = http_request.host
    comm_data['port'] = http_request.port
    comm_data['is_ssl'] = http_request.is_ssl
    comm_data['full_message'] = base64.b64encode(http_request.full_message)
    comm_data['tags'] = ['footag']
    v = perform_comm(json.dumps(comm_data))

    expected_data = {}
    expected_data[u'request'] = json.loads(http_request.to_json())
    expected_data[u'response'] = json.loads(http_request.response.to_json())
    expected_data[u'success'] = True
    expected_data[u'request'][u'tags'] = [u'footag']
    assert json.loads(v) == expected_data
예제 #17
0
def rsp_mangler_change(request):
    rsp = http.Response('HTTP/1.1 500 MANGLED\r\n\r\n')
    d = mock_deferred(rsp)
    return d
예제 #18
0
def req_mangler_change(request):
    req = http.Request('GET /mangled HTTP/1.1\r\n\r\n')
    d = mock_deferred(req)
    return d
예제 #19
0
def rsp_mangler_change(request, conn_id):
    req = http.Request()
    rsp = http.Response('HTTP/1.1 500 MANGLED\r\n\r\n')
    req.response = rsp
    d = mock_deferred(req)
    return d
예제 #20
0
 def f(request, mangle_macros):
     request.response = new_rsp
     return mock_deferred(True)
예제 #21
0
def notouch_mangle_req(request, conn_id):
    orig_req = http.Request(request.full_request)
    orig_req.port = request.port
    orig_req.is_ssl = request.is_ssl
    d = mock_deferred(orig_req)
    return d
예제 #22
0
def notouch_mangle_rsp(request):
    d = mock_deferred(request.response)
    return d
예제 #23
0
def notouch_mangle_req(request):
    d = mock_deferred(request)
    return d
예제 #24
0
def notouch_mangle_rsp(response, conn_id):
    req = http.Request()
    orig_rsp = http.Response(response.full_response)
    req.response = orig_rsp
    d = mock_deferred(req)
    return d
예제 #25
0
def ignore_edit(mocker):
    new_edit = mock.MagicMock()
    new_edit.return_value = mock_deferred(None)
    mocker.patch('pappyproxy.console.edit_file', new=new_edit)
예제 #26
0
 def f(_, req, *args, **kwargs):
     req.response = rsp
     req.reqid = 123
     return mock_deferred(req)
예제 #27
0
def rsp_mangler_drop(request):
    return mock_deferred(None)
예제 #28
0
def test_mock_deferreds():
    d = mock_deferred('Hello!')
    r = yield d
    assert r == 'Hello!'
예제 #29
0
 def inc_day_mangle(x, y):
     freeze.delta(days=1)
     return mock_deferred((mangreq, True))
예제 #30
0
 def f(_, req, *args, **kwargs):
     req.response = rsp
     req.reqid = 123
     return mock_deferred(req)
예제 #31
0
 def f(request, mangle_macros):
     request.response = new_rsp
     return mock_deferred(True)
예제 #32
0
def mock_req_async_save(req):
    req.reqid = str(random.randint(1, 1000000))
    return mock_deferred()
예제 #33
0
 def inc_day_mangle(x, y):
     freeze.delta(days=1)
     return mock_deferred((mangreq, True))
예제 #34
0
def ignore_edit(mocker):
    new_edit = mock.MagicMock()
    new_edit.return_value = mock_deferred(None)
    mocker.patch('pappyproxy.console.edit_file', new=new_edit)
예제 #35
0
def notouch_mangle_req(request):
    d = mock_deferred(request)
    return d
예제 #36
0
def req_mangler_change(request):
    req = http.Request('GET /mangled HTTP/1.1\r\n\r\n')
    d = mock_deferred(req)
    return d
예제 #37
0
def notouch_mangle_rsp(request):
    d = mock_deferred(request.response)
    return d
예제 #38
0
def rsp_mangler_change(request):
    rsp = http.Response('HTTP/1.1 500 MANGLED\r\n\r\n')
    d = mock_deferred(rsp)
    return d
예제 #39
0
def rsp_mangler_drop(request):
    return mock_deferred(None)
예제 #40
0
def mock_req_async_save(req):
    req.reqid = str(random.randint(1,1000000))
    return mock_deferred()
예제 #41
0
def test_mock_deferreds():
    d = mock_deferred('Hello!')
    r = yield d
    assert r == 'Hello!'
예제 #42
0
def ignore_edit(mocker):
    new_edit = mock.MagicMock()
    new_edit.return_value = mock_deferred(None)
    new_plugin = mock.MagicMock()
    new_plugin.return_value = new_edit
    mocker.patch("pappyproxy.plugin.plugin_by_name", new=new_plugin)
예제 #43
0
def ignore_edit(mocker):
    new_edit = mock.MagicMock()
    new_edit.return_value = mock_deferred(None)
    new_plugin = mock.MagicMock()
    new_plugin.return_value = new_edit
    mocker.patch('pappyproxy.plugin.plugin_by_name', new=new_plugin)