krb5 commit: Add tests for LDAP SASL support
Greg Hudson
ghudson at MIT.EDU
Sat Jul 19 16:39:26 EDT 2014
https://github.com/krb5/krb5/commit/3902e509d0d3ad41ce3938ee11b3a3765a194238
commit 3902e509d0d3ad41ce3938ee11b3a3765a194238
Author: Greg Hudson <ghudson at mit.edu>
Date: Mon Jun 16 12:52:29 2014 -0400
Add tests for LDAP SASL support
In t_kdb.py, add a test case for EXTERNAL, and a test case for
DIGEST-MD5 if we built with the SASL header file and found the core
schema file.
ticket: 7944
src/tests/t_kdb.py | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 65 insertions(+), 1 deletions(-)
diff --git a/src/tests/t_kdb.py b/src/tests/t_kdb.py
index 64ce682..1426990 100644
--- a/src/tests/t_kdb.py
+++ b/src/tests/t_kdb.py
@@ -42,17 +42,29 @@ os.mkdir(dbdir)
# directory. Try to defeat this by copying the binary.
shutil.copy(system_slapd, slapd)
+# Find the core schema file if we can.
+core_schema = None
+if os.path.isfile('/etc/ldap/schema/core.schema'):
+ core_schema = '/etc/ldap/schema/core.schema'
+
# Make a slapd config file. This is deprecated in OpenLDAP 2.3 and
-# later, but it's easier than using LDIF and slapadd.
+# later, but it's easier than using LDIF and slapadd. Include some
+# authz-regexp entries for SASL authentication tests. Load the core
+# schema if we found it, for use in the DIGEST-MD5 test.
file = open(slapd_conf, 'w')
file.write('pidfile %s\n' % slapd_pidfile)
file.write('include %s\n' % schema)
+if core_schema:
+ file.write('include %s\n' % core_schema)
file.write('moduleload back_bdb\n')
file.write('database bdb\n')
file.write('suffix %s\n' % top_dn)
file.write('rootdn %s\n' % admin_dn)
file.write('rootpw %s\n' % admin_pw)
file.write('directory %s\n' % dbdir)
+file.write('authz-regexp .*uidNumber=%d,cn=peercred,cn=external,cn=auth %s\n' %
+ (os.geteuid(), admin_dn))
+file.write('authz-regexp uid=digestuser,cn=digest-md5,cn=auth %s\n' % admin_dn)
file.close()
slapd_pid = -1
@@ -301,6 +313,58 @@ out = kldaputil(['list'])
if out:
fail('Unexpected kdb5_ldap_util list output after destroy')
+# Test SASL EXTERNAL auth. Remove the DNs and service password file
+# from the DB module config. EXTERNAL auth can work even if we didn't
+# build with the SASL header file, because no interaction is required.
+os.remove(ldap_pwfile)
+dbmod = conf['dbmodules']['ldap']
+dbmod['ldap_kdc_sasl_mech'] = dbmod['ldap_kadmind_sasl_mech'] = 'EXTERNAL'
+del dbmod['ldap_service_password_file']
+del dbmod['ldap_kdc_dn'], dbmod['ldap_kadmind_dn']
+realm = K5Realm(create_kdb=False, kdc_conf=conf)
+realm.run([kdb5_ldap_util, 'create', '-s', '-P', 'master'])
+realm.start_kdc()
+realm.addprinc(realm.user_princ, password('user'))
+realm.kinit(realm.user_princ, password('user'))
+realm.stop()
+realm.run([kdb5_ldap_util, 'destroy', '-f'])
+
+if not core_schema:
+ success('Warning: skipping some LDAP tests because core schema not found')
+ sys.exit(0)
+
+if runenv.have_sasl != 'yes':
+ success('Warning: skipping some LDAP tests because SASL support not built')
+ sys.exit(0)
+
+# Test SASL DIGEST-MD5 auth. We need to set a clear-text password for
+# the admin DN, so create a person entry (requires the core schema).
+# Restore the service password file in the config and set authcids.
+ldap_add('cn=admin,cn=krb5', 'person',
+ ['sn: dummy', 'userPassword: admin'])
+dbmod['ldap_kdc_sasl_mech'] = dbmod['ldap_kadmind_sasl_mech'] = 'DIGEST-MD5'
+dbmod['ldap_kdc_sasl_authcid'] = 'digestuser'
+dbmod['ldap_kadmind_sasl_authcid'] = 'digestuser'
+dbmod['ldap_service_password_file'] = ldap_pwfile
+realm = K5Realm(create_kdb=False, kdc_conf=conf)
+input = admin_pw + '\n' + admin_pw + '\n'
+realm.run([kdb5_ldap_util, 'stashsrvpw', 'digestuser'], input=input)
+realm.run([kdb5_ldap_util, 'create', '-s', '-P', 'master'])
+realm.start_kdc()
+realm.addprinc(realm.user_princ, password('user'))
+realm.kinit(realm.user_princ, password('user'))
+realm.stop()
+# Exercise DB options, which should cause binding to fail.
+out = realm.run([kadmin_local, '-x', 'sasl_authcid=ab', '-q', 'getprinc user'],
+ expected_code=1)
+if 'Cannot bind to LDAP server' not in out:
+ fail('Expected error not seen in kadmin.local output')
+out = realm.run([kadmin_local, '-x', 'bindpwd=wrong', '-q', 'getprinc user'],
+ expected_code=1)
+if 'Cannot bind to LDAP server' not in out:
+ fail('Expected error not seen in kadmin.local output')
+realm.run([kdb5_ldap_util, 'destroy', '-f'])
+
# We could still use tests to exercise:
# * DB arg handling in krb5_ldap_create
# * krbAllowedToDelegateTo attribute processing
More information about the cvs-krb5
mailing list