Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-12-02 Thread Graham Leggett via dev
On 24 Nov 2023, at 19:26, Ruediger Pluem  wrote:

>> We do - and we also need to apr_pstrdup() the dn to be consistent with the 
>> rest.
> 
> Why? dn is already apr_pstrdup from r->pool:
> 
> https://github.com/apache/httpd/blob/dc76ce4c43efb8c0c36a5990aeb0468a87458087/modules/ldap/util_ldap.c#L2133

Looks like we were consistently wasteful due to lack of const, fixed in 
r1914281.

Regards,
Graham
—



Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-24 Thread Ruediger Pluem



On 11/24/23 5:41 PM, Graham Leggett via dev wrote:
> On 24 Nov 2023, at 14:25, Ruediger Pluem  wrote:
> 
>>> +            req->dn = dn;
>>
>> Don't we need to save the vals as well?
> 
> We do - and we also need to apr_pstrdup() the dn to be consistent with the 
> rest.

Why? dn is already apr_pstrdup from r->pool:

https://github.com/apache/httpd/blob/dc76ce4c43efb8c0c36a5990aeb0468a87458087/modules/ldap/util_ldap.c#L2133

Regards

Rüdiger



Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-24 Thread Graham Leggett via dev
On 24 Nov 2023, at 14:25, Ruediger Pluem  wrote:

>> +req->dn = dn;
> 
> Don't we need to save the vals as well?

We do - and we also need to apr_pstrdup() the dn to be consistent with the rest.


Index: modules/aaa/mod_authnz_ldap.c
===
--- modules/aaa/mod_authnz_ldap.c   (revision 1914090)
+++ modules/aaa/mod_authnz_ldap.c   (working copy)
@@ -1453,7 +1453,6 @@
 t = require;
 
 if (t[0]) {
-const char **vals;
 
 ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02630)
   "auth_ldap authorize: checking filter %s", t);
@@ -1460,11 +1459,11 @@
 
 /* Search for the user DN */
 result = util_ldap_cache_getuserdn(r, ldc, sec->url, sec->basedn,
- sec->scope, sec->attributes, t, , );
+ sec->scope, sec->attributes, t, , &(req->vals));
 
 /* Make sure that the filtered search returned a single dn */
 if (result == LDAP_SUCCESS && dn) {
-req->dn = dn;
+req->dn = apr_pstrdup(r->pool, dn);
 ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02631)
   "auth_ldap authorize: require ldap-search: "
   "authorization successful");

Regards,
Graham
—



Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-24 Thread Ruediger Pluem



On 11/24/23 10:45 AM, Graham Leggett via dev wrote:

> 
>  
> 
>          /* Make sure that the filtered search returned a single dn */
> 
>          if (result == LDAP_SUCCESS && dn) {
> 
> +            req->dn = dn;

Don't we need to save the vals as well?

Index: modules/aaa/mod_authnz_ldap.c
===
--- modules/aaa/mod_authnz_ldap.c   (revision 1914069)
+++ modules/aaa/mod_authnz_ldap.c   (working copy)
@@ -1482,10 +1482,12 @@

 /* Make sure that the filtered search returned a single dn */
 if (result == LDAP_SUCCESS && dn) {
+req->dn = dn;
+req->vals = vals;
 ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02631)
   "auth_ldap authorize: require ldap-search: "
   "authorization successful");




Regards

Rüdiger


Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-24 Thread Yann Ylavic
On Fri, Nov 24, 2023 at 12:41 PM Graham Leggett  wrote:
>
> On 24 Nov 2023, at 10:03, Yann Ylavic  wrote:
>
> > +1 this is pretty much what Rüdiger proposed earlier and it aligns
> > with the proposed 2.4.x backport so I understand better :)
>
> Rüdiger’s patch had conflicts in the time he posted it and now, I reapplied 
> his changes in the above patch and confirmed they worked.
>
> Who wants to commit? (Am happy to)

Sure, go ahead.

Regards;
Yann.


Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-24 Thread Graham Leggett via dev
On 24 Nov 2023, at 10:03, Yann Ylavic  wrote:

> +1 this is pretty much what Rüdiger proposed earlier and it aligns
> with the proposed 2.4.x backport so I understand better :)

Rüdiger’s patch had conflicts in the time he posted it and now, I reapplied his 
changes in the above patch and confirmed they worked.

Who wants to commit? (Am happy to)

