From: Simo Sorce Date: Mon, 23 Feb 2015 04:53:33 +0000 (-0500) Subject: Use the new Policy engine for login/info mapping X-Git-Tag: v0.4.0~11 X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fipsilon.git;a=commitdiff_plain;h=29542bc6407f06edb5bebedc64b84802f1ccb154 Use the new Policy engine for login/info mapping The InfoMapping class is now only used to prettify the default set of wellknown attributes. Signed-off-by: Simo Sorce Reviewed-by: Patrick Uiterwijk --- diff --git a/ipsilon/info/common.py b/ipsilon/info/common.py index 16a7e29..0a5cb74 100644 --- a/ipsilon/info/common.py +++ b/ipsilon/info/common.py @@ -37,27 +37,12 @@ class InfoMapping(Log): 'language': 'Language', 'timezone': 'Time Zone', } - self.mapping = dict() - - def set_mapping(self, attrs_map): - self.mapping = attrs_map def display_name(self, name): if name in self.standard_attributes: return self.standard_attributes[name] return name - def map_attrs(self, attrs): - s = dict() - e = dict() - for a in attrs: - if a in self.mapping: - s[self.mapping[a]] = attrs[a] - else: - e[a] = attrs[a] - - return s, e - FACILITY = 'info_config' diff --git a/ipsilon/info/infoldap.py b/ipsilon/info/infoldap.py index 0ec6dd1..7170e95 100644 --- a/ipsilon/info/infoldap.py +++ b/ipsilon/info/infoldap.py @@ -4,33 +4,32 @@ from ipsilon.info.common import InfoProviderBase from ipsilon.info.common import InfoProviderInstaller -from ipsilon.info.common import InfoMapping from ipsilon.util.plugin import PluginObject +from ipsilon.util.policy import Policy from ipsilon.util import config as pconfig import ldap # TODO: fetch mapping from configuration -ldap_mapping = { - 'cn': 'fullname', - 'commonname': 'fullname', - 'sn': 'surname', - 'mail': 'email', - 'destinationindicator': 'country', - 'postalcode': 'postcode', - 'st': 'state', - 'statetorprovincename': 'state', - 'streetaddress': 'street', - 'telephonenumber': 'phone', -} +ldap_mapping = [ + ['cn', 'fullname'], + ['commonname', 'fullname'], + ['sn', 'surname'], + ['mail', 'email'], + ['destinationindicator', 'country'], + ['postalcode', 'postcode'], + ['st', 'state'], + ['statetorprovincename', 'state'], + ['streetaddress', 'street'], + ['telephonenumber', 'phone'], +] class InfoProvider(InfoProviderBase): def __init__(self, *pargs): super(InfoProvider, self).__init__(*pargs) - self.mapper = InfoMapping() - self.mapper.set_mapping(ldap_mapping) + self.mapper = Policy(ldap_mapping) self.name = 'ldap' self.description = """ Info plugin that uses LDAP to retrieve user data. """ @@ -127,7 +126,7 @@ Info plugin that uses LDAP to retrieve user data. """ reply = dict() try: ldapattrs = self._get_user_data(conn, dn) - userattrs, extras = self.mapper.map_attrs(ldapattrs) + userattrs, extras = self.mapper.map_attributes(ldapattrs) groups = self._get_user_groups(conn, dn, ldapattrs) reply = userattrs reply['_groups'] = groups diff --git a/ipsilon/info/infosssd.py b/ipsilon/info/infosssd.py index 63ffecc..ff468a9 100644 --- a/ipsilon/info/infosssd.py +++ b/ipsilon/info/infosssd.py @@ -7,8 +7,8 @@ from ipsilon.info.common import InfoProviderBase from ipsilon.info.common import InfoProviderInstaller -from ipsilon.info.common import InfoMapping from ipsilon.util.plugin import PluginObject +from ipsilon.util.policy import Policy from string import Template import cherrypy import time @@ -28,24 +28,23 @@ SSSD_ATTRS = ['mail', # Map the mod_lookup_identity env variables to Ipsilon. The inverse of # this is in the httpd template. -sssd_mapping = { - 'REMOTE_USER_GECOS': 'fullname', - 'REMOTE_USER_EMAIL': 'email', - 'REMOTE_USER_FIRSTNAME': 'givenname', - 'REMOTE_USER_LASTNAME': 'surname', - 'REMOTE_USER_STREET': 'street', - 'REMOTE_USER_STATE': 'state', - 'REMOTE_USER_POSTALCODE': 'postcode', - 'REMOTE_USER_TELEPHONENUMBER': 'phone', -} +sssd_mapping = [ + ['REMOTE_USER_GECOS', 'fullname'], + ['REMOTE_USER_EMAIL', 'email'], + ['REMOTE_USER_FIRSTNAME', 'givenname'], + ['REMOTE_USER_LASTNAME', 'surname'], + ['REMOTE_USER_STREET', 'street'], + ['REMOTE_USER_STATE', 'state'], + ['REMOTE_USER_POSTALCODE', 'postcode'], + ['REMOTE_USER_TELEPHONENUMBER', 'phone'], +] class InfoProvider(InfoProviderBase): def __init__(self, *pargs): super(InfoProvider, self).__init__(*pargs) - self.mapper = InfoMapping() - self.mapper.set_mapping(sssd_mapping) + self.mapper = Policy(sssd_mapping) self.name = 'sssd' self.new_config(self.name) @@ -71,7 +70,7 @@ class InfoProvider(InfoProviderBase): reply = dict() try: attrs, groups = self._get_user_data(user) - userattrs, extras = self.mapper.map_attrs(attrs) + userattrs, extras = self.mapper.map_attributes(attrs) reply = userattrs reply['_groups'] = groups reply['_extras'] = {'sssd': extras} diff --git a/ipsilon/info/nss.py b/ipsilon/info/nss.py index 2f4039a..0669e95 100644 --- a/ipsilon/info/nss.py +++ b/ipsilon/info/nss.py @@ -4,24 +4,23 @@ from ipsilon.info.common import InfoProviderBase from ipsilon.info.common import InfoProviderInstaller -from ipsilon.info.common import InfoMapping from ipsilon.util.plugin import PluginObject +from ipsilon.util.policy import Policy import grp import pwd import os -posix_map = { - 'gecos': 'fullname' -} +posix_map = [ + ['gecos', 'fullname'] +] class InfoProvider(InfoProviderBase): def __init__(self, *pargs): super(InfoProvider, self).__init__(*pargs) - self.mapper = InfoMapping() - self.mapper.set_mapping(posix_map) + self.mapper = Policy(posix_map) self.name = 'nss' self.new_config(self.name) @@ -58,7 +57,7 @@ class InfoProvider(InfoProviderBase): reply = dict() try: posix_user = self._get_posix_user(user) - userattrs, extras = self.mapper.map_attrs(posix_user) + userattrs, extras = self.mapper.map_attributes(posix_user) groups = self._get_posix_groups(posix_user['username'], posix_user['gidNumber']) reply = userattrs diff --git a/ipsilon/login/authfas.py b/ipsilon/login/authfas.py index 3697c1a..a44b470 100644 --- a/ipsilon/login/authfas.py +++ b/ipsilon/login/authfas.py @@ -1,9 +1,9 @@ # Copyright (C) 2014 Ipsilon contributors, see COPYING file for license -from ipsilon.info.common import InfoMapping from ipsilon.login.common import LoginFormBase, LoginManagerBase from ipsilon.util.plugin import PluginObject +from ipsilon.util.policy import Policy from ipsilon.util import config as pconfig import cherrypy @@ -27,22 +27,21 @@ try: except ImportError: CLA_GROUPS = dict() -fas_mapping = { - 'username': 'nickname', - 'telephone': 'phone', - 'country_code': 'country', - 'human_name': 'fullname', - 'email': 'email', - 'timezone': 'timezone', -} +fas_mapping = [ + ['username', 'nickname'], + ['telephone', 'phone'], + ['country_code', 'country'], + ['human_name', 'fullname'], + ['email', 'email'], + ['timezone', 'timezone'], +] class FAS(LoginFormBase): def __init__(self, site, mgr, page): super(FAS, self).__init__(site, mgr, page) - self.mapper = InfoMapping() - self.mapper.set_mapping(fas_mapping) + self.mapper = Policy(fas_mapping) def POST(self, *args, **kwargs): username = kwargs.get("login_name") @@ -79,7 +78,7 @@ class FAS(LoginFormBase): return self._template(self.formtemplate, **context) def make_userdata(self, fas_data): - userdata, fas_extra = self.mapper.map_attrs(fas_data) + userdata, fas_extra = self.mapper.map_attributes(fas_data) # compute and store groups and cla groups userdata['_groups'] = []