From: Graham Leggett Date: Sat, 14 Sep 2013 15:02:10 +0000 (+0000) Subject: mod_ldap: "LDAPReferrals off" does not disable LDAPReferrals feature. X-Git-Tag: 2.4.7~227 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cb67f7294439a412360498cfb11aaa9cae3dab99;p=apache mod_ldap: "LDAPReferrals off" does not disable LDAPReferrals feature. Make "off" really "off" and add "unset" to take SDK defaults trunk patch: http://svn.apache.org/r1517388 docs: http://svn.apache.org/r1518265 Submitted by: covener Reviewed by: jim, humbedooh git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1523263 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 58adc0b11e..3ab1a36156 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,11 @@ Changes with Apache 2.4.7 + *) mod_ldap: Change "LDAPReferrals off" to actually set the underlying LDAP + SDK option to OFF, and introduce "LDAPReferrals default" to take the SDK + default, sans rebind authentication callback. + [Jan Kaluza ] + *) core: Log a message at TRACE1 when the client aborts a connection. [Eric Covener] diff --git a/STATUS b/STATUS index b94d2aabab..ae86d7d18f 100644 --- a/STATUS +++ b/STATUS @@ -145,14 +145,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK: +1: covener, jim, humbedooh - * mod_ldap: "LDAPReferrals off" does not disable LDAPReferrals feature. - Make "off" really "off" and add "unset" to take SDK defaults - trunk patch: http://svn.apache.org/r1517388 - docs: http://svn.apache.org/r1518265 - 2.4.x patch: trunk works - +1: covener, jim, humbedooh - - PATCHES PROPOSED TO BACKPORT FROM TRUNK: [ New proposals should be added at the end of the list ] diff --git a/docs/manual/mod/mod_ldap.xml b/docs/manual/mod/mod_ldap.xml index 3f6e034968..b6c7022d77 100644 --- a/docs/manual/mod/mod_ldap.xml +++ b/docs/manual/mod/mod_ldap.xml @@ -507,19 +507,40 @@ valid LDAPReferrals Enable referral chasing during queries to the LDAP server. -LDAPReferrals On|Off +LDAPReferrals On|Off|default LDAPReferrals On directory.htaccess AuthConfig

Some LDAP servers divide their directory among multiple domains and use referrals - to direct a client when a domain boundary is crossed. By setting LDAPReferrals On - referrals will be chased (setting it to off causes referrals to be ignored). The directive - LDAPReferralHopLimit works in conjunction with this directive to limit the - number of referral hops to follow before terminating the LDAP query. When referral processing - is enabled client credentials will be provided, via a rebind callback, for any LDAP server - requiring them.

+ to direct a client when a domain boundary is crossed. This is similar to a HTTP redirect. + LDAP client libraries may or may not chase referrals by default. This directive + explicitly configures the referral chasing in the underlying SDK.

+ + +

LDAPReferrals takes the takes the following values: +

+
"on"
+

When set to "on", the underlying SDK's referral chasing state + is enabled, LDAPReferralHopLimit is used to + override the SDK's hop limit, and an LDAP rebind callback is + registered.

+
"off"
+

When set to "off", the underlying SDK's referral chasing state + is disabled completely.

+
"default"
+

When set to "default", the underlying SDK's referral chasing state + is not changed, LDAPReferralHopLimit is not + used to overide the SDK's hop limit, and no LDAP rebind callback is + registered.

+
+

+ +

The directive LDAPReferralHopLimit works in conjunction with + this directive to limit the number of referral hops to follow before terminating the LDAP query. + When referral processing is enabled by a value of "On", client credentials will be provided, + via a rebind callback, for any LDAP server requiring them.

diff --git a/modules/ldap/util_ldap.c b/modules/ldap/util_ldap.c index 7c6a5e300b..93a520cd89 100644 --- a/modules/ldap/util_ldap.c +++ b/modules/ldap/util_ldap.c @@ -60,6 +60,7 @@ #endif #define AP_LDAP_HOPLIMIT_UNSET -1 +#define AP_LDAP_CHASEREFERRALS_SDKDEFAULT -1 #define AP_LDAP_CHASEREFERRALS_OFF 0 #define AP_LDAP_CHASEREFERRALS_ON 1 @@ -364,7 +365,7 @@ static int uldap_connection_init(request_rec *r, ldap_option = ldc->deref; ldap_set_option(ldc->ldap, LDAP_OPT_DEREF, &ldap_option); - if (ldc->ChaseReferrals == AP_LDAP_CHASEREFERRALS_ON) { + if (ldc->ChaseReferrals != AP_LDAP_CHASEREFERRALS_SDKDEFAULT) { /* Set options for rebind and referrals. */ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, APLOGNO(01278) "LDAP: Setting referrals to %s.", @@ -384,7 +385,9 @@ static int uldap_connection_init(request_rec *r, uldap_connection_unbind(ldc); return(result->rc); } + } + if (ldc->ChaseReferrals == AP_LDAP_CHASEREFERRALS_ON) { if ((ldc->ReferralHopLimit != AP_LDAP_HOPLIMIT_UNSET) && ldc->ChaseReferrals == AP_LDAP_CHASEREFERRALS_ON) { /* Referral hop limit - only if referrals are enabled and a hop limit is explicitly requested */ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, APLOGNO(01280) @@ -2536,15 +2539,25 @@ static const char *util_ldap_set_connection_timeout(cmd_parms *cmd, static const char *util_ldap_set_chase_referrals(cmd_parms *cmd, void *config, - int mode) + const char *arg) { util_ldap_config_t *dc = config; ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, cmd->server, APLOGNO(01311) - "LDAP: Setting referral chasing %s", - (mode == AP_LDAP_CHASEREFERRALS_ON) ? "ON" : "OFF"); + "LDAP: Setting referral chasing %s", arg); - dc->ChaseReferrals = mode; + if (0 == strcasecmp(arg, "on")) { + dc->ChaseReferrals = AP_LDAP_CHASEREFERRALS_ON; + } + else if (0 == strcasecmp(arg, "off")) { + dc->ChaseReferrals = AP_LDAP_CHASEREFERRALS_OFF; + } + else if (0 == strcasecmp(arg, "default")) { + dc->ChaseReferrals = AP_LDAP_CHASEREFERRALS_SDKDEFAULT; + } + else { + return "LDAPReferrals must be 'on', 'off', or 'default'"; + } return(NULL); } @@ -3076,9 +3089,9 @@ static const command_rec util_ldap_cmds[] = { "Specify the LDAP socket connection timeout in seconds " "(default: 10)"), - AP_INIT_FLAG("LDAPReferrals", util_ldap_set_chase_referrals, + AP_INIT_TAKE1("LDAPReferrals", util_ldap_set_chase_referrals, NULL, OR_AUTHCFG, - "Choose whether referrals are chased ['ON'|'OFF']. Default 'ON'"), + "Choose whether referrals are chased ['ON'|'OFF'|'DEFAULT']. Default 'ON'"), AP_INIT_TAKE1("LDAPReferralHopLimit", util_ldap_set_referral_hop_limit, NULL, OR_AUTHCFG,