Regards,
Graham
—



Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-24 Thread Yann Ylavic
On Fri, Nov 24, 2023 at 10:45 AM Graham Leggett via dev
 wrote:
>
> I completely misunderstood this - I had the idea that build_request_config() 
> was being removed, when it was being left behind, sorry about that.
> The patch that applies to trunk looks like this, and I just tested it and it 
> works:
>
> Index: modules/aaa/mod_authnz_ldap.c
> ===
> --- modules/aaa/mod_authnz_ldap.c (revision 1914067)
> +++ modules/aaa/mod_authnz_ldap.c (working copy)
> @@ -1441,24 +1441,6 @@
>  req = build_request_config(r);
>  }
>  ldc = get_connection_for_authz(r, LDAP_SEARCH);
> -if (!req->dn && r->user) {
> -authz_status rv;
> -if (!*r->user) {
> -ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(10487)
> -  "ldap authorize: Userid is blank, AuthType=%s",
> -  r->ap_auth_type);
> -}
> -rv = get_dn_for_nonldap_authn(r, ldc);
> -if (rv != AUTHZ_GRANTED) {
> -return rv;
> -}
> -if (req->dn == NULL || !*req->dn) {
> -ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02636)
> -  "auth_ldap authorize: require ldap-search: user's 
> DN "
> -  "has not been defined; failing authorization");
> -return AUTHZ_DENIED;
> -}
> -}
>
>  require = ap_expr_str_exec(r, expr, );
>  if (err) {
> @@ -1482,6 +1464,7 @@
>
>  /* Make sure that the filtered search returned a single dn */
>  if (result == LDAP_SUCCESS && dn) {
> +req->dn = dn;
>  ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02631)
>"auth_ldap authorize: require ldap-search: "
>"authorization successful");

+1 this is pretty much what Rüdiger proposed earlier and it aligns
with the proposed 2.4.x backport so I understand better :)

Regards;
Yann.


Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-24 Thread Graham Leggett via dev
On 20 Nov 2023, at 15:10, Ruediger Pluem  wrote:

> Revisiting this again. I guess the below patch should fix it.
> I assume that only the checking on req != NULL is relevant.
> r->user and req->dn do not matter. But we should set req->dn to dn
> if util_ldap_cache_getuserdn found one.
> 
> BTW: get_connection_for_authz(r, LDAP_SEARCH); requires a valid req. It 
> cannot deal with req == NULL.
> 
> 
> Index: modules/aaa/mod_authnz_ldap.c
> ===
> --- modules/aaa/mod_authnz_ldap.c (revision 1913980)
> +++ modules/aaa/mod_authnz_ldap.c (working copy)
> @@ -1442,23 +1442,10 @@
>  */
> 
> if (!req) {
> -authz_status rv = AUTHZ_DENIED;
> req = build_request_config(r);

I completely misunderstood this - I had the idea that build_request_config() 
was being removed, when it was being left behind, sorry about that.

The patch that applies to trunk looks like this, and I just tested it and it 
works:

Index: modules/aaa/mod_authnz_ldap.c
===
--- modules/aaa/mod_authnz_ldap.c   (revision 1914067)
+++ modules/aaa/mod_authnz_ldap.c   (working copy)
@@ -1441,24 +1441,6 @@
 req = build_request_config(r);
 }
 ldc = get_connection_for_authz(r, LDAP_SEARCH);
-if (!req->dn && r->user) {
-authz_status rv;
-if (!*r->user) {
-ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(10487)
-  "ldap authorize: Userid is blank, AuthType=%s",
-  r->ap_auth_type);
-}
-rv = get_dn_for_nonldap_authn(r, ldc);
-if (rv != AUTHZ_GRANTED) {
-return rv;
-}
-if (req->dn == NULL || !*req->dn) {
-ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02636)
-  "auth_ldap authorize: require ldap-search: user's DN 
"
-  "has not been defined; failing authorization");
-return AUTHZ_DENIED;
-}
-}
 
 require = ap_expr_str_exec(r, expr, );
 if (err) {
@@ -1482,6 +1464,7 @@
 
 /* Make sure that the filtered search returned a single dn */
 if (result == LDAP_SUCCESS && dn) {
+req->dn = dn;
 ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02631)
   "auth_ldap authorize: require ldap-search: "
   "authorization successful");

Regards,
Graham
—




Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-22 Thread Yann Ylavic
On Wed, Nov 22, 2023 at 3:40 PM Graham Leggett via dev
 wrote:
