Welcome! Log In Create A New Profile

Advanced

Re: [PATCH 18 of 20] Upstream: multiple WWW-Authenticate headers (ticket #485)

Sergey Kandaurov
May 20, 2022 09:56AM
> On 13 May 2022, at 05:57, Maxim Dounin <mdounin@mdounin.ru> wrote:
>
> Hello!
>
> On Thu, May 12, 2022 at 01:03:37AM +0400, Sergey Kandaurov wrote:
>
>> On Thu, Apr 21, 2022 at 01:18:58AM +0300, Maxim Dounin wrote:
>>> # HG changeset patch
>>> # User Maxim Dounin <mdounin@mdounin.ru>
>>> # Date 1650492341 -10800
>>> # Thu Apr 21 01:05:41 2022 +0300
>>> # Node ID fa9751ffe7723a11159c158078e454671e81cb87
>>> # Parent 2027b85971d4b8a7e33c018548468057cb57eaf7
>>> Upstream: multiple WWW-Authenticate headers (ticket #485).
>>>
>>> When using proxy_intercept_errors and an error page for error 401
>>> (Unauthorized), multiple WWW-Authenticate headers from the upstream server
>>> response are now properly copied to the response.
>>>
>>> diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
>>> --- a/src/http/ngx_http_upstream.c
>>> +++ b/src/http/ngx_http_upstream.c
>>> @@ -2647,7 +2647,7 @@ ngx_http_upstream_intercept_errors(ngx_h
>>> {
>>> ngx_int_t status;
>>> ngx_uint_t i;
>>> - ngx_table_elt_t *h;
>>> + ngx_table_elt_t *h, *ho, **ph;
>>> ngx_http_err_page_t *err_page;
>>> ngx_http_core_loc_conf_t *clcf;
>>>
>>> @@ -2676,18 +2676,26 @@ ngx_http_upstream_intercept_errors(ngx_h
>>> if (status == NGX_HTTP_UNAUTHORIZED
>>> && u->headers_in.www_authenticate)
>>> {
>>> - h = ngx_list_push(&r->headers_out.headers);
>>> -
>>> - if (h == NULL) {
>>> - ngx_http_upstream_finalize_request(r, u,
>>> + h = u->headers_in.www_authenticate;
>>> + ph = &r->headers_out.www_authenticate;
>>> +
>>> + while (h) {
>>> + ho = ngx_list_push(&r->headers_out.headers);
>>> +
>>> + if (ho == NULL) {
>>> + ngx_http_upstream_finalize_request(r, u,
>>> NGX_HTTP_INTERNAL_SERVER_ERROR);
>>> - return NGX_OK;
>>> + return NGX_OK;
>>> + }
>>> +
>>> + *ho = *h;
>>> + ho->next = NULL;
>>> +
>>> + *ph = ho;
>>> + ph = &ho->next;
>>> +
>>> + h = h->next;
>>> }
>>> -
>>> - *h = *u->headers_in.www_authenticate;
>>> - h->next = NULL;
>>> -
>>> - r->headers_out.www_authenticate = h;
>>> }
>>>
>>> #if (NGX_HTTP_CACHE)
>>>
>>
>> While the patch certainly looks correct,
>> I'm not sure about usefulness of r->headers_out.www_authenticate.
>> Is the header accessed directly through this pointer ever?
>> For read purposes I mean. Header filters seem not.
>>
>> The only place is in the auth_request module,
>> but it doesn't seem to make sense in subrequest.
>
> The auth request module uses it to copy the WWW-Authenticate
> headers from the subrequest response to the main request. For
> example, in a configuration like:
>
> location / { auth_request /auth; ... }
> location /auth { auth_basic foo; ... }
>
> While such configurations are unlikely, as using auth_basic
> directly should be easier, these are certainly possible.

I doubt access phase handlers are executed in subrequests at all,
see the "r != r->main" check in ngx_http_core_access_phase().
So it doesn't look feasible with auth_basic (or another auth module).

>
> Similarly, r->headers_out.www_authenticate can be used with
> proxy_intercept_errors + error_page 401 in the subrequest (since
> r->upstream can be cleared by the error page).

That's true, tnx for the point.
Indeed, with such setup, after internal redirect while in subrequest,
headers are already there in (s)r->headers_out.www_authenticate.

>
> BTW, looking at this once again, I tend to think we also need
> ngx_http_core_access_phase() changes for proper handling of
> multiple WWW-Authenticate headers. It might not be a good idea to
> commit it right now though, see commit log.

auth_spnego is such an outstanding example.
As said, with the patch applied, when it comes to clear headers with
"satisfy any;", this leads to segfault on h->next.
Even with h->next initialized, and since the module allows to insert
two headers at once, the first one gets lost tracking to be cleared
(which is also true now).
So, the module needs more work to gain from properly linked headers.

>
> On the other hand, breaking it all at once might be less painful
> (after all, the auth_request change will already made such modules
> to segfault when used with auth_request; though this is unlikely,
> since such configurations hardly make sense).

Still not clear how's that possible in subrequests, see above.

>
> # HG changeset patch
> # User Maxim Dounin <mdounin@mdounin.ru>
> # Date 1652405911 -10800
> # Fri May 13 04:38:31 2022 +0300
> # Node ID 0c2cf997bde390c9be27e0685ee2a00024c57e4e
> # Parent c53cb6f31b9855020d85476fa98ef1cdca809aed
> Multiple WWW-Authenticate headers with "satisfy any;".
>
> If a module adds multiple WWW-Authenticate headers (ticket #485) to the
> response, linked in r->headers_out.www_authenticate, all headers are now
> cleared if another module later allows access.
>
> This change is a nop for standard modules, since the only access module which
> can add multiple WWW-Authenticate headers is the auth request module, and
> it is checked after other standard access modules. Though this might
> affect some third party access modules.
>
> Note that if a 3rd party module adds a single WWW-Authenticate header
> and not yet modified to set the header's next pointer to NULL, attempt to
> clear such a header with this change will result in a segmentation fault.
>
> diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
> --- a/src/http/ngx_http_core_module.c
> +++ b/src/http/ngx_http_core_module.c
> @@ -1088,6 +1088,7 @@ ngx_int_t
> ngx_http_core_access_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)
> {
> ngx_int_t rc;
> + ngx_table_elt_t *h;
> ngx_http_core_loc_conf_t *clcf;
>
> if (r != r->main) {
> @@ -1122,8 +1123,8 @@ ngx_http_core_access_phase(ngx_http_requ
> if (rc == NGX_OK) {
> r->access_code = 0;
>
> - if (r->headers_out.www_authenticate) {
> - r->headers_out.www_authenticate->hash = 0;
> + for (h = r->headers_out.www_authenticate; h; h = h->next) {
> + h->hash = 0;
> }
>
> r->phase_handler = ph->next;
>

I think it is good from an architectural point of view.

--
Sergey Kandaurov

_______________________________________________
nginx-devel mailing list -- nginx-devel@nginx.org
To unsubscribe send an email to nginx-devel-leave@nginx.org
Subject Author Views Posted

[PATCH 00 of 20] multiple headers handling

Maxim Dounin 864 April 20, 2022 06:38PM

[PATCH 03 of 20] SCGI: combining headers with identical names (ticket #1724)

Maxim Dounin 179 April 20, 2022 06:40PM

[PATCH 02 of 20] FastCGI: combining headers with identical names (ticket #1724)

Maxim Dounin 145 April 20, 2022 06:42PM

Re: [PATCH 02 of 20] FastCGI: combining headers with identical names (ticket #1724)

Sergey Kandaurov 186 May 11, 2022 11:36AM

Re: [PATCH 02 of 20] FastCGI: combining headers with identical names (ticket #1724)

Maxim Dounin 100 May 12, 2022 06:34PM

Re: [PATCH 02 of 20] FastCGI: combining headers with identical names (ticket #1724)

Sergey Kandaurov 213 May 13, 2022 10:06AM

Re: [PATCH 02 of 20] FastCGI: combining headers with identical names (ticket #1724)

Sergey Kandaurov 100 May 13, 2022 10:06AM

[PATCH 04 of 20] Uwsgi: combining headers with identical names (ticket #1724)

Maxim Dounin 148 April 20, 2022 06:44PM

[PATCH 08 of 20] Perl: all known input headers are handled identically

Maxim Dounin 223 April 20, 2022 06:44PM

[PATCH 10 of 20] Upstream: style

Maxim Dounin 191 April 20, 2022 06:46PM

[PATCH 07 of 20] All non-unique input headers are now linked lists

Maxim Dounin 271 April 20, 2022 06:48PM

Re: [PATCH 07 of 20] All non-unique input headers are now linked lists

Sergey Kandaurov 243 May 11, 2022 03:44PM

Re: [PATCH 07 of 20] All non-unique input headers are now linked lists

Maxim Dounin 93 May 12, 2022 07:56PM

[PATCH 09 of 20] Perl: combining unknown headers during $r->header_in() lookup

Maxim Dounin 128 April 20, 2022 06:50PM

[PATCH 12 of 20] Upstream: simplified Accept-Ranges handling

Maxim Dounin 297 April 20, 2022 06:52PM

[PATCH 11 of 20] Upstream: simplified Content-Encoding handling

Maxim Dounin 177 April 20, 2022 06:54PM

Re: [PATCH 11 of 20] Upstream: simplified Content-Encoding handling

Sergey Kandaurov 141 May 11, 2022 04:02PM

Re: [PATCH 11 of 20] Upstream: simplified Content-Encoding handling

Maxim Dounin 129 May 12, 2022 08:20PM

[PATCH 05 of 20] Combining unknown headers during variables lookup (ticket #1316)

Maxim Dounin 123 April 20, 2022 06:56PM

Re: [PATCH 05 of 20] Combining unknown headers during variables lookup (ticket #1316)

Sergey Kandaurov 158 May 11, 2022 12:12PM

Re: [PATCH 05 of 20] Combining unknown headers during variables lookup (ticket #1316)

Maxim Dounin 217 May 12, 2022 07:18PM

[PATCH 06 of 20] Reworked multi headers to use linked lists

Maxim Dounin 191 April 20, 2022 06:58PM

Re: [PATCH 06 of 20] Reworked multi headers to use linked lists

Sergey Kandaurov 130 May 11, 2022 03:24PM

Re: [PATCH 06 of 20] Reworked multi headers to use linked lists

Maxim Dounin 122 May 12, 2022 07:44PM

Re: [PATCH 06 of 20] Reworked multi headers to use linked lists

Sergey Kandaurov 274 June 13, 2022 01:08PM

Re: [PATCH 06 of 20] Reworked multi headers to use linked lists

Maxim Dounin 127 June 13, 2022 06:52PM

[PATCH 14 of 20] Upstream: all known headers in u->headers_in are linked lists now

Maxim Dounin 182 April 20, 2022 07:00PM

[PATCH 13 of 20] All known output headers can be linked lists now

Maxim Dounin 120 April 20, 2022 07:02PM

[PATCH 15 of 20] Upstream: header handlers can now return parsing errors

Maxim Dounin 112 April 20, 2022 07:04PM

Re: [PATCH 15 of 20] Upstream: header handlers can now return parsing errors

Sergey Kandaurov 108 May 11, 2022 04:30PM

Re: [PATCH 15 of 20] Upstream: header handlers can now return parsing errors

Maxim Dounin 128 May 12, 2022 08:26PM

[PATCH 17 of 20] Upstream: handling of multiple Vary headers (ticket #1423)

Maxim Dounin 150 April 20, 2022 07:06PM

Re: [PATCH 17 of 20] Upstream: handling of multiple Vary headers (ticket #1423)

Sergey Kandaurov 132 May 11, 2022 04:48PM

Re: [PATCH 17 of 20] Upstream: handling of multiple Vary headers (ticket #1423)

Maxim Dounin 100 May 12, 2022 08:52PM

[PATCH 18 of 20] Upstream: multiple WWW-Authenticate headers (ticket #485)

Maxim Dounin 119 April 20, 2022 07:08PM

Re: [PATCH 18 of 20] Upstream: multiple WWW-Authenticate headers (ticket #485)

Sergey Kandaurov 137 May 11, 2022 05:06PM

Re: [PATCH 18 of 20] Upstream: multiple WWW-Authenticate headers (ticket #485)

Maxim Dounin 102 May 12, 2022 10:00PM

Re: [PATCH 18 of 20] Upstream: multiple WWW-Authenticate headers (ticket #485)

Sergey Kandaurov 106 May 20, 2022 09:56AM

Re: [PATCH 18 of 20] Upstream: multiple WWW-Authenticate headers (ticket #485)

Maxim Dounin 113 May 20, 2022 05:10PM

[PATCH 16 of 20] Upstream: duplicate headers ignored or properly linked

Maxim Dounin 156 April 20, 2022 07:10PM

Re: [PATCH 16 of 20] Upstream: duplicate headers ignored or properly linked

Sergey Kandaurov 104 May 11, 2022 04:36PM

Re: [PATCH 16 of 20] Upstream: duplicate headers ignored or properly linked

Maxim Dounin 438 May 12, 2022 08:36PM

[PATCH 20 of 20] Headers filter: improved memory allocation error handling

Maxim Dounin 145 April 20, 2022 07:12PM

[PATCH 19 of 20] Auth request: multiple WWW-Authenticate headers (ticket #485)

Maxim Dounin 170 April 20, 2022 07:14PM

[PATCH 00 of 10] multiple headers tests

Maxim Dounin 157 April 20, 2022 07:16PM

[PATCH 01 of 10] Tests: tests for passing Date and Server headers

Maxim Dounin 123 April 20, 2022 07:18PM

[PATCH 02 of 10] Tests: fastcgi tests for combining headers

Maxim Dounin 176 April 20, 2022 07:20PM

[PATCH 03 of 10] Tests: scgi tests for combining headers

Maxim Dounin 124 April 20, 2022 07:20PM

[PATCH 04 of 10] Tests: uwsgi tests for combining headers

Maxim Dounin 93 April 20, 2022 07:22PM

[PATCH 07 of 10] Tests: perl $r->header_in() combining headers test

Maxim Dounin 111 April 20, 2022 07:24PM

[PATCH 09 of 10] Tests: tests for multiple Vary headers (ticket #1423)

Maxim Dounin 113 April 20, 2022 07:26PM

[PATCH 06 of 10] Tests: perl $r->header_in("Connection") test

Maxim Dounin 114 April 20, 2022 07:28PM

[PATCH 05 of 10] Tests: tests for various http header variables

Maxim Dounin 167 April 20, 2022 07:30PM

[PATCH 08 of 10] Tests: tests for duplicate response headers

Maxim Dounin 123 April 20, 2022 07:32PM

[PATCH 10 of 10] Tests: tests for multiple WWW-Authenticate headers (ticket #485)

Maxim Dounin 136 April 20, 2022 07:34PM

Re: [PATCH 00 of 10] multiple headers tests

Sergey Kandaurov 150 May 31, 2022 07:14PM

Re: [PATCH 00 of 10] multiple headers tests

Maxim Dounin 96 June 03, 2022 07:26PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 170
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready