6 array_values = ['objectClass', 'keyFingerPrint', 'mailWhitelist', 'mailRBL', 'mailRHSBL', 'supplementaryGid', 'sshRSAAuthKey', 'sudoPassword', 'dnsZoneEntry']
7 int_values = ['shadowExpire', 'gidNumber', 'uidNumber']
9 'accountStatus': 'active',
14 def from_search(ldap_connection, base, user):
15 searchresult = ldap_connection.search_s(base, ldap.SCOPE_SUBTREE, 'uid=%s'%(user))
16 if len(searchresult) < 1:
17 sys.stderr.write("No such user: %s\n"%(user))
19 elif len(searchresult) > 1:
20 sys.stderr.write("More than one hit when getting %s\n"%(user))
23 return Account(searchresult[0][0], searchresult[0][1])
25 def __init__(self, dn, attributes):
27 self.attributes = attributes
29 def __getitem__(self, key):
30 if key in self.attributes:
31 if key in self.array_values:
32 return self.attributes[key]
34 if not len(self.attributes[key]) == 1:
35 raise ValueError, 'non-array value has not exactly one value'
37 if key in self.int_values:
38 return int(self.attributes[key][0])
40 return self.attributes[key][0]
41 elif key in self.defaults:
42 return self.defaults[key]
46 def __contains__(self, key):
47 return key in self.attributes
50 if 'mailDisableMessage' in self.attributes:
54 # not locked locked, just reset to something invalid like {crypt}*SSLRESET* is still active
56 if self['userPassword'] == '{crypt}*LK*':
58 if self['userPassword'].startswith("{crypt}!"):
62 def get_password(self):
63 p = self['userPassword']
64 if not p.startswith('{crypt}') or len(p) > 50:
70 def shadow_active(self):
71 if 'shadowExpire' in self and \
72 self['shadowExpire'] < (time.time() / 3600 / 24):
77 return len(self['keyFingerPrint'])
79 def is_active_user(self):
80 return self['accountStatus'] == 'active' and self.numkeys() != 0
82 def latitude_dec(self, anonymized=False):
83 return userdir_ldap.DecDegree(self['latitude'], anonymized)
84 def longitude_dec(self, anonymized=False):
85 return userdir_ldap.DecDegree(self['longitude'], anonymized)
87 def verbose_status(self):
89 status.append('mail: %s' %(['disabled', 'active'][ self.has_mail() ]))
90 status.append('pw: %s' %(['locked', 'active'][ self.pw_active() ]))
91 status.append('shadow: %s'%(['expired', 'active'][ self.shadow_active() ]))
92 status.append('keys: %d' %( self.numkeys() ))
93 status.append('status: %s'%( self['accountStatus'] ))
95 return '(%s)'%(', '.join(status))
100 def email_address(self):
101 mailbox = "<%s@%s>" % (self['uid'], userdir_ldap.EmailAppend)
103 if 'cn' in self: tokens.append(self['cn'])
104 if 'sn' in self: tokens.append(self['sn'])
105 tokens.append(mailbox)
106 return ' '.join(tokens)
110 # vim:set shiftwidth=4: