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,), ) ) ) ) ) ) ) ) )
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'))