diff --git a/mdproxy.py b/mdproxy.py index 6160c8efe629af4cf32e85228ff01fa83d3a80ea..ef73bd30f8ee0a9b6f15dff0260a3d1804bf7846 100755 --- a/mdproxy.py +++ b/mdproxy.py @@ -1,9 +1,11 @@ #!/usr/bin/env python +import requests -from flask import Flask, request +from lxml import etree as ET +from flask import Flask from urllib.parse import unquote -import requests -# import traceback +from dateutil import parser, tz +from datetime import datetime app = Flask(__name__) @@ -13,18 +15,30 @@ cached = {} signer = 'http://localhost:5001/sign' +class Entity(object): + md = None + valid_until = 0 + + @app.route('/cache/<path:eid>', methods=['GET']) def cache(eid): global cached entity = unquote(eid) print(f"entity: {entity}") if entity in cached: - print(f"serve {entity}") - return cached[entity] + if cached[entity].valid_until > datetime.now(tz.tzutc()): + print(f"serve {entity}") + return cached[entity].md else: print(f"request {entity}") result = requests.get(f"{signer}/{entity}").text - cached[entity] = result + parsed = ET.fromstring(result) + validUntil = parsed.get('validUntil') + # cacheDuration = parsed.get('cacheDuration') + cached_entity = Entity + cached_entity.md = result + cached_entity.valid_until = parser.isoparse(validUntil) + cached[entity] = cached_entity return result diff --git a/mdserver.py b/mdserver.py index 5015ac3221163bcd9b3b323f5f96a617c5656de2..1bf6f5da042b01038e6c8e7b22a7e282940da6a6 100755 --- a/mdserver.py +++ b/mdserver.py @@ -3,12 +3,13 @@ import sys import copy from lxml import etree as ET -from signxml import XMLSigner, XMLVerifier -# import hashlib - -from flask import Flask, request +from signxml import XMLSigner +from flask import Flask from urllib.parse import unquote -# import traceback +from dateutil import parser, tz +from datetime import datetime + +# import hashlib app = Flask(__name__) @@ -22,24 +23,36 @@ cert = open("meta.crt").read() key = open("meta.key").read() +class Entity(object): + md = None + valid_until = 0 + + @app.route('/sign/<path:eid>', methods=['GET']) def sign(eid): global idps, signed, cert entity = unquote(eid) - try: - if entity in signed: + if entity in signed: + signed_entity = signed[entity] + if signed_entity.valid_until > datetime.now(tz.tzutc()): print(f"serve {entity}") - return signed[entity] - elif entity in idps: + return signed[entity].md + + if entity in idps: + try: print(f"sign {entity}") - signed_element = XMLSigner().sign(idps[entity], key=key, cert=cert) + signed_element = XMLSigner().sign(idps[entity].md, key=key, cert=cert) signed_xml = ET.tostring(signed_element, pretty_print=True).decode() - signed[entity] = signed_xml + signed_entity = Entity + signed_entity.md = signed_xml + signed_entity.valid_until = idps[entity].valid_until + signed[entity] = signed_entity return signed_xml - except Exception as e: - print(entity) - print(f" {e}") - # traceback.print_exc() + except Exception as e: + print(entity) + print(f" {e}") + + return "No valid metadata\n", 404 for mdfile in sys.argv[1:]: @@ -47,12 +60,18 @@ for mdfile in sys.argv[1:]: root = tree.getroot() ns = copy.deepcopy(root.nsmap) ns['xml'] = 'http://www.w3.org/XML/1998/namespace' - - for idp in root.findall('md:EntityDescriptor', ns): - entityID = idp.attrib.get('entityID', 'none') + validUntil = root.get('validUntil') + cacheDuration = root.get('cacheDuration') + for entity_descriptor in root.findall('md:EntityDescriptor', ns): + entityID = entity_descriptor.attrib.get('entityID', 'none') + entity_descriptor.set('validUntil', validUntil) + entity_descriptor.set('cacheDuration', cacheDuration) + entity = Entity + entity.md = entity_descriptor + entity.valid_until = parser.isoparse(validUntil) if entityID not in idps: print(entityID) - idps[entityID] = idp + idps[entityID] = entity found += 1 print(f"Found: {found}") diff --git a/requirements.txt b/requirements.txt index 18520a310defae0bb031e9df6353facfa1f17bb5..f3c10b9d7d25b1162bbc62934e2020e9cd392358 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ lxml signxml flask requests +python-dateutil