This patch begins the process of replacing OpenLDAP with mozldap.

FreeIPA relies on RedHat's Directory Server, which uses mozldap.
A FreeIPA build using mozldap would reduce the project's dependencies and
redundant code. In addition, mozldap uses NSS instead of OpenSSL.
This is beneficial for the reasons listed in [1].

[1] http://fedoraproject.org/wiki/FedoraCryptoConsolidation
This commit is contained in:
W. Michael Petullo
2008-05-01 09:57:32 -04:00
committed by Simo Sorce
parent 274eb708c2
commit 29ddbc610c
8 changed files with 108 additions and 101 deletions

View File

@@ -13,7 +13,8 @@ INCLUDES = \
-DLIBEXECDIR=\""$(libexecdir)"\" \ -DLIBEXECDIR=\""$(libexecdir)"\" \
-DDATADIR=\""$(datadir)"\" \ -DDATADIR=\""$(datadir)"\" \
$(KRB5_CFLAGS) \ $(KRB5_CFLAGS) \
$(LDAP_CFLAGS) \ $(OPENLDAP_CFLAGS) \
$(MOZLDAP_CFLAGS) \
$(SASL_CFLAGS) \ $(SASL_CFLAGS) \
$(POPT_CFLAGS) \ $(POPT_CFLAGS) \
$(WARN_CFLAGS) \ $(WARN_CFLAGS) \
@@ -29,7 +30,8 @@ ipa_getkeytab_SOURCES = \
ipa_getkeytab_LDADD = \ ipa_getkeytab_LDADD = \
$(KRB5_LIBS) \ $(KRB5_LIBS) \
$(LDAP_LIBS) \ $(OPENLDAP_LIBS) \
$(MOZLDAP_LIBS) \
$(SASL_LIBS) \ $(SASL_LIBS) \
$(POPT_LIBS) \ $(POPT_LIBS) \
$(NULL) $(NULL)

View File

@@ -82,42 +82,47 @@ fi
AC_SUBST(KRB5_LIBS) AC_SUBST(KRB5_LIBS)
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
dnl - Check for LDAP dnl - Check for Mozilla LDAP or OpenLDAP SDK
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
LDAP_LIBS= AC_ARG_WITH(openldap, [ --with-openldap Use OpenLDAP])
AC_CHECK_HEADER(ldap.h)
AC_CHECK_HEADER(lber.h)
AC_CHECK_LIB(ldap, ldap_search, with_ldap=yes) if test x$with_openldap = xyes; then
dnl Check for other libraries we need to link with to get the main routines. AC_CHECK_LIB(ldap, ldap_search, with_ldap=yes)
test "$with_ldap" != "yes" && { AC_CHECK_LIB(ldap, ldap_open, [with_ldap=yes with_ldap_lber=yes], , -llber) } dnl Check for other libraries we need to link with to get the main routines.
test "$with_ldap" != "yes" && { AC_CHECK_LIB(ldap, ldap_open, [with_ldap=yes with_ldap_lber=yes with_ldap_krb=yes], , -llber -lkrb) } test "$with_ldap" != "yes" && { AC_CHECK_LIB(ldap, ldap_open, [with_ldap=yes with_ldap_lber=yes], , -llber) }
test "$with_ldap" != "yes" && { AC_CHECK_LIB(ldap, ldap_open, [with_ldap=yes with_ldap_lber=yes with_ldap_krb=yes with_ldap_des=yes], , -llber -lkrb -ldes) } test "$with_ldap" != "yes" && { AC_CHECK_LIB(ldap, ldap_open, [with_ldap=yes with_ldap_lber=yes with_ldap_krb=yes], , -llber -lkrb) }
dnl Recently, we need -lber even though the main routines are elsewhere, test "$with_ldap" != "yes" && { AC_CHECK_LIB(ldap, ldap_open, [with_ldap=yes with_ldap_lber=yes with_ldap_krb=yes with_ldap_des=yes], , -llber -lkrb -ldes) }
dnl because otherwise be get link errors w.r.t. ber_pvt_opt_on. So just dnl Recently, we need -lber even though the main routines are elsewhere,
dnl check for that (it's a variable not a fun but that doesn't seem to dnl because otherwise be get link errors w.r.t. ber_pvt_opt_on. So just
dnl matter in these checks) and stick in -lber if so. Can't hurt (even to dnl check for that (it's a variable not a fun but that doesn't seem to
dnl stick it in always shouldn't hurt, I don't think) ... #### Someone who dnl matter in these checks) and stick in -lber if so. Can't hurt (even to
dnl #### understands LDAP needs to fix this properly. dnl stick it in always shouldn't hurt, I don't think) ... #### Someone who
test "$with_ldap_lber" != "yes" && { AC_CHECK_LIB(lber, ber_pvt_opt_on, with_ldap_lber=yes) } dnl #### understands LDAP needs to fix this properly.
test "$with_ldap_lber" != "yes" && { AC_CHECK_LIB(lber, ber_pvt_opt_on, with_ldap_lber=yes) }
if test "$with_ldap" = "yes"; then if test "$with_ldap" = "yes"; then
if test "$with_ldap_des" = "yes" ; then if test "$with_ldap_des" = "yes" ; then
LDAP_LIBS="${LDAP_LIBS} -ldes" OPENLDAP_LIBS="${OPENLDAP_LIBS} -ldes"
fi fi
if test "$with_ldap_krb" = "yes" ; then if test "$with_ldap_krb" = "yes" ; then
LDAP_LIBS="${LDAP_LIBS} -lkrb" OPENLDAP_LIBS="${OPENLDAP_LIBS} -lkrb"
fi fi
if test "$with_ldap_lber" = "yes" ; then if test "$with_ldap_lber" = "yes" ; then
LDAP_LIBS="${LDAP_LIBS} -llber" OPENLDAP_LIBS="${OPENLDAP_LIBS} -llber"
fi fi
LDAP_LIBS="${LDAP_LIBS} -lldap" OPENLDAP_LIBS="${OPENLDAP_LIBS} -lldap"
else
AC_MSG_ERROR([OpenLDAP not found])
fi
AC_SUBST(OPENLDAP_LIBS)
else else
AC_MSG_ERROR([LDAP not found]) PKG_CHECK_MODULES(MOZLDAP, mozldap > 6)
MOZLDAP_CFLAGS="${MOZLDAP_CFLAGS} -DWITH_MOZLDAP"
AC_SUBST(MOZLDAP_CFLAGS)
fi fi
AC_SUBST(LDAP_LIBS)
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
dnl - Check for POPT dnl - Check for POPT

