This commit is contained in:
Benjamin Dauvergne 2016-02-26 13:04:14 +01:00
parent bd216c7ab7
commit 75382c9ab1
2 changed files with 32 additions and 19 deletions

View File

@ -2,18 +2,19 @@ from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
class UserSAMLIdentifier(models.Model):
user = models.ForeignKey(
verbose_name=_('user'),
to=settings.AUTH_USER_MODEL,
related_name='saml_identifiers')
issuer = models.TextField(
verbose_name=_('Issuer'))
user = models.ForeignKey(
verbose_name=_('user'),
to=settings.AUTH_USER_MODEL,
related_name='saml_identifiers')
issuer = models.TextField(
verbose_name=_('Issuer'))
name_id = models.TextField(
verbose_name=_('SAML identifier'))
verbose_name=_('SAML identifier'))
created = models.DateTimeField(
verbose_name=_('created'),
auto_now_add=True)
verbose_name=_('created'),
auto_now_add=True)
class Meta:
verbose_name = _('user SAML identifier')

View File

@ -1,6 +1,4 @@
import logging
import re
import time
import datetime
import importlib
from functools import wraps
@ -11,7 +9,7 @@ import dateutil.parser
from django.core.urlresolvers import reverse
from django.template.loader import render_to_string
from django.utils.timezone import make_aware, utc, now, make_naive, is_aware
from django.utils.timezone import make_aware, now, make_naive, is_aware
from django.conf import settings
import lasso
@ -44,6 +42,7 @@ def create_metadata(request):
SERVERS = {}
def create_server(request):
logger = logging.getLogger(__name__)
root = request.build_absolute_uri('/')
@ -59,7 +58,7 @@ def create_server(request):
if isinstance(private_key, (tuple, list)):
private_key_password = private_key[1]
private_key = private_key[0]
else: # no signature
else: # no signature
private_key = None
private_key_password = None
server = lasso.Server.newFromBuffers(metadata,
@ -102,6 +101,7 @@ def create_server(request):
SERVERS[root] = server
return SERVERS[root]
def create_login(request):
server = create_server(request)
login = lasso.Login(server)
@ -109,6 +109,7 @@ def create_login(request):
login.setSignatureHint(lasso.PROFILE_SIGNATURE_HINT_FORBID)
return login
def get_idp(entity_id):
for adapter in get_adapters():
if hasattr(adapter, 'get_idp'):
@ -117,12 +118,14 @@ def get_idp(entity_id):
return idp
return {}
def get_idps():
for adapter in get_adapters():
if hasattr(adapter, 'get_idps'):
for idp in adapter.get_idps():
yield idp
def flatten_datetime(d):
d = d.copy()
for key, value in d.iteritems():
@ -130,6 +133,7 @@ def flatten_datetime(d):
d[key] = value.isoformat() + 'Z'
return d
def iso8601_to_datetime(date_string):
'''Convert a string formatted as an ISO8601 date into a time_t
value.
@ -144,20 +148,24 @@ def iso8601_to_datetime(date_string):
dt = make_aware(dt)
return dt
def get_seconds_expiry(datetime_expiry):
return (datetime_expiry - now()).total_seconds()
def to_list(func):
@wraps(func)
def f(*args, **kwargs):
return list(func(*args, **kwargs))
return f
def import_object(path):
module, name = path.rsplit('.', 1)
module = importlib.import_module(module)
return getattr(module, name)
@to_list
def get_adapters(idp={}):
idp = idp or {}
@ -165,6 +173,7 @@ def get_adapters(idp={}):
for adapter in adapters:
yield import_object(adapter)()
def get_values(saml_attributes, name):
values = saml_attributes.get(name)
if values is None:
@ -173,12 +182,14 @@ def get_values(saml_attributes, name):
return (values,)
return values
def get_setting(idp, name, default=None):
'''Get a parameter from an IdP specific configuration or from the main
settings.
'''
return idp.get(name) or getattr(app_settings, name, default)
def create_logout(request):
logger = logging.getLogger(__name__)
server = create_server(request)
@ -190,12 +201,12 @@ def create_logout(request):
name_id_name_qualifier = mellon_session.get('name_id_name_qualifier')
name_id_sp_name_qualifier = mellon_session.get('name_id_sp_name_qualifier')
session_dump = render_to_string('mellon/session_dump.xml', {
'entity_id': entity_id,
'session_index': session_index,
'name_id_format': name_id_format,
'name_id_content': name_id_content,
'name_id_name_qualifier': name_id_name_qualifier,
'name_id_sp_name_qualifier': name_id_sp_name_qualifier,
'entity_id': entity_id,
'session_index': session_index,
'name_id_format': name_id_format,
'name_id_content': name_id_content,
'name_id_name_qualifier': name_id_name_qualifier,
'name_id_sp_name_qualifier': name_id_sp_name_qualifier,
})
logger.debug('session_dump %s', session_dump)
logout = lasso.Logout(server)
@ -204,5 +215,6 @@ def create_logout(request):
logout.setSessionFromDump(session_dump)
return logout
def is_nonnull(s):
return not '\x00' in s