def addEntry(self, newRecord, user, accountStatus, vpnEnabled): def mailOut(result): if result[0]: print "Welcome message was successfully sent to %s" % newRecord[ 'mail'][0] else: print "Error sending welcome message to %s" % newRecord[ 'mail'][0] l = LDAP.createLDAPConnection(Settings.LDAPServer, 'o=' + Settings.LDAPBase, Settings.LDAPManager, Settings.LDAPPass) dc = "%s,%s,o=%s" % (Settings.LDAPPeople, LDAP.domainToDC( self.domain), Settings.LDAPBase) # Send this to Thebe ser = WebUtils.serialiseUser(newRecord, self.domain) mail = "%s@%s" % (user, self.domain) self.handler.sendMessage(self.handler.master.hiveName, "user:%s:%s" % (mail, ser)) try: print newRecord, user, dc LDAP.addElement(l, 'uid=%s,%s' % (user, dc), newRecord) except Exception, L: print "Error adding element", L l.unbind_s() return url.root.child('Users').child(self.domain).child("Error")
def Burst(_): print "Burst start", _ for i in v: path, detail = i[0] if "ou=People" not in path: continue dom = path.split(',o=')[0].split('ou=People,dc=')[-1].replace(',dc=', '.') x = WebUtils.serialiseUser(detail, dom) # create a mail resource locator mail = "%s@%s" % (detail['uid'][0], dom) print "User check:", mail self.handler.sendMessage(self.handler.master.hiveName, "user:%s:%s" % (mail, x)) # soften this reactor.callLater(2, self.handler.sendMessage, self.handler.master.hiveName, "usernoburst:+:+")
class editPage(Base.Page): addSlash = True userData = {} def __init__(self, avatarId=None, db=None, cid=None, domain=None, returns=None, *a, **ka): PageHelpers.DefaultPage.__init__(self, avatarId, db, *a, **ka) self.avatarId = avatarId self.cid = cid self.domain = domain self.returns = returns if domain: self.lc = LDAP.LDAPConnector(self.domain, self.sysconf) def form_editForm(self, data): domains = [] if self.avatarId.isAdmin: for i in self.flatFil: thisdom = i.split('dm=')[-1].split(',')[0] if not thisdom in domains: domains.append(thisdom) # Form population userData = self.lc.getUser(self.cid) devList = [] #extList = [] rouList = [] UserExtForm = [] fkeyForm = [] if Settings.sambaDN and self.domain == Settings.defaultDomain and PBXUtils.enabled( ): includeList = [] includeList = self.sysconf.PBXExtensions.get( userData['uid'][0], {'extensions': []})['extensions'] devIncList = self.sysconf.PBXExtensions.get( userData['uid'][0], {'devices': []})['devices'] extList = PBXUtils.getAvaExtenNumSelect(True, includeList) #for ext in PBXUtils.getAvailibleExtensions(): # extList.append((str(ext), str(ext))) for dev in PBXUtils.getAllAvaExtDeviceEndPoints(devIncList): devList.append((str(dev), str(dev))) queueList = [ (queue, queue) for queue in self.sysconf.PBX.get('queues', {}).keys() ] rouList = self.sysconf.PBXRouters.keys() extensionWidget = formal.widgetFactory(formal.SelectChoice, options=extList) deviceWidget = formal.widgetFactory(formal.SelectChoice, options=devList) #queueWidget = formal.widgetFactory(formal.SelectChoice, options = queueList) userExtensions = PBXUtils.getExtensionSelect() queueOptions = formal.widgetFactory(formal.SelectChoice, options=[(1, "Level 1 Member"), (2, "Level 2 Member"), (3, "Level 3 Member") ]) queues = [] for queue in self.sysconf.PBX.get('queues', {}).keys()[0:-1]: queues.append( formal.Field('queue%s' % queue, formal.Integer(), queueOptions, label="Queue %s" % queue)) try: queue = self.sysconf.PBX.get('queues', {}).keys()[-1] except: queue = None if queue: queues.append( formal.Field( 'queue%s' % queue, formal.Integer(), queueOptions, label="Queue %s" % queue, description= "Each extension may be part of many queues, each queue membersip has a specific weighting. The weighting determines the order in which calls may be seeded. Level 2 members only get calls seeded to them once Level 1 has been saturated etc." )) fKeyOptions = formal.widgetFactory(formal.SelectChoice, options=userExtensions) fKeys = [] maxKeys = 54 for i in range(maxKeys): fKeys.append( formal.Field('fkeys%s' % i, formal.String(), fKeyOptions, label="Key %s" % i)) fKeys.append( formal.Field( 'fkeys%s' % maxKeys, formal.String(), fKeyOptions, label="Key %s" % maxKeys, description= "Select the extensions for the function keys above")) userExtFormContent = [ formal.Field('userExtEnabled', formal.Boolean(), label=self.text.userFormLabelExtEnabled), formal.Field('userExtOutbound', formal.Sequence(formal.String()), formal.widgetFactory(formal.CheckboxMultiChoice, options=[(i, i) for i in rouList]), label=self.text.userFormLabelOutbound, description=self.text.userFormDescOutbound), #formal.Field('userExtQueues', formal.Sequence(formal.String()), # formal.widgetFactory(formal.CheckboxMultiChoice, # options = queueList), # label = self.text.userFormLabelQueues, # description = self.text.userFormDescQueues), ] userExtFormContent.extend(queues) userExtFormContent.extend([ formal.Field( 'userLowBW', formal.Boolean(), label="Low Bandwidth", description= 'Indicates that the devices(if applicable) should use a low bandwidth codec' ), formal.Field( 'userExtTimeout', formal.Integer(), label="Timeout", description= "How many seconds should we wait before giving up on this extension, note that setting this to 0 will force the extension to use the default timeout" ), formal.Field( 'userExtqTimeout', formal.Integer(), label="Queue Timeout", description= "How many seconds should we wait before giving up on this queue member, 0 will indicate to use the default" ), formal.Field('userExtCallerID', formal.String(), label=self.text.userFormLabelCallID), formal.Field('userExtNumber0', formal.String(), extensionWidget, label=self.text.userFormLabelExtNumber), formal.Field('userExtNumber1', formal.String(), extensionWidget, label=""), formal.Field('userExtNumber2', formal.String(), extensionWidget, label=""), formal.Field('userExtNumber3', formal.String(), extensionWidget, label=""), formal.Field('userExtNumber4', formal.String(), extensionWidget, label=""), formal.Field('userExtNumber5', formal.String(), extensionWidget, label=""), formal.Field('userExtNumber6', formal.String(), extensionWidget, label=""), formal.Field('userExtNumber7', formal.String(), extensionWidget, label=""), formal.Field('userExtNumber8', formal.String(), extensionWidget, label=""), formal.Field('userExtNumber9', formal.String(), extensionWidget, label=""), tags.div(_class="userLine")[tags.a( href="#", onclick="addExten();")[self.text.userFormLabelAddExt]], #formal.Field('userExtFwdUA', formal.String(), label = self.text.userFormLabelRedNoAnswer, # description = self.text.userFormDescRedNoAnswer), formal.Field('userExtDev0', formal.String(), deviceWidget, label=self.text.userFormLabelDev), formal.Field('userExtDev1', formal.String(), deviceWidget, label=""), formal.Field('userExtDev2', formal.String(), deviceWidget, label=""), formal.Field('userExtDev3', formal.String(), deviceWidget, label=""), formal.Field('userExtDev4', formal.String(), deviceWidget, label=""), formal.Field('userExtDev5', formal.String(), deviceWidget, label=""), formal.Field('userExtDev6', formal.String(), deviceWidget, label=""), formal.Field('userExtDev7', formal.String(), deviceWidget, label=""), formal.Field('userExtDev8', formal.String(), deviceWidget, label=""), formal.Field('userExtDev9', formal.String(), deviceWidget, label=""), tags.div(_class="userLine")[tags.a( href="#", onclick="addExtDev();")[self.text.userFormLabelAddDev]], formal.Field('userExtVoiceMail', formal.Boolean(), label=self.text.userFormLabelVoiceMail), formal.Field('userExtVoiceMailPin', formal.String(), label=self.text.userFormLabelVoiceMailPin), ]) UserExtForm = formal.Group('userExtension')[userExtFormContent] fkeyForm = formal.Group('userFKeys')[fKeys] form = formal.Form( self.submitForm )[formal.Group('userSettings')[tags.div(_class="field")[ tags.label[self.text.userFormLabelEmailAddress], tags.div(id="emailAd", _class="inputs")["%s@%s" % (self.cid, self.domain)]], formal.Field('uid', formal .String(required=True, validators=Base .UserNameValidators), label=self.text. userFormLabelUsername), formal.Field('givenName', formal.String( required=True), label=self.text. userFormLabelName), formal.Field('sn', formal.String(), label=self.text. userFormLabelSurname), formal.Field('userPassword', formal.String(), formal.CheckedPassword, label=self.text. userFormLabelPass), ], formal.Group('mailSettings') [formal.Field('mailForwardingAddress0', formal.String(), label=self. text.userFormLabelForward), formal.Field('mailForwardingAddress1', formal.String(), label=""), formal.Field('mailForwardingAddress2', formal.String(), label=""), formal.Field('mailForwardingAddress3', formal.String(), label=""), formal.Field('mailForwardingAddress4', formal.String(), label=""), formal.Field('mailForwardingAddress5', formal.String(), label=""), formal.Field('mailForwardingAddress6', formal.String(), label=""), formal.Field('mailForwardingAddress7', formal.String(), label=""), formal.Field('mailForwardingAddress8', formal.String(), label=""), formal.Field('mailForwardingAddress9', formal.String(), label=""), tags.div( _class="userLine")[tags.a(href="#", onclick="addForward();" )[self.text.userFormLabelAddline]], formal.Field('mailAlternateAddress0', formal.String(), label=self.text.userFormLabelAlias), formal.Field('mailAlternateAddress1', formal.String(), label=""), formal.Field('mailAlternateAddress2', formal.String(), label=""), formal.Field('mailAlternateAddress3', formal.String(), label=""), formal.Field('mailAlternateAddress4', formal.String(), label=""), formal.Field('mailAlternateAddress5', formal.String(), label=""), formal.Field('mailAlternateAddress6', formal.String(), label=""), formal.Field('mailAlternateAddress7', formal.String(), label=""), formal.Field('mailAlternateAddress8', formal.String(), label=""), formal.Field('mailAlternateAddress9', formal.String(), label=""), tags.div( _class="userLine")[tags.a(href="#", onclick="addAlias();" )[self.text.userFormLabelAddline]], formal.Field('vacen', formal.Boolean(), label=self.text.userFormLabelVacationActive, description=self.text.userFormTextVacationNote), formal.Field('vacation', formal.String(), formal.TextArea, label=self.text.userFormLabelVacation), formal.Field('vacvalidity', formal.Date(), label="Valid until", description= "Disable the vacation note automatically on this date" )], formal.Group('userPermissions')[ formal.Field('employeeType', formal.Boolean(), label=self.text.userFormLabelWeb), formal.Field('accountStatus', formal.Boolean(), label=self.text.userFormLabelEmail), formal.Field('tumsAdmin', formal.Boolean(), label=self.text.userFormLabelAdmin), formal.Field('tumsUser', formal.Sequence(formal.String()), formal.widgetFactory(formal.CheckboxMultiChoice, [( i, i) for i in domains]), label=self.text.userFormLabelDomainAdmin), formal.Field('tumsReports', formal.Boolean(), label=self.text.userFormLabelReports), formal.Field('copyto', formal.String(), label=self.text.userFormLabelCopy, description=self.text.userFormTextCopy)], formal.Group('userAccess')[ formal.Field('vpnEnabled', formal.Boolean(), label=self.text.userFormLabelVPN, description=self.text.userFormTextVPN), formal.Field('ftpEnabled', formal.Boolean(), label=self.text.userFormLabelFTP, description=self.text.userFormTextFTP), formal.Field('ftpGlobal', formal.Boolean(), label=self.text.userFormLabelGlobalFTP, description=self.text.userFormTextGlobal)], UserExtForm, fkeyForm] form.addAction(self.submitForm) tData = copy.deepcopy(userData) tData['userSettings.uid'] = tData['uid'][0] tData['userSettings.givenName'] = tData.get('givenName', [""])[0] tData['userSettings.sn'] = tData.get('sn', [""])[0] if tData.get('loginShell'): if '/bin/bash' in tData['loginShell']: tData['userAccess.ftpEnabled'] = True if self.sysconf.FTP.get('globals'): if tData['uid'][0] in self.sysconf.FTP['globals']: tData['userAccess.ftpGlobal'] = True tData['userSettings.userPassword'] = '' # Strip password address = "%s@%s" % (tData['uid'][0], self.domain) for i in os.listdir('/etc/openvpn/keys/'): if "%s.%s" % (self.cid, self.domain) in i and "key" in i: tData['userAccess.vpnEnabled'] = True if self.sysconf.Mail.get('copys', []): for addr, dest in self.sysconf.Mail['copys']: if addr == address: tData['userPermissions.copyto'] = dest if userData.get('accountStatus', False): tData['userPermissions.accountStatus'] = True else: tData['userPermissions.accountStatus'] = False if userData.get('mailForwardingAddress', False): for cnt, address in enumerate(userData['mailForwardingAddress']): tData['mailSettings.mailForwardingAddress%s' % cnt] = address if userData.get('mailAlternateAddress', False): for cnt, address in enumerate(userData['mailAlternateAddress']): tData['mailSettings.mailAlternateAddress%s' % cnt] = address emp = userData.get('employeeType', [False]) if 'squid' in emp: tData['userPermissions.employeeType'] = True else: tData['userPermissions.employeeType'] = False if 'tumsAdmin' in emp: tData['userPermissions.tumsAdmin'] = True else: tData['userPermissions.tumsAdmin'] = False if 'tumsReports' in emp: tData['userPermissions.tumsReports'] = True else: tData['userPermissions.tumsReports'] = False if emp[0]: for i in emp: if 'tumsUser[' in i: tData['userPermissions.tumsUser'] = i.split('[')[-1].split( ']')[0].split(',') try: vac = open( "/var/spool/mail/vacation/%s@%s.txt" % (self.cid, self.domain), 'r') tData['mailSettings.vacation'] = vac.read() tData['mailSettings.vacen'] = True except: pass # No vacation note try: vac = open( "/var/spool/mail/vacation/DISABLED%s@%s.txt" % (self.cid, self.domain), 'r') tData['mailSettings.vacation'] = vac.read() tData['mailSettings.vacen'] = False except: pass # No disabled note either. if os.path.exists('/var/spool/mail/vacation/%s@%s.validity' % (self.cid, self.domain)): n = open('/var/spool/mail/vacation/%s@%s.validity' % (self.cid, self.domain)).read().strip('\n') d = datetime.date(*[int(i) for i in n.split('-')]) tData['mailSettings.vacvalidity'] = d #Populate Userextension Data if PBXUtils.enabled(): ext = self.sysconf.PBXExtensions.get( tData['uid'][0], { 'enabled': False, 'lowbw': False, 'outbound': [], 'callerID': "", 'voiceMail': False, 'voiceMailPin': '', 'fkeys': [], 'extensions': [], 'devices': [], 'queues': {} }) tData['userExtension.userExtEnabled'] = ext['enabled'] tData['userExtension.userExtOutbound'] = ext['outbound'] tData['userExtension.userExtTimeout'] = ext.get('timeout', 0) tData['userExtension.userExtqTimeout'] = ext.get('qtimeout', 0) #tData['userExtension.userExtQueues'] = ext.get('queues', []) queueSettings = ext.get('queues', {}) if type(queueSettings) == list: n = {} for queue in queueSettings: n[queue] = 1 queueSettings = n for queue in self.sysconf.PBX.get('queues', {}).keys(): tData['userExtension.queue%s' % queue] = queueSettings.get( queue, None) tData['userExtension.userExtCallerID'] = ext['callerID'] tData['userExtension.userExtVoiceMail'] = ext['voiceMail'] tData['userExtension.userExtVoiceMailPin'] = ext['voiceMailPin'] tData['userExtension.userLowBW'] = ext.get('lowbw', False) for i in range(0, 9): try: tData['userExtension.userExtNumber%s' % i] = ext['extensions'][i] except: pass try: tData['userExtension.userExtDev%s' % i] = ext['devices'][i] except: pass for i in range(54): try: tData['userFKeys.fkeys%s' % i] = ext['fkeys'][i] except: pass form.data = tData return form def commitUserExtensions(self, form, data): def cAscii(val): if type(val) == str: return val.encode('ascii', 'replace') return val if Settings.sambaDN and self.domain == Settings.defaultDomain and PBXUtils.enabled( ): user = data['userSettings.uid'].encode('ascii', 'replace').lower() ext = self.sysconf.PBXExtensions.get( user, { 'enabled': False, 'lowbw': False, 'outbound': [], 'callerID': "", 'voiceMail': False, 'voiceMailPin': '', 'fkeys': [], 'extensions': [], 'devices': [], 'queues': {} }) ext['enabled'] = data['userExtension.userExtEnabled'] if data['userExtension.userExtOutbound']: ext['outbound'] = [ cAscii(i) for i in data['userExtension.userExtOutbound'] ] #if data['userExtension.userExtQueues']: # ext['queues'] = [ # cAscii(i) # for i in data['userExtension.userExtQueues'] # ] #else: # ext['queues'] = [] userQueues = {} for queue in self.sysconf.PBX.get('queues', {}).keys(): penalty = data.get("userExtension.queue%s" % queue, None) if penalty: userQueues[queue.encode('ascii', 'replace')] = penalty ext['queues'] = userQueues if data['userExtension.userExtCallerID']: ext['callerID'] = cAscii(data['userExtension.userExtCallerID']) else: ext['callerID'] = cAscii(data['userExtension.userExtNumber0']) if data['userExtension.userExtTimeout'] > 0: ext['timeout'] = cAscii(data['userExtension.userExtTimeout']) else: if 'timeout' in ext: del ext['timeout'] if data['userExtension.userExtqTimeout'] > 0: ext['qtimeout'] = cAscii(data['userExtension.userExtqTimeout']) else: if 'qtimeout' in ext: del ext['qtimeout'] oldFullCID = self.sysconf.PBXExtensions.get( user, {'fullcallerID': ""}) ext['lowbw'] = data['userExtension.userLowBW'] ext['fullcallerID'] = """"%s" <%s>""" % (data['cn'][0].encode( 'ascii', 'replace'), ext['callerID']) ext['voiceMail'] = data['userExtension.userExtVoiceMail'] if data['userExtension.userExtVoiceMailPin']: ext['voiceMailPin'] = data[ 'userExtension.userExtVoiceMailPin'].encode( 'ascii', 'replace') else: ext['voiceMailPin'] = '' ext['extensions'] = [] ext['devices'] = [] oldDev = self.sysconf.PBXExtensions.get(user, {'devices': []})['devices'] for i in range(0, 9): if data['userExtension.userExtNumber%s' % i]: ext['extensions'].append( cAscii(data['userExtension.userExtNumber%s' % i])) if data['userExtension.userExtDev%s' % i]: ext['devices'].append( cAscii(data['userExtension.userExtDev%s' % i])) restartPhone = False fkeys = [] for i in range(54): fkeys.append(data['userFKeys.fkeys%s' % i]) if 'fkeys' in ext: if ext['fkeys'] != fkeys: restartPhone = True ext['fkeys'] = fkeys for k, devname in enumerate(oldDev): if k < len(ext['devices']): if devname != ext['devices'][k]: restartPhone = True if oldFullCID != ext['fullcallerID']: restartPhone = True if restartPhone: for devname in ext['devices']: dev = devname.split('/') if dev[0] == 'Phone': Asterisk.restartSnom(dev[1]) EXT = self.sysconf.PBXExtensions EXT[user] = ext self.sysconf.PBXExtensions = EXT return True def submitForm(self, ctx, form, data): oldRecord, newRecord = self.lc.modifyUser(self.cid, data) dc = "%s,%s,o=%s" % (Settings.LDAPPeople, LDAP.domainToDC( self.domain), Settings.LDAPBase) user = data['userSettings.uid'].encode('ascii', 'replace').lower() moveUser = False if user != self.cid: moveUser = True vacFiles = [ "/var/spool/mail/vacation/%s@%s.db" % (user, self.domain), "/var/spool/mail/vacation/%s@%s.log" % (user, self.domain), "/var/spool/mail/vacation/%s@%s.txt" % (user, self.domain) ] runLater = [] vpnCurrent = False for i in os.listdir('/etc/openvpn/keys/'): if "%s.%s" % (user, self.domain) in i and "key" in i: vpnCurrent = True if data['userAccess.vpnEnabled'] and vpnCurrent == False: vdata = { 'name': "%s.%s" % (user, self.domain), 'mail': "%s@%s" % (user, self.domain), 'ip': None, 'mailKey': True } v = VPN.Page() v.text = self.text v.newCert(None, None, vdata) elif not data['userAccess.vpnEnabled'] and vpnCurrent == True: runLater.append( 'cd /etc/openvpn/easy-rsa/; source /etc/openvpn/easy-rsa/vars; /etc/openvpn/easy-rsa/revoke-full %s; rm /etc/openvpn/keys/%s.*' % ("%s.%s" % (user, self.domain), "%s.%s" % (user, self.domain))) address = "%s@%s" % (user, self.domain) mailConf = self.sysconf.Mail if data['userPermissions.copyto']: if mailConf.get('copys', []): newCopys = [] for addr, dest in mailConf['copys']: if addr != address: newCopys.append((addr, dest)) newCopys.append((address, data['userPermissions.copyto'])) mailConf['copys'] = newCopys else: mailConf['copys'] = [(address, data['userPermissions.copyto'])] else: if mailConf.get('copys', []): newCopys = [] for addr, dest in mailConf['copys']: if addr != address: newCopys.append((addr, dest)) mailConf['copys'] = newCopys self.sysconf.Mail = mailConf if data['mailSettings.vacation']: # Write a vacation note. try: if data['mailSettings.vacen']: l1 = open( "/var/spool/mail/vacation/%s@%s.db" % (user, self.domain), 'w') l2 = open( "/var/spool/mail/vacation/%s@%s.log" % (user, self.domain), 'w') l3 = open( "/var/spool/mail/vacation/%s@%s.txt" % (user, self.domain), 'w') l1.write('') l2.write('') else: l3 = open( "/var/spool/mail/vacation/DISABLED%s@%s.txt" % (user, self.domain), 'w') l3.write(data['mailSettings.vacation'].encode("utf-8")) # Update permissions runLater.append( 'chown www-data:root /var/spool/mail/vacation/*; chmod a+rw /var/spool/mail/vacation/*' ) except Exception, e: print "Error ", e, " in vacation" if not data['mailSettings.vacation'] or not data[ 'mailSettings.vacen']: # if vacation is disabled or blank. for vacFile in vacFiles: if os.path.exists(vacFile): os.remove(vacFile) if data['mailSettings.vacen']: try: os.remove("/var/spool/mail/vacation/DISABLED%s@%s.txt" % (user, self.domain)) except: pass if data['mailSettings.vacvalidity']: d = data['mailSettings.vacvalidity'] n = open( '/var/spool/mail/vacation/%s@%s.validity' % (self.cid, self.domain), 'wt') n.write(str(d)) n.close() # Send this to Thebe (Unless this call is Thebe invoked..) if self.handler: try: ser = WebUtils.serialiseUser(newRecord, self.domain) mail = "%s@%s" % (user, self.domain) self.handler.sendMessage(self.handler.master.hiveName, "user:%s:%s" % (mail, ser)) except: pass if moveUser: runLater.append( 'mv /var/spool/mail/%s\@%s /var/spool/mail/%s\@%s' % (self.cid, self.domain, user, self.domain)) if Settings.sambaDN and self.domain == Settings.defaultDomain: if moveUser: runLater.append('mv /home/%s /home/%s' % (self.cid, user)) runLater.append( 'mv /var/lib/samba/profiles/%s /var/lib/samba/profiles/%s' % (self.cid, user)) runLater.append('/etc/init.d/nscd restart') runLater.append( '/usr/local/tcs/tums/configurator --exim; /etc/init.d/exim4 restart' ) runLater.append( '/usr/local/tcs/tums/configurator --ftp; /etc/init.d/vsftpd restart' ) defs = [] #Process UserExtsions if self.commitUserExtensions(form, data): defs.append(restartAsterisk()) def ReturnPage(_): return url.root.child('Users').child('Edit').child( self.domain).child(user).child('Completed') for cmd in runLater: defs.append(WebUtils.system(cmd)) return defer.DeferredList(defs).addCallback(ReturnPage)
def submitForm(self, ctx, form, data): l = LDAP.createLDAPConnection(Settings.LDAPServer, 'o='+Settings.LDAPBase, Settings.LDAPManager, Settings.LDAPPass) dc = "%s,%s,o=%s" % (Settings.LDAPPeople, LDAP.domainToDC(self.domain), Settings.LDAPBase) oldRecord = LDAP.getUsers(l, dc, 'uid='+self.cid)[0] newRecord = copy.deepcopy(oldRecord) l.unbind_s() def failed(e): print 'Submmit on edit failed', e l.unbind_s() return url.root.child('Users').child('Edit').child(self.domain).child(self.cid).child('Failed') def formValidated(newRecord, oldRecord): l = LDAP.createLDAPConnection(Settings.LDAPServer, 'o='+Settings.LDAPBase, Settings.LDAPManager, Settings.LDAPPass) dc = "%s,%s,o=%s" % (Settings.LDAPPeople, LDAP.domainToDC(self.domain), Settings.LDAPBase) moveUser = False if newRecord['uid'][0].lower() != oldRecord['uid'][0].lower(): # Rename first l.rename_s('uid='+self.cid+','+dc, 'uid='+newRecord['uid'][0]) self.cid = newRecord['uid'][0] newRecord['mail'] = ['%s@%s' % (newRecord['uid'][0], self.domain)] newRecord['mailMessageStore'] = ['/var/spool/mail/%s@%s' % (newRecord['uid'][0], self.domain)] if Settings.sambaDN and self.domain==Settings.defaultDomain: newRecord['homeDirectory'] = ['/home/%s' % newRecord['uid'][0]] moveUser = True vacFiles = [ "/var/spool/mail/vacation/%s@%s.db" % (self.cid, self.domain), "/var/spool/mail/vacation/%s@%s.log" % (self.cid, self.domain), "/var/spool/mail/vacation/%s@%s.txt" % (self.cid, self.domain) ] vpnCurrent = False for i in os.listdir('/etc/openvpn/keys/'): if "%s.%s" % (self.cid, self.domain) in i and "key" in i: vpnCurrent = True if data['userAccess.vpnEnabled'] and vpnCurrent == False: vdata = { 'name': "%s.%s" % (self.cid, self.domain), 'mail': "%s@%s" % (self.cid, self.domain), 'ip':None, 'mailKey':True } v = VPN.Page() v.text = self.text v.newCert(None, None, vdata) elif not data['userAccess.vpnEnabled'] and vpnCurrent == True: WebUtils.system('cd /etc/openvpn/easy-rsa/; source /etc/openvpn/easy-rsa/vars; /etc/openvpn/easy-rsa/revoke-full %s; rm /etc/openvpn/keys/%s.*' % ( "%s.%s" % (self.cid, self.domain), "%s.%s" % (self.cid, self.domain) )) address = "%s@%s" % (newRecord['uid'][0].lower(), self.domain) mailConf = self.sysconf.Mail if data['userPermissions.copyto']: if mailConf.get('copys', []): newCopys = [] for addr, dest in mailConf['copys']: if addr != address: newCopys.append((addr, dest)) newCopys.append((address, data['userPermissions.copyto'])) mailConf['copys'] = newCopys else: mailConf['copys'] = [(address, data['userPermissions.copyto'])] else: if mailConf.get('copys', []): newCopys = [] for addr, dest in mailConf['copys']: if addr != address: newCopys.append((addr, dest)) mailConf['copys'] = newCopys self.sysconf.Mail = mailConf if data['mailSettings.vacation']: # Write a vacation note. try: if data['mailSettings.vacen']: l1 = open("/var/spool/mail/vacation/%s@%s.db" % (self.cid, self.domain), 'w') l2 = open("/var/spool/mail/vacation/%s@%s.log" % (self.cid, self.domain), 'w') l3 = open("/var/spool/mail/vacation/%s@%s.txt" % (self.cid, self.domain), 'w') l1.write('') l2.write('') else: l3 = open("/var/spool/mail/vacation/DISABLED%s@%s.txt" % (self.cid, self.domain), 'w') l3.write(data['mailSettings.vacation'].encode("utf-8")) # Update permissions WebUtils.system('chown www-data:root /var/spool/mail/vacation/*; chmod a+rw /var/spool/mail/vacation/*') except Exception, e: print "Error ", e, " in vacation" if not data['mailSettings.vacation'] or not data['mailSettings.vacen']: # if vacation is disabled or blank. for vacFile in vacFiles: try: os.remove(vacFile) except: pass if data['mailSettings.vacen']: try: os.remove("/var/spool/mail/vacation/DISABLED%s@%s.txt" % (self.cid, self.domain)) except: pass # Send this to Thebe (Unless this call is Thebe invoked..) if self.handler: try: ser = WebUtils.serialiseUser(newRecord, self.domain) mail = "%s@%s" % (self.cid, self.domain) self.handler.sendMessage(self.handler.master.hiveName, "user:%s:%s" % (mail, ser)) except: pass # Check if there are any LDAP changes to worry about change = False for k,v in newRecord.items(): if v != oldRecord.get(k, []): print k,v, oldRecord.get(k, []) change = True break # Now update LDAP tree if there were changes if change: try: l = LDAP.createLDAPConnection(Settings.LDAPServer, 'o='+Settings.LDAPBase, Settings.LDAPManager, Settings.LDAPPass) LDAP.modifyElement(l, 'uid='+self.cid+','+dc, oldRecord, newRecord) except Exception, e: print e, " LDAP issue in modify" l.unbind_s() return url.root.child('Users').child('Edit').child(self.domain).child(self.cid).child('Failed') l.unbind_s()
def submitForm(self, ctx, form, data): # Process LDAP commands ld = LDAP.LDAPConnector(self.domain, self.sysconf) newRecord = ld.addUser(data) user = data['userSettings.uid'].encode("utf-8").lower() emailAddress = str("%s@%s" % (user, self.domain)) runLater = [] # Commands to run defs = [] # Deferreds to wait for if data.get('userPermissions.copyto'): address = emailAddress mailConf = self.sysconf.Mail if mailConf.get('copys', []): mailConf['copys'].append( (address, data['userPermissions.copyto'])) else: mailConf['copys'] = [(address, data['userPermissions.copyto'])] self.sysconf.Mail = mailConf # We need to restart exim if a copyto was set runLater.append( '/usr/local/tcs/tums/configurator --exim; /etc/init.d/exim4 restart' ) def mailOut(result): if result[0]: print "Welcome message was successfully sent to %s" % emailAddress else: print "Error sending welcome message to %s" % emailAddress # Send this to Thebe try: ser = WebUtils.serialiseUser(newRecord, self.domain) mail = "%s@%s" % (user, self.domain) self.handler.sendMessage(self.handler.master.hiveName, "user:%s:%s" % (mail, ser)) except: print "Failed to serialise user at this time" #Create User's MailDir if '/var/spool/mail' in newRecord['mailMessageStore'][0]: runLater.append( 'maildirmake "%(mailDir)s" ; chown mail:mail -R "%(mailDir)s" ; chmod 2770 -R "%(mailDir)s"' % {'mailDir': '/var/spool/mail/' + emailAddress}) # Send a mail to the luser to enable it... if data.get('userPermissions.accountStatus'): defs.append( Utils.sendMail( newRecord['mail'][0], newRecord['mail'], 'Welcome %s' % newRecord['givenName'][0], self.text.userMailWelcomeMessage % newRecord['cn'][0]).addBoth(mailOut)) if data.get('userAccess.vpnEnabled'): vdata = { 'name': "%s.%s" % (self.cid, self.domain), 'mail': "%s@%s" % (user, self.domain), 'ip': None, 'mailKey': True } v = VPN.Page() v.text = self.text defs.append(v.newCert(None, None, vdata)) # Create Home directory and restart NSCD if Settings.sambaDN and self.domain == Settings.defaultDomain: runLater.append('/etc/init.d/nscd restart') runLater.append('mkdir /home/%s; chown %s:Domain\ Users /home/%s' % (user, user, user)) runLater.append( '/usr/local/tcs/tums/configurator --ftp; /etc/init.d/vsftpd restart' ) # Execute all this crap for cmd in runLater: defs.append(WebUtils.system(cmd)) def ReturnPage(_): return url.root.child('Users').child('Edit').child( self.domain).child(user) return defer.DeferredList(defs).addCallback(ReturnPage)