Welcome! Log In Create A New Profile

Advanced

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

Maxim Dounin
May 20, 2022 05:10PM
Hello!

On Fri, May 20, 2022 at 05:51:19PM +0400, Sergey Kandaurov wrote:

> > On 13 May 2022, at 05:57, Maxim Dounin <mdounin@mdounin.ru> wrote:
> >
> > 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).

Yes, you're right, forgot about this check. So it's probably only
proxying then.

> > 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.

Yes, looks like a good example. So, the module doesn't work
correctly with "satisfy any;" now, and it cannot be fixed to work
properly. With the patch, it will be possible to fix the module
to work correctly.

> > 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.

I think you are right and it's not currently possible, see above.
Yet I still tend to think that committing this with other changes
would the right thing to do.

> > # 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.

Yep, sure. And I tend to think it worth committing, so it will be
clear why and how modules adding WWW-Authenticate have to be
modified. Added this to the queue.

--
Maxim Dounin
http://mdounin.ru/
_______________________________________________
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 181 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 214 May 13, 2022 10:06AM

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

Sergey Kandaurov 101 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 244 May 11, 2022 03:44PM

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

Maxim Dounin 95 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 192 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 123 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 113 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 129 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 138 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 107 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 171 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 114 April 20, 2022 07:26PM

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

Maxim Dounin 115 April 20, 2022 07:28PM

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

Maxim Dounin 168 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 137 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: 225
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