>
> On 20 Nov 2023, at 15:32, Yann Ylavic  wrote:
>>
>> OK, I drop a new v3 here just in case and let those who know how LDAP
>> authn/authz work take whatever :)
>> This is just to show that there is some room for
>> factorization/disambiguation in this code..
>
> Just tested this, and it appears to work fine.
>
> One tiny detail, these is a logging line that refers to ldap-filter inside 
> ldap-search, but other than that, +1.
>
> +  "auth_ldap authorize: require ldap-filter: user's 
> DN "

Please take it, I do not have the environment for now to compile
and/or test this.

Regards;
Yann.


Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-22 Thread Graham Leggett via dev
On 20 Nov 2023, at 15:32, Yann Ylavic  wrote:

> OK, I drop a new v3 here just in case and let those who know how LDAP
> authn/authz work take whatever :)
> This is just to show that there is some room for
> factorization/disambiguation in this code..
> 
> 
> Regards;
> Yann.
> 

Just tested this, and it appears to work fine.

One tiny detail, these is a logging line that refers to ldap-filter inside 
ldap-search, but other than that, +1.

+  "auth_ldap authorize: require ldap-filter: user's DN 
"

Regards,
Graham
—



Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-20 Thread Yann Ylavic
On Mon, Nov 20, 2023 at 4:21 PM Ruediger Pluem  wrote:
>
> On 11/20/23 4:05 PM, Yann Ylavic wrote:
> > On Mon, Nov 20, 2023 at 3:46 PM Yann Ylavic  wrote:
> >>
> >> On Mon, Nov 20, 2023 at 2:33 PM Yann Ylavic  wrote:
> >>>
> >>> On Mon, Nov 20, 2023 at 1:57 PM Graham Leggett via dev
> >>>  wrote:
> 
>  On 20 Nov 2023, at 12:26, Ruediger Pluem  wrote:
> 
>  Or we need to ensure that authn_ldap_build_filter is NULL safe and 
>  returns in a sensible way if user == NULL.
> 
> 
>  This is the option we need I think - it’s possible that ldapsearch could 
>  be used without a user.
> >>>
> >>> In the proposed 2.4.x backport of ldapsearch_check_authorization()
> >>> there is no call to get_dn_for_nonldap_authn() nor
> >>> authn_ldap_build_filter(). The Require expression is passed directly
> >>> to util_ldap_cache_getuserdn(), so what is building a filter with
> >>> r->user about in the ldapsearch case finally?
> >>
> >> I mean, isn't what we need for something like the attached patch?
> >> This would call get_dn_for_nonldap_authn() only "if we have been
> >> authenticated by some other module than mod_auth_ldap" (per comment in
> >> the code), and do nothing about r->user otherwise.
> >> Again, I don't really know how mod_ldap is supposed to work so
> >> possibly this is all irrelevant..
> >
> > A more complete/correct patch would be this attached v2 anyway.
>
> +1 to the stuff outside ldapsearch_check_authorization. For the stuff inside 
> ldapsearch_check_authorization I guess my patch
> is closer to what ldapsearch intends to do do.

OK, I drop a new v3 here just in case and let those who know how LDAP
authn/authz work take whatever :)
This is just to show that there is some room for
factorization/disambiguation in this code..


Regards;
Yann.
Index: modules/aaa/mod_authnz_ldap.c
===
--- modules/aaa/mod_authnz_ldap.c	(revision 1913977)
+++ modules/aaa/mod_authnz_ldap.c	(working copy)
@@ -767,32 +767,27 @@ static authz_status ldapuser_check_authorization(r
 return AUTHZ_DENIED;
 }
 
-if (!req) {
-authz_status rv = AUTHZ_DENIED;
-req = build_request_config(r);
-ldc = get_connection_for_authz(r, LDAP_COMPARE);
-if (AUTHZ_GRANTED != (rv = get_dn_for_nonldap_authn(r, ldc))) { 
-return rv;
-}
-}
-else { 
-ldc = get_connection_for_authz(r, LDAP_COMPARE);
-}
-
-
 /*
  * If we have been authenticated by some other module than mod_authnz_ldap,
  * the req structure needed for authorization needs to be created
  * and populated with the userid and DN of the account in LDAP
  */
-
-
-if (!*r->user) {
-ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(01699)
-"ldap authorize: Userid is blank, AuthType=%s",
-r->ap_auth_type);
+if (!req) {
+req = build_request_config(r);
 }
-
+ldc = get_connection_for_authz(r, LDAP_COMPARE);
+if (!req->dn) {
+authz_status rv;
+if (!*r->user) {
+ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(01699)
+  "ldap authorize: Userid is blank, AuthType=%s",
+  r->ap_auth_type);
+}
+rv = get_dn_for_nonldap_authn(r, ldc);
+if (rv != AUTHZ_GRANTED) {
+return rv;
+}
+}
 if (req->dn == NULL || !*req->dn) {
 ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01702)
   "auth_ldap authorize: require user: user's DN has not "
@@ -895,17 +890,27 @@ static authz_status ldapgroup_check_authorization(
 return AUTHZ_DENIED;
 }
 
+/*
+ * If we have been authenticated by some other module than mod_authnz_ldap,
+ * the req structure needed for authorization needs to be created
+ * and populated with the userid and DN of the account in LDAP
+ */
 if (!req) {
-authz_status rv = AUTHZ_DENIED;
 req = build_request_config(r);
-ldc = get_connection_for_authz(r, LDAP_COMPARE);
-if (AUTHZ_GRANTED != (rv = get_dn_for_nonldap_authn(r, ldc))) {
+}
+ldc = get_connection_for_authz(r, LDAP_COMPARE);
+if (!req->dn) {
+authz_status rv;
+if (!*r->user) {
+ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(01699)
+  "ldap authorize: Userid is blank, AuthType=%s",
+  r->ap_auth_type);
+}
+rv = get_dn_for_nonldap_authn(r, ldc);
+if (rv != AUTHZ_GRANTED) {
 return rv;
 }
 }
-else { 
-ldc = get_connection_for_authz(r, LDAP_COMPARE);
-}
 
 /*
  * If there are no elements in the group attribute array, the default should be
@@ -1101,24 +1106,22 @@ static authz_status ldapdn_check_authorization(req
  * the req structure needed for authorization needs to be created
  * and 

Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-20 Thread Ruediger Pluem



On 11/20/23 4:19 PM, Graham Leggett via dev wrote:
> On 20 Nov 2023, at 15:10, Ruediger Pluem  wrote:
> 
>> Revisiting this again. I guess the below patch should fix it.
>> I assume that only the checking on req != NULL is relevant.
>> r->user and req->dn do not matter. But we should set req->dn to dn
>> if util_ldap_cache_getuserdn found one.
>>
>> BTW: get_connection_for_authz(r, LDAP_SEARCH); requires a valid req. It 
>> cannot deal with req == NULL.
>>
>>
>> Index: modules/aaa/mod_authnz_ldap.c
>> ===
>> --- modules/aaa/mod_authnz_ldap.c(revision 1913980)
>> +++ modules/aaa/mod_authnz_ldap.c(working copy)
>> @@ -1442,23 +1442,10 @@
>>  */
>>
>> if (!req) {
>> -authz_status rv = AUTHZ_DENIED;
>> req = build_request_config(r);
>> -ldc = get_connection_for_authz(r, LDAP_SEARCH);
>> -if (AUTHZ_GRANTED != (rv = get_dn_for_nonldap_authn(r, ldc))) {
>> -return rv;
>> -}
>> }
>> -else {
>> -ldc = get_connection_for_authz(r, LDAP_SEARCH);
>> -}
>>
>> -if (req->dn == NULL || !*req->dn) {
>> -ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02636)
>> -  "auth_ldap authorize: require ldap-filter: user's DN "
>> -  "has not been defined; failing authorization");
>> -return AUTHZ_DENIED;
>> -}
>> +ldc = get_connection_for_authz(r, LDAP_SEARCH);
> 
> Unfortunately removing this makes it impossible to use ldapsearch for authz 
> only, as the setup process normally done in the authn phase never happens.

Removing what exactly? I currently cannot follow.

Regards

Rüdiger



Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-20 Thread Ruediger Pluem



On 11/20/23 4:05 PM, Yann Ylavic wrote:
> On Mon, Nov 20, 2023 at 3:46 PM Yann Ylavic  wrote:
>>
>> On Mon, Nov 20, 2023 at 2:33 PM Yann Ylavic  wrote:
>>>
>>> On Mon, Nov 20, 2023 at 1:57 PM Graham Leggett via dev
>>>  wrote:

 On 20 Nov 2023, at 12:26, Ruediger Pluem  wrote:

 Or we need to ensure that authn_ldap_build_filter is NULL safe and returns 
 in a sensible way if user == NULL.


 This is the option we need I think - it’s possible that ldapsearch could 
 be used without a user.
>>>
>>> In the proposed 2.4.x backport of ldapsearch_check_authorization()
>>> there is no call to get_dn_for_nonldap_authn() nor
>>> authn_ldap_build_filter(). The Require expression is passed directly
>>> to util_ldap_cache_getuserdn(), so what is building a filter with
>>> r->user about in the ldapsearch case finally?
>>
>> I mean, isn't what we need for something like the attached patch?
>> This would call get_dn_for_nonldap_authn() only "if we have been
>> authenticated by some other module than mod_auth_ldap" (per comment in
>> the code), and do nothing about r->user otherwise.
>> Again, I don't really know how mod_ldap is supposed to work so
>> possibly this is all irrelevant..
> 
> A more complete/correct patch would be this attached v2 anyway.

+1 to the stuff outside ldapsearch_check_authorization. For the stuff inside 
ldapsearch_check_authorization I guess my patch
is closer to what ldapsearch intends to do do.

Regards

Rüdiger



Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-20 Thread Graham Leggett via dev
On 20 Nov 2023, at 15:10, Ruediger Pluem  wrote:

> Revisiting this again. I guess the below patch should fix it.
> I assume that only the checking on req != NULL is relevant.
> r->user and req->dn do not matter. But we should set req->dn to dn
> if util_ldap_cache_getuserdn found one.
> 
> BTW: get_connection_for_authz(r, LDAP_SEARCH); requires a valid req. It 
> cannot deal with req == NULL.
> 
> 
> Index: modules/aaa/mod_authnz_ldap.c
> ===
> --- modules/aaa/mod_authnz_ldap.c (revision 1913980)
> +++ modules/aaa/mod_authnz_ldap.c (working copy)
> @@ -1442,23 +1442,10 @@
>  */
> 
> if (!req) {
> -authz_status rv = AUTHZ_DENIED;
> req = build_request_config(r);
> -ldc = get_connection_for_authz(r, LDAP_SEARCH);
> -if (AUTHZ_GRANTED != (rv = get_dn_for_nonldap_authn(r, ldc))) {
> -return rv;
> -}
> }
> -else {
> -ldc = get_connection_for_authz(r, LDAP_SEARCH);
> -}
> 
> -if (req->dn == NULL || !*req->dn) {
> -ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02636)
> -  "auth_ldap authorize: require ldap-filter: user's DN "
> -  "has not been defined; failing authorization");
> -return AUTHZ_DENIED;
> -}
> +ldc = get_connection_for_authz(r, LDAP_SEARCH);

Unfortunately removing this makes it impossible to use ldapsearch for authz 
only, as the setup process normally done in the authn phase never happens.

The typical use case for ldapsearch is without authn, because you’re allowing 
someone in based on something other than a user login, for example a property 
of the SSL connection, or an IP address, etc.

Regards,
Graham
—



Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-20 Thread Ruediger Pluem



On 11/20/23 3:46 PM, Yann Ylavic wrote:
> On Mon, Nov 20, 2023 at 2:33 PM Yann Ylavic  wrote:
>>
>> On Mon, Nov 20, 2023 at 1:57 PM Graham Leggett via dev
>>  wrote:
>>>
>>> On 20 Nov 2023, at 12:26, Ruediger Pluem  wrote:
>>>
>>> Or we need to ensure that authn_ldap_build_filter is NULL safe and returns 
>>> in a sensible way if user == NULL.
>>>
>>>
>>> This is the option we need I think - it’s possible that ldapsearch could be 
>>> used without a user.
>>
>> In the proposed 2.4.x backport of ldapsearch_check_authorization()
>> there is no call to get_dn_for_nonldap_authn() nor
>> authn_ldap_build_filter(). The Require expression is passed directly
>> to util_ldap_cache_getuserdn(), so what is building a filter with
>> r->user about in the ldapsearch case finally?
> 
> I mean, isn't what we need for something like the attached patch?
> This would call get_dn_for_nonldap_authn() only "if we have been
> authenticated by some other module than mod_auth_ldap" (per comment in
> the code), and do nothing about r->user otherwise.
> Again, I don't really know how mod_ldap is supposed to work so
> possibly this is all irrelevant..
> 

Revisiting this again. I guess the below patch should fix it.
I assume that only the checking on req != NULL is relevant.
r->user and req->dn do not matter. But we should set req->dn to dn
if util_ldap_cache_getuserdn found one.

BTW: get_connection_for_authz(r, LDAP_SEARCH); requires a valid req. It cannot 
deal with req == NULL.


Index: modules/aaa/mod_authnz_ldap.c
===
--- modules/aaa/mod_authnz_ldap.c   (revision 1913980)
+++ modules/aaa/mod_authnz_ldap.c   (working copy)
@@ -1442,23 +1442,10 @@
  */

 if (!req) {
-authz_status rv = AUTHZ_DENIED;
 req = build_request_config(r);
-ldc = get_connection_for_authz(r, LDAP_SEARCH);
-if (AUTHZ_GRANTED != (rv = get_dn_for_nonldap_authn(r, ldc))) {
-return rv;
-}
 }
-else {
-ldc = get_connection_for_authz(r, LDAP_SEARCH);
-}

-if (req->dn == NULL || !*req->dn) {
-ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02636)
-  "auth_ldap authorize: require ldap-filter: user's DN "
-  "has not been defined; failing authorization");
-return AUTHZ_DENIED;
-}
+ldc = get_connection_for_authz(r, LDAP_SEARCH);

 require = ap_expr_str_exec(r, expr, );
 if (err) {
@@ -1482,6 +1469,7 @@

 /* Make sure that the filtered search returned a single dn */
 if (result == LDAP_SUCCESS && dn) {
+req->dn = dn;
 ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02631)
   "auth_ldap authorize: require ldap-search: "
   "authorization successful");

Regards

Rüdiger



Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-20 Thread Yann Ylavic
On Mon, Nov 20, 2023 at 3:46 PM Yann Ylavic  wrote:
>
> On Mon, Nov 20, 2023 at 2:33 PM Yann Ylavic  wrote:
> >
> > On Mon, Nov 20, 2023 at 1:57 PM Graham Leggett via dev
> >  wrote:
> > >
> > > On 20 Nov 2023, at 12:26, Ruediger Pluem  wrote:
> > >
> > > Or we need to ensure that authn_ldap_build_filter is NULL safe and 
> > > returns in a sensible way if user == NULL.
> > >
> > >
> > > This is the option we need I think - it’s possible that ldapsearch could 
> > > be used without a user.
> >
> > In the proposed 2.4.x backport of ldapsearch_check_authorization()
> > there is no call to get_dn_for_nonldap_authn() nor
> > authn_ldap_build_filter(). The Require expression is passed directly
> > to util_ldap_cache_getuserdn(), so what is building a filter with
> > r->user about in the ldapsearch case finally?
>
> I mean, isn't what we need for something like the attached patch?
> This would call get_dn_for_nonldap_authn() only "if we have been
> authenticated by some other module than mod_auth_ldap" (per comment in
> the code), and do nothing about r->user otherwise.
> Again, I don't really know how mod_ldap is supposed to work so
> possibly this is all irrelevant..

A more complete/correct patch would be this attached v2 anyway.

>
> Regards;
> Yann.
Index: modules/aaa/mod_authnz_ldap.c
===
--- modules/aaa/mod_authnz_ldap.c	(revision 1913977)
+++ modules/aaa/mod_authnz_ldap.c	(working copy)
@@ -767,19 +767,6 @@ static authz_status ldapuser_check_authorization(r
 return AUTHZ_DENIED;
 }
 
-if (!req) {
-authz_status rv = AUTHZ_DENIED;
-req = build_request_config(r);
-ldc = get_connection_for_authz(r, LDAP_COMPARE);
-if (AUTHZ_GRANTED != (rv = get_dn_for_nonldap_authn(r, ldc))) { 
-return rv;
-}
-}
-else { 
-ldc = get_connection_for_authz(r, LDAP_COMPARE);
-}
-
-
 /*
  * If we have been authenticated by some other module than mod_authnz_ldap,
  * the req structure needed for authorization needs to be created
@@ -786,7 +773,6 @@ static authz_status ldapuser_check_authorization(r
  * and populated with the userid and DN of the account in LDAP
  */
 
-
 if (!*r->user) {
 ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(01699)
 "ldap authorize: Userid is blank, AuthType=%s",
@@ -793,6 +779,17 @@ static authz_status ldapuser_check_authorization(r
 r->ap_auth_type);
 }
 
+if (!req) {
+req = build_request_config(r);
+}
+ldc = get_connection_for_authz(r, LDAP_COMPARE);
+if (!req->dn) {
+authz_status rv = get_dn_for_nonldap_authn(r, ldc);
+if (rv != AUTHZ_GRANTED) {
+return rv;
+}
+}
+
 if (req->dn == NULL || !*req->dn) {
 ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01702)
   "auth_ldap authorize: require user: user's DN has not "
@@ -895,17 +892,28 @@ static authz_status ldapgroup_check_authorization(
 return AUTHZ_DENIED;
 }
 
+/*
+ * If we have been authenticated by some other module than mod_authnz_ldap,
+ * the req structure needed for authorization needs to be created
+ * and populated with the userid and DN of the account in LDAP
+ */
+
+if (!*r->user) {
+ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(01699)
+"ldap authorize: Userid is blank, AuthType=%s",
+r->ap_auth_type);
+}
+
 if (!req) {
-authz_status rv = AUTHZ_DENIED;
 req = build_request_config(r);
-ldc = get_connection_for_authz(r, LDAP_COMPARE);
-if (AUTHZ_GRANTED != (rv = get_dn_for_nonldap_authn(r, ldc))) {
+}
+ldc = get_connection_for_authz(r, LDAP_COMPARE);
+if (!req->dn) {
+authz_status rv = get_dn_for_nonldap_authn(r, ldc);
+if (rv != AUTHZ_GRANTED) {
 return rv;
 }
 }
-else { 
-ldc = get_connection_for_authz(r, LDAP_COMPARE);
-}
 
 /*
  * If there are no elements in the group attribute array, the default should be
@@ -1109,16 +1117,15 @@ static authz_status ldapdn_check_authorization(req
 }
 
 if (!req) {
-authz_status rv = AUTHZ_DENIED;
 req = build_request_config(r);
-ldc = get_connection_for_authz(r, LDAP_SEARCH); /* comparedn is a search */
-if (AUTHZ_GRANTED != (rv = get_dn_for_nonldap_authn(r, ldc))) {
+}
+ldc = get_connection_for_authz(r, LDAP_SEARCH); /* comparedn is a search */
+if (!req->dn) {
+authz_status rv = get_dn_for_nonldap_authn(r, ldc);
+if (rv != AUTHZ_GRANTED) {
 return rv;
 }
 }
-else { 
-ldc = get_connection_for_authz(r, LDAP_SEARCH); /* comparedn is a search */
-}
 
 require = ap_expr_str_exec(r, expr, );
 if (err) {
@@ -1209,16 +1216,15 @@ static authz_status ldapattribute_check_authorizat
 }
 

Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-20 Thread Yann Ylavic
On Mon, Nov 20, 2023 at 2:33 PM Yann Ylavic  wrote:
>
> On Mon, Nov 20, 2023 at 1:57 PM Graham Leggett via dev
>  wrote:
> >
> > On 20 Nov 2023, at 12:26, Ruediger Pluem  wrote:
> >
> > Or we need to ensure that authn_ldap_build_filter is NULL safe and returns 
> > in a sensible way if user == NULL.
> >
> >
> > This is the option we need I think - it’s possible that ldapsearch could be 
> > used without a user.
>
> In the proposed 2.4.x backport of ldapsearch_check_authorization()
> there is no call to get_dn_for_nonldap_authn() nor
> authn_ldap_build_filter(). The Require expression is passed directly
> to util_ldap_cache_getuserdn(), so what is building a filter with
> r->user about in the ldapsearch case finally?

I mean, isn't what we need for something like the attached patch?
This would call get_dn_for_nonldap_authn() only "if we have been
authenticated by some other module than mod_auth_ldap" (per comment in
the code), and do nothing about r->user otherwise.
Again, I don't really know how mod_ldap is supposed to work so
possibly this is all irrelevant..

Regards;
Yann.
Index: modules/aaa/mod_authnz_ldap.c
===
--- modules/aaa/mod_authnz_ldap.c	(revision 1913977)
+++ modules/aaa/mod_authnz_ldap.c	(working copy)
@@ -1435,31 +1435,29 @@ static authz_status ldapsearch_check_authorization
 return AUTHZ_DENIED;
 }
 
+ldc = get_connection_for_authz(r, LDAP_SEARCH);
+
 /*
  * If we have been authenticated by some other module than mod_auth_ldap,
  * the req structure needed for authorization needs to be created
  * and populated with the userid and DN of the account in LDAP
  */
-
 if (!req) {
-authz_status rv = AUTHZ_DENIED;
 req = build_request_config(r);
-ldc = get_connection_for_authz(r, LDAP_SEARCH);
-if (AUTHZ_GRANTED != (rv = get_dn_for_nonldap_authn(r, ldc))) {
-return rv;
+if (r->user && *r->user) {
+authz_status rv = get_dn_for_nonldap_authn(r, ldc);
+if (rv != AUTHZ_GRANTED) {
+return rv;
+}
+if (req->dn == NULL || !*req->dn) {
+ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02636)
+  "auth_ldap authorize: require ldap-filter: user's DN "
+  "has not been defined; failing authorization");
+return AUTHZ_DENIED;
+}
 }
 }
-else {
-ldc = get_connection_for_authz(r, LDAP_SEARCH);
-}
 
-if (req->dn == NULL || !*req->dn) {
-ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02636)
-  "auth_ldap authorize: require ldap-filter: user's DN "
-  "has not been defined; failing authorization");
-return AUTHZ_DENIED;
-}
-
 require = ap_expr_str_exec(r, expr, );
 if (err) {
 ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02629)


Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-20 Thread Yann Ylavic
On Mon, Nov 20, 2023 at 1:57 PM Graham Leggett via dev
 wrote:
>
> On 20 Nov 2023, at 12:26, Ruediger Pluem  wrote:
>
> Or we need to ensure that authn_ldap_build_filter is NULL safe and returns in 
> a sensible way if user == NULL.
>
>
> This is the option we need I think - it’s possible that ldapsearch could be 
> used without a user.

In the proposed 2.4.x backport of ldapsearch_check_authorization()
there is no call to get_dn_for_nonldap_authn() nor
authn_ldap_build_filter(). The Require expression is passed directly
to util_ldap_cache_getuserdn(), so what is building a filter with
r->user about in the ldapsearch case finally?

>
> Regards,
> Graham
> —
>


Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-20 Thread Graham Leggett via dev
On 20 Nov 2023, at 12:26, Ruediger Pluem  wrote:

> Or we need to ensure that authn_ldap_build_filter is NULL safe and returns in 
> a sensible way if user == NULL.

This is the option we need I think - it’s possible that ldapsearch could be 
used without a user.

Regards,
Graham
—



Re: svn commit: r1913977 - /httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c

2023-11-20 Thread Ruediger Pluem



On 11/20/23 1:07 PM, yla...@apache.org wrote:
> Author: ylavic
> Date: Mon Nov 20 12:07:11 2023
> New Revision: 1913977
> 
> URL: http://svn.apache.org/viewvc?rev=1913977=rev
> Log:
> mod_authnz_ldap: Follow up to r1913962: r->user not used in 
> ldapsearch_check_authorization().
> 
> 
> Modified:
> httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c
> 
> Modified: httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c
> URL: 
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c?rev=1913977=1913976=1913977=diff
> ==
> --- httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c (original)
> +++ httpd/httpd/trunk/modules/aaa/mod_authnz_ldap.c Mon Nov 20 12:07:11 2023
> @@ -1441,12 +1441,6 @@ static authz_status ldapsearch_check_aut
>   * and populated with the userid and DN of the account in LDAP
>   */
>  
> -if (!*r->user) {
> -ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(10487)
> -"ldap authorize: Userid is blank, AuthType=%s",
> -r->ap_auth_type);
> -}
> -

We need r->user in get_dn_for_nonldap_authn -> authn_ldap_build_filter in case 
req == NULL.
authn_ldap_build_filter will segfault if r->user is NULL. Hence I guess we 
should apply the following
on top:

Index: modules/aaa/mod_authnz_ldap.c
===
--- modules/aaa/mod_authnz_ldap.c   (revision 1913977)
+++ modules/aaa/mod_authnz_ldap.c   (working copy)
@@ -1443,6 +1443,12 @@

 if (!req) {
 authz_status rv = AUTHZ_DENIED;
+if (!r->user || !*r->user) {
+ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(10487)
+"ldap authorize: Userid is blank, AuthType=%s",
+r->ap_auth_type);
+return rv;
+}
 req = build_request_config(r);
 ldc = get_connection_for_authz(r, LDAP_SEARCH);
 if (AUTHZ_GRANTED != (rv = get_dn_for_nonldap_authn(r, ldc))) {


Or we need to ensure that authn_ldap_build_filter is NULL safe and returns in a 
sensible way if user == NULL.

Regards

Rüdiger