annotate src/http/modules/ngx_http_auth_basic_module.c @ 6986:0cdee26605f3

Cleaned up r->headers_out.headers allocation error handling. If initialization of a header failed for some reason after ngx_list_push(), leaving the header as is can result in uninitialized memory access by the header filter or the log module. The fix is to clear partially initialized headers in case of errors. For the Cache-Control header, the fix is to postpone pushing r->headers_out.cache_control until its value is completed.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 20 Apr 2017 18:26:37 +0300
parents f01ab2dbcfdc
children 4a670c18e5e6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3922
diff changeset
4 * Copyright (C) Nginx, Inc.
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
3922
9c057d5e1c27 "$apr1", "{PLAIN}", and "{SSHA}" password methods in auth basic module
Igor Sysoev <igor@sysoev.ru>
parents: 3887
diff changeset
11 #include <ngx_crypt.h>
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 #define NGX_HTTP_AUTH_BUF_SIZE 2048
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17 typedef struct {
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2571
diff changeset
18 ngx_str_t passwd;
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 } ngx_http_auth_basic_ctx_t;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 typedef struct {
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
23 ngx_http_complex_value_t *realm;
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
24 ngx_http_complex_value_t user_file;
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 } ngx_http_auth_basic_loc_conf_t;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 static ngx_int_t ngx_http_auth_basic_handler(ngx_http_request_t *r);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 static ngx_int_t ngx_http_auth_basic_crypt_handler(ngx_http_request_t *r,
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 ngx_http_auth_basic_ctx_t *ctx, ngx_str_t *passwd, ngx_str_t *realm);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 static ngx_int_t ngx_http_auth_basic_set_realm(ngx_http_request_t *r,
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 ngx_str_t *realm);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 static void ngx_http_auth_basic_close(ngx_file_t *file);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 static void *ngx_http_auth_basic_create_loc_conf(ngx_conf_t *cf);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 static char *ngx_http_auth_basic_merge_loc_conf(ngx_conf_t *cf,
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 void *parent, void *child);
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
37 static ngx_int_t ngx_http_auth_basic_init(ngx_conf_t *cf);
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
38 static char *ngx_http_auth_basic_user_file(ngx_conf_t *cf, ngx_command_t *cmd,
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
39 void *conf);
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 static ngx_command_t ngx_http_auth_basic_commands[] = {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 { ngx_string("auth_basic"),
631
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
45 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
46 |NGX_CONF_TAKE1,
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
47 ngx_http_set_complex_value_slot,
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 NGX_HTTP_LOC_CONF_OFFSET,
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 offsetof(ngx_http_auth_basic_loc_conf_t, realm),
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
50 NULL },
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 { ngx_string("auth_basic_user_file"),
631
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
53 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF
5d2b8078c1c2 nginx-0.3.37-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
54 |NGX_CONF_TAKE1,
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
55 ngx_http_auth_basic_user_file,
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 NGX_HTTP_LOC_CONF_OFFSET,
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 offsetof(ngx_http_auth_basic_loc_conf_t, user_file),
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 NULL },
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 ngx_null_command
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 };
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
64 static ngx_http_module_t ngx_http_auth_basic_module_ctx = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 503
diff changeset
65 NULL, /* preconfiguration */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
66 ngx_http_auth_basic_init, /* postconfiguration */
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 NULL, /* create main configuration */
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 NULL, /* init main configuration */
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 NULL, /* create server configuration */
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 NULL, /* merge server configuration */
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 ngx_http_auth_basic_create_loc_conf, /* create location configuration */
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 ngx_http_auth_basic_merge_loc_conf /* merge location configuration */
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 };
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 ngx_module_t ngx_http_auth_basic_module = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 503
diff changeset
80 NGX_MODULE_V1,
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 &ngx_http_auth_basic_module_ctx, /* module context */
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 ngx_http_auth_basic_commands, /* module directives */
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 NGX_HTTP_MODULE, /* module type */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
84 NULL, /* init master */
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
85 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
86 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
87 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
88 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
89 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
90 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 539
diff changeset
91 NGX_MODULE_V1_PADDING
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 };
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 static ngx_int_t
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 ngx_http_auth_basic_handler(ngx_http_request_t *r)
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 off_t offset;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 ssize_t n;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 ngx_fd_t fd;
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
101 ngx_int_t rc;
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
102 ngx_err_t err;
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
103 ngx_str_t pwd, realm, user_file;
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
104 ngx_uint_t i, level, login, left, passwd;
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 ngx_file_t file;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 ngx_http_auth_basic_ctx_t *ctx;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 ngx_http_auth_basic_loc_conf_t *alcf;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 u_char buf[NGX_HTTP_AUTH_BUF_SIZE];
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 enum {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 sw_login,
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 sw_passwd,
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 sw_skip
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 } state;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 alcf = ngx_http_get_module_loc_conf(r, ngx_http_auth_basic_module);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
117 if (alcf->realm == NULL || alcf->user_file.value.data == NULL) {
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
118 return NGX_DECLINED;
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
119 }
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
120
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
121 if (ngx_http_complex_value(r, alcf->realm, &realm) != NGX_OK) {
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
122 return NGX_ERROR;
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
123 }
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
124
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
125 if (realm.len == 3 && ngx_strncmp(realm.data, "off", 3) == 0) {
1786
adca43955f79 return NGX_DECLINED if access directives are not active,
Igor Sysoev <igor@sysoev.ru>
parents: 1352
diff changeset
126 return NGX_DECLINED;
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 ctx = ngx_http_get_module_ctx(r, ngx_http_auth_basic_module);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 if (ctx) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 return ngx_http_auth_basic_crypt_handler(r, ctx, &ctx->passwd,
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
133 &realm);
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
136 rc = ngx_http_auth_basic_user(r);
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
138 if (rc == NGX_DECLINED) {
2523
7764f0fdd2a4 add auth basic failure logging
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
139
5433
c37f34bda5ea Auth basic: "info" logging level on no user/password.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4948
diff changeset
140 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
2523
7764f0fdd2a4 add auth basic failure logging
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
141 "no user/password was provided for basic authentication");
7764f0fdd2a4 add auth basic failure logging
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
142
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
143 return ngx_http_auth_basic_set_realm(r, &realm);
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
146 if (rc == NGX_ERROR) {
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 return NGX_HTTP_INTERNAL_SERVER_ERROR;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2571
diff changeset
150 if (ngx_http_complex_value(r, &alcf->user_file, &user_file) != NGX_OK) {
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2571
diff changeset
151 return NGX_ERROR;
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
152 }
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
153
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
154 fd = ngx_open_file(user_file.data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 if (fd == NGX_INVALID_FILE) {
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
157 err = ngx_errno;
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
158
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
159 if (err == NGX_ENOENT) {
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
160 level = NGX_LOG_ERR;
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
161 rc = NGX_HTTP_FORBIDDEN;
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
162
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
163 } else {
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
164 level = NGX_LOG_CRIT;
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
165 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
166 }
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
167
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
168 ngx_log_error(level, r->connection->log, err,
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
169 ngx_open_file_n " \"%s\" failed", user_file.data);
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
170
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
171 return rc;
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 ngx_memzero(&file, sizeof(ngx_file_t));
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 file.fd = fd;
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
177 file.name = user_file;
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178 file.log = r->connection->log;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 state = sw_login;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 passwd = 0;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 login = 0;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 left = 0;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 offset = 0;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 for ( ;; ) {
890
6356b34cf027 fix when last htpasswd line has no CR or LF
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
187 i = left;
6356b34cf027 fix when last htpasswd line has no CR or LF
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
188
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 n = ngx_read_file(&file, buf + left, NGX_HTTP_AUTH_BUF_SIZE - left,
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 offset);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 if (n == NGX_ERROR) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 ngx_http_auth_basic_close(&file);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194 return NGX_HTTP_INTERNAL_SERVER_ERROR;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 if (n == 0) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 break;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 for (i = left; i < left + n; i++) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 switch (state) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 case sw_login:
2524
fd4ee75c6eee name/password were ignored after odd empty lines
Igor Sysoev <igor@sysoev.ru>
parents: 2523
diff changeset
205 if (login == 0) {
fd4ee75c6eee name/password were ignored after odd empty lines
Igor Sysoev <igor@sysoev.ru>
parents: 2523
diff changeset
206
fd4ee75c6eee name/password were ignored after odd empty lines
Igor Sysoev <igor@sysoev.ru>
parents: 2523
diff changeset
207 if (buf[i] == '#' || buf[i] == CR) {
fd4ee75c6eee name/password were ignored after odd empty lines
Igor Sysoev <igor@sysoev.ru>
parents: 2523
diff changeset
208 state = sw_skip;
fd4ee75c6eee name/password were ignored after odd empty lines
Igor Sysoev <igor@sysoev.ru>
parents: 2523
diff changeset
209 break;
fd4ee75c6eee name/password were ignored after odd empty lines
Igor Sysoev <igor@sysoev.ru>
parents: 2523
diff changeset
210 }
fd4ee75c6eee name/password were ignored after odd empty lines
Igor Sysoev <igor@sysoev.ru>
parents: 2523
diff changeset
211
fd4ee75c6eee name/password were ignored after odd empty lines
Igor Sysoev <igor@sysoev.ru>
parents: 2523
diff changeset
212 if (buf[i] == LF) {
fd4ee75c6eee name/password were ignored after odd empty lines
Igor Sysoev <igor@sysoev.ru>
parents: 2523
diff changeset
213 break;
fd4ee75c6eee name/password were ignored after odd empty lines
Igor Sysoev <igor@sysoev.ru>
parents: 2523
diff changeset
214 }
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
217 if (buf[i] != r->headers_in.user.data[login]) {
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218 state = sw_skip;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219 break;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221
539
371c1cee100d nginx-0.1.44-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
222 if (login == r->headers_in.user.len) {
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 state = sw_passwd;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 passwd = i + 1;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227 login++;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 break;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231 case sw_passwd:
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 if (buf[i] == LF || buf[i] == CR || buf[i] == ':') {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 buf[i] = '\0';
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235 ngx_http_auth_basic_close(&file);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237 pwd.len = i - passwd;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238 pwd.data = &buf[passwd];
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 return ngx_http_auth_basic_crypt_handler(r, NULL, &pwd,
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
241 &realm);
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 break;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 case sw_skip:
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 if (buf[i] == LF) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248 state = sw_login;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249 login = 0;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252 break;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256 if (state == sw_passwd) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257 left = left + n - passwd;
3887
e7798b5e990a use memmove() in appropriate places
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
258 ngx_memmove(buf, &buf[passwd], left);
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259 passwd = 0;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261 } else {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262 left = 0;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265 offset += n;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268 ngx_http_auth_basic_close(&file);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269
890
6356b34cf027 fix when last htpasswd line has no CR or LF
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
270 if (state == sw_passwd) {
6356b34cf027 fix when last htpasswd line has no CR or LF
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
271 pwd.len = i - passwd;
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1786
diff changeset
272 pwd.data = ngx_pnalloc(r->pool, pwd.len + 1);
890
6356b34cf027 fix when last htpasswd line has no CR or LF
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
273 if (pwd.data == NULL) {
6356b34cf027 fix when last htpasswd line has no CR or LF
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
274 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6356b34cf027 fix when last htpasswd line has no CR or LF
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
275 }
6356b34cf027 fix when last htpasswd line has no CR or LF
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
276
6356b34cf027 fix when last htpasswd line has no CR or LF
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
277 ngx_cpystrn(pwd.data, &buf[passwd], pwd.len + 1);
6356b34cf027 fix when last htpasswd line has no CR or LF
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
278
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
279 return ngx_http_auth_basic_crypt_handler(r, NULL, &pwd, &realm);
890
6356b34cf027 fix when last htpasswd line has no CR or LF
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
280 }
6356b34cf027 fix when last htpasswd line has no CR or LF
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
281
2523
7764f0fdd2a4 add auth basic failure logging
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
282 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
7764f0fdd2a4 add auth basic failure logging
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
283 "user \"%V\" was not found in \"%V\"",
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
284 &r->headers_in.user, &user_file);
2523
7764f0fdd2a4 add auth basic failure logging
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
285
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
286 return ngx_http_auth_basic_set_realm(r, &realm);
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290 static ngx_int_t
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291 ngx_http_auth_basic_crypt_handler(ngx_http_request_t *r,
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292 ngx_http_auth_basic_ctx_t *ctx, ngx_str_t *passwd, ngx_str_t *realm)
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293 {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
294 ngx_int_t rc;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295 u_char *encrypted;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297 rc = ngx_crypt(r->pool, r->headers_in.passwd.data, passwd->data,
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 &encrypted);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6480
f01ab2dbcfdc Fixed logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5433
diff changeset
301 "rc: %i user: \"%V\" salt: \"%s\"",
2523
7764f0fdd2a4 add auth basic failure logging
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
302 rc, &r->headers_in.user, passwd->data);
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
303
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
304 if (rc == NGX_OK) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
305 if (ngx_strcmp(encrypted, passwd->data) == 0) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
306 return NGX_OK;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310 "encrypted: \"%s\"", encrypted);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311
2523
7764f0fdd2a4 add auth basic failure logging
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
312 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
7764f0fdd2a4 add auth basic failure logging
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
313 "user \"%V\": password mismatch",
7764f0fdd2a4 add auth basic failure logging
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
314 &r->headers_in.user);
7764f0fdd2a4 add auth basic failure logging
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
315
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316 return ngx_http_auth_basic_set_realm(r, realm);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319 if (rc == NGX_ERROR) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 return NGX_HTTP_INTERNAL_SERVER_ERROR;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
322
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323 /* rc == NGX_AGAIN */
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
324
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
325 if (ctx == NULL) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
326 ctx = ngx_palloc(r->pool, sizeof(ngx_http_auth_basic_ctx_t));
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
327 if (ctx == NULL) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
328 return NGX_HTTP_INTERNAL_SERVER_ERROR;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
329 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
330
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
331 ngx_http_set_ctx(r, ctx, ngx_http_auth_basic_module);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
333 ctx->passwd.len = passwd->len;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334 passwd->len++;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
335
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
336 ctx->passwd.data = ngx_pstrdup(r->pool, passwd);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
337 if (ctx->passwd.data == NULL) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 return NGX_HTTP_INTERNAL_SERVER_ERROR;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
340
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
341 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
342
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
343 /* TODO: add mutex event */
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
344
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
345 return rc;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
346 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
347
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
348
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
349 static ngx_int_t
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
350 ngx_http_auth_basic_set_realm(ngx_http_request_t *r, ngx_str_t *realm)
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
351 {
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
352 size_t len;
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
353 u_char *basic, *p;
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
354
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355 r->headers_out.www_authenticate = ngx_list_push(&r->headers_out.headers);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356 if (r->headers_out.www_authenticate == NULL) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
357 return NGX_HTTP_INTERNAL_SERVER_ERROR;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
359
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
360 len = sizeof("Basic realm=\"\"") - 1 + realm->len;
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
361
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
362 basic = ngx_pnalloc(r->pool, len);
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
363 if (basic == NULL) {
6986
0cdee26605f3 Cleaned up r->headers_out.headers allocation error handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6480
diff changeset
364 r->headers_out.www_authenticate->hash = 0;
0cdee26605f3 Cleaned up r->headers_out.headers allocation error handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6480
diff changeset
365 r->headers_out.www_authenticate = NULL;
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
366 return NGX_HTTP_INTERNAL_SERVER_ERROR;
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
367 }
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
368
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
369 p = ngx_cpymem(basic, "Basic realm=\"", sizeof("Basic realm=\"") - 1);
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
370 p = ngx_cpymem(p, realm->data, realm->len);
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
371 *p = '"';
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
372
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 503
diff changeset
373 r->headers_out.www_authenticate->hash = 1;
3516
dd1570b6f237 ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
374 ngx_str_set(&r->headers_out.www_authenticate->key, "WWW-Authenticate");
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
375 r->headers_out.www_authenticate->value.data = basic;
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
376 r->headers_out.www_authenticate->value.len = len;
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
378 return NGX_HTTP_UNAUTHORIZED;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
379 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381 static void
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382 ngx_http_auth_basic_close(ngx_file_t *file)
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383 {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384 if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
385 ngx_log_error(NGX_LOG_ALERT, file->log, ngx_errno,
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 ngx_close_file_n " \"%s\" failed", file->name.data);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
388 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391 static void *
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392 ngx_http_auth_basic_create_loc_conf(ngx_conf_t *cf)
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393 {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 ngx_http_auth_basic_loc_conf_t *conf;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_auth_basic_loc_conf_t));
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397 if (conf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2588
diff changeset
398 return NULL;
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401 return conf;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
404
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
405 static char *
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
406 ngx_http_auth_basic_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
407 {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
408 ngx_http_auth_basic_loc_conf_t *prev = parent;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
409 ngx_http_auth_basic_loc_conf_t *conf = child;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
410
4948
d03712b6914b The "auth_basic" directive gained support of variables.
Ruslan Ermilov <ru@nginx.com>
parents: 4947
diff changeset
411 if (conf->realm == NULL) {
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412 conf->realm = prev->realm;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414
4947
4251e72b8bb4 Allow the complex value to be defined as an empty string.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
415 if (conf->user_file.value.data == NULL) {
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 conf->user_file = prev->user_file;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419 return NGX_CONF_OK;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
422
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
423 static ngx_int_t
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
424 ngx_http_auth_basic_init(ngx_conf_t *cf)
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425 {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426 ngx_http_handler_pt *h;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427 ngx_http_core_main_conf_t *cmcf;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428
681
7e24168b0853 nginx-0.4.0-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
429 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
503
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431 h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432 if (h == NULL) {
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
433 return NGX_ERROR;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436 *h = ngx_http_auth_basic_handler;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 return NGX_OK;
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439 }
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
440
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441
b1648294f693 nginx-0.1.26-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442 static char *
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
443 ngx_http_auth_basic_user_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
444 {
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
445 ngx_http_auth_basic_loc_conf_t *alcf = conf;
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
446
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2571
diff changeset
447 ngx_str_t *value;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2571
diff changeset
448 ngx_http_compile_complex_value_t ccv;
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
449
4947
4251e72b8bb4 Allow the complex value to be defined as an empty string.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
450 if (alcf->user_file.value.data) {
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
451 return "is duplicate";
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
452 }
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
453
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
454 value = cf->args->elts;
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
455
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2571
diff changeset
456 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
457
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2571
diff changeset
458 ccv.cf = cf;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2571
diff changeset
459 ccv.value = &value[1];
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2571
diff changeset
460 ccv.complex_value = &alcf->user_file;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2571
diff changeset
461 ccv.zero = 1;
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2571
diff changeset
462 ccv.conf_prefix = 1;
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
463
2588
a6954ce88b80 use complex values in add_header, auth_basic_user_file,
Igor Sysoev <igor@sysoev.ru>
parents: 2571
diff changeset
464 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
2567
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
465 return NGX_CONF_ERROR;
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
466 }
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
467
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
468 return NGX_CONF_OK;
f0f64973ba2f auth_basic_user_file supports variables
Igor Sysoev <igor@sysoev.ru>
parents: 2524
diff changeset
469 }