Roundup Tracker

The following example is an adaptation of LDAPLogin I just took the code and made it work with Active Directory.

Just like LDAPLogin create in the 'extensions' directory, a file 'ldap.py' with (NOTE this code is slightly different then LDAPLogin):

import ldap
from roundup.cgi.actions import LoginAction
from roundup.i18n import _

class LdapLoginAction(LoginAction):

        ldap_attrs = (
                ( 'realname', ['cn'] ),
                ( 'username', ['sAMAccountName'] ),
                )
        ldap_server = 'ldap://example.com'
        ldap_base = 'dc=example, dc=com'
        email_suffix = '@example.com'
        intBindUser = "username"
        intBindPasswd = "password"

        def verifyLocalPassword(self, password):
                ''' Verify the password that the user has supplied '''
                stored = self.db.user.get(self.client.userid, 'password')
                if password == stored:
                        return 1
                if not password and not stored:
                        return 1
                return 0

        def local_login (self, password):
                ''' Local authentication '''
                # make sure the user exists
                try:
                        self.client.userid = self.db.user.lookup(self.client.user)
                except KeyError:
                        self.client.error_message.append(_('Unknown user "%s"')%self.client.user)
                        return 0
                # verify the password
                if not self.verifyLocalPassword(password):
                        self.client.error_message.append(_('Invalid password'))
                        return 0
                return 1

        def ldap_login (self, password):
                ''' Authentication via LDAP '''
                try:
                        # connect to LDAP host
                        ldapcn = ldap.initialize(self.ldap_server)
                        ldapcn.protocol_version = ldap.VERSION3
                        ldapcn.simple_bind_s(self.intBindUser,self.intBindPasswd)
                except ldap.LDAPError, e:
                        #self.client.error_message.append (_('Unknown LDAP account "%(name)s"')% locals())
                        self.client.error_message.append (_('LDAPError = %s"')% e)
                        return 0

                # make sure that user exists
                try:
                        ldaps = ldapcn.search_s(self.ldap_base, ldap.SCOPE_SUBTREE,'sAMAccountName=%s'%self.client.user)
                        self.ldapdn,self.attrs = ldaps[0][0],ldaps[0][1]
                except ldap.LDAPError, e:
                        name = self.client.user
                        self.client.error_message.append (_('Unknown LDAP account "%(name)s"') % locals())
                        self.client.error_message.append (_('LDAPError = %s"')% e)
                        return 0
                # verify the password
                try:
                        ldapcn.bind_s (self.ldapdn, password)
                except ldap.LDAPError, e:
                        self.client.error_message.append (_('Invalid password !'))
                        self.client.error_message.append (_('LDAPError = %s') % e)
                        return 0
                return 1

        def verifyLogin(self, username, password):
                # try to login throught LDAP or with local account
                ldap_ok = None
                if not self.local_login(password):
                        ldap_ok = self.ldap_login(password)
                        if not ldap_ok:
                                self.client.make_user_anonymous ()
                                return
                self.client.error_message = []
                # reload user profile, or create it automatically if missing
                try:
                        self.client.userid = self.db.user.lookup(self.client.user)
                except:
                        if ldap_ok:
                                props = {}
                                for user_attr,ldap_attr in self.ldap_attrs:
                                        props[user_attr] = ' '.join([self.attrs.get (attr,['',''])[0] for attr in ldap_attr])
                                props['address'] =  self.attrs['sAMAccountName'][0]+self.email_suffix
                                self.journaltag = 'admin'
                                cl = self.db.user
                                props['roles'] = self.db.config.NEW_WEB_USER_ROLES
                                self.userid = cl.create (**props)
                                self.db.commit ()
                                self.client.userid = self.db.user.lookup(self.client.user)
                        else:
                                self.client.make_user_anonymous()
                                self.client.error_message.append(_("No account created without LDAP account"))
                                return

def init(instance):
        instance.registerAction('login', LdapLoginAction)

---

CategoryActions