From 1b29eef87904318e48f99d0a2eaaa9870da95b6c Mon Sep 17 00:00:00 2001
From: Davide Vaghetti <davide.vaghetti@garr.it>
Date: Fri, 4 Dec 2020 11:39:31 +0100
Subject: [PATCH] Moved the edugain_contacts.py script to sirtfi_contacts.py

---
 sirtfi_contacts.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)
 create mode 100755 sirtfi_contacts.py

diff --git a/sirtfi_contacts.py b/sirtfi_contacts.py
new file mode 100755
index 0000000..d718fde
--- /dev/null
+++ b/sirtfi_contacts.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python3
+
+# This script will download the current edugain metadata aggregate XML
+# and parse it to derive a list of contacts in CSV format.
+# This list will be printed to stdout.
+
+import requests
+from xml.etree import ElementTree as ET
+
+
+def strip_start(s, start):
+    if s.startswith(start):
+        return s[len(start):]
+    return s
+
+
+xml_req = requests.get('https://mds.edugain.org/edugain-v1.xml')
+root = ET.fromstring(xml_req.content)
+
+contacts = set()
+seen_doms_mails = set()
+
+ns = {
+    'md': 'urn:oasis:names:tc:SAML:2.0:metadata',
+    'mdui': 'urn:oasis:names:tc:SAML:metadata:ui',
+    'shibmd': 'urn:mace:shibboleth:metadata:1.0',
+    'remd': 'http://refeds.org/metadata',
+    'icmd': 'http://id.incommon.org/metadata'
+}
+
+
+entities = root.findall('./md:EntityDescriptor', ns)
+
+for entity in entities:
+    sec_mails = set()
+    orgname = entity.find('./md:Organization/md:OrganizationDisplayName', ns).text.strip()
+    if not orgname:
+        continue
+    sec_contact_els = entity.findall('./md:ContactPerson[@remd:contactType="http://refeds.org/metadata/contactType/security"]', ns) + \
+    entity.findall('./md:ContactPerson[@icmd:contactType="http://id.incommon.org/metadata/contactType/security"]', ns)    
+    for sec_contact_el in sec_contact_els:
+        mail_el = sec_contact_el.find('./md:EmailAddress', ns)
+        name_el = sec_contact_el.find('./md:GivenName', ns)
+        surname_el = sec_contact_el.find('./md:SurName', ns)
+        if mail_el is None:
+            continue
+        mail = strip_start(mail_el.text, 'mailto:')
+        if name_el is not None:
+            name = name_el.text.strip()
+            if surname_el is not None:
+                surname = surname_el.text.strip()
+                sec_mails.add('"{} {}" <{}>'.format(name, surname, mail))
+            else:
+                sec_mails.add('"{}" <{}>'.format(name, mail))
+        else:
+            sec_mails.add(mail)
+    doms = entity.findall('./md:IDPSSODescriptor/md:Extensions/shibmd:Scope[@regexp="false"]', ns)
+    doms_set = set()
+    for dom in doms:
+        doms_set.add(dom.text)
+    for domain in doms_set:
+        for mail in sec_mails:
+            if (domain,mail) not in seen_doms_mails:
+                seen_doms_mails.add((domain, mail))
+                contacts.add('{},{},{}'.format(domain, mail, orgname))
+
+for contact in sorted(contacts):
+    print(contact)
-- 
GitLab