Skip to content
Snippets Groups Projects
Commit 4c706675 authored by sveseli's avatar sveseli
Browse files

add ldap user info object that will be used for ldap-based utilities;...

add ldap user info object that will be used for ldap-based utilities; introduce ldap create user functionality
parent 58342d01
No related branches found
No related tags found
No related merge requests found
#!/usr/bin/env python
from dmObject import DmObject
class LdapUserInfo(DmObject):
DEFAULT_KEY_LIST = [ 'userDn', 'userAttrs' ]
def __init__(self, dict):
DmObject.__init__(self, dict)
...@@ -33,6 +33,8 @@ class LdapClient: ...@@ -33,6 +33,8 @@ class LdapClient:
try: try:
result = func(*args, **kwargs) result = func(*args, **kwargs)
return result return result
except ldap.NO_SUCH_OBJECT, ex:
raise ObjectNotFound(str(ex))
except DmException, ex: except DmException, ex:
raise raise
except Exception, ex: except Exception, ex:
......
...@@ -10,6 +10,7 @@ from base64 import b16decode ...@@ -10,6 +10,7 @@ from base64 import b16decode
from base64 import b64encode from base64 import b64encode
from base64 import b64decode from base64 import b64decode
from dm.common.objects.ldapUserInfo import LdapUserInfo
from dm.common.utility.loggingManager import LoggingManager from dm.common.utility.loggingManager import LoggingManager
from dm.common.utility.configurationManager import ConfigurationManager from dm.common.utility.configurationManager import ConfigurationManager
from dm.common.exceptions.configurationError import ConfigurationError from dm.common.exceptions.configurationError import ConfigurationError
...@@ -18,6 +19,7 @@ from dm.common.exceptions.objectNotFound import ObjectNotFound ...@@ -18,6 +19,7 @@ from dm.common.exceptions.objectNotFound import ObjectNotFound
from dm.common.exceptions.authenticationError import AuthenticationError from dm.common.exceptions.authenticationError import AuthenticationError
from dm.common.exceptions.communicationError import CommunicationError from dm.common.exceptions.communicationError import CommunicationError
from dm.common.exceptions.invalidArgument import InvalidArgument from dm.common.exceptions.invalidArgument import InvalidArgument
from dm.common.exceptions.objectAlreadyExists import ObjectAlreadyExists
from dm.common.exceptions.dmException import DmException from dm.common.exceptions.dmException import DmException
from ldapClient import LdapClient from ldapClient import LdapClient
...@@ -51,27 +53,82 @@ class LdapUserManager(LdapClient): ...@@ -51,27 +53,82 @@ class LdapUserManager(LdapClient):
ldapClient = self.getLdapClient() ldapClient = self.getLdapClient()
resultList = ldapClient.search_s(userDn, ldap.SCOPE_BASE) resultList = ldapClient.search_s(userDn, ldap.SCOPE_BASE)
userTuple = resultList[0] userTuple = resultList[0]
return userTuple return LdapUserInfo({'userDn' : userTuple[0], 'userAttrs' : userTuple[1]})
@LdapClient.executeLdapCall
def modifyUserInfo(self, username, attrDict): def modifyUserInfo(self, username, attrDict):
""" Modify user. """ """ Modify user. """
logger = self.getLogger() logger = self.getLogger()
ldapClient = self.getLdapClient() ldapClient = self.getLdapClient()
userDn,userAttrs = self.getUserInfo(username) ldapUserInfo = self.getUserInfo(username)
logger.debug('Modifying user %s attrs %s' % (username, attrDict)) userDn = ldapUserInfo.get('userDn')
userAttrs = ldapUserInfo.get('userAttrs')
userAttrs2 = copy.copy(userAttrs) userAttrs2 = copy.copy(userAttrs)
for name,value in attrDict.items(): for name,value in attrDict.items():
if not userAttrs2.has_key(name): ldapName = name
raise InvalidArgument('No such attribute: %s' % name) ldapValue = value
if type(value) == types.ListType: if name == 'passwordHashValue':
userAttrs2[name] = value ldapName = 'userPassword'
ldapValue = self.encodePasswordHash(value)
if not userAttrs2.has_key(ldapName):
raise InvalidArgument('No such attribute: %s' % ldapName)
if type(ldapValue) == types.ListType:
userAttrs2[ldapName] = ldapValue
else: else:
if name == 'userPassword': userAttrs2[ldapName] = [str(ldapValue)]
value = self.encodePasswordHash(value)
userAttrs2[name] = [str(value)]
logger.debug('Modifying user %s attrs %s' % (username, userAttrs2))
userLdif = ldap.modlist.modifyModlist(userAttrs, userAttrs2) userLdif = ldap.modlist.modifyModlist(userAttrs, userAttrs2)
ldapClient.modify_s(userDn, userLdif) ldapClient.modify_s(userDn, userLdif)
return LdapUserInfo({'userDn' : userDn, 'userAttrs' : userAttrs2})
@LdapClient.executeLdapCall
def createUserInfo(self, username, attrDict):
""" Create user. """
logger = self.getLogger()
ldapClient = self.getLdapClient()
try:
ldapUserInfo = self.getUserInfo(username)
raise ObjectAlreadyExists('User %s already exists.' % username)
except ObjectNotFound, ex:
pass
middleName = attrDict.get('middleName', '')
fullName = '%s, %s' % (attrDict.get('lastName', ''), attrDict.get('firstName', ''))
if len(middleName):
fullName = '%s %s' % (fullName, middleName)
badgeNumber = attrDict.get('badgeNumber')
uid = 'd%s' % badgeNumber
if username != uid:
raise InvalidArgument('Username %s and badge number %s are not consistent.' % (username, badgeNumber))
userAttrs = {}
userAttrs['objectclass'] = ['top', 'person', 'organizationalPerson', 'inetOrgPerson', 'inetUser', 'shadowAccount', 'posixAccount', 'passwordObject', 'APSexten', 'apple-user']
userAttrs['cn'] = [attrDict.get('name', fullName)]
userAttrs['revcn'] = ['%s %s' % (attrDict.get('lastName', ''), attrDict.get('firstName', ''))]
userAttrs['loginShell'] = ['/sbin/nologin']
userAttrs['allowed-host'] = ['dmid-vm']
userAttrs['uidNumber'] = ['10%s' % badgeNumber]
userAttrs['uid'] = [uid]
userAttrs['homeDirectory'] = ['/data']
userAttrs['home7Directory'] = ['/data']
userAttrs['o'] = [attrDict.get('grp')]
userAttrs['inetUserStatus'] = ['active']
userAttrs['gidNumber'] = ['66001']
userAttrs['gecos'] = [attrDict.get('name', fullName)]
userAttrs['sn'] = [attrDict.get('lastName', '')]
userAttrs['givenName'] = [attrDict.get('firstName', '')]
passwordHash = attrDict.get('userPassword')
if not passwordHash:
passwordHash = attrDict.get('passwordHashValue')
if passwordHash:
userAttrs['userPassword'] = [self.encodePasswordHash(passwordHash)]
logger.debug('Creating user %s with attrs %s' % (username, userAttrs))
userDn = self.userDnFormat % str(username)
userLdif = ldap.modlist.addModlist(userAttrs)
ldapClient.add_s(userDn, userLdif)
return LdapUserInfo({'userDn' : userDn, 'userAttrs' : userAttrs})
def createGroup(self, name): def createGroup(self, name):
""" Create group if it does not exist. """ """ Create group if it does not exist. """
...@@ -231,14 +288,20 @@ if __name__ == '__main__': ...@@ -231,14 +288,20 @@ if __name__ == '__main__':
print utility.getGroupInfo(u's1id-test03') print utility.getGroupInfo(u's1id-test03')
user = utility.getUserInfo(u'd225159') user = utility.getUserInfo(u'd225159')
print user print user
utility.modifyUserInfo(u'd225159', {'homeDirectory' : '/data'}) utility.modifyUserInfo(u'd225159', {'homeDirectory' : '/data/'})
user = utility.getUserInfo(u'd225159') user = utility.getUserInfo(u'd225159')
print user print user
user = utility.getUserInfo(u'd65114') user = utility.getUserInfo(u'd65114')
print user print user
passwordHash = LdapUserManager.decodePasswordHash(user[1]['userPassword'][0]) passwordHash = LdapUserManager.decodePasswordHash(user['userAttrs']['userPassword'][0])
print passwordHash print passwordHash
attrDict = {'badgeNumber' : '000001', 'name' : 'Test, User 1.', 'firstName' : 'User', 'middleName' : '1.', 'lastName' : 'Test', 'passwordHashValue' : '84673F4A8774846B1C096511C7F6B1329CEE5CCC', 'inactive' : 'N', 'grp' : 'XSD-TEST', 'lastChangeDate' : '2015-02-03 15:52:15', 'email' : 'UTEST1@APS.ANL.GOV', 'isUserNotAnlEmployee' : 'N' }
user = utility.createUserInfo(u'd000001', attrDict)
user = utility.getUserInfo(u'd000001')
print user
#print LdapUserManager.encodePasswordHash(passwordHash) #print LdapUserManager.encodePasswordHash(passwordHash)
#utility.addLocalUserToGroup(u'sveseli', u'id8i-test02') #utility.addLocalUserToGroup(u'sveseli', u'id8i-test02')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment