Add attribute mapping for user information
[cascardo/ipsilon.git] / ipsilon / info / nss.py
index e9a3a96..4208442 100755 (executable)
@@ -6,27 +6,70 @@
 
 from ipsilon.info.common import InfoProviderBase
 from ipsilon.info.common import InfoProviderInstaller
+from ipsilon.info.common import InfoMapping
 from ipsilon.util.plugin import PluginObject
+import grp
 import pwd
+import os
+
+
+posix_map = {
+    'gecos': 'fullname'
+}
 
 
 class InfoProvider(InfoProviderBase):
 
     def __init__(self):
         super(InfoProvider, self).__init__()
+        self.mapper = InfoMapping()
+        self.mapper.set_mapping(posix_map)
         self.name = 'nss'
 
+    def _get_posix_user(self, user):
+        p = pwd.getpwnam(user)
+        return {'username': p.pw_name, 'uidNumber': p.pw_uid,
+                'gidNumber': p.pw_gid, 'gecos': p.pw_gecos,
+                'homeDirectory': p.pw_dir, 'loginShell': p.pw_shell}
+
+    def _get_posix_groups(self, user, group):
+        groups = set()
+        getgrouplist = getattr(os, 'getgrouplist', None)
+        if getgrouplist:
+            ids = getgrouplist(user, group)
+            for i in ids:
+                try:
+                    g = grp.getgrgid(i)
+                    groups.add(g.gr_name)
+                except KeyError:
+                    pass
+
+        else:
+            g = grp.getgrgid(group)
+            groups.add(g.gr_name)
+
+            allg = grp.getgrall()
+            for g in allg:
+                if user in g.gr_mem:
+                    groups.add(g.gr_name)
+
+        return list(groups)
+
     def get_user_attrs(self, user):
-        userattrs = None
+        reply = dict()
         try:
-            p = pwd.getpwnam(user)
-            userattrs = {'uidNumber': p[2], 'gidNumber': p[3],
-                         'gecos': p[4], 'homeDirectory': p[5],
-                         'loginShell': p[6]}
+            posix_user = self._get_posix_user(user)
+            userattrs, extras = self.mapper.map_attrs(posix_user)
+            groups = self._get_posix_groups(posix_user['username'],
+                                            posix_user['gidNumber'])
+            reply['userdata'] = userattrs
+            reply['groups'] = groups
+            reply['extras'] = {'posix': extras}
+
         except KeyError:
             pass
 
-        return userattrs
+        return reply
 
 
 class Installer(InfoProviderInstaller):