Add Info Provider plugin framework
authorSimo Sorce <simo@redhat.com>
Fri, 27 Jun 2014 23:29:27 +0000 (19:29 -0400)
committerPatrick Uiterwijk <puiterwijk@redhat.com>
Wed, 24 Sep 2014 18:29:41 +0000 (20:29 +0200)
Signed-off-by: Simo Sorce <simo@redhat.com>
Reviewed-by: Patrick Uiterwijk <puiterwijk@redhat.com>
contrib/fedora/ipsilon.spec
ipsilon/info/__init__.py [new file with mode: 0644]
ipsilon/info/common.py [new file with mode: 0755]
ipsilon/info/nss.py [new file with mode: 0755]
ipsilon/install/ipsilon-server-install
setup.py

index 2e8c361..662d56b 100644 (file)
@@ -85,6 +85,7 @@ fi
 %{python2_sitelib}/ipsilon-*.egg-info
 %{python2_sitelib}/ipsilon/admin/*
 %{python2_sitelib}/ipsilon/login/*
+%{python2_sitelib}/ipsilon/info/*
 %{python2_sitelib}/ipsilon/providers/*
 %{python2_sitelib}/ipsilon/root.py*
 %{python2_sitelib}/ipsilon/util/*
diff --git a/ipsilon/info/__init__.py b/ipsilon/info/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ipsilon/info/common.py b/ipsilon/info/common.py
new file mode 100755 (executable)
index 0000000..6dbaf93
--- /dev/null
@@ -0,0 +1,75 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2014 Ipsilon Project Contributors
+#
+# See the file named COPYING for the project license
+
+from ipsilon.util.log import Log
+from ipsilon.util.plugin import PluginLoader, PluginObject
+from ipsilon.util.plugin import PluginInstaller
+
+
+class InfoProviderBase(PluginObject):
+
+    def __init__(self):
+        super(InfoProviderBase, self).__init__()
+
+    def get_user_attrs(self, user):
+        raise NotImplementedError
+
+
+FACILITY = 'info_config'
+
+
+class Info(Log):
+
+    def __init__(self, *args, **kwargs):
+        self.providers = []
+
+        loader = PluginLoader(Info, FACILITY, 'InfoProvider')
+        plugins = loader.get_plugin_data()
+
+        available = plugins['available'].keys()
+        self.debug('Available info providers: %s' % str(available))
+
+        for item in plugins['whitelist']:
+            self.debug('Login plugin in whitelist: %s' % item)
+            if item not in plugins['available']:
+                self.debug('Info Plugin %s not found' % item)
+                continue
+            self.providers.append((item, plugins['available'][item]))
+            self.debug('Added Info plugin: %s' % item)
+
+    def get_user_attrs(self, user, provider=None):
+        if provider:
+            for p in self.providers:
+                if p[0] == provider:
+                    return p[1].get_user_attrs(user)
+        else:
+            for p in self.providers:
+                ret = p[1].get_user_attrs(user)
+                if ret:
+                    return ret
+
+        return None
+
+
+class InfoProviderInstaller(object):
+
+    def __init__(self):
+        self.facility = FACILITY
+        self.ptype = 'info'
+        self.name = None
+
+    def install_args(self, group):
+        raise NotImplementedError
+
+    def configure(self, opts):
+        raise NotImplementedError
+
+
+class InfoProviderInstall(object):
+
+    def __init__(self):
+        pi = PluginInstaller(InfoProviderInstall)
+        self.plugins = pi.get_plugins()
diff --git a/ipsilon/info/nss.py b/ipsilon/info/nss.py
new file mode 100755 (executable)
index 0000000..e9a3a96
--- /dev/null
@@ -0,0 +1,62 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2014 Ipsilon Project Contributors
+#
+# See the file named COPYING for the project license
+
+from ipsilon.info.common import InfoProviderBase
+from ipsilon.info.common import InfoProviderInstaller
+from ipsilon.util.plugin import PluginObject
+import pwd
+
+
+class InfoProvider(InfoProviderBase):
+
+    def __init__(self):
+        super(InfoProvider, self).__init__()
+        self.name = 'nss'
+
+    def get_user_attrs(self, user):
+        userattrs = None
+        try:
+            p = pwd.getpwnam(user)
+            userattrs = {'uidNumber': p[2], 'gidNumber': p[3],
+                         'gecos': p[4], 'homeDirectory': p[5],
+                         'loginShell': p[6]}
+        except KeyError:
+            pass
+
+        return userattrs
+
+
+class Installer(InfoProviderInstaller):
+
+    def __init__(self):
+        super(Installer, self).__init__()
+        self.name = 'nss'
+
+    def install_args(self, group):
+        group.add_argument('--info-nss', choices=['yes', 'no'], default='no',
+                           help='Use passwd data to populate user attrs')
+
+    def configure(self, opts):
+        if opts['info_nss'] != 'yes':
+            return
+
+        # Add configuration data to database
+        po = PluginObject()
+        po.name = 'nss'
+        po.wipe_data()
+        po.wipe_config_values(self.facility)
+
+        # Replace global config, only one plugin info can be used
+        po.name = 'global'
+        globalconf = po.get_plugin_config(self.facility)
+        if 'order' in globalconf:
+            order = globalconf['order'].split(',')
+        else:
+            order = []
+        order.append('nss')
+        globalconf['order'] = ','.join(order)
+        po.set_config(globalconf)
+        po.save_plugin_config(self.facility)
index a4410fa..e088b39 100755 (executable)
@@ -18,6 +18,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 from ipsilon.login.common import LoginMgrsInstall
+from ipsilon.info.common import InfoProviderInstall
 from ipsilon.providers.common import ProvidersInstall
 from ipsilon.helpers.common import EnvHelpersInstall
 from ipsilon.util.data import Store
@@ -156,6 +157,11 @@ def install(plugins, args):
         plugin = plugins['Login Managers'][plugin_name]
         plugin.configure(args)
 
+    logger.info('Configuring Info provider')
+    for plugin_name in plugins['Info Provider']:
+        plugin = plugins['Info Provider'][plugin_name]
+        plugin.configure(args)
+
     logger.info('Configuring Authentication Providers')
     for plugin_name in plugins['Auth Providers']:
         plugin = plugins['Auth Providers'][plugin_name]
@@ -178,6 +184,7 @@ def find_plugins():
     plugins = {
         'Environment Helpers': EnvHelpersInstall().plugins,
         'Login Managers': LoginMgrsInstall().plugins,
+        'Info Provider': InfoProviderInstall().plugins,
         'Auth Providers': ProvidersInstall().plugins
     }
     return plugins
index 5053e9c..aacc6da 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -29,7 +29,8 @@ setup(
     maintainer = 'Simo Sorce',
     maintainer_email = 'simo@redhat.com',
     url='https://fedorahosted.org/ipsilon/',
-    packages = ['ipsilon', 'ipsilon.admin', 'ipsilon.login', 'ipsilon.util',
+    packages = ['ipsilon', 'ipsilon.admin', 'ipsilon.login',
+                'ipsilon.info', 'ipsilon.util',
                 'ipsilon.providers', 'ipsilon.providers.saml2',
                 'ipsilon.tools', 'ipsilon.helpers',
                 'tests', 'tests.helpers'],