def ldap_authenticate(ldap_conn: SimpleLDAPObject, user_dn: str, password: str): """Validates/binds the provided dn/password with the LDAP sever.""" try: LOG.debug(f"LDAP bind TRY with username: '******'") ldap_conn.simple_bind_s(who=user_dn, cred=password) LOG.debug(f"LDAP bind SUCCESS with username: '******'") return True except ldap.INVALID_CREDENTIALS: return False
from dsadmin import DSAdmin, Entry from ldap.ldapobject import SimpleLDAPObject import pprint host1 = "localhost.localdomain" port1 = 1110 basedn = 'dc=example,dc=com' ldapifilepath = os.environ.get('PREFIX', "") + "/var/run/slapd-srv.socket" os.environ['USE_GDB'] = "1" srv = DSAdmin.createInstance({ 'newrootpw': 'password', 'newhost': host1, 'newport': port1, 'newinst': 'srv', 'newsuffix': basedn, 'no_admin': True, 'ldapifilepath': ldapifilepath }) del os.environ['USE_GDB'] ldapiurl = ldapurl.LDAPUrl(None, "ldapi", ldapifilepath) conn = SimpleLDAPObject(ldapiurl.initializeUrl()) print "connecting to", ldapiurl.initializeUrl() conn.simple_bind_s("cn=directory manager", "password") ents = conn.search_s("", ldap.SCOPE_BASE) pprint.pprint(ents)
print "create userb" dn = "uid=userb,ou=people," + basedn userbdn = dn ent = Entry(dn) ent.setValues('objectclass', ['inetOrgPerson', 'myAuxOc']) ent.setValues('cn', 'User B') ent.setValues('sn', 'B') ent.setValues('givenName', 'User') userbpw = 'userb' ent.setValues('userPassword', userbpw) ent.setValues('owner', useradn) srv.add_s(ent) print "create aci to allow usera to set password in userb" aci = '(targetattr="userPassword")(version 3.0; acl "Owners can set passwords"; allow(write) userattr="owner#USERDN";)' mod = [(ldap.MOD_REPLACE, 'aci', aci)] srv.modify_s(basedn, mod) print "bind as usera" aconn = SimpleLDAPObject('ldap://%s:%d' % (host1, port1)) aconn.simple_bind_s(useradn, userapw) print "user a will modify user b userPassword" userbpw = 'anewpassword' mod = [(ldap.MOD_REPLACE, 'userPassword', userbpw)] aconn.modify_s(userbdn, mod) print "userb will attempt to bind with new password" bconn = SimpleLDAPObject('ldap://%s:%d' % (host1, port1)) bconn.simple_bind_s(userbdn, userbpw)
import tempfile from ldap.ldapobject import SimpleLDAPObject import pprint host1 = "localhost.localdomain" port1 = 1110 basedn = 'dc=example,dc=com' ldapifilepath = os.environ.get('PREFIX', "") + "/var/run/slapd-srv.socket" os.environ['USE_GDB'] = "1" srv = DSAdmin.createInstance({ 'newrootpw': 'password', 'newhost': host1, 'newport': port1, 'newinst': 'srv', 'newsuffix': basedn, 'no_admin': True, 'ldapifilepath': ldapifilepath }) del os.environ['USE_GDB'] ldapiurl = ldapurl.LDAPUrl(None, "ldapi", ldapifilepath) conn = SimpleLDAPObject(ldapiurl.initializeUrl()) print "connecting to", ldapiurl.initializeUrl() conn.simple_bind_s("cn=directory manager", "password") ents = conn.search_s("", ldap.SCOPE_BASE) pprint.pprint(ents)
(ldap.MOD_REPLACE, 'limitattrname', 'accountInactivityLimit')] srv.modify_s('cn=config,cn=Account Policy Plugin,cn=plugins,cn=config', mod) print "restart server for changes to take effect" srv.stop() srv.start() print "find scarter" ents = srv.search_s(basedn, ldap.SCOPE_SUBTREE, 'uid=scarter', ['lastLoginTime', 'createTimestamp']) userdn = ents[0].dn pprint.pprint(ents[0]) print "bind as", userdn conn = SimpleLDAPObject('ldap://%s:%d' % (host1, port1)) try: conn.simple_bind_s(userdn, 'sprain') except ldap.CONSTRAINT_VIOLATION: print "user is prevented from logging in after", inactivetime, "seconds of inactivity" ents = srv.search_s(basedn, ldap.SCOPE_SUBTREE, 'uid=scarter', ['lastLoginTime', 'createTimestamp']) print "lastLoginTime:", ents[0].lastLoginTime print "sleep for a while . . ." time.sleep(inactivetime) print "bind as", userdn, "again - see if there is any account policy" conn = SimpleLDAPObject('ldap://%s:%d' % (host1, port1)) try: conn.simple_bind_s(userdn, 'sprain') except ldap.CONSTRAINT_VIOLATION: print "user is prevented from logging in after", inactivetime, "seconds of inactivity" ents = srv.search_s(basedn, ldap.SCOPE_SUBTREE, 'uid=scarter', ['lastLoginTime', 'createTimestamp']) print "lastLoginTime:", ents[0].lastLoginTime