# Author: Zhang Huangbin import sys import types import web from controllers import base from libs import iredutils from libs.ldaplib import maillist, domain as domainlib, ldaputils, connUtils session = web.config.get('_session') # # Group related. # class List: def __del__(self): pass @base.require_login def GET(self, domain='', cur_page=1): domain = web.safestr(domain).split('/', 1)[0] cur_page = int(cur_page) if cur_page == 0: cur_page == 1 domainLib = domainlib.Domain() result = domainLib.listAccounts(attrs=['domainName']) if result[0] is True: allDomains = result[1] else: return result maillistLib = maillist.Maillist() if domain == '' or domain is None: # List mail lists if only one domain available. if isinstance(allDomains, types.ListType) is True and len(allDomains) == 1: cur_domain = str(allDomains[0][1]['domainName'][0]) maillists = maillistLib.listAccounts(domain=cur_domain) if maillists is not False: return web.seeother('/maillists/' + cur_domain) else: return web.seeother('/domains?msg=NO_SUCH_DOMAIN') elif isinstance(allDomains, types.ListType) is True and len(allDomains) == 0: return web.render('ldap/maillist/list.html', msg='NO_DOMAIN_AVAILABLE', ) elif isinstance(allDomains, types.ListType) is True and len(allDomains) > 1: return web.render('ldap/maillist/list.html', allDomains=allDomains, ) else: return web.seeother('/domains?msg=NO_SUCH_DOMAIN') else: result = maillistLib.listAccounts(domain=domain) if result[0] is True: i = web.input() connutils = connUtils.Utils() sl = connutils.getSizelimitFromAccountLists(result[1], curPage=cur_page, sizelimit=session['pageSizeLimit'],) if cur_page > sl.get('totalPages'): cur_page = sl.get('totalPages') return web.render( 'ldap/maillist/list.html', cur_page=cur_page, total=sl.get('totalAccounts'), maillists=sl.get('accountList'), cur_domain=domain, allDomains=allDomains, msg=i.get('msg'), ) else: return web.seeother('/domains?' + result[1]) @base.require_login def POST(self, domain, ): i = web.input(_unicode=False, mail=[]) self.domain = web.safestr(domain) self.mails = i.get('mail', []) self.action = i.get('action', None) maillistLib = maillist.Maillist() if self.action == 'delete': result = maillistLib.delete(domain=self.domain, mails=self.mails, ) msg = 'DELETED_SUCCESS' elif self.action == 'disable': result = maillistLib.enableOrDisableAccount(domain=self.domain, mails=self.mails, action='disable', ) msg = 'DISABLED_SUCCESS' elif self.action == 'enable': result = maillistLib.enableOrDisableAccount(domain=self.domain, mails=self.mails, action='enable', ) msg = 'ENABLED_SUCCESS' else: result = (False, 'INVALID_ACTION') msg = i.get('msg', None) if result[0] is True: return web.seeother('/maillists/%s?msg=%s' % (self.domain, msg)) else: return web.seeother('/maillists/%s?msg=%s' % (self.domain, result[1])) class Create: @base.require_login def GET(self, domainName=None): i = web.input() if domainName is None: self.cur_domain = '' else: self.cur_domain = web.safestr(domainName) domainLib = domainlib.Domain() result = domainLib.listAccounts(attrs=['domainName', 'accountSetting',]) if result[0] is True: allDomains = result[1] if len(allDomains) == 0: return web.seeother('/domains?msg=NO_DOMAIN_AVAILABLE') else: # Redirect to create new user under first domain, so that we # can get per-domain account settings, such as number of # account limit, password length control, etc. if self.cur_domain == '': return web.seeother('/create/maillist/' + str(allDomains[0][1]['domainName'][0])) # Get accountSetting of current domain. allAccountSettings = ldaputils.getAccountSettingFromLdapQueryResult(allDomains, key='domainName') domainAccountSetting = allAccountSettings.get(self.cur_domain, {}) else: return web.seeother('/domains?msg=' % result[1]) # Get number of users. connutils = connUtils.Utils() result = connutils.getNumberOfCurrentAccountsUnderDomain(self.cur_domain, accountType='maillist', ) if result[0] is True: numberOfCurrentAccounts = result[1] else: numberOfCurrentAccounts = 0 return web.render('ldap/maillist/create.html', cur_domain=self.cur_domain, allDomains=allDomains, domainAccountSetting=domainAccountSetting, numberOfCurrentAccounts=numberOfCurrentAccounts, msg=i.get('msg'), ) @base.require_login def POST(self): i = web.input() # Get domain name, maillist name, cn. self.domain = web.safestr(i.get('domainName')) self.listname = web.safestr(i.get('listname')) maillistLib = maillist.Maillist() result = maillistLib.add(domain=self.domain, data=i) if result[0] is True: # Redirect to profile page for assigning internal members. return web.seeother('/profile/maillist/members/%s?msg=CREATED_SUCCESS' % (self.listname + '@' + self.domain)) else: return web.seeother('/create/maillist/%s?msg=%s' % (self.domain, result[1])) class Profile: @base.require_login def GET(self, profile_type, mail): self.profile_type = web.safestr(profile_type) self.mail = web.safestr(mail) self.domain = web.safestr(self.mail.split('@')[1]) if not iredutils.isDomain(self.domain): return web.seeother('/domains?msg=INVALID_DOMAIN') maillistLib = maillist.Maillist() result = maillistLib.profile( domain=self.domain, mail=self.mail, profile_type=self.profile_type, ) if result[0] is True: i = web.input() return web.render('ldap/maillist/profile.html', profile_type=self.profile_type, mail=self.mail, maillist_profile=result[1], msg=i.get('msg'), ) else: return web.seeother('/domains?' + result[1]) @base.require_login def POST(self, profile_type, mail): self.profile_type = web.safestr(profile_type) self.mail = web.safestr(mail) i = web.input() maillistLib = maillist.Maillist() result = maillistLib.update(profile_type=self.profile_type, mail=self.mail, data=i,) if result[0] is True: return web.seeother('/profile/maillist/%s/%s?msg=PROFILE_UPDATED_SUCCESS' % (self.profile_type, self.mail)) else: return web.seeother('/profile/maillist/%s/%s?msg=%s' % (self.profile_type, self.mail, result[1])) class Members: @base.require_login def GET(self, mail,): self.mail = web.safestr(mail) self.domain = self.mail.split('@')[1] if not iredutils.isDomain(self.domain): return web.seeother('/domains?msg=INVALID_DOMAIN') maillistLib = maillist.Maillist() # Get profile of mail list. result = maillistLib.profile(domain=self.domain, mail=self.mail,) if result[0] is not True: return web.seeother('/maillists/%s?msg=%s' % (self.domain, str(result[1]))) i = web.input() # Get both internal & external members. allMembers = maillistLib.members( domain=self.domain, mail=self.mail, ) return web.render( 'ldap/maillist/profile.html', profile_type='members', mail=self.mail, maillist_profile=result[1], internal_members=allMembers[1], external_members=allMembers[2], msg=i.get('msg'), ) # Assign or remove members. @base.require_login def POST(self, mail,): self.mail = web.safestr(mail) self.domain = self.mail.split('@')[1] msg = '' if not iredutils.isDomain(self.domain): return web.seeother('/domains?msg=INVALID_DOMAIN') maillistLib = maillist.Maillist() result = maillistLib.profile(domain=self.domain, mail=self.mail,) if result[0] is not True: return web.seeother('/domains?msg=' + result[1]) i = web.input(_unicode=False, mail=[],) # form var: profile_action # - remove_internal # - remove_external # - add_members self.profile_action = i.get('profile_action', None) if self.profile_action == 'remove_internal': # Remove internal members. self.members = i.get('mail', []) if len(self.members) < 1: return web.seeother('/profile/maillist/members/%s?msg=NO_MEMBER_SELECTED' % (self.mail)) try: r = maillistLib.assignOrRemoveInternalMembers( domain=self.domain, mail=self.mail, members=self.members, action='remove', ) if r[0] is True: return web.seeother('/profile/maillist/members/%s?msg=PROFILE_UPDATED_SUCCESS' % (self.mail,)) else: return web.seeother('/profile/maillist/members/%s?msg=%s' % (self.mail, r[1])) except Exception, e: return web.seeother('/profile/maillist/members/%s?msg=%s' % ( self.mail, ldaputils.getExceptionDesc(e), ) ) elif self.profile_action == 'remove_external': # Remove external members. self.members = i.get('mail', []) if len(self.members) < 1: return web.seeother('/profile/maillist/members/%s?msg=NO_MEMBER_SELECTED' % (self.mail)) try: r = maillistLib.assignOrRemoveExternalMembers( domain=self.domain, mail=self.mail, members=self.members, action='remove', ) if r[0] is True: web.seeother('/profile/maillist/members/%s?msg=PROFILE_UPDATED_SUCCESS' % (self.mail,)) else: web.seeother('/profile/maillist/members/%s?msg=%s' % (self.mail, r[1])) except Exception, e: web.seeother('/profile/maillist/members/%s?msg=%s' % (self.mail, ldaputils.getExceptionDesc(e),)) elif self.profile_action == 'add_members': # Pre-defined. self.members = [] # Get members from web form, split by new line. self.membersFromForm = i.get('members', '').splitlines() # Split by comma, space. for m in self.membersFromForm: tmpList = str(m).strip().split(',') for j in tmpList: tmpList2 = str(j).strip().split(' ') self.members += [str(v) for v in tmpList2 if iredutils.isEmail(str(v))] self.internalMembers = [v for v in self.members if v.endswith(self.domain)] self.externalMembers = [v for v in self.members if not v.endswith(self.domain)] # Add internal members. if len(self.internalMembers) > 0: try: r = maillistLib.assignOrRemoveInternalMembers( domain=self.domain, mail=self.mail, members=self.internalMembers, action='assign', ) if r[0] is False: msg += r[1] except Exception, e: msg += ldaputils.getExceptionDesc(e) else: pass # Add external members. if len(self.externalMembers) > 0: try: r = maillistLib.assignOrRemoveExternalMembers( domain=self.domain, mail=self.mail, members=self.externalMembers, action='assign', ) if r[0] is False: msg += r[1] except Exception, e: msg += ldaputils.getExceptionDesc(e) if msg == '': return web.seeother('/profile/maillist/members/%s?msg=PROFILE_UPDATED_SUCCESS' % (self.mail,)) else: return web.seeother('/profile/maillist/members/%s?msg=%s' % (self.mail, msg,)) class Moderators: @base.require_login def GET(self, mail,): self.mail = web.safestr(mail) self.domain = self.mail.split('@')[1] if not iredutils.isDomain(self.domain): return web.seeother('/domains?msg=INVALID_DOMAIN') maillistLib = maillist.Maillist() result = maillistLib.profile(domain=self.domain, mail=self.mail,) if result[0] is not True: return web.seeother('/domains?msg=' + result[1]) i = web.input() # Get internal moderators. allModerators = maillistLib.moderators( domain=self.domain, mail=self.mail, ) if allModerators[0] is False: return web.seeother('/profile/maillist/general/%s?msg=%s' % (self.mail, result[1])) return web.render( 'ldap/maillist/profile.html', profile_type='moderators', mail=self.mail, maillist_profile=result[1], internal_moderators=allModerators[1], external_moderators=allModerators[2], msg=i.get('msg'), ) # Assign or remove moderators. @base.require_login def POST(self, mail,): self.mail = web.safestr(mail) self.domain = self.mail.split('@')[1] msg = '' if not iredutils.isDomain(self.domain): return web.seeother('/domains?msg=INVALID_DOMAIN') i = web.input(_unicode=False, mail=[],) self.profile_action = i.get('profile_action') # Update moderators with submited moderators. maillistLib = maillist.Maillist() # Get mail list of moderators. if self.profile_action == 'remove' or self.profile_action == 'delete': self.action = 'remove' self.moderators = i.get('mail', []) elif self.profile_action == 'add_moderators': self.action = 'assign' self.moderators = [] # Get members from web form. self.moderatorsFromForm = i.get('moderators', '').splitlines() # Split by comma, space. for m in self.moderatorsFromForm: tmpList = str(m).strip().split(',') for j in tmpList: tmpList2 = str(j).strip().split(' ') self.moderators += [str(v) for v in tmpList2 if iredutils.isEmail(str(v))] self.moderators = [str(v) for v in self.moderators if iredutils.isEmail(str(v))] try: r = maillistLib.assignOrRemoveModerators( domain=self.domain, mail=self.mail, moderators=self.moderators, action=self.action, ) except Exception, e: msg += ldaputils.getExceptionDesc(e) if msg == '': return web.seeother('/profile/maillist/moderators/%s?msg=PROFILE_UPDATED_SUCCESS' % (self.mail,)) else: return web.seeother('/profile/maillist/moderators/%s?msg=%s' % (self.mail, msg,))