From aa7cd3ad8e6d51f51ae46b3a6a15a9021edfa595 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Fri, 27 Jun 2014 19:29:27 -0400 Subject: [PATCH] Add Info Provider plugin framework Signed-off-by: Simo Sorce Reviewed-by: Patrick Uiterwijk --- contrib/fedora/ipsilon.spec | 1 + ipsilon/info/__init__.py | 0 ipsilon/info/common.py | 75 ++++++++++++++++++++++++++ ipsilon/info/nss.py | 62 +++++++++++++++++++++ ipsilon/install/ipsilon-server-install | 7 +++ setup.py | 3 +- 6 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 ipsilon/info/__init__.py create mode 100755 ipsilon/info/common.py create mode 100755 ipsilon/info/nss.py diff --git a/contrib/fedora/ipsilon.spec b/contrib/fedora/ipsilon.spec index 2e8c361..662d56b 100644 --- a/contrib/fedora/ipsilon.spec +++ b/contrib/fedora/ipsilon.spec @@ -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 index 0000000..e69de29 diff --git a/ipsilon/info/common.py b/ipsilon/info/common.py new file mode 100755 index 0000000..6dbaf93 --- /dev/null +++ b/ipsilon/info/common.py @@ -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 index 0000000..e9a3a96 --- /dev/null +++ b/ipsilon/info/nss.py @@ -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) diff --git a/ipsilon/install/ipsilon-server-install b/ipsilon/install/ipsilon-server-install index a4410fa..e088b39 100755 --- a/ipsilon/install/ipsilon-server-install +++ b/ipsilon/install/ipsilon-server-install @@ -18,6 +18,7 @@ # along with this program. If not, see . 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 diff --git a/setup.py b/setup.py index 5053e9c..aacc6da 100755 --- 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'], -- 2.20.1