View File

@@ -31,7 +31,11 @@
#include <errno.h> #include <errno.h>
#include <time.h> #include <time.h>
#include <krb5.h> #include <krb5.h>
#ifdef WITH_MOZLDAP
#include <mozldap/ldap.h>
#else
#include <ldap.h> #include <ldap.h>
#endif
#include <sasl/sasl.h> #include <sasl/sasl.h>
#include <popt.h> #include <popt.h>
@@ -275,7 +279,6 @@ static int ldap_set_keytab(const char *servername,
BerElement *ctrl = NULL; BerElement *ctrl = NULL;
BerElement *sctrl = NULL; BerElement *sctrl = NULL;
struct berval *control = NULL; struct berval *control = NULL;
char *ldap_uri = NULL;
struct berval **ncvals; struct berval **ncvals;
char *ldap_base = NULL; char *ldap_base = NULL;
char *retoid = NULL; char *retoid = NULL;
@@ -306,23 +309,16 @@ static int ldap_set_keytab(const char *servername,
goto error_out; goto error_out;
} }
/* connect to ldap server */
ret = asprintf(&ldap_uri, "ldap://%s:389", servername);
if (ret == -1) {
fprintf(stderr, "Unable to determine server URI!\n");
goto error_out;
}
/* TODO: support referrals ? */ /* TODO: support referrals ? */
ret = ldap_initialize(&ld, ldap_uri); ld = ldap_init(servername, 389);
if(ret != LDAP_SUCCESS) { if(ld == NULL) {
fprintf(stderr, "Unable to initialize ldap library!\n"); fprintf(stderr, "Unable to initialize ldap library!\n");
goto error_out; goto error_out;
} }
version = LDAP_VERSION3; version = LDAP_VERSION3;
ret = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version); ret = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version);
if (ret != LDAP_OPT_SUCCESS) { if (ret != LDAP_SUCCESS) {
fprintf(stderr, "Unable to set ldap options!\n"); fprintf(stderr, "Unable to set ldap options!\n");
goto error_out; goto error_out;
} }
@@ -427,8 +423,7 @@ static int ldap_set_keytab(const char *servername,
ber_free(sctrl, 1); ber_free(sctrl, 1);
ldap_controls_free(srvctrl); ldap_controls_free(srvctrl);
ldap_msgfree(res); ldap_msgfree(res);
ldap_unbind_ext_s(ld, NULL, NULL); ldap_unbind_ext(ld, NULL, NULL);
free(ldap_uri);
return kvno; return kvno;
error_out: error_out:
@@ -436,8 +431,7 @@ error_out:
if (srvctrl) ldap_controls_free(srvctrl); if (srvctrl) ldap_controls_free(srvctrl);
if (err) ldap_memfree(err); if (err) ldap_memfree(err);
if (res) ldap_msgfree(res); if (res) ldap_msgfree(res);
if (ld) ldap_unbind_ext_s(ld, NULL, NULL); if (ld) ldap_unbind_ext(ld, NULL, NULL);
if (ldap_uri) free(ldap_uri);
if (control) ber_bvfree(control); if (control) ber_bvfree(control);
if (encs) free(encs); if (encs) free(encs);
return 0; return 0;

View File

@@ -87,49 +87,56 @@ fi
AC_SUBST(KRB5_LIBS) AC_SUBST(KRB5_LIBS)
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
dnl - Check for LDAP dnl - Check for Mozilla LDAP or OpenLDAP SDK
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
LDAP_LIBS= AC_ARG_WITH(openldap, [ --with-openldap Use OpenLDAP])
AC_CHECK_HEADER(ldap.h)
AC_CHECK_HEADER(lber.h)
AC_CHECK_LIB(ldap, ldap_search, with_ldap=yes)
dnl Check for other libraries we need to link with to get the main routines.
test "$with_ldap" != "yes" && { AC_CHECK_LIB(ldap, ldap_open, [with_ldap=yes with_ldap_lber=yes], , -llber) }
test "$with_ldap" != "yes" && { AC_CHECK_LIB(ldap, ldap_open, [with_ldap=yes with_ldap_lber=yes with_ldap_krb=yes], , -llber -lkrb) }
test "$with_ldap" != "yes" && { AC_CHECK_LIB(ldap, ldap_open, [with_ldap=yes with_ldap_lber=yes with_ldap_krb=yes with_ldap_des=yes], , -llber -lkrb -ldes) }
dnl Recently, we need -lber even though the main routines are elsewhere,
dnl because otherwise be get link errors w.r.t. ber_pvt_opt_on. So just
dnl check for that (it's a variable not a fun but that doesn't seem to
dnl matter in these checks) and stick in -lber if so. Can't hurt (even to
dnl stick it in always shouldn't hurt, I don't think) ... #### Someone who
dnl #### understands LDAP needs to fix this properly.
test "$with_ldap_lber" != "yes" && { AC_CHECK_LIB(lber, ber_pvt_opt_on, with_ldap_lber=yes) }
if test "$with_ldap" = "yes"; then
if test "$with_ldap_des" = "yes" ; then
LDAP_LIBS="${LDAP_LIBS} -ldes"
fi
if test "$with_ldap_krb" = "yes" ; then
LDAP_LIBS="${LDAP_LIBS} -lkrb"
fi
if test "$with_ldap_lber" = "yes" ; then
LDAP_LIBS="${LDAP_LIBS} -llber"
fi
LDAP_LIBS="${LDAP_LIBS} -lldap"
else
AC_MSG_ERROR([LDAP not found])
fi
AC_SUBST(LDAP_LIBS)
dnl ---------------------------------------------------------------------------
dnl - Check for Mozilla LDAP SDK
dnl ---------------------------------------------------------------------------
dnl The mozldap libraries are always needed because ipa-slapi-plugins/dna/
dnl will not build against OpenLDAP.
PKG_CHECK_MODULES(MOZLDAP, mozldap > 6) PKG_CHECK_MODULES(MOZLDAP, mozldap > 6)
if test x$with_openldap = xyes; then
AC_CHECK_LIB(ldap, ldap_search, with_ldap=yes)
dnl Check for other libraries we need to link with to get the main routines.
test "$with_ldap" != "yes" && { AC_CHECK_LIB(ldap, ldap_open, [with_ldap=yes with_ldap_lber=yes], , -llber) }
test "$with_ldap" != "yes" && { AC_CHECK_LIB(ldap, ldap_open, [with_ldap=yes with_ldap_lber=yes with_ldap_krb=yes], , -llber -lkrb) }
test "$with_ldap" != "yes" && { AC_CHECK_LIB(ldap, ldap_open, [with_ldap=yes with_ldap_lber=yes with_ldap_krb=yes with_ldap_des=yes], , -llber -lkrb -ldes) }
dnl Recently, we need -lber even though the main routines are elsewhere,
dnl because otherwise be get link errors w.r.t. ber_pvt_opt_on. So just
dnl check for that (it's a variable not a fun but that doesn't seem to
dnl matter in these checks) and stick in -lber if so. Can't hurt (even to
dnl stick it in always shouldn't hurt, I don't think) ... #### Someone who
dnl #### understands LDAP needs to fix this properly.
test "$with_ldap_lber" != "yes" && { AC_CHECK_LIB(lber, ber_pvt_opt_on, with_ldap_lber=yes) }
if test "$with_ldap" = "yes"; then
if test "$with_ldap_des" = "yes" ; then
LDAP_LIBS="${LDAP_LIBS} -ldes"
fi
if test "$with_ldap_krb" = "yes" ; then
LDAP_LIBS="${LDAP_LIBS} -lkrb"
fi
if test "$with_ldap_lber" = "yes" ; then
LDAP_LIBS="${LDAP_LIBS} -llber"
fi
LDAP_LIBS="${LDAP_LIBS} -lldap"
else
AC_MSG_ERROR([OpenLDAP not found])
fi
AC_SUBST(LDAP_LIBS)
LDAP_CFLAGS="${LDAP_CFLAGS} -DWITH_OPENLDAP"
AC_SUBST(LDAP_CFLAGS)
else
LDAP_LIBS="${MOZLDAP_LIBS}"
AC_SUBST(LDAP_LIBS)
LDAP_CFLAGS="${LDAP_CFLAGS} -DWITH_MOZLDAP"
AC_SUBST(LDAP_CFLAGS)
fi
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
dnl - Check for OpenSSL Crypto library dnl - Check for OpenSSL Crypto library
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------

View File

@@ -39,13 +39,23 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include <time.h> #include <time.h>
#include <krb5.h> #include <krb5.h>
#ifdef WITH_MOZLDAP
#include <mozldap/ldap.h>
#else
#include <ldap.h> #include <ldap.h>
#endif
#include <sasl/sasl.h> #include <sasl/sasl.h>
#define DEFAULT_KEYTAB "FILE:/var/kerberos/krb5kdc/kpasswd.keytab" #define DEFAULT_KEYTAB "FILE:/var/kerberos/krb5kdc/kpasswd.keytab"
#define TMP_TEMPLATE "/var/cache/ipa/kpasswd/krb5_cc.XXXXXX" #define TMP_TEMPLATE "/var/cache/ipa/kpasswd/krb5_cc.XXXXXX"
#define KPASSWD_PORT 464 #define KPASSWD_PORT 464
#ifdef WITH_MOZLDAP
/* From OpenLDAP's ldap.h */
#define LDAP_TAG_EXOP_MODIFY_PASSWD_ID ((ber_tag_t) 0x80U)
#define LDAP_TAG_EXOP_MODIFY_PASSWD_NEW ((ber_tag_t) 0x82U)
#endif
/* blacklist entries are released only BLCAKLIST_TIMEOUT seconds /* blacklist entries are released only BLCAKLIST_TIMEOUT seconds
* after the children performing the noperation has finished. * after the children performing the noperation has finished.
* this is to avoid races */ * this is to avoid races */
@@ -310,7 +320,6 @@ int ldap_pwd_change(char *client_name, char *realm_name, krb5_data pwd, char **e
struct berval control; struct berval control;
struct berval newpw; struct berval newpw;
char hostname[1024]; char hostname[1024];
char *ldap_uri = NULL;
struct berval **ncvals; struct berval **ncvals;
char *ldap_base = NULL; char *ldap_base = NULL;
char *filter; char *filter;
@@ -367,17 +376,10 @@ int ldap_pwd_change(char *client_name, char *realm_name, krb5_data pwd, char **e
goto done; goto done;
} }
ret = asprintf(&ldap_uri, "ldap://%s:389", hostname);
if (ret == -1) {
syslog(LOG_ERR, "Out of memory!");
ret = KRB5_KPASSWD_HARDERROR;
goto done;
}
/* connect to ldap server */ /* connect to ldap server */
/* TODO: support referrals ? */ /* TODO: support referrals ? */
ret = ldap_initialize(&ld, ldap_uri); ld = ldap_init(hostname, 389);
if(ret != LDAP_SUCCESS) { if(ld == NULL) {
syslog(LOG_ERR, "Unable to connect to ldap server"); syslog(LOG_ERR, "Unable to connect to ldap server");
ret = KRB5_KPASSWD_HARDERROR; ret = KRB5_KPASSWD_HARDERROR;
goto done; goto done;
@@ -385,7 +387,7 @@ int ldap_pwd_change(char *client_name, char *realm_name, krb5_data pwd, char **e
version = LDAP_VERSION3; version = LDAP_VERSION3;
ret = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version); ret = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version);
if (ret != LDAP_OPT_SUCCESS) { if (ret != LDAP_SUCCESS) {
syslog(LOG_ERR, "Unable to set ldap protocol version"); syslog(LOG_ERR, "Unable to set ldap protocol version");
ret = KRB5_KPASSWD_HARDERROR; ret = KRB5_KPASSWD_HARDERROR;
goto done; goto done;
@@ -480,11 +482,12 @@ int ldap_pwd_change(char *client_name, char *realm_name, krb5_data pwd, char **e
ret = KRB5_KPASSWD_HARDERROR; ret = KRB5_KPASSWD_HARDERROR;
goto done; goto done;
} }
ber_printf(ctrl, "{tstON}", ber_printf(ctrl, "{tstON}",
LDAP_TAG_EXOP_MODIFY_PASSWD_ID, userdn, LDAP_TAG_EXOP_MODIFY_PASSWD_ID, userdn,
LDAP_TAG_EXOP_MODIFY_PASSWD_NEW, &newpw); LDAP_TAG_EXOP_MODIFY_PASSWD_NEW, &newpw);
ret = ber_flatten2(ctrl, &control, 0); ret = ber_flatten(ctrl, &control);
if (ret < 0) { if (ret < 0) {
syslog(LOG_ERR, "ber flattening failed!"); syslog(LOG_ERR, "ber flattening failed!");
ret = KRB5_KPASSWD_HARDERROR; ret = KRB5_KPASSWD_HARDERROR;
@@ -645,8 +648,7 @@ done:
if (exterr1) free(exterr1); if (exterr1) free(exterr1);
if (exterr2) free(exterr2); if (exterr2) free(exterr2);
if (userdn) free(userdn); if (userdn) free(userdn);
if (ld) ldap_unbind_ext_s(ld, NULL, NULL); if (ld) ldap_unbind_ext(ld, NULL, NULL);
if (ldap_uri) free(ldap_uri);
if (tmp_file) { if (tmp_file) {
unlink(tmp_file); unlink(tmp_file);
free(tmp_file); free(tmp_file);

View File

@@ -9,7 +9,6 @@ INCLUDES = \
-DLIBEXECDIR=\""$(libexecdir)"\" \ -DLIBEXECDIR=\""$(libexecdir)"\" \
-DDATADIR=\""$(datadir)"\" \ -DDATADIR=\""$(datadir)"\" \
$(MOZLDAP_CFLAGS) \ $(MOZLDAP_CFLAGS) \
$(LDAP_CFLAGS) \
$(KRB5_CFLAGS) \ $(KRB5_CFLAGS) \
$(WARN_CFLAGS) \ $(WARN_CFLAGS) \
$(NULL) $(NULL)

View File

@@ -9,7 +9,6 @@ INCLUDES = \
-DLIBEXECDIR=\""$(libexecdir)"\" \ -DLIBEXECDIR=\""$(libexecdir)"\" \
-DDATADIR=\""$(datadir)"\" \ -DDATADIR=\""$(datadir)"\" \
$(MOZLDAP_CFLAGS) \ $(MOZLDAP_CFLAGS) \
$(LDAP_CFLAGS) \
$(KRB5_CFLAGS) \ $(KRB5_CFLAGS) \
$(WARN_CFLAGS) \ $(WARN_CFLAGS) \
$(NULL) $(NULL)

View File

@@ -9,7 +9,6 @@ INCLUDES = \
-DLIBEXECDIR=\""$(libexecdir)"\" \ -DLIBEXECDIR=\""$(libexecdir)"\" \
-DDATADIR=\""$(datadir)"\" \ -DDATADIR=\""$(datadir)"\" \
$(MOZLDAP_CFLAGS) \ $(MOZLDAP_CFLAGS) \
$(LDAP_CFLAGS) \
$(KRB5_CFLAGS) \ $(KRB5_CFLAGS) \
$(SSL_CFLAGS) \ $(SSL_CFLAGS) \
$(WARN_CFLAGS) \ $(WARN_CFLAGS) \