From a00e5d403d9b42bfcce51114fa0a24437c667f64 Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Tue, 21 Jun 2016 14:42:35 +0200 Subject: [PATCH] Add a verbone names to CAS_FEDERATE_PROVIDERS --- README.rst | 8 +++++--- cas_server/default_settings.py | 28 +++++++++++++++++++++++++--- cas_server/forms.py | 9 +++++++-- cas_server/utils.py | 7 +++++++ 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/README.rst b/README.rst index fc2d188..3cf60fb 100644 --- a/README.rst +++ b/README.rst @@ -295,19 +295,21 @@ For instance: .. code-block:: python CAS_FEDERATE_PROVIDERS = { - "example.com": ("https://cas.example.com", 3), - "exemple.fr": ("https://cas.exemple.fr", 3), + "example.com": ("https://cas.example.com", 3, "Example dot com"), + "exemple.fr": ("https://cas.exemple.fr", 3, "Exemple point fr"), } ``CAS_FEDERATE_PROVIDERS`` is a dictionnary using provider names as key and a tuple -(cas address, cas version protocol) as value. +(cas address, cas version protocol, provider verbose name) as value. In federation mode, ``django-cas-server`` build user's username as follow: ``provider_returned_username@provider_name``. You can choose the provider returned username for ``django-cas-server`` and the provider name in order to make sense. +The "provider verbose name" is showed on the select menu of the login page. + Then using federate mode, you should add one command to a daily crontab: ``cas_clean_federate``. This command clean the local cache of federated user from old unused users. diff --git a/cas_server/default_settings.py b/cas_server/default_settings.py index 7b9aca1..2f32134 100644 --- a/cas_server/default_settings.py +++ b/cas_server/default_settings.py @@ -12,6 +12,9 @@ from django.conf import settings from django.contrib.staticfiles.templatetags.staticfiles import static +import re +import six + def setting_default(name, default_value): """if the config `name` is not set, set it the `default_value`""" @@ -76,11 +79,30 @@ setting_default('CAS_SQL_PASSWORD_CHECK', 'crypt') # crypt or plain setting_default('CAS_FEDERATE', False) -# A dict of "provider name" -> (provider CAS server url, CAS version) +# A dict of "provider suffix" -> (provider CAS server url, CAS version, verbose name) setting_default('CAS_FEDERATE_PROVIDERS', {}) if settings.CAS_FEDERATE: settings.CAS_AUTH_CLASS = "cas_server.auth.CASFederateAuth" -CAS_FEDERATE_PROVIDERS_LIST = list(settings.CAS_FEDERATE_PROVIDERS.keys()) -CAS_FEDERATE_PROVIDERS_LIST.sort() +__CAS_FEDERATE_PROVIDERS_LIST = list(settings.CAS_FEDERATE_PROVIDERS.keys()) + + +def __CAS_FEDERATE_PROVIDERS_LIST_sort(key): + if len(settings.CAS_FEDERATE_PROVIDERS[key]) > 2: + key = settings.CAS_FEDERATE_PROVIDERS[key][2].lower() + else: + key = key.lower() + if isinstance(key, six.string_types) or isinstance(key, six.text_type): + return tuple( + int(num) if num else alpha + for num, alpha in __CAS_FEDERATE_PROVIDERS_LIST_sort.tokenize(key) + ) + else: + return key + + +__CAS_FEDERATE_PROVIDERS_LIST_sort.tokenize = re.compile(r'(\d+)|(\D+)').findall +__CAS_FEDERATE_PROVIDERS_LIST.sort(key=__CAS_FEDERATE_PROVIDERS_LIST_sort) + +settings.CAS_FEDERATE_PROVIDERS_LIST = __CAS_FEDERATE_PROVIDERS_LIST diff --git a/cas_server/forms.py b/cas_server/forms.py index 33b3a2c..1036cf5 100644 --- a/cas_server/forms.py +++ b/cas_server/forms.py @@ -9,7 +9,7 @@ # # (c) 2015 Valentin Samir """forms for the app""" -from .default_settings import settings, CAS_FEDERATE_PROVIDERS_LIST +from .default_settings import settings from django import forms from django.utils.translation import ugettext_lazy as _ @@ -30,7 +30,12 @@ class WarnForm(forms.Form): class FederateSelect(forms.Form): provider = forms.ChoiceField( label=_('Identity provider'), - choices=[(p, p) for p in CAS_FEDERATE_PROVIDERS_LIST] + choices=[ + ( + p, + utils.get_tuple(settings.CAS_FEDERATE_PROVIDERS[p], 2, p) + ) for p in settings.CAS_FEDERATE_PROVIDERS_LIST + ] ) service = forms.CharField(label=_('service'), widget=forms.HiddenInput(), required=False) method = forms.CharField(widget=forms.HiddenInput(), required=False) diff --git a/cas_server/utils.py b/cas_server/utils.py index 7d418ad..bfa0fe4 100644 --- a/cas_server/utils.py +++ b/cas_server/utils.py @@ -181,3 +181,10 @@ def gen_pgtiou(): def gen_saml_id(): """Generate an saml id""" return _gen_ticket('_') + + +def get_tuple(tuple, index, default=None): + try: + return tuple[index] + except IndexError: + return default