diff --git a/mdserver.py b/mdserver.py new file mode 100755 index 0000000000000000000000000000000000000000..4b145309363637fb1eb28a2b24e1c3594638c4d5 --- /dev/null +++ b/mdserver.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +import sys +import copy + +from lxml import etree as ET +from signxml import XMLSigner, XMLVerifier +# import hashlib + +from flask import Flask, request +from urllib.parse import unquote +# import traceback + +app = Flask(__name__) + + +# Find all IdP's in edugain metadata +idps = {} +signed = {} +found = 0 + +cert = open("meta.crt").read() +key = open("meta.key").read() + + +@app.route('/sign', methods=['GET']) +def sign(): + global idps, signed, cert + entity = unquote(request.args.get('id')) + try: + if entity in signed: + print(f"serve {entity}") + return signed[entity] + elif entity in idps: + print(f"sign {entity}") + signed_element = XMLSigner().sign(idps[entity], key=key, cert=cert) + signed_xml = ET.tostring(signed_element, pretty_print=True).decode() + signed[entity] = signed_xml + return signed_xml + except Exception as e: + print(entity) + print(f" {e}") + # traceback.print_exc() + + +for mdfile in sys.argv[1:]: + tree = ET.ElementTree(file=mdfile) + 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') + if entityID not in idps: + print(entityID) + idps[entityID] = idp + found += 1 + +print(f"Found: {found}") + +app.run(host='0.0.0.0', port=5001) diff --git a/requirements.txt b/requirements.txt index fa728d53f816b8b6845df799121bb040f616d645..8d90b7ea6b98011c79fdcf7e2ac890cac72d1af9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ lxml signxml +flask