On Fri, 2007-11-02 at 14:25 -0400, Newman, Edward (GTI) wrote:
> Just wanted to confirm whether SASL support is currently broken in 5.0.2
> with all outstanding patches applied. 
> 
> Debug of code suggests following issues:
> 
> - Makefile has invalid test for HAVE_SASL in configure.in and thus
> doesn't include correct libraries (-z instead of -n in test step)

OK, so for now just don't use --with-sasl and it should build in SASL
support.

> - patched code in connect_to_server in lookup_ldap.c does not call
> auth_init prior to testing for auth_required and thus fails SASL in all
> cases

Yes, please try patch below.

> - order of code sequence currently fails to enable SASL correctly.

As Jeff says, is this just restating the point above?

> 
> I am also trying to use an existing keytab for Kerberos GSSAPI
> authentication to directory and currently sasl_kinit code appears to
> fail. Haven't worked out exact cause yet but appears to not passing a
> keytab name and environment is not picking up location from krb5.conf.

This is a bit more interesting.
We need to be able to use alternate keytabs.
I believe that the code, as it is, will use the Kerberos5 mechanisms to
locate the keytab. Are you setting KRB5_KTNAME?

Anyway, this patch should fix the second issue you mentioned above.
Can you give it a try please?

---
diff --git a/modules/cyrus-sasl.c b/modules/cyrus-sasl.c
index 18733f3..75b8667 100644
--- a/modules/cyrus-sasl.c
+++ b/modules/cyrus-sasl.c
@@ -75,6 +75,7 @@ static const char *krb5ccval = "MEMORY:_autofstkt";
 static pthread_mutex_t krb5cc_mutex = PTHREAD_MUTEX_INITIALIZER;
 static unsigned int krb5cc_in_use = 0;
 
+static unsigned int init_callbacks = 1;
 static int sasl_log_func(void *, int, const char *);
 static int getpass_func(sasl_conn_t *, void *, int, sasl_secret_t **);
 static int getuser_func(void *, int, const char **, unsigned *);
@@ -721,23 +722,30 @@ autofs_sasl_init(unsigned logopt, LDAP *ldap, struct 
lookup_context *ctxt)
        sasl_conn_t *conn;
 
        /* Start up Cyrus SASL--only needs to be done once. */
-       if (sasl_client_init(callbacks) != SASL_OK) {
+       if (init_callbacks && sasl_client_init(callbacks) != SASL_OK) {
                error(logopt, "sasl_client_init failed");
                return -1;
        }
+       init_callbacks = 0;
 
        sasl_auth_id = ctxt->user;
        sasl_auth_secret = ctxt->secret;
 
        /*
-        *  If sasl_mech was not filled in, it means that there was no
-        *  mechanism specified in the configuration file.  Try to auto-
-        *  select one.
+        *  If LDAP_AUTH_AUTODETECT is set, it means that there was no
+        *  mechanism specified in the configuration file or auto
+        *  selection has been requested, so try to auto-select an
+        *  auth mechanism.
         */
-       if (ctxt->sasl_mech)
+       if (!(ctxt->auth_required & LDAP_AUTH_AUTODETECT))
                conn = sasl_bind_mech(logopt, ldap, ctxt, ctxt->sasl_mech);
-       else
+       else {
+               if (ctxt->sasl_mech) {
+                       free(ctxt->sasl_mech);
+                       ctxt->sasl_mech = NULL;
+               }
                conn = sasl_choose_mech(logopt, ldap, ctxt);
+       }
 
        if (conn) {
                sasl_dispose(&conn);
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c
index dfb3054..fc2ed52 100644
--- a/modules/lookup_ldap.c
+++ b/modules/lookup_ldap.c
@@ -400,8 +400,7 @@ static int do_bind(unsigned logopt, LDAP *ldap, struct 
lookup_context *ctxt)
        debug(logopt, MODPREFIX "auth_required: %d, sasl_mech %s",
              ctxt->auth_required, ctxt->sasl_mech);
 
-       if (ctxt->sasl_mech ||
-          (ctxt->auth_required & (LDAP_AUTH_REQUIRED|LDAP_AUTH_AUTODETECT))) {
+       if (ctxt->auth_required & (LDAP_AUTH_REQUIRED|LDAP_AUTH_AUTODETECT)) {
                rv = autofs_sasl_bind(logopt, ldap, ctxt);
                debug(logopt, MODPREFIX "autofs_sasl_bind returned %d", rv);
        } else {
@@ -495,7 +494,7 @@ static LDAP *connect_to_server(unsigned logopt, const char 
*uri, struct lookup_c
         * Determine which authentication mechanism to use if we require
         * authentication.
         */
-       if (ctxt->auth_required & LDAP_AUTH_REQUIRED) {
+       if (ctxt->auth_required & (LDAP_AUTH_REQUIRED|LDAP_AUTH_AUTODETECT)) {
                ldap = auth_init(logopt, uri, ctxt);
                if (!ldap && ctxt->auth_required & LDAP_AUTH_AUTODETECT)
                        info(logopt,
@@ -577,7 +576,9 @@ static LDAP *do_reconnect(unsigned logopt, struct 
lookup_context *ctxt)
                list_add_tail(&this->list, ctxt->uri);
        }
 
+#ifdef WITH_SASL
        autofs_sasl_done(ctxt);
+#endif
 
        /* Current server failed connect, try the rest */
        ldap = find_server(logopt, ctxt);
@@ -840,6 +841,8 @@ int parse_ldap_config(unsigned logopt, struct 
lookup_context *ctxt)
        ctxt->tls_required = tls_required;
        ctxt->auth_required = auth_required;
        ctxt->sasl_mech = authtype;
+       if (!authtype && (auth_required & LDAP_AUTH_REQUIRED))
+               ctxt->auth_required |= LDAP_AUTH_AUTODETECT;
        ctxt->user = user;
        ctxt->secret = secret;
        ctxt->client_princ = client_princ;
@@ -882,16 +885,6 @@ static LDAP *auth_init(unsigned logopt, const char *uri, 
struct lookup_context *
        int ret;
        LDAP *ldap;
 
-       /*
-        *  First, check to see if a preferred authentication method was
-        *  specified by the user.  parse_ldap_config will return error
-        *  if the permissions on the file were incorrect, or if the
-        *  specified authentication type is not valid.
-        */
-       ret = parse_ldap_config(logopt, ctxt);
-       if (ret)
-               return NULL;
-
        ldap = init_ldap_connection(logopt, uri, ctxt);
        if (!ldap)
                return NULL;
@@ -1180,6 +1173,7 @@ int lookup_init(const char *mapfmt, int argc, const char 
*const *argv, void **co
        struct lookup_context *ctxt;
        char buf[MAX_ERR_BUF];
        LDAP *ldap = NULL;
+       int ret;
 
        *context = NULL;
 
@@ -1220,6 +1214,20 @@ int lookup_init(const char *mapfmt, int argc, const char 
*const *argv, void **co
                }
        }
 
+#ifdef WITH_SASL
+       /*
+        *  First, check to see if a preferred authentication method was
+        *  specified by the user.  parse_ldap_config will return error
+        *  if the permissions on the file were incorrect, or if the
+        *  specified authentication type is not valid.
+        */
+       ret = parse_ldap_config(LOGOPT_NONE, ctxt);
+       if (ret) {
+               free_context(ctxt);
+               return 1;
+       }
+#endif
+
        if (ctxt->server || !ctxt->uri) {
                ldap = connect_to_server(LOGOPT_NONE, ctxt->server, ctxt);
                if (!ldap) {


_______________________________________________
autofs mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/autofs

Reply via email to