On Fri, Apr 25, 2014 at 1:15 PM <[email protected]> wrote:
>
> Author: minfrin
> Date: Fri Apr 25 11:14:36 2014
> New Revision: 1589993
>
> URL: http://svn.apache.org/r1589993
> Log:
> Add the ldap-search option to mod_authnz_ldap, allowing authorization
> to be based on arbitrary expressions that do not include the username.
[]
>
> --- httpd/httpd/trunk/docs/manual/mod/mod_authnz_ldap.xml (original)
> +++ httpd/httpd/trunk/docs/manual/mod/mod_authnz_ldap.xml Fri Apr 25 11:14:36
> 2014
[]
> @@ -508,6 +514,28 @@ AuthLDAPMaxSubGroupDepth 1
>
> </section>
>
> +<section id="reqsearch"><title>Require ldap-search</title>
> +
> + <p>The <code>Require ldap-search</code> directive allows the
> + administrator to grant access based on a generic LDAP search filter
> using an
> + <a href="../expr.html">expression</a>. If there is exactly one match to
> the search filter,
> + regardless of the distinguished name, access is granted.</p>
I get from this that there should be one match..
>
> --- httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c (original)
> +++ httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c Fri Apr 25 11:14:36 2014
[]
>
> +static authz_status ldapsearch_check_authorization(request_rec *r,
> + const char *require_args,
> + const void
> *parsed_require_args)
> +{
> + int result = 0;
> + authn_ldap_config_t *sec =
> + (authn_ldap_config_t *)ap_get_module_config(r->per_dir_config,
> &authnz_ldap_module);
> +
> + util_ldap_connection_t *ldc = NULL;
> +
> + const char *err = NULL;
> + const ap_expr_info_t *expr = parsed_require_args;
> + const char *require;
> + const char *t;
> + const char *dn = NULL;
> +
> + if (!sec->have_ldap_url) {
> + return AUTHZ_DENIED;
> + }
> +
> + if (sec->host) {
> + ldc = get_connection_for_authz(r, LDAP_SEARCH);
> + apr_pool_cleanup_register(r->pool, ldc,
> + authnz_ldap_cleanup_connection_close,
> + apr_pool_cleanup_null);
> + }
> + else {
> + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(01738)
> + "auth_ldap authorize: no sec->host - weird...?");
> + return AUTHZ_DENIED;
> + }
> +
> + require = ap_expr_str_exec(r, expr, &err);
> + if (err) {
> + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO()
> + "auth_ldap authorize: require ldap-search: Can't "
> + "evaluate require expression: %s", err);
> + return AUTHZ_DENIED;
> + }
> +
> + t = require;
> +
> + if (t[0]) {
> + const char **vals;
> +
> + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO()
> + "auth_ldap authorize: checking filter %s", t);
> +
> + /* Search for the user DN */
> + result = util_ldap_cache_getuserdn(r, ldc, sec->url, sec->basedn,
> + sec->scope, sec->attributes, t, &dn, &vals);
> +
> + /* Make sure that the filtered search returned a single dn */
And it's restated here..
> + if (result == LDAP_SUCCESS && dn) {
> + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO()
> + "auth_ldap authorize: require ldap-search: "
> + "authorization successful");
> + return AUTHZ_GRANTED;
I get that for "ldap-filter" (unlike for "ldap-search here) we'll do a
util_ldap_cache_comparedn() to (double) check the returned DN somehow
(sorry I don't really know how LDAP works), not here though because we
don't require a particular DN but just a single one.
But what makes sure that it's the case here?
> + }
> + else {
> + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO()
> + "auth_ldap authorize: require ldap-search: "
> + "%s authorization failed [%s][%s]",
> + t, ldc->reason, ldap_err2string(result));
> + }
> + }
> +
> + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO()
> + "auth_ldap authorize filter: authorization denied for "
> + "to %s", r->uri);
> +
> + return AUTHZ_DENIED;
> +}
Regards;
Yann.