Skip to content
Snippets Groups Projects
Commit 9bdc0095 authored by Davide Vaghetti's avatar Davide Vaghetti
Browse files

First commit

parent bdf40c67
No related branches found
No related tags found
No related merge requests found
# eduGAIN Contacts
This script will download the current edugain metadata aggregate XML and parse it
to derive a list of contacts in CSV format. The list will be printed to stdout.
#!/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
from urllib.parse import urlparse
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 = 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:
orgname = entity.find('./md:Organization/md:OrganizationDisplayName', ns).text.strip()
if not orgname:
continue
contact = entity.find('./md:ContactPerson[@remd:contactType="http://refeds.org/metadata/contactType/security"]', ns)
if contact is None:
contact = entity.find(
'./md:ContactPerson[@icmd:contactType="http://id.incommon.org/metadata/contactType/security"]', ns)
if contact is None:
continue
mail_el = contact.find('./md:EmailAddress', ns)
if mail_el is None:
continue
name_el = contact.find('./md:GivenName', ns)
surname_el = contact.find('./md:SurName', ns)
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()
contact_txt = '"{} {}" <{}>'.format(name, surname, mail)
else:
contact_txt = '"{}" <{}>'.format(name, mail)
else:
contact_txt = mail
doms = entity.findall('./md:IDPSSODescriptor/md:Extensions/mdui:DiscoHints/mdui:DomainHint', ns) + \
entity.findall('./md:IDPSSODescriptor/md:Extensions/shibmd:Scope[@regexp="false"]', ns)
doms = {strip_start(dom.text, 'www.') for dom in doms}
if len(doms) == 0:
orgurl = entity.find('./md:Organization/md:OrganizationURL', ns)
if orgurl is None:
continue
baseurl = strip_start(urlparse(orgurl.text).netloc, 'www.')
if ':' in baseurl:
baseurl = baseurl.split(':')[0]
doms = {baseurl}
for domain in doms:
if domain not in seen_doms:
seen_doms.add(domain)
contacts.add('{},{},{}'.format(domain, contact_txt, orgname))
for contact in sorted(contacts):
print(contact)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment