# Author: Zhang Huangbin import sys import types import ldap import web from controllers import base from libs import iredutils from libs.ldaplib import alias, domain as domainlib, attrs, ldaputils, connUtils session = web.config.get('_session') 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() if result[0] is True: allDomains = result[1] else: return result aliasLib = alias.Alias() if domain == '' or domain is None: #return web.render('ldap/alias/list.html', allDomains=allDomains) # List mail aliases if only one domain available. if isinstance(allDomains, types.ListType) is True and len(allDomains) == 1: cur_domain = str(allDomains[0][1]['domainName'][0]) result = aliasLib.listAccounts(domain=cur_domain) if result[0] is True: return web.seeother('/aliases/' + cur_domain) else: return web.seeother('/domains?msg=%s' % result[1]) elif isinstance(allDomains, types.ListType) is True and len(allDomains) == 0: return web.render('ldap/alias/list.html', msg='NO_DOMAIN_AVAILABLE', ) elif isinstance(allDomains, types.ListType) is True and len(allDomains) > 1: return web.render('ldap/alias/list.html', allDomains=allDomains, ) else: return web.seeother('/domains?msg=NO_SUCH_DOMAIN') else: result = aliasLib.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/alias/list.html', cur_page=cur_page, total=sl.get('totalAccounts'), aliases=sl.get('accountList'), cur_domain=domain, allDomains=allDomains, msg=i.get('msg'), ) else: return web.seeother('/domains?msg=%s' % result[1]) # Delete aliases. @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) aliasLib = alias.Alias() if self.action == 'delete': result = aliasLib.delete(domain=self.domain, mails=self.mails,) msg = 'DELETED_SUCCESS' elif self.action == 'disable': result = aliasLib.enableOrDisableAccount(domain=self.domain, mails=self.mails, action='disable',) msg = 'DISABLED_SUCCESS' elif self.action == 'enable': result = aliasLib.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('/aliases/%s?msg=%s' % (self.domain, msg)) else: return web.seeother('/aliases/%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/alias/' + 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 result # Get number of users. connutils = connUtils.Utils() result = connutils.getNumberOfCurrentAccountsUnderDomain(self.cur_domain, accountType='alias', ) if result[0] is True: numberOfCurrentAccounts = result[1] else: numberOfCurrentAccounts = 0 return web.render('ldap/alias/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')) aliasLib = alias.Alias() result = aliasLib.add(domain=self.domain, data=i) if result[0] is True: # Redirect to profile page for adding members. return web.seeother('/profile/alias/general/%s?msg=CREATED_SUCCESS' % (self.listname + '@' + self.domain)) else: return web.seeother('/create/alias/%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') aliasLib = alias.Alias() result = aliasLib.profile(domain=self.domain, mail=self.mail) if result[0] is True: i = web.input(mailForwardingAddress=[],) result_members = aliasLib.members(domain=self.domain, mail=self.mail,) return web.render('ldap/alias/profile.html', profile_type=self.profile_type, mail=self.mail, alias_profile=result[1], alias_members=result_members[1], msg=i.get('msg'), ) else: return web.seeother('/domains?msg=%s' % result[1]) @base.require_login def POST(self, profile_type, mail,): self.profile_type = web.safestr(profile_type) self.mail = web.safestr(mail) self.domain = web.safestr(self.mail.split('@')[1]) i = web.input(mailForwardingAddress=[],) aliasLib = alias.Alias() result = aliasLib.update( profile_type=self.profile_type, mail=self.mail, data=i, ) if result[0] is True: return web.seeother('/profile/alias/%s/%s?msg=PROFILE_UPDATED_SUCCESS' % (self.profile_type, self.mail,)) else: return web.seeother('/profile/alias/%s/%s?msg=%s' % (self.profile_type, self.mail, result[1]))