give Account class a __getitem__ method and use it
[mirror/userdir-ldap.git] / UDLdap.py
1 import ldap
2 import time
3
4 class Account:
5     array_values = ['keyFingerPrint']
6     int_values = ['shadowExpire']
7     defaults = {
8                  'accountStatus': 'active',
9                  'keyFingerPrint': []
10                }
11
12     @staticmethod
13     def from_search(ldap_connection, base, user):
14         searchresult = ldap_connection.search_s(base, ldap.SCOPE_SUBTREE, 'uid=%s'%(user))
15         if len(searchresult) < 1:
16             sys.stderr.write("No such user: %s\n"%(user))
17             return
18         elif len(searchresult) > 1:
19             sys.stderr.write("More than one hit when getting %s\n"%(user))
20             return
21         else:
22             return Account(searchresult[0][0], searchresult[0][1])
23
24     def __init__(self, dn, attributes):
25         self.dn = dn
26         self.attributes = attributes
27
28     def __getitem__(self, key):
29         if key in self.attributes:
30             if key in self.array_values:
31                 return self.attributes[key]
32             elif key in self.int_values:
33                 return int(self.attributes[key][0])
34             else:
35                 return self.attributes[key][0]
36         elif key in self.defaults:
37             return self.defaults[key]
38         else:
39             raise IndexError
40
41     def __contains__(self, key):
42         return key in self.attributes
43
44     def has_mail(self):
45         if 'mailDisableMessage' in self.attributes:
46             return False
47         return True
48
49     # not locked locked,  just reset to something invalid like {crypt}*SSLRESET* is still active
50     def pw_active(self):
51         if self['userPassword'] == '{crypt}*LK*':
52             return False
53         return True
54
55     # not expired
56     def shadow_active(self):
57         if 'shadowExpire' in self and \
58             self['shadowExpire'] < (time.time() / 3600 / 24):
59             return False
60         return True
61
62     def numkeys(self):
63         return len(self['keyFingerPrint'])
64
65     def verbose_status(self):
66         status = []
67         status.append('mail: %s'  %(['disabled', 'active'][ self.has_mail() ]))
68         status.append('pw: %s'    %(['locked', 'active'][ self.pw_active() ]))
69         status.append('shadow: %s'%(['expired', 'active'][ self.shadow_active() ]))
70         status.append('keys: %d'  %( self.numkeys() ))
71         status.append('status: %s'%( self['accountStatus'] ))
72
73         return '(%s)'%(', '.join(status))
74
75     def get_dn(self):
76         return self.dn
77
78 # vim:set et:
79 # vim:set ts=4:
80 # vim:set shiftwidth=4: