Use the new Policy engine for login/info mapping
[cascardo/ipsilon.git] / ipsilon / info / nss.py
1 # Copyright (C) 2014 Ipsilon Project Contributors
2 #
3 # See the file named COPYING for the project license
4
5 from ipsilon.info.common import InfoProviderBase
6 from ipsilon.info.common import InfoProviderInstaller
7 from ipsilon.util.plugin import PluginObject
8 from ipsilon.util.policy import Policy
9 import grp
10 import pwd
11 import os
12
13
14 posix_map = [
15     ['gecos', 'fullname']
16 ]
17
18
19 class InfoProvider(InfoProviderBase):
20
21     def __init__(self, *pargs):
22         super(InfoProvider, self).__init__(*pargs)
23         self.mapper = Policy(posix_map)
24         self.name = 'nss'
25         self.new_config(self.name)
26
27     def _get_posix_user(self, user):
28         p = pwd.getpwnam(user)
29         return {'username': p.pw_name, 'uidNumber': p.pw_uid,
30                 'gidNumber': p.pw_gid, 'gecos': p.pw_gecos,
31                 'homeDirectory': p.pw_dir, 'loginShell': p.pw_shell}
32
33     def _get_posix_groups(self, user, group):
34         groups = set()
35         getgrouplist = getattr(os, 'getgrouplist', None)
36         if getgrouplist:
37             ids = getgrouplist(user, group)
38             for i in ids:
39                 try:
40                     g = grp.getgrgid(i)
41                     groups.add(g.gr_name)
42                 except KeyError:
43                     pass
44
45         else:
46             g = grp.getgrgid(group)
47             groups.add(g.gr_name)
48
49             allg = grp.getgrall()
50             for g in allg:
51                 if user in g.gr_mem:
52                     groups.add(g.gr_name)
53
54         return list(groups)
55
56     def get_user_attrs(self, user):
57         reply = dict()
58         try:
59             posix_user = self._get_posix_user(user)
60             userattrs, extras = self.mapper.map_attributes(posix_user)
61             groups = self._get_posix_groups(posix_user['username'],
62                                             posix_user['gidNumber'])
63             reply = userattrs
64             reply['_groups'] = groups
65             reply['_extras'] = {'posix': extras}
66
67         except KeyError:
68             pass
69
70         return reply
71
72
73 class Installer(InfoProviderInstaller):
74
75     def __init__(self, *pargs):
76         super(Installer, self).__init__()
77         self.name = 'nss'
78         self.pargs = pargs
79
80     def install_args(self, group):
81         group.add_argument('--info-nss', choices=['yes', 'no'], default='no',
82                            help='Use passwd data to populate user attrs')
83
84     def configure(self, opts):
85         if opts['info_nss'] != 'yes':
86             return
87
88         # Add configuration data to database
89         po = PluginObject(*self.pargs)
90         po.name = 'nss'
91         po.wipe_data()
92         po.wipe_config_values()
93
94         # Update global config to add info plugin
95         po.is_enabled = True
96         po.save_enabled_state()