diff --git a/mdproxy.py b/mdproxy.py index 28816574661663a802f31161da61f337b0888c49..f1e779bced0d0630b223b593f2ac3d92729378fd 100755 --- a/mdproxy.py +++ b/mdproxy.py @@ -15,32 +15,32 @@ app = Flask(__name__) # Find all IdP's in edugain metadata cached = {} -signer_url = 'http://localhost:5001/sign' +signer_url = 'http://localhost:5001' -@app.route('/cache/<path:eid>', methods=['GET']) -def cache(eid): - global cached +@app.route('/<domain>/entities/<path:eid>', methods=['GET']) +def serve(domain, eid): entityID = unquote(eid) if entityID[:6] == "{sha1}": entityID = entityID[6:] else: entityID = hasher(entityID) - if entityID in cached: - if cached[entityID].valid_until > datetime.now(tz.tzutc()): + cached[domain] = cached.get(domain, {}) + if entityID in cached[domain]: + if cached[domain][entityID].valid_until > datetime.now(tz.tzutc()): print(f"serve {entityID}") - return cached[entityID].md + return cached[domain][entityID].md else: print(f"request {entityID}") - result = requests.get(f"{signer_url}/{{sha1}}{entityID}").text + result = requests.get(f"{signer_url}/{domain}/entities/{{sha1}}{entityID}").text 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[entityID] = cached_entity + cached[domain][entityID] = cached_entity return result diff --git a/mdserver.py b/mdserver.py index f0d9a654d2d5515c957b7195dd745f2db5e6c304..dbb2e50894cfb0ff467b9352269b4b9d11a2e9a9 100755 --- a/mdserver.py +++ b/mdserver.py @@ -8,13 +8,14 @@ from datetime import datetime import traceback from utils import read_config, read_domain, hasher, idps, \ - signed, signer, Signers, Entity + signed, signer, Signers, Entity, event_notifier +signers = Signers() app = Flask(__name__) @app.route('/<domain>/entities/<path:eid>', methods=['GET']) -def sign(domain, eid): +def serve(domain, eid): entityID = unquote(eid) if entityID[:6] == "{sha1}": sha1 = entityID[6:] @@ -34,7 +35,7 @@ def sign(domain, eid): print(f"sign {domain} {sha1}") valid_until = idps[domain][sha1].valid_until if valid_until > datetime.now(tz.tzutc()): - signed_element = Signers()[signer[domain]](idps[domain][sha1].md) + signed_element = signers[signer[domain]](idps[domain][sha1].md) signed_xml = ET.tostring(signed_element, pretty_print=True).decode() signed_entity = Entity() signed_entity.md = signed_xml @@ -62,4 +63,6 @@ for domain, values in config.items(): read_domain(domain, values) signer[domain] = values['signer'] + app.run(host='127.0.0.1', port=5001) +event_notifier.start() diff --git a/mdsigner.py b/mdsigner.py index 352eb61ea2bf27b560c97ca497498aa75383e342..23c981d636f47a0daf4349606e2100aa5583cd9d 100755 --- a/mdsigner.py +++ b/mdsigner.py @@ -6,7 +6,7 @@ from concurrent.futures import ThreadPoolExecutor from lxml import etree as ET # import traceback -from utils import hasher, signer +from utils import hasher, Signers # Find all IdP's in edugain metadata @@ -14,9 +14,7 @@ idps = [] success = 0 failed = 0 maxthreads = 8 - -cert = open("meta.crt").read() -key = open("meta.key").read() +signer = Signers()['normal_signer'] def sign(xml, name): @@ -24,7 +22,7 @@ def sign(xml, name): # print("Signer") try: sha1 = hasher(name) - signed = signer(xml, cert, key) + signed = signer(xml) out = ET.tostring(signed, pretty_print=True).decode() # XMLVerifier().verify(out, x509_cert=cert) with open(f'output/{sha1}.xml', 'w') as f: diff --git a/utils.py b/utils.py index aae3bbce3ae54919b26e1c81f2298774bc80964d..543982d13d05cf6f20c36c0ffd5805f3c8ff8a0c 100644 --- a/utils.py +++ b/utils.py @@ -21,6 +21,13 @@ signed = {} signer = {} +def hasher(entity_id): + sha1 = hashlib.sha1() + sha1.update(entity_id.encode()) + sha1_digest = sha1.hexdigest() + return sha1_digest + + class Entity(object): md = None valid_until = 0 @@ -112,13 +119,4 @@ def read_config(): return config -def hasher(entity_id): - sha1 = hashlib.sha1() - sha1.update(entity_id.encode()) - sha1_digest = sha1.hexdigest() - return sha1_digest - - - event_notifier = pyinotify.ThreadedNotifier(watch_manager, EventProcessor()) -event_notifier.start()