diff --git a/mellon/models.py b/mellon/models.py index 7dfa1fa..9368a1d 100644 --- a/mellon/models.py +++ b/mellon/models.py @@ -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') diff --git a/mellon/utils.py b/mellon/utils.py index cb14410..f98f040 100644 --- a/mellon/utils.py +++ b/mellon/utils.py @@ -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