def testUpdateIpFilter(self):
        observer = CallTrace(methods={'handleRequest': handleRequest})
        ipf = IpFilter(allowedIps=['192.168.1.1'], allowedIpRanges=[('10.0.0.1', '10.0.0.2'), '2001:41c8:10:7b::/64'])

        dna = be(
            (Observable(),
                (ipf,
                    (observer,)
                )
            )
        )

        list(compose(dna.all.handleRequest(Client=('127.0.0.1',), Headers={})))
        list(compose(dna.all.handleRequest(Client=('10.0.0.10',), Headers={})))
        self.assertEquals(0, len(observer.calledMethods))
        list(compose(dna.all.handleRequest(Client=('192.168.1.1',), Headers={})))
        self.assertEquals(1, len(observer.calledMethods))
        del observer.calledMethods[:]

        list(compose(dna.all.handleRequest(Client=('2001:41c8:10:7b:aa:6:0:2', ), Headers={})))
        self.assertEquals(1, len(observer.calledMethods))
        del observer.calledMethods[:]

        ipf.updateIps(ipAddresses=['127.0.0.1'], ipRanges=[('10.0.0.1', '10.0.0.255'), '2001:41c8:10:7c::/64'])
        list(compose(dna.all.handleRequest(Client=('192.168.1.1',), Headers={})))
        self.assertEquals(0, len(observer.calledMethods))
        list(compose(dna.all.handleRequest(Client=('127.0.0.1',), Headers={})))
        list(compose(dna.all.handleRequest(Client=('10.0.0.10',), Headers={})))
        self.assertEquals(2, len(observer.calledMethods))

        list(compose(dna.all.handleRequest(Client=('2001:41c8:10:7b:aa:6:0:2', ), Headers={})))
        self.assertEquals(2, len(observer.calledMethods))
        list(compose(dna.all.handleRequest(Client=('2001:41c8:10:7c:aa:6:0:2', ), Headers={})))
        self.assertEquals(3, len(observer.calledMethods))
 def testFilterIpAddressDoesNotWorkIfNotInTestmode(self):
     ipf = IpFilter(allowedIps=['10.0.0.1'])
     Headers = {'X-Meresco-Ipfilter-Fake-Ip': '10.0.0.1'}
     self.assertEquals(True, ipf.filterIpAddress(ipaddress='127.0.0.1', Headers=Headers))
     try:
         os.environ['TESTMODE'] = 'FALSE'
         ipf = IpFilter(allowedIps=['10.0.0.1'])
         Headers = {'X-Meresco-Ipfilter-Fake-Ip': '10.0.0.1'}
         self.assertEquals(False, ipf.filterIpAddress(ipaddress='127.0.0.1', Headers=Headers))
     finally:
         os.environ['TESTMODE'] = 'TRUE'
    def testUpdateIpFilter(self):
        observer = CallTrace(methods={'handleRequest': handleRequest})
        ipf = IpFilter(allowedIps=['192.168.1.1'],
                       allowedIpRanges=[('10.0.0.1', '10.0.0.2'),
                                        '2001:41c8:10:7b::/64'])

        dna = be((Observable(), (ipf, (observer, ))))

        list(compose(dna.all.handleRequest(Client=('127.0.0.1', ),
                                           Headers={})))
        list(compose(dna.all.handleRequest(Client=('10.0.0.10', ),
                                           Headers={})))
        self.assertEqual(0, len(observer.calledMethods))
        list(
            compose(dna.all.handleRequest(Client=('192.168.1.1', ),
                                          Headers={})))
        self.assertEqual(1, len(observer.calledMethods))
        del observer.calledMethods[:]

        list(
            compose(
                dna.all.handleRequest(Client=('2001:41c8:10:7b:aa:6:0:2', ),
                                      Headers={})))
        self.assertEqual(1, len(observer.calledMethods))
        del observer.calledMethods[:]

        ipf.updateIps(ipAddresses=['127.0.0.1'],
                      ipRanges=[('10.0.0.1', '10.0.0.255'),
                                '2001:41c8:10:7c::/64'])
        list(
            compose(dna.all.handleRequest(Client=('192.168.1.1', ),
                                          Headers={})))
        self.assertEqual(0, len(observer.calledMethods))
        list(compose(dna.all.handleRequest(Client=('127.0.0.1', ),
                                           Headers={})))
        list(compose(dna.all.handleRequest(Client=('10.0.0.10', ),
                                           Headers={})))
        self.assertEqual(2, len(observer.calledMethods))

        list(
            compose(
                dna.all.handleRequest(Client=('2001:41c8:10:7b:aa:6:0:2', ),
                                      Headers={})))
        self.assertEqual(2, len(observer.calledMethods))
        list(
            compose(
                dna.all.handleRequest(Client=('2001:41c8:10:7c:aa:6:0:2', ),
                                      Headers={})))
        self.assertEqual(3, len(observer.calledMethods))
    def testFilterIpAddress(self):
        ipf = IpFilter(allowedIps=['10.0.0.1'])
        self.assertEquals(False, ipf.filterIpAddress(ipaddress='127.0.0.1'))
        self.assertEquals(True, ipf.filterIpAddress(ipaddress='10.0.0.1'))

        Headers = {'X-Meresco-Ipfilter-Fake-Ip': '10.99.99.99'}
        self.assertEquals(False, ipf.filterIpAddress(ipaddress='127.0.0.1', Headers=Headers))
        Headers = {'X-Meresco-Ipfilter-Fake-Ip': '10.0.0.1'}
        self.assertEquals(False, ipf.filterIpAddress(ipaddress='127.99.99.99', Headers=Headers))

        self.assertEquals(True, ipf.filterIpAddress(ipaddress='127.0.0.1', Headers=Headers))

        ipf = IpFilter(allowedIps=['2001:41c8:10:7b:aa:6:0:1'])
        self.assertEquals(False, ipf.filterIpAddress(ipaddress='::1'))
        self.assertEquals(True, ipf.filterIpAddress(ipaddress='2001:41c8:10:7b:aa:6:0:1'))
    def _assertValidIp(self, address, ipranges, ips, headers, passed):
        self.observer = CallTrace('Observer',
                                  methods={'handleRequest': handleRequest})

        dna = be((Observable(), (IpFilter(allowedIps=ips,
                                          allowedIpRanges=ipranges),
                                 (self.observer, ))))

        list(
            compose(dna.all.handleRequest(Client=(address, ),
                                          Headers=headers)))
        if passed:
            self.assertEqual(1, len(self.observer.calledMethods))
            self.assertEqual('handleRequest',
                             self.observer.calledMethods[0].name)
            self.assertEqual((address, ),
                             self.observer.calledMethods[0].kwargs['Client'])
        else:
            self.assertEqual(0, len(self.observer.calledMethods))
 def testFilterIpAddressDoesNotWorkIfNotInTestmode(self):
     ipf = IpFilter(allowedIps=['10.0.0.1'])
     Headers = {'X-Meresco-Ipfilter-Fake-Ip': '10.0.0.1'}
     self.assertEqual(
         True, ipf.filterIpAddress(ipaddress='127.0.0.1', Headers=Headers))
     try:
         os.environ['TESTMODE'] = 'FALSE'
         ipf = IpFilter(allowedIps=['10.0.0.1'])
         Headers = {'X-Meresco-Ipfilter-Fake-Ip': '10.0.0.1'}
         self.assertEqual(
             False,
             ipf.filterIpAddress(ipaddress='127.0.0.1', Headers=Headers))
     finally:
         os.environ['TESTMODE'] = 'TRUE'
    def testIpfilterFakeIpHeaderKwargsUnchanged(self):
        observer = CallTrace(methods={'handleRequest': handleRequest})
        ipf = IpFilter(allowedIps=['192.168.1.1'])

        dna = be((Observable(), (ipf, (observer, ))))

        list(
            compose(
                dna.all.handleRequest(
                    Client=('127.0.0.1', ),
                    Headers={'X-Meresco-Ipfilter-Fake-Ip': '192.168.1.1'})))

        self.assertEqual(1, len(observer.calledMethods))
        self.assertEqual((), observer.calledMethods[0].args)
        self.assertEqual(
            {
                'Client': ('127.0.0.1', ),
                'Headers': {
                    'X-Meresco-Ipfilter-Fake-Ip': '192.168.1.1'
                }
            }, observer.calledMethods[0].kwargs)
def main(reactor, port, statePath, **ignored):

    oaiSuspendRegister = SuspendRegister()
    oaiJazz = be((OaiJazz(join(statePath, 'oai')), (oaiSuspendRegister, )))

    # WST:
    # strategie = HashDistributeStrategy() # filename (=partname) is also hashed: difficult to read by human eye...
    strategie = Md5HashDistributeStrategy()

    storeComponent = StorageComponent(
        join(statePath, 'store'),
        strategy=strategie,
        partsRemovedOnDelete=[NORMALISED_DOC_NAME])

    return \
    (Observable(),
        # (scheduledCommitPeriodicCall,),
        # (DebugPrompt(reactor=reactor, port=port+1, globals=locals()),),
        (ObservableHttpServer(reactor=reactor, port=port),
            (BasicHttpHandler(),
                (IpFilter(allowedIps=['127.0.0.1']),
                    (PathFilter('/oaix', excluding=['/oaix/info']),
                        (OaiPmh(repositoryName='Gateway',
                                adminEmail='*****@*****.**',
                                supportXWait=True,
                                batchSize=2000 # Override default batch size of 200.
                            ),
                            (oaiJazz,),
                            (oaiSuspendRegister,),
                            (StorageAdapter(),
                                (storeComponent,),
                            ),
                        )
                    ),
                    (PathFilter('/oaix/info'),
                        (OaiInfo(reactor=reactor, oaiPath='/oai'),
                            (oaiJazz,),
                        )
                    ),
                ),
                (PathFilter('/update'),
                    (SruRecordUpdate(sendRecordData=False, logErrors=True,),
                        (FilterMessages(allowed=['delete']),
                            (storeComponent,),
                            (oaiJazz,),
                        ),
                        (FilterMessages(allowed=['add']),

                            # Does not work? See comments in component...
                            # (AddMetadataFormat(fromKwarg="lxmlNode", name='md_format'),
                            #     (LogComponent("AddMetadataFormat"),),
                            # ),
                            (XmlXPath(['srw:recordData/*'], fromKwarg='lxmlNode'), # Stuurt IEDERE matching node in een nieuw bericht door.
                                # (LogComponent("TO LONG CONVERTER:"),),
                                (AddMetadataNamespace(dateformat="%Y-%m-%dT%H:%M:%SZ", fromKwarg='lxmlNode'), # Adds metadataNamespace to meta part in the message.
                                    (NormaliseOaiRecord(fromKwarg='lxmlNode'), # Normalises record to: long & original parts. Raises ValidationException if no 'known' metadataformat 
                                        (XmlPrintLxml(fromKwarg='lxmlNode', toKwarg='data', pretty_print=False),
                                            (RewritePartname(NORMALISED_DOC_NAME), # Rename converted part.
                                                (storeComponent,), # Store converted/renamed part.
                                            )
                                        )
                                    ),
                                    (OaiAddDeleteRecordWithPrefixesAndSetSpecs(metadataPrefixes=[NORMALISED_DOC_NAME]),
                                        (oaiJazz,),
                                    )
                                )
                            )
                        )
                    )
                )
            )
        )
    )
Beispiel #9
0
def main(reactor, port, statePath, **ignored):

    oaiSuspendRegister = SuspendRegister()
    oaiJazz = be((OaiJazz(join(statePath, 'oai'),
                          alwaysDeleteInPrefixes=[NORMALISED_DOC_NAME]),
                  (oaiSuspendRegister, )))

    normLogger = Logger(join(statePath, 'normlogger'))

    # strategie = HashDistributeStrategy() # filename (=partname) is also hashed: difficult to read by human eye...
    strategie = Md5HashDistributeStrategy()

    storeComponent = StorageComponent(
        join(statePath, 'store'),
        strategy=strategie,
        partsRemovedOnDelete=[NORMALISED_DOC_NAME])

    return \
    (Observable(),
        # (scheduledCommitPeriodicCall,),
        # (DebugPrompt(reactor=reactor, port=port+1, globals=locals()),),
        (ObservableHttpServer(reactor=reactor, port=port),
            (BasicHttpHandler(),
                (IpFilter(allowedIps=['127.0.0.1']),
                    (PathFilter('/oaix', excluding=['/oaix/info']),
                        (OaiPmh(repositoryName='Gateway',
                                adminEmail='*****@*****.**',
                                supportXWait=True,
                                batchSize=2000 # Override default batch size of 200.
                            ),
                            (oaiJazz,),
                            (oaiSuspendRegister,),
                            (StorageAdapter(),
                                (storeComponent,),
                            ),
                        )
                    ),
                    (PathFilter('/oaix/info'),
                        (OaiInfo(reactor=reactor, oaiPath='/oai'),
                            (oaiJazz,),
                        )
                    ),
                ),
                (PathFilter('/update'),
                    (SruRecordUpdate(sendRecordData=False, logErrors=True,),
                        (FilterMessages(allowed=['delete']),
                            (storeComponent,),
                            (oaiJazz,),
                        ),
                        (FilterMessages(allowed=['add']),
                            # (LogComponent("LXML:"),),
                            (Validate([('DIDL container','//didl:DIDL', 'didl.xsd'), ('MODS metadata', '//mods:mods', 'mods-3-6.xsd')]),
                                # (LogComponent("VALIDATED:"),),
                                (AddMetadataDocumentPart(partName='normdoc', fromKwarg='lxmlNode'),
                                    (NormaliseDIDL(nsMap=namespacesMap, fromKwarg='lxmlNode'), # Normalise DIDL in partname=normdoc metadata
                                        (normLogger,),
                                        (NormaliseMODS(nsMap=namespacesMap, fromKwarg='lxmlNode'), # Normalise MODS in partname=normdoc metadata
                                            (normLogger,),
                                            (XmlPrintLxml(fromKwarg='lxmlNode', toKwarg='data'),
                                                (RewritePartname(NORMALISED_DOC_NAME), # Rename converted part.
                                                    (storeComponent,), # Store converted/renamed part.
                                                )
                                            ),
                                            (OaiAddDeleteRecordWithPrefixesAndSetSpecs(metadataPrefixes=[NORMALISED_DOC_NAME]),
                                                (oaiJazz,),
                                            )
                                        )
                                    )
                                )
                            )
                        )
                    )
                )
            )
        )
    )
    def testFilterIpAddress(self):
        ipf = IpFilter(allowedIps=['10.0.0.1'])
        self.assertEqual(False, ipf.filterIpAddress(ipaddress='127.0.0.1'))
        self.assertEqual(True, ipf.filterIpAddress(ipaddress='10.0.0.1'))

        Headers = {'X-Meresco-Ipfilter-Fake-Ip': '10.99.99.99'}
        self.assertEqual(
            False, ipf.filterIpAddress(ipaddress='127.0.0.1', Headers=Headers))
        Headers = {'X-Meresco-Ipfilter-Fake-Ip': '10.0.0.1'}
        self.assertEqual(
            False,
            ipf.filterIpAddress(ipaddress='127.99.99.99', Headers=Headers))

        self.assertEqual(
            True, ipf.filterIpAddress(ipaddress='127.0.0.1', Headers=Headers))

        ipf = IpFilter(allowedIps=['2001:41c8:10:7b:aa:6:0:1'])
        self.assertEqual(False, ipf.filterIpAddress(ipaddress='::1'))
        self.assertEqual(
            True, ipf.filterIpAddress(ipaddress='2001:41c8:10:7b:aa:6:0:1'))