This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
univnautes-old/virtualenv/pffedportal/create_loginhtml.py

91 lines
2.4 KiB
Python
Executable File

#!/usr/bin/env python
'''
output a merge of idp + geo informations from discojuice
'''
# initialise django environnement for pffedportal
# (the script is launched into the pffedportal directory)
import os
os.environ['DJANGO_SETTINGS_MODULE'] = "settings"
from authentic2.saml.models import LibertyProvider
from xml.etree import ElementTree as ET
from operator import itemgetter
import sys
import json
import math
import urllib
def geo2idp(filename):
idps = {}
try:
f = open(filename)
except IOError, e:
print >> sys.stderr, e
return {}
try:
idp_list = json.load(f)
except ValueError, e:
f.close()
print >> sys.stderr, 'reading %s: %s' % (filename, e)
return {}
f.close()
if not idp_list:
return {}
if not isinstance(idp_list, list):
print >> sys.stderr, '%s does not contain a list' % filename
return {}
for idp in idp_list:
try:
idps[idp['entityID']] = idp
except Exception, e:
print >> sys.stderr, 'bad geo information in %s (%s)' % (filename, idp)
return idps
geo_idps = {}
for geofile in sys.argv[1:]:
geo_idps.update(geo2idp(geofile))
def get_ui_displayname(provider):
def get_first_child(xml, child):
for c in xml:
if c.tag.endswith(child):
return c
return None
xml = ET.fromstring(provider.metadata.encode('utf-8'))
for tag in ('IDPSSODescriptor', 'Extensions', 'UIInfo', 'DisplayName'):
xml = get_first_child(xml, tag)
if xml is None:
return provider.name
return xml.text
n = 0
idps = []
for provider in LibertyProvider.objects.all():
n += 1
geo = geo_idps.get(provider.entity_id, {}).get('geo',
{'lat': 47.0+2.0*math.sin(n), 'lon': 2.5+3.0*math.cos(n)})
idps.append({
'entityid': provider.entity_id,
'name': get_ui_displayname(provider),
'lat': geo['lat'],
'lon': geo['lon'],
'href': '/sso?' + urllib.urlencode([('entity_id', provider.entity_id)]),
})
print """{% extends "login0.html" %}
{% block idps %}"""
for idp in sorted(idps, key=itemgetter('name')):
li = u'<li><a href="%(href)s" class="idplink" ' \
'data-lat="%(lat)s" data-lon="%(lon)s" ' \
'data-entityid="%(entityid)s" ' \
'data-filtertext="%(name)s">%(name)s</a></li>' % idp
print li.encode("utf-8")
print "{% endblock %}"