Example #1
0
class DeproxyTest(TestCase):
    def setUp(self):
        TestCase.setUp(self)

        self.createTree(deproxyForIps=['1.1.1.1'])

    def createTree(self, **kwargs):
        self.deproxy = Deproxy(**kwargs)
        self.observer = CallTrace('Observer', emptyGeneratorMethods=['handleRequest'])
        self.top = be((Observable(),
            (self.deproxy,
                (self.observer,),
            )
        ))

    def testShouldPassthroughHandleRequestIfUnconfigured(self):
        self.createTree()
        consume(self.top.all.handleRequest(Client=("9.1.8.2", 99), Headers={'H': 'eaders'}, other='item'))
        self.assertEquals(['handleRequest'], self.observer.calledMethodNames())
        handleRequest, = self.observer.calledMethods
        self.assertEquals(tuple(), handleRequest.args)
        self.assertEquals(dict(
                Client=("9.1.8.2", 99),
                Headers={'H': 'eaders'},
                port=80,
                other='item',
                OriginalClient=None,
            ), handleRequest.kwargs)

    def testClientInCaseNoXForwardedForHeader(self):
        list(compose(self.top.all.handleRequest(Client=("1.1.1.1", 11111), Headers={})))

        self.assertEquals(1, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[0].kwargs
        self.assertEquals("1.1.1.1", handleRequestCallKwargs['Client'][0])
        self.assertEquals({}, handleRequestCallKwargs['Headers'])

    def testDeproxy(self):
        list(compose(self.top.all.handleRequest(
            Client=("1.1.1.1", 11111),
            Headers={"X-Forwarded-For": "2.2.2.2"})))

        self.assertEquals(1, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[0].kwargs
        self.assertEquals("2.2.2.2", handleRequestCallKwargs['Client'][0])
        self.assertEquals("1.1.1.1", handleRequestCallKwargs['OriginalClient'][0])
        self.assertEquals({"X-Forwarded-For": "2.2.2.2"}, handleRequestCallKwargs['Headers'])

    def testClientFromMulitpleXForwardedForEntries(self):
        list(compose(self.top.all.handleRequest(
             Client=("1.1.1.1", 11111),
             Headers={"X-Forwarded-For": "2.2.2.2,3.3.3.3,4.4.4.4"})))

        self.assertEquals(1, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[0].kwargs
        self.assertEquals('4.4.4.4', handleRequestCallKwargs['Client'][0])
        self.assertEquals({"X-Forwarded-For": "2.2.2.2,3.3.3.3,4.4.4.4"}, handleRequestCallKwargs['Headers'])

        list(compose(self.top.all.handleRequest(
             Client=("1.1.1.1", 11111),
             Headers={"X-Forwarded-For": " 2.2.2.2 , 3.3.3.3, 4.4.4.4 ,"})))
        self.assertEquals('4.4.4.4', self.observer.calledMethods[1].kwargs['Client'][0])

    def testHostFromXForwardedHost(self):
        self.createTree(deproxyForIpRanges=[
            ('9.9.9.0', '9.9.9.255')])
        Headers={
            "Host": "1.1.1.1:11111",
            "X-Forwarded-Host": "2.2.2.2:22222,3.3.3.3:33333,4.4.4.4:44444"
        }
        consume(self.top.all.handleRequest(Client=("9.9.9.9", 9999), port=11111, Headers=Headers))

        self.assertEquals(1, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[0].kwargs
        self.assertEquals("4.4.4.4:44444", handleRequestCallKwargs['Headers']['Host'])
        self.assertEquals(44444, handleRequestCallKwargs['port'])

        Headers={
            "Host": "1.1.1.1:11111",
            "X-Forwarded-Host": "2.2.2.2,3.3.3.3,4.4.4.4"
        }
        consume(self.top.all.handleRequest(Client=("9.9.9.9", 9999), port=11111, Headers=Headers))

        self.assertEquals(2, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[1].kwargs
        self.assertEquals('4.4.4.4', handleRequestCallKwargs['Headers']['Host'])
        self.assertEquals(80, handleRequestCallKwargs['port'])

    def testDeproxyForIps(self):
        self.createTree(deproxyForIps=['3.3.3.3'])
        consume(self.top.all.handleRequest(
            Client=("1.1.1.1", 11111),
            Headers={"X-Forwarded-For": "2.2.2.2"}))

        self.assertEquals(1, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[0].kwargs
        self.assertEquals("1.1.1.1", handleRequestCallKwargs['Client'][0])
        self.assertEquals({"X-Forwarded-For": "2.2.2.2"}, handleRequestCallKwargs['Headers'])

    def testDeproxyUpdateIps(self):
        # Expose updateIps from IpFilter
        self.createTree(deproxyForIps=['127.7.7.7'])

        # White box
        allowDeproxying = lambda ip: self.deproxy._ipfilter.filterIpAddress(ip)
        self.assertEquals(True, allowDeproxying('127.7.7.7'))
        self.assertEquals(False, allowDeproxying('127.0.0.1'))
        self.assertEquals(False, allowDeproxying('10.0.0.1'))

        self.deproxy.updateIps(ipAddresses=['192.168.96.96'], ipRanges=[('10.0.0.0', '10.0.0.2')])
        self.assertEquals(True, allowDeproxying('192.168.96.96'))
        self.assertEquals(True, allowDeproxying('10.0.0.1'))
        self.assertEquals(False, allowDeproxying('127.7.7.7'))
        self.assertEquals(False, allowDeproxying('127.0.0.1'))

        # Black box
        consume(self.top.all.handleRequest(
            Client=("192.168.96.96", 12345),
            Headers={
                "X-Forwarded-For": "2.2.2.2",
                "X-Forwarded-Host": "example.org"}))

        self.assertEquals(1, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[0].kwargs
        self.assertEquals("2.2.2.2", handleRequestCallKwargs['Client'][0])
        self.assertEquals('192.168.96.96', handleRequestCallKwargs['OriginalClient'][0])
        self.assertEquals({"X-Forwarded-For": "2.2.2.2", "X-Forwarded-Host": "example.org", "Host": "example.org"}, handleRequestCallKwargs['Headers'])

    def testOnlyDeproxied(self):
        odp = OnlyDeproxied()
        odp.addObserver(self.observer)
        consume(odp.handleRequest(path='/path'))
        self.assertEquals([], self.observer.calledMethodNames())

        consume(odp.handleRequest(path='/path', OriginalClient=('1.2.3.4', 1234)))
        self.assertEquals(['handleRequest'], self.observer.calledMethodNames())
        self.assertEquals(dict(path='/path', OriginalClient=('1.2.3.4', 1234)), self.observer.calledMethods[0].kwargs)
Example #2
0
class DeproxyTest(TestCase):
    def setUp(self):
        TestCase.setUp(self)

        self.createTree(deproxyForIps=['1.1.1.1'])

    def createTree(self, **kwargs):
        self.deproxy = Deproxy(**kwargs)
        self.observer = CallTrace('Observer', emptyGeneratorMethods=['handleRequest'])
        self.top = be((Observable(),
            (self.deproxy,
                (self.observer,),
            )
        ))

    def testShouldPassthroughHandleRequestIfUnconfigured(self):
        self.createTree()
        consume(self.top.all.handleRequest(Client=("9.1.8.2", 99), Headers={'H': 'eaders'}, other='item'))
        self.assertEqual(['handleRequest'], self.observer.calledMethodNames())
        handleRequest, = self.observer.calledMethods
        self.assertEqual(tuple(), handleRequest.args)
        self.assertEqual(dict(
                Client=("9.1.8.2", 99),
                Headers={'H': 'eaders'},
                port=80,
                other='item',
                OriginalClient=None,
            ), handleRequest.kwargs)

    def testClientInCaseNoXForwardedForHeader(self):
        list(compose(self.top.all.handleRequest(Client=("1.1.1.1", 11111), Headers={})))

        self.assertEqual(1, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[0].kwargs
        self.assertEqual("1.1.1.1", handleRequestCallKwargs['Client'][0])
        self.assertEqual({}, handleRequestCallKwargs['Headers'])

    def testDeproxy(self):
        list(compose(self.top.all.handleRequest(
            Client=("1.1.1.1", 11111),
            Headers={"X-Forwarded-For": "2.2.2.2"})))

        self.assertEqual(1, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[0].kwargs
        self.assertEqual("2.2.2.2", handleRequestCallKwargs['Client'][0])
        self.assertEqual("1.1.1.1", handleRequestCallKwargs['OriginalClient'][0])
        self.assertEqual({"X-Forwarded-For": "2.2.2.2"}, handleRequestCallKwargs['Headers'])

    def testClientFromMulitpleXForwardedForEntries(self):
        list(compose(self.top.all.handleRequest(
             Client=("1.1.1.1", 11111),
             Headers={"X-Forwarded-For": "2.2.2.2,3.3.3.3,4.4.4.4"})))

        self.assertEqual(1, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[0].kwargs
        self.assertEqual('4.4.4.4', handleRequestCallKwargs['Client'][0])
        self.assertEqual({"X-Forwarded-For": "2.2.2.2,3.3.3.3,4.4.4.4"}, handleRequestCallKwargs['Headers'])

        list(compose(self.top.all.handleRequest(
             Client=("1.1.1.1", 11111),
             Headers={"X-Forwarded-For": " 2.2.2.2 , 3.3.3.3, 4.4.4.4 ,"})))
        self.assertEqual('4.4.4.4', self.observer.calledMethods[1].kwargs['Client'][0])

    def testHostFromXForwardedHost(self):
        self.createTree(deproxyForIpRanges=[
            ('9.9.9.0', '9.9.9.255')])
        Headers={
            "Host": "1.1.1.1:11111",
            "X-Forwarded-Host": "2.2.2.2:22222,3.3.3.3:33333,4.4.4.4:44444"
        }
        consume(self.top.all.handleRequest(Client=("9.9.9.9", 9999), port=11111, Headers=Headers))

        self.assertEqual(1, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[0].kwargs
        self.assertEqual("4.4.4.4:44444", handleRequestCallKwargs['Headers']['Host'])
        self.assertEqual(44444, handleRequestCallKwargs['port'])

        Headers={
            "Host": "1.1.1.1:11111",
            "X-Forwarded-Host": "2.2.2.2,3.3.3.3,4.4.4.4"
        }
        consume(self.top.all.handleRequest(Client=("9.9.9.9", 9999), port=11111, Headers=Headers))

        self.assertEqual(2, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[1].kwargs
        self.assertEqual('4.4.4.4', handleRequestCallKwargs['Headers']['Host'])
        self.assertEqual(80, handleRequestCallKwargs['port'])

    def testHostMultiple(self):
        self.createTree(deproxyForIpRanges=[
            ('9.9.9.0', '9.9.9.255')])
        Headers={
            "Host": ["1.1.1.1:11111", "4.4.4.4:44444"],
        }
        consume(self.top.all.handleRequest(Client=("9.9.9.9", 9999), port=11111, Headers=Headers))

        self.assertEqual(1, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[0].kwargs
        self.assertEqual("4.4.4.4:44444", handleRequestCallKwargs['Headers']['Host'])

    def testDeproxyForIps(self):
        self.createTree(deproxyForIps=['3.3.3.3'])
        consume(self.top.all.handleRequest(
            Client=("1.1.1.1", 11111),
            Headers={"X-Forwarded-For": "2.2.2.2"}))

        self.assertEqual(1, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[0].kwargs
        self.assertEqual("1.1.1.1", handleRequestCallKwargs['Client'][0])
        self.assertEqual({"X-Forwarded-For": "2.2.2.2"}, handleRequestCallKwargs['Headers'])

    def testDeproxyUpdateIps(self):
        # Expose updateIps from IpFilter
        self.createTree(deproxyForIps=['127.7.7.7'])

        # White box
        allowDeproxying = lambda ip: self.deproxy._ipfilter.filterIpAddress(ip)
        self.assertEqual(True, allowDeproxying('127.7.7.7'))
        self.assertEqual(False, allowDeproxying('127.0.0.1'))
        self.assertEqual(False, allowDeproxying('10.0.0.1'))

        self.deproxy.updateIps(ipAddresses=['192.168.96.96'], ipRanges=[('10.0.0.0', '10.0.0.2')])
        self.assertEqual(True, allowDeproxying('192.168.96.96'))
        self.assertEqual(True, allowDeproxying('10.0.0.1'))
        self.assertEqual(False, allowDeproxying('127.7.7.7'))
        self.assertEqual(False, allowDeproxying('127.0.0.1'))

        # Black box
        consume(self.top.all.handleRequest(
            Client=("192.168.96.96", 12345),
            Headers={
                "X-Forwarded-For": "2.2.2.2",
                "X-Forwarded-Host": "example.org"}))

        self.assertEqual(1, len(self.observer.calledMethods))
        handleRequestCallKwargs = self.observer.calledMethods[0].kwargs
        self.assertEqual("2.2.2.2", handleRequestCallKwargs['Client'][0])
        self.assertEqual('192.168.96.96', handleRequestCallKwargs['OriginalClient'][0])
        self.assertEqual({"X-Forwarded-For": "2.2.2.2", "X-Forwarded-Host": "example.org", "Host": "example.org"}, handleRequestCallKwargs['Headers'])

    def testOnlyDeproxied(self):
        odp = OnlyDeproxied()
        odp.addObserver(self.observer)
        consume(odp.handleRequest(path='/path'))
        self.assertEqual([], self.observer.calledMethodNames())

        consume(odp.handleRequest(path='/path', OriginalClient=('1.2.3.4', 1234)))
        self.assertEqual(['handleRequest'], self.observer.calledMethodNames())
        self.assertEqual(dict(path='/path', OriginalClient=('1.2.3.4', 1234)), self.observer.calledMethods[0].kwargs)