|
|
|
@ -1024,7 +1024,7 @@ class servUnix(shareLdap):
|
|
|
|
|
#Добавляем его в другие группы (опция G)
|
|
|
|
|
if options.has_key('G') and userGroupNames:
|
|
|
|
|
for group in userGroupNames:
|
|
|
|
|
self.addUserGroupUnix([userName],group)
|
|
|
|
|
self.addUsersGroupUnix([userName],group)
|
|
|
|
|
# не переделывать на else
|
|
|
|
|
if self.ldapObj.getError():
|
|
|
|
|
print _("Unix Error") + ": " + self.ldapObj.getError()
|
|
|
|
@ -1042,7 +1042,7 @@ class servUnix(shareLdap):
|
|
|
|
|
self.printSUCCESS(_("Added user in Unix service") + " ...")
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def addUserGroupUnix(self, users, groupName):
|
|
|
|
|
def addUsersGroupUnix(self, users, groupName):
|
|
|
|
|
"""Добавляет пользователей из списка в Unix группу"""
|
|
|
|
|
if not self.searchUnixGroupName(groupName):
|
|
|
|
|
self.printERROR(_("group name is not found in Unix service") +\
|
|
|
|
@ -1297,7 +1297,7 @@ class servUnix(shareLdap):
|
|
|
|
|
return False
|
|
|
|
|
flagError = False
|
|
|
|
|
for group in userGroupNames:
|
|
|
|
|
if not self.addUserGroupUnix([userName], group):
|
|
|
|
|
if not self.addUsersGroupUnix([userName], group):
|
|
|
|
|
flagError = True
|
|
|
|
|
break
|
|
|
|
|
if flagError:
|
|
|
|
@ -1313,7 +1313,7 @@ class servUnix(shareLdap):
|
|
|
|
|
return False
|
|
|
|
|
flagError = False
|
|
|
|
|
for group in userGroupNames:
|
|
|
|
|
if not self.addUserGroupUnix([userName], group):
|
|
|
|
|
if not self.addUsersGroupUnix([userName], group):
|
|
|
|
|
flagError = True
|
|
|
|
|
break
|
|
|
|
|
if flagError:
|
|
|
|
@ -1480,7 +1480,7 @@ class servUnix(shareLdap):
|
|
|
|
|
if options.has_key('a'):
|
|
|
|
|
# добавляемые пользователи в группу
|
|
|
|
|
users = options['a'].split(',')
|
|
|
|
|
res = self.addUserGroupUnix(users, groupName)
|
|
|
|
|
res = self.addUsersGroupUnix(users, groupName)
|
|
|
|
|
if res:
|
|
|
|
|
self.printSUCCESS(_("Appended list users to group") + " " +\
|
|
|
|
|
str(groupName) + " ...")
|
|
|
|
@ -1543,7 +1543,7 @@ class servUnix(shareLdap):
|
|
|
|
|
flagError = False
|
|
|
|
|
for group in userInGroups:
|
|
|
|
|
groupName = group[0][1]['cn'][0]
|
|
|
|
|
groupDN = self.addDN("cn="+group, self.relGroupsDN)
|
|
|
|
|
groupDN = self.addDN("cn=" + groupName, self.relGroupsDN)
|
|
|
|
|
if not self.modAttrsDN(groupDN, modAttrs):
|
|
|
|
|
flagError = True
|
|
|
|
|
break
|
|
|
|
@ -1552,6 +1552,7 @@ class servUnix(shareLdap):
|
|
|
|
|
else:
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def delUserGroupUnix(self, users, groupName):
|
|
|
|
|
"""Удаление пользователей из списка из группы Unix"""
|
|
|
|
|
res = self.searchUnixGroupName(groupName)
|
|
|
|
@ -1675,6 +1676,8 @@ class servMail(shareLdap):
|
|
|
|
|
"/usr/lib/calculate/calculate-server/ldif/mail_base.ldif"
|
|
|
|
|
self.ldifFileUser =\
|
|
|
|
|
"/usr/lib/calculate/calculate-server/ldif/mail_user.ldif"
|
|
|
|
|
self.ldifFileGroup =\
|
|
|
|
|
"/usr/lib/calculate/calculate-server/ldif/mail_group.ldif"
|
|
|
|
|
# Алгоритм шифрования пароля для Mail пользователя
|
|
|
|
|
self.userCrypt = "{SSHA}"
|
|
|
|
|
# Директория где хранятся письма
|
|
|
|
@ -1686,16 +1689,152 @@ class servMail(shareLdap):
|
|
|
|
|
# создаем объект сервиса Unix
|
|
|
|
|
self.servUnixObj = servUnix()
|
|
|
|
|
|
|
|
|
|
def searchGroupsMail(self, userGroups, printError=True):
|
|
|
|
|
"""Ищет список групп из списка userGroups в Mail сервисе
|
|
|
|
|
|
|
|
|
|
Список групп может состоять из названий групп или их почтовых адресов
|
|
|
|
|
Возвращает список названий групп
|
|
|
|
|
"""
|
|
|
|
|
userGroupNames = []
|
|
|
|
|
flagError = False
|
|
|
|
|
searchEmailGroup = True
|
|
|
|
|
searchNameGroup = True
|
|
|
|
|
for userGroup in userGroups:
|
|
|
|
|
if "@" in userGroup:
|
|
|
|
|
searchEmailGroup = self.searchGroupToMail(userGroup)
|
|
|
|
|
if not searchEmailGroup:
|
|
|
|
|
flagError = True
|
|
|
|
|
break
|
|
|
|
|
userGroupNames.append(searchEmailGroup[0][0][1]['cn'][0])
|
|
|
|
|
else:
|
|
|
|
|
searchNameGroup = self.searchMailGroupToName(userGroup)
|
|
|
|
|
if not searchNameGroup:
|
|
|
|
|
flagError = True
|
|
|
|
|
break
|
|
|
|
|
userGroupNames.append(userGroup)
|
|
|
|
|
if flagError:
|
|
|
|
|
if printError:
|
|
|
|
|
if not searchEmailGroup:
|
|
|
|
|
self.printERROR(_("Email addres") + ": " +\
|
|
|
|
|
str(userGroup) + " " +\
|
|
|
|
|
_("is not found in Mail service") + " ...")
|
|
|
|
|
elif not searchNameGroup:
|
|
|
|
|
self.printERROR(_("Group name") + ": " +\
|
|
|
|
|
str(userGroup) + " " +\
|
|
|
|
|
_("is not found in Mail service") + " ...")
|
|
|
|
|
return False
|
|
|
|
|
return userGroupNames
|
|
|
|
|
|
|
|
|
|
def searchMailGroupToName(self, groupName):
|
|
|
|
|
"""Находит группу сервиса Unix по её имени"""
|
|
|
|
|
resSearch = self.searchLdapDN(groupName, self.relGroupsDN, "cn")
|
|
|
|
|
return resSearch
|
|
|
|
|
|
|
|
|
|
def searchMailGroup(self, nameOrMali):
|
|
|
|
|
"""Находит группу сервиса Mail по имени или email"""
|
|
|
|
|
if "@" in nameOrMali:
|
|
|
|
|
resSearch = self.searchGroupToMail(nameOrMali)
|
|
|
|
|
else:
|
|
|
|
|
resSearch = self.searchMailGroupToName(nameOrMali)
|
|
|
|
|
return resSearch
|
|
|
|
|
|
|
|
|
|
def searchMailMember(self, nameOrMali, printError=True):
|
|
|
|
|
"""Ищет группы сервиса Unix в котрых есть данный пользователь
|
|
|
|
|
|
|
|
|
|
Поиск происходит по email или имени пользователя
|
|
|
|
|
"""
|
|
|
|
|
resSearchUser = self.searchMailUser(nameOrMali)
|
|
|
|
|
if not resSearchUser:
|
|
|
|
|
if printError:
|
|
|
|
|
self.printERROR(_("Mail user or email:")+ " " +\
|
|
|
|
|
str(nameOrMali) + " " +\
|
|
|
|
|
_("not found in Mail service") + " ...")
|
|
|
|
|
return False
|
|
|
|
|
userMail = resSearchUser[0][0][1]['mail'][0]
|
|
|
|
|
resSearchGroup = self.searchLdapDN(userMail, self.relGroupsDN,
|
|
|
|
|
"rfc822member")
|
|
|
|
|
return (userMail, resSearchGroup)
|
|
|
|
|
|
|
|
|
|
def delUserInGroup(self, userName):
|
|
|
|
|
"""Удаление из групп в которые входит пользователь"""
|
|
|
|
|
resSearch = self.searchMailMember(userName)
|
|
|
|
|
if not resSearch:
|
|
|
|
|
return False
|
|
|
|
|
userMail = resSearch[0]
|
|
|
|
|
userInGroups = resSearch[1]
|
|
|
|
|
modAttrs = [(ldap.MOD_DELETE, 'rfc822member', userMail)]
|
|
|
|
|
flagError = False
|
|
|
|
|
for group in userInGroups:
|
|
|
|
|
groupName = group[0][1]['cn'][0]
|
|
|
|
|
groupDN = self.addDN("cn=" + groupName, self.relGroupsDN)
|
|
|
|
|
if not self.modAttrsDN(groupDN, modAttrs):
|
|
|
|
|
flagError = True
|
|
|
|
|
break
|
|
|
|
|
if flagError:
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def modUserMailServer(self,userName, options):
|
|
|
|
|
"""Модифицирует настройки пользователя Mail в LDAP"""
|
|
|
|
|
res = self.searchMailUserToName(userName)
|
|
|
|
|
if not res:
|
|
|
|
|
self.printERROR(_("User") + " " + str(userName) + " " +\
|
|
|
|
|
_("not found in Mail service") + " ...")
|
|
|
|
|
return False
|
|
|
|
|
# Новые группы в которые входит пользователь
|
|
|
|
|
if options.has_key('G'):
|
|
|
|
|
userGroups = options['G'].split(',')
|
|
|
|
|
#список имен добавляемых групп
|
|
|
|
|
userGroupNames = self.searchGroupsMail(userGroups)
|
|
|
|
|
if not userGroupNames:
|
|
|
|
|
return False
|
|
|
|
|
# Удаляем пользователя из групп в которые он входит
|
|
|
|
|
if not self.delUserInGroup(userName):
|
|
|
|
|
return False
|
|
|
|
|
flagError = False
|
|
|
|
|
for group in userGroupNames:
|
|
|
|
|
if not self.addUsersGroupMail([userName], group):
|
|
|
|
|
flagError = True
|
|
|
|
|
break
|
|
|
|
|
if flagError:
|
|
|
|
|
return False
|
|
|
|
|
self.printSUCCESS(_("Replace list of supplementary group") +\
|
|
|
|
|
" ...")
|
|
|
|
|
|
|
|
|
|
@adminConnectLdap
|
|
|
|
|
def addGroupMailServer(self, groupName, options):
|
|
|
|
|
"""Добавляет группу пользователей Mail"""
|
|
|
|
|
pass
|
|
|
|
|
#resGroup = self.searchGroupToMail(groupName)
|
|
|
|
|
#resUser =
|
|
|
|
|
if self.searchMailGroupToName(groupName):
|
|
|
|
|
self.printERROR(_("group name")+ " " + str(groupName) + " " +\
|
|
|
|
|
_("found in Mail dervice") + " ...")
|
|
|
|
|
return False
|
|
|
|
|
mail = "%s@%s.%s" %(groupName,
|
|
|
|
|
self.clVars.Get("net_host"),
|
|
|
|
|
self.clVars.Get("sys_domain"))
|
|
|
|
|
if self.searchUserToMail(mail) or\
|
|
|
|
|
self.searchGroupToMail(mail):
|
|
|
|
|
self.printERROR(_("Email addres") + ": " + str(mail) +\
|
|
|
|
|
" " + _("is found in Mail service") + " ...")
|
|
|
|
|
return False
|
|
|
|
|
self.clVars.Set("soft_ldap_group_name",groupName)
|
|
|
|
|
ldifFile = self.ldifFileGroup
|
|
|
|
|
groupLdif = self.createLdif(ldifFile)
|
|
|
|
|
if not groupLdif:
|
|
|
|
|
print self.getError()
|
|
|
|
|
return False
|
|
|
|
|
if not self.ldapObj.getError():
|
|
|
|
|
self.ldapObj.ldapAdd(groupLdif)
|
|
|
|
|
if self.ldapObj.getError():
|
|
|
|
|
print _("LDAP Error") + ": " + self.ldapObj.getError()
|
|
|
|
|
return False
|
|
|
|
|
self.printSUCCESS(_("Added group in Mail service") + " ...")
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def modUserMailPasswd(self, userName, options):
|
|
|
|
|
"""Устанавливает пароль Mail пользователя и меняет его опции"""
|
|
|
|
|
res = self.searchMailUser(userName)
|
|
|
|
|
res = self.searchMailUserToName(userName)
|
|
|
|
|
if not res:
|
|
|
|
|
self.printERROR(
|
|
|
|
|
_("User %s is not found in Mail service") % str(userName) +\
|
|
|
|
@ -1746,8 +1885,30 @@ class servMail(shareLdap):
|
|
|
|
|
os.chown(mailDir,uid,gid)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def searchUsersInGroupMail(self, usersNames, groupName):
|
|
|
|
|
"""Ищет спиcок пользователей в группе, ищет в LDAP
|
|
|
|
|
|
|
|
|
|
В случае успеха выводит список найденных пользователей
|
|
|
|
|
если нет группы False
|
|
|
|
|
если ничего не найдено пустой список
|
|
|
|
|
"""
|
|
|
|
|
res = self.searchMailGroupToName(groupName)
|
|
|
|
|
if not res:
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
findUsers = []
|
|
|
|
|
if res[0][0][1].has_key('rfc822member'):
|
|
|
|
|
usersInGroup = res[0][0][1]['rfc822member']
|
|
|
|
|
for userName in usersNames:
|
|
|
|
|
userMail = "%s@%s.%s" %(userName,
|
|
|
|
|
self.clVars.Get("net_host"),
|
|
|
|
|
self.clVars.Get("sys_domain"))
|
|
|
|
|
if userMail in usersInGroup:
|
|
|
|
|
findUsers.append(userName)
|
|
|
|
|
return findUsers
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def searchMailUser(self, userName):
|
|
|
|
|
def searchMailUserToName(self, userName):
|
|
|
|
|
"""Находит пользователя сервиса Mail по имени"""
|
|
|
|
|
resSearch = self.searchLdapDN(userName, self.relUsersDN, "uid")
|
|
|
|
|
return resSearch
|
|
|
|
@ -1760,6 +1921,14 @@ class servMail(shareLdap):
|
|
|
|
|
"mailAlternateAddress")
|
|
|
|
|
return resSearch
|
|
|
|
|
|
|
|
|
|
def searchMailUser(self, nameOrMali):
|
|
|
|
|
"""Находит пользователя сервиса Mail по имени или email"""
|
|
|
|
|
if "@" in nameOrMali:
|
|
|
|
|
resSearch = self.searchUserToMail(nameOrMali)
|
|
|
|
|
else:
|
|
|
|
|
resSearch = self.searchMailUserToName(nameOrMali)
|
|
|
|
|
return resSearch
|
|
|
|
|
|
|
|
|
|
def searchGroupToMail(self, mail):
|
|
|
|
|
"""Находит группу по ее почтовому адресу"""
|
|
|
|
|
resSearch = self.searchLdapDN(mail, self.relGroupsDN, "mail")
|
|
|
|
@ -1768,6 +1937,39 @@ class servMail(shareLdap):
|
|
|
|
|
"mailAlternateAddress")
|
|
|
|
|
return resSearch
|
|
|
|
|
|
|
|
|
|
def addUsersGroupMail(self, users, groupName):
|
|
|
|
|
"""Добавляет пользователей из списка в Mail группу"""
|
|
|
|
|
if not self.searchMailGroupToName(groupName):
|
|
|
|
|
self.printERROR(_("Group name not found in Mail service ..."))
|
|
|
|
|
return False
|
|
|
|
|
flagFalse = False
|
|
|
|
|
for userName in users:
|
|
|
|
|
if not self.searchMailUserToName(userName):
|
|
|
|
|
self.printERROR(_("User") + " " + str(userName) + " " +\
|
|
|
|
|
_("not found in Mail service" +" ..."))
|
|
|
|
|
flagFalse = True
|
|
|
|
|
break
|
|
|
|
|
if flagFalse:
|
|
|
|
|
return False
|
|
|
|
|
foundUsersMail = self.searchUsersInGroupMail(users, groupName)
|
|
|
|
|
foundUsers = []
|
|
|
|
|
if foundUsersMail:
|
|
|
|
|
foundUsers = foundUsersMail
|
|
|
|
|
addUsers = []
|
|
|
|
|
for user in users:
|
|
|
|
|
if not(user in foundUsers):
|
|
|
|
|
addUsers.append(user)
|
|
|
|
|
modAttrs = []
|
|
|
|
|
for userName in addUsers:
|
|
|
|
|
userMail = "%s@%s.%s" %(userName,
|
|
|
|
|
self.clVars.Get("net_host"),
|
|
|
|
|
self.clVars.Get("sys_domain"))
|
|
|
|
|
modAttrs.append((ldap.MOD_ADD, 'rfc822member', userMail))
|
|
|
|
|
if modAttrs:
|
|
|
|
|
groupDN = self.addDN("cn="+groupName, self.relGroupsDN)
|
|
|
|
|
return self.modAttrsDN(groupDN, modAttrs)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
@adminConnectLdap
|
|
|
|
|
def addUserMailServer(self, userName, options):
|
|
|
|
|
"""Добавляет почтового пользователя в LDAP-сервер"""
|
|
|
|
@ -1789,6 +1991,18 @@ class servMail(shareLdap):
|
|
|
|
|
" ...")
|
|
|
|
|
return False
|
|
|
|
|
modAttrs.append((ldap.MOD_ADD, 'mailAlternateAddress', mail))
|
|
|
|
|
if self.searchMailUserToName(userName):
|
|
|
|
|
self.printERROR(_("User exists in Mail service"))
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
mail = "%s@%s.%s" %(userName,
|
|
|
|
|
self.clVars.Get("net_host"),
|
|
|
|
|
self.clVars.Get("sys_domain"))
|
|
|
|
|
if self.searchUserToMail(mail) or\
|
|
|
|
|
self.searchGroupToMail(mail):
|
|
|
|
|
self.printERROR(_("Email addres") + ": " + str(mail) +\
|
|
|
|
|
" " + _("is found in Mail service") + " ...")
|
|
|
|
|
return False
|
|
|
|
|
resUnix = self.servUnixObj.searchUnixUser(userName)
|
|
|
|
|
resPwd = self.servUnixObj.searchPasswdUser(userName)
|
|
|
|
|
# Пароль пользователя почты
|
|
|
|
@ -1813,15 +2027,6 @@ class servMail(shareLdap):
|
|
|
|
|
_("User %s is not found in Mail service") % str(userName) +\
|
|
|
|
|
" ...")
|
|
|
|
|
return False
|
|
|
|
|
if self.searchMailUser(userName):
|
|
|
|
|
self.printERROR(_("User exists in Mail service"))
|
|
|
|
|
return False
|
|
|
|
|
elif self.searchUserToMail(userName) or\
|
|
|
|
|
self.searchGroupToMail(userName):
|
|
|
|
|
self.printERROR(\
|
|
|
|
|
_("User name %s is found in Mail service") %\
|
|
|
|
|
str(userName) + "...")
|
|
|
|
|
return False
|
|
|
|
|
self.clVars.Set("soft_ldap_user_login", userName)
|
|
|
|
|
#Полное имя пользователя
|
|
|
|
|
fullNameUser = self.servUnixObj.fullNameUser
|
|
|
|
@ -2410,7 +2615,7 @@ class servLdap(shareLdap):
|
|
|
|
|
# получаем ldif текст всей базы LDAP
|
|
|
|
|
ldifText = self.fullElementDNtoText("")
|
|
|
|
|
if not ldifText:
|
|
|
|
|
self.printError("Not found or empty service Unix DN")
|
|
|
|
|
self.printERROR("Not found or empty service Unix DN")
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
# генерируем название файла архива
|
|
|
|
@ -2424,7 +2629,7 @@ class servLdap(shareLdap):
|
|
|
|
|
# находим пути к профилям установленных сервисов
|
|
|
|
|
servicePaths, servInstalled = self.getServiceSetupPathProfiles()
|
|
|
|
|
if not servicePaths:
|
|
|
|
|
self.printError("Services are not installed")
|
|
|
|
|
self.printERROR("Services are not installed")
|
|
|
|
|
return False
|
|
|
|
|
# Все файлы которые нужно заархивировать
|
|
|
|
|
allArchFiles = []
|
|
|
|
@ -3090,6 +3295,13 @@ group already exists")
|
|
|
|
|
'helpChapter':_("Service Unix options"),
|
|
|
|
|
'help':_("new list of supplementary GROUPS")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(5,),
|
|
|
|
|
'shortOption':"G",
|
|
|
|
|
'longOption':"groups",
|
|
|
|
|
'optVal':"GROUPS",
|
|
|
|
|
'helpChapter':_("Service Mail options"),
|
|
|
|
|
'help':_("new list of supplementary email GROUPS")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(5,),
|
|
|
|
|
'shortOption':"a",
|
|
|
|
|
'longOption':"append",
|
|
|
|
@ -3097,6 +3309,13 @@ group already exists")
|
|
|
|
|
'helpChapter':_("Service Unix options"),
|
|
|
|
|
'help':_("append the user to the supplemental GROUPS")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(5,),
|
|
|
|
|
'shortOption':"a",
|
|
|
|
|
'longOption':"append",
|
|
|
|
|
'optVal':"GROUPS",
|
|
|
|
|
'helpChapter':_("Service Mail options"),
|
|
|
|
|
'help':_("append the user to the supplemental email GROUPS")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(5,),
|
|
|
|
|
'shortOption':"m",
|
|
|
|
|
'longOption':"move-home",
|
|
|
|
|