annotate src/http/modules/ngx_http_auth_request_module.c @ 8164:b71e69247483

Variables: avoid possible buffer overrun with some "$sent_http_*". The existing logic to evaluate multi header "$sent_http_*" variables, such as $sent_http_cache_control, as previously introduced in 1.23.0, doesn't take into account that one or more elements can be cleared, yet still present in a linked list, pointed to by the next field. Such elements don't contribute to the resulting variable length, an attempt to append a separator for them ends up in out of bounds write. This is not possible with standard modules, though at least one third party module is known to override multi header values this way, so it makes sense to harden the logic. The fix restores a generic boundary check.
author Sergey Kandaurov <pluknet@nginx.com>
date Mon, 01 May 2023 19:16:05 +0400
parents 8272c823a7d0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5329
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2 /*
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 * Copyright (C) Maxim Dounin
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8 #include <ngx_config.h>
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 #include <ngx_core.h>
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 #include <ngx_http.h>
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
13 typedef struct {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14 ngx_str_t uri;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15 ngx_array_t *vars;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
16 } ngx_http_auth_request_conf_t;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 typedef struct {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20 ngx_uint_t done;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21 ngx_uint_t status;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 ngx_http_request_t *subrequest;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23 } ngx_http_auth_request_ctx_t;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
24
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26 typedef struct {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27 ngx_int_t index;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28 ngx_http_complex_value_t value;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29 ngx_http_set_variable_pt set_handler;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30 } ngx_http_auth_request_variable_t;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33 static ngx_int_t ngx_http_auth_request_handler(ngx_http_request_t *r);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34 static ngx_int_t ngx_http_auth_request_done(ngx_http_request_t *r,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35 void *data, ngx_int_t rc);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36 static ngx_int_t ngx_http_auth_request_set_variables(ngx_http_request_t *r,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37 ngx_http_auth_request_conf_t *arcf, ngx_http_auth_request_ctx_t *ctx);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 static ngx_int_t ngx_http_auth_request_variable(ngx_http_request_t *r,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39 ngx_http_variable_value_t *v, uintptr_t data);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 static void *ngx_http_auth_request_create_conf(ngx_conf_t *cf);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41 static char *ngx_http_auth_request_merge_conf(ngx_conf_t *cf,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42 void *parent, void *child);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43 static ngx_int_t ngx_http_auth_request_init(ngx_conf_t *cf);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44 static char *ngx_http_auth_request(ngx_conf_t *cf, ngx_command_t *cmd,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45 void *conf);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46 static char *ngx_http_auth_request_set(ngx_conf_t *cf, ngx_command_t *cmd,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47 void *conf);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 static ngx_command_t ngx_http_auth_request_commands[] = {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 { ngx_string("auth_request"),
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54 ngx_http_auth_request,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55 NGX_HTTP_LOC_CONF_OFFSET,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56 0,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
57 NULL },
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59 { ngx_string("auth_request_set"),
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61 ngx_http_auth_request_set,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 NGX_HTTP_LOC_CONF_OFFSET,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63 0,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64 NULL },
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66 ngx_null_command
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 };
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 static ngx_http_module_t ngx_http_auth_request_module_ctx = {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 NULL, /* preconfiguration */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72 ngx_http_auth_request_init, /* postconfiguration */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 NULL, /* create main configuration */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75 NULL, /* init main configuration */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77 NULL, /* create server configuration */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78 NULL, /* merge server configuration */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80 ngx_http_auth_request_create_conf, /* create location configuration */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81 ngx_http_auth_request_merge_conf /* merge location configuration */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82 };
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 ngx_module_t ngx_http_auth_request_module = {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86 NGX_MODULE_V1,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87 &ngx_http_auth_request_module_ctx, /* module context */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 ngx_http_auth_request_commands, /* module directives */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89 NGX_HTTP_MODULE, /* module type */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 NULL, /* init master */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91 NULL, /* init module */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 NULL, /* init process */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 NULL, /* init thread */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 NULL, /* exit thread */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 NULL, /* exit process */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 NULL, /* exit master */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 NGX_MODULE_V1_PADDING
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98 };
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 static ngx_int_t
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 ngx_http_auth_request_handler(ngx_http_request_t *r)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103 {
8037
8272c823a7d0 Auth request: multiple WWW-Authenticate headers (ticket #485).
Maxim Dounin <mdounin@mdounin.ru>
parents: 8031
diff changeset
104 ngx_table_elt_t *h, *ho, **ph;
5329
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105 ngx_http_request_t *sr;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 ngx_http_post_subrequest_t *ps;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 ngx_http_auth_request_ctx_t *ctx;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 ngx_http_auth_request_conf_t *arcf;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 arcf = ngx_http_get_module_loc_conf(r, ngx_http_auth_request_module);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 if (arcf->uri.len == 0) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 return NGX_DECLINED;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 "auth request handler");
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119 ctx = ngx_http_get_module_ctx(r, ngx_http_auth_request_module);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
121 if (ctx != NULL) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
122 if (!ctx->done) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123 return NGX_AGAIN;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
124 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
125
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126 /*
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
127 * as soon as we are done - explicitly set variables to make
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128 * sure they will be available after internal redirects
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
129 */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131 if (ngx_http_auth_request_set_variables(r, arcf, ctx) != NGX_OK) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132 return NGX_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
133 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
134
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135 /* return appropriate status */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
136
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
137 if (ctx->status == NGX_HTTP_FORBIDDEN) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
138 return ctx->status;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
139 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
140
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
141 if (ctx->status == NGX_HTTP_UNAUTHORIZED) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
142 sr = ctx->subrequest;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
143
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
144 h = sr->headers_out.www_authenticate;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
145
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
146 if (!h && sr->upstream) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
147 h = sr->upstream->headers_in.www_authenticate;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
148 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149
8037
8272c823a7d0 Auth request: multiple WWW-Authenticate headers (ticket #485).
Maxim Dounin <mdounin@mdounin.ru>
parents: 8031
diff changeset
150 ph = &r->headers_out.www_authenticate;
8272c823a7d0 Auth request: multiple WWW-Authenticate headers (ticket #485).
Maxim Dounin <mdounin@mdounin.ru>
parents: 8031
diff changeset
151
8272c823a7d0 Auth request: multiple WWW-Authenticate headers (ticket #485).
Maxim Dounin <mdounin@mdounin.ru>
parents: 8031
diff changeset
152 while (h) {
5329
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
153 ho = ngx_list_push(&r->headers_out.headers);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
154 if (ho == NULL) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
155 return NGX_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
156 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
157
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158 *ho = *h;
8031
d26db4f82d7d All known output headers can be linked lists now.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6480
diff changeset
159 ho->next = NULL;
5329
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
160
8037
8272c823a7d0 Auth request: multiple WWW-Authenticate headers (ticket #485).
Maxim Dounin <mdounin@mdounin.ru>
parents: 8031
diff changeset
161 *ph = ho;
8272c823a7d0 Auth request: multiple WWW-Authenticate headers (ticket #485).
Maxim Dounin <mdounin@mdounin.ru>
parents: 8031
diff changeset
162 ph = &ho->next;
8272c823a7d0 Auth request: multiple WWW-Authenticate headers (ticket #485).
Maxim Dounin <mdounin@mdounin.ru>
parents: 8031
diff changeset
163
8272c823a7d0 Auth request: multiple WWW-Authenticate headers (ticket #485).
Maxim Dounin <mdounin@mdounin.ru>
parents: 8031
diff changeset
164 h = h->next;
5329
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
165 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
166
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
167 return ctx->status;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
168 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
169
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
170 if (ctx->status >= NGX_HTTP_OK
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
171 && ctx->status < NGX_HTTP_SPECIAL_RESPONSE)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
172 {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
173 return NGX_OK;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
176 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6480
f01ab2dbcfdc Fixed logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5329
diff changeset
177 "auth request unexpected status: %ui", ctx->status);
5329
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
178
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
179 return NGX_HTTP_INTERNAL_SERVER_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
180 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
181
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
182 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_auth_request_ctx_t));
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
183 if (ctx == NULL) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184 return NGX_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
186
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
187 ps = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188 if (ps == NULL) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189 return NGX_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192 ps->handler = ngx_http_auth_request_done;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193 ps->data = ctx;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
194
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
195 if (ngx_http_subrequest(r, &arcf->uri, NULL, &sr, ps,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
196 NGX_HTTP_SUBREQUEST_WAITED)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
197 != NGX_OK)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
198 {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199 return NGX_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
200 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
202 /*
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
203 * allocate fake request body to avoid attempts to read it and to make
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204 * sure real body file (if already read) won't be closed by upstream
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
205 */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
206
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
207 sr->request_body = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
208 if (sr->request_body == NULL) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
209 return NGX_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
210 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
211
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
212 sr->header_only = 1;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 ctx->subrequest = sr;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
215
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
216 ngx_http_set_ctx(r, ctx, ngx_http_auth_request_module);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
217
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
218 return NGX_AGAIN;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
219 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
220
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
221
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222 static ngx_int_t
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223 ngx_http_auth_request_done(ngx_http_request_t *r, void *data, ngx_int_t rc)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224 {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225 ngx_http_auth_request_ctx_t *ctx = data;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6480
f01ab2dbcfdc Fixed logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5329
diff changeset
228 "auth request done s:%ui", r->headers_out.status);
5329
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
229
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230 ctx->done = 1;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231 ctx->status = r->headers_out.status;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
232
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
233 return rc;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
234 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
235
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
236
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
237 static ngx_int_t
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
238 ngx_http_auth_request_set_variables(ngx_http_request_t *r,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
239 ngx_http_auth_request_conf_t *arcf, ngx_http_auth_request_ctx_t *ctx)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
240 {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
241 ngx_str_t val;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
242 ngx_http_variable_t *v;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
243 ngx_http_variable_value_t *vv;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
244 ngx_http_auth_request_variable_t *av, *last;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
245 ngx_http_core_main_conf_t *cmcf;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
246
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
247 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
248 "auth request set variables");
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
249
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
250 if (arcf->vars == NULL) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
251 return NGX_OK;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
252 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
253
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
254 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
255 v = cmcf->variables.elts;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
256
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
257 av = arcf->vars->elts;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
258 last = av + arcf->vars->nelts;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
259
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
260 while (av < last) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
261 /*
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
262 * explicitly set new value to make sure it will be available after
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
263 * internal redirects
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
264 */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
265
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
266 vv = &r->variables[av->index];
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
267
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
268 if (ngx_http_complex_value(ctx->subrequest, &av->value, &val)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
269 != NGX_OK)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
270 {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
271 return NGX_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
272 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
274 vv->valid = 1;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
275 vv->not_found = 0;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
276 vv->data = val.data;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
277 vv->len = val.len;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
278
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
279 if (av->set_handler) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
280 /*
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
281 * set_handler only available in cmcf->variables_keys, so we store
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
282 * it explicitly
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
283 */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
284
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
285 av->set_handler(r, vv, v[av->index].data);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
286 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
287
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
288 av++;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
289 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
290
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
291 return NGX_OK;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
292 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
293
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
294
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
295 static ngx_int_t
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
296 ngx_http_auth_request_variable(ngx_http_request_t *r,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
297 ngx_http_variable_value_t *v, uintptr_t data)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
298 {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
299 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
300 "auth request variable");
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
301
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
302 v->not_found = 1;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
303
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
304 return NGX_OK;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
305 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
306
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
307
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
308 static void *
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
309 ngx_http_auth_request_create_conf(ngx_conf_t *cf)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
310 {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
311 ngx_http_auth_request_conf_t *conf;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
312
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_auth_request_conf_t));
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
314 if (conf == NULL) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
315 return NULL;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
316 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
317
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
318 /*
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
319 * set by ngx_pcalloc():
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
320 *
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
321 * conf->uri = { 0, NULL };
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
322 */
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
323
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
324 conf->vars = NGX_CONF_UNSET_PTR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
325
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
326 return conf;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
327 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
328
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
329
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
330 static char *
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
331 ngx_http_auth_request_merge_conf(ngx_conf_t *cf, void *parent, void *child)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
332 {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
333 ngx_http_auth_request_conf_t *prev = parent;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
334 ngx_http_auth_request_conf_t *conf = child;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
335
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
336 ngx_conf_merge_str_value(conf->uri, prev->uri, "");
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
337 ngx_conf_merge_ptr_value(conf->vars, prev->vars, NULL);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
338
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
339 return NGX_CONF_OK;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
340 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
341
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
342
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
343 static ngx_int_t
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
344 ngx_http_auth_request_init(ngx_conf_t *cf)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
345 {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
346 ngx_http_handler_pt *h;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
347 ngx_http_core_main_conf_t *cmcf;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
348
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
349 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
350
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
351 h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
352 if (h == NULL) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
353 return NGX_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
354 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
355
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
356 *h = ngx_http_auth_request_handler;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
357
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
358 return NGX_OK;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
359 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
360
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
361
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
362 static char *
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
363 ngx_http_auth_request(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
364 {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
365 ngx_http_auth_request_conf_t *arcf = conf;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
366
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
367 ngx_str_t *value;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
368
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
369 if (arcf->uri.data != NULL) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
370 return "is duplicate";
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
371 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
372
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
373 value = cf->args->elts;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
375 if (ngx_strcmp(value[1].data, "off") == 0) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
376 arcf->uri.len = 0;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
377 arcf->uri.data = (u_char *) "";
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
378
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
379 return NGX_CONF_OK;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
380 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
381
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
382 arcf->uri = value[1];
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
383
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
384 return NGX_CONF_OK;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
385 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
386
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
387
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
388 static char *
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
389 ngx_http_auth_request_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
390 {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
391 ngx_http_auth_request_conf_t *arcf = conf;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
392
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
393 ngx_str_t *value;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
394 ngx_http_variable_t *v;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
395 ngx_http_auth_request_variable_t *av;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
396 ngx_http_compile_complex_value_t ccv;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
397
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
398 value = cf->args->elts;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
399
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
400 if (value[1].data[0] != '$') {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
401 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
402 "invalid variable name \"%V\"", &value[1]);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
403 return NGX_CONF_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
404 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
405
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
406 value[1].len--;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
407 value[1].data++;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
408
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
409 if (arcf->vars == NGX_CONF_UNSET_PTR) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
410 arcf->vars = ngx_array_create(cf->pool, 1,
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
411 sizeof(ngx_http_auth_request_variable_t));
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
412 if (arcf->vars == NULL) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
413 return NGX_CONF_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
414 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
415 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
416
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
417 av = ngx_array_push(arcf->vars);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
418 if (av == NULL) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
419 return NGX_CONF_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
420 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
421
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
422 v = ngx_http_add_variable(cf, &value[1], NGX_HTTP_VAR_CHANGEABLE);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
423 if (v == NULL) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
424 return NGX_CONF_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
425 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
426
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
427 av->index = ngx_http_get_variable_index(cf, &value[1]);
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
428 if (av->index == NGX_ERROR) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
429 return NGX_CONF_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
430 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
431
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
432 if (v->get_handler == NULL) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
433 v->get_handler = ngx_http_auth_request_variable;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
434 v->data = (uintptr_t) av;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
435 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
436
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
437 av->set_handler = v->set_handler;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
438
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
439 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
440
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
441 ccv.cf = cf;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
442 ccv.value = &value[2];
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
443 ccv.complex_value = &av->value;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
444
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
445 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
446 return NGX_CONF_ERROR;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
447 }
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
448
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
449 return NGX_CONF_OK;
00bdc9f08a16 Auth request module import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
450 }