Ejemplo n.º 1
0
Archivo: Add.py Proyecto: calston/tums
    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")
Ejemplo n.º 2
0
        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:+:+")
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
Archivo: Edit.py Proyecto: calston/tums
    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()
Ejemplo n.º 5
0
    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)