Use the new Policy engine for login/info mapping
authorSimo Sorce <simo@redhat.com>
Mon, 23 Feb 2015 04:53:33 +0000 (23:53 -0500)
committerPatrick Uiterwijk <puiterwijk@redhat.com>
Tue, 24 Feb 2015 15:58:25 +0000 (16:58 +0100)
The InfoMapping class is now only used to prettify the default
set of wellknown attributes.

Signed-off-by: Simo Sorce <simo@redhat.com>
Reviewed-by: Patrick Uiterwijk <puiterwijk@redhat.com>
ipsilon/info/common.py
ipsilon/info/infoldap.py
ipsilon/info/infosssd.py
ipsilon/info/nss.py
ipsilon/login/authfas.py

index 16a7e29..0a5cb74 100644 (file)
@@ -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'
 
index 0ec6dd1..7170e95 100644 (file)
@@ -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
index 63ffecc..ff468a9 100644 (file)
@@ -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}
index 2f4039a..0669e95 100644 (file)
@@ -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
index 3697c1a..a44b470 100644 (file)
@@ -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'] = []