annotate src/http/modules/ngx_http_referer_module.c @ 9275:199dc0d6b05b default tip

Added max_headers directive. The directive limits the number of request headers accepted from clients. While the total amount of headers is believed to be sufficiently limited by the existing buffer size limits (client_header_buffer_size and large_client_header_buffers), the additional limit on the number of headers might be beneficial to better protect backend servers. Requested by Maksim Yevmenkin.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 24 May 2024 00:20:01 +0300
parents 7564a919d333
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
4d9ea73a627a nginx-0.3.10-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: 4008
diff changeset
4 * Copyright (C) Nginx, Inc.
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
13 #define NGX_HTTP_REFERER_NO_URI_PART ((void *) 4)
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
14
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
15
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 typedef struct {
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
17 ngx_hash_combined_t hash;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
19 #if (NGX_PCRE)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
20 ngx_array_t *regex;
5350
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
21 ngx_array_t *server_name_regex;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
22 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
23
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
24 ngx_flag_t no_referer;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
25 ngx_flag_t blocked_referer;
5351
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
26 ngx_flag_t server_names;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
28 ngx_hash_keys_arrays_t *keys;
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
29
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
30 ngx_uint_t referer_hash_max_size;
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
31 ngx_uint_t referer_hash_bucket_size;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 } ngx_http_referer_conf_t;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34
7079
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
35 static ngx_int_t ngx_http_referer_add_variables(ngx_conf_t *cf);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 static void * ngx_http_referer_create_conf(ngx_conf_t *cf);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 static char * ngx_http_referer_merge_conf(ngx_conf_t *cf, void *parent,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 void *child);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 static char *ngx_http_valid_referers(ngx_conf_t *cf, ngx_command_t *cmd,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 void *conf);
5349
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
41 static ngx_int_t ngx_http_add_referer(ngx_conf_t *cf,
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
42 ngx_hash_keys_arrays_t *keys, ngx_str_t *value, ngx_str_t *uri);
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
43 static ngx_int_t ngx_http_add_regex_referer(ngx_conf_t *cf,
5350
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
44 ngx_http_referer_conf_t *rlcf, ngx_str_t *name);
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
45 #if (NGX_PCRE)
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
46 static ngx_int_t ngx_http_add_regex_server_name(ngx_conf_t *cf,
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
47 ngx_http_referer_conf_t *rlcf, ngx_http_regex_t *regex);
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
48 #endif
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
49 static int ngx_libc_cdecl ngx_http_cmp_referer_wildcards(const void *one,
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
50 const void *two);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 static ngx_command_t ngx_http_referer_commands[] = {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 { ngx_string("valid_referers"),
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 ngx_http_valid_referers,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 NGX_HTTP_LOC_CONF_OFFSET,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 0,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 NULL },
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
62 { ngx_string("referer_hash_max_size"),
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
63 NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
64 ngx_conf_set_num_slot,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
65 NGX_HTTP_LOC_CONF_OFFSET,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
66 offsetof(ngx_http_referer_conf_t, referer_hash_max_size),
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
67 NULL },
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
68
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
69 { ngx_string("referer_hash_bucket_size"),
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
70 NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
71 ngx_conf_set_num_slot,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
72 NGX_HTTP_LOC_CONF_OFFSET,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
73 offsetof(ngx_http_referer_conf_t, referer_hash_bucket_size),
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
74 NULL },
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
75
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 ngx_null_command
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 };
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 static ngx_http_module_t ngx_http_referer_module_ctx = {
7079
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
81 ngx_http_referer_add_variables, /* preconfiguration */
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 NULL, /* postconfiguration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 NULL, /* create main configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 NULL, /* init main configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 NULL, /* create server configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 NULL, /* merge server configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 ngx_http_referer_create_conf, /* create location configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 ngx_http_referer_merge_conf /* merge location configuration */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 };
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 ngx_module_t ngx_http_referer_module = {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 NGX_MODULE_V1,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 &ngx_http_referer_module_ctx, /* module context */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 ngx_http_referer_commands, /* module directives */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 NGX_HTTP_MODULE, /* module type */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 NULL, /* init master */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 NULL, /* init module */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 NULL, /* init process */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 NULL, /* init thread */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 NULL, /* exit thread */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 NULL, /* exit process */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 NULL, /* exit master */
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 NGX_MODULE_V1_PADDING
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 };
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110
7079
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
111 static ngx_str_t ngx_http_invalid_referer_name = ngx_string("invalid_referer");
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
112
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
113
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 static ngx_int_t
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 ngx_http_referer_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
6474
Ruslan Ermilov <ru@nginx.com>
parents: 5352
diff changeset
116 uintptr_t data)
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 {
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
118 u_char *p, *ref, *last;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
119 size_t len;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
120 ngx_str_t *uri;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
121 ngx_uint_t i, key;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
122 ngx_http_referer_conf_t *rlcf;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
123 u_char buf[256];
5350
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
124 #if (NGX_PCRE)
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
125 ngx_int_t rc;
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
126 ngx_str_t referer;
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
127 #endif
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
129 rlcf = ngx_http_get_module_loc_conf(r, ngx_http_referer_module);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
131 if (rlcf->hash.hash.buckets == NULL
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
132 && rlcf->hash.wc_head == NULL
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
133 && rlcf->hash.wc_tail == NULL
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
134 #if (NGX_PCRE)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
135 && rlcf->regex == NULL
5350
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
136 && rlcf->server_name_regex == NULL
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
137 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
138 )
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
139 {
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
140 goto valid;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 if (r->headers_in.referer == NULL) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
144 if (rlcf->no_referer) {
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
145 goto valid;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
146 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
148 goto invalid;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 len = r->headers_in.referer->value.len;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 ref = r->headers_in.referer->value.data;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153
3459
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
154 if (len >= sizeof("http://i.ru") - 1) {
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
155 last = ref + len;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
156
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
157 if (ngx_strncasecmp(ref, (u_char *) "http://", 7) == 0) {
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
158 ref += 7;
5321
9806f7932474 Referer module: fixed regex matching against HTTPS referers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5221
diff changeset
159 len -= 7;
3459
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
160 goto valid_scheme;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
161
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
162 } else if (ngx_strncasecmp(ref, (u_char *) "https://", 8) == 0) {
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
163 ref += 8;
5321
9806f7932474 Referer module: fixed regex matching against HTTPS referers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5221
diff changeset
164 len -= 8;
3459
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
165 goto valid_scheme;
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
166 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168
3459
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
169 if (rlcf->blocked_referer) {
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
170 goto valid;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
171 }
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
172
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
173 goto invalid;
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
174
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
175 valid_scheme:
958f8de0c45f allow HTTPS referers
Igor Sysoev <igor@sysoev.ru>
parents: 3325
diff changeset
176
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
177 i = 0;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
178 key = 0;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
180 for (p = ref; p < last; p++) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
181 if (*p == '/' || *p == ':') {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
182 break;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 }
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
184
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
185 if (i == 256) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
186 goto invalid;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
187 }
5352
ec0be12c8e29 Referer: fixed hostname buffer overflow check.
Valentin Bartenev <vbart@nginx.com>
parents: 5351
diff changeset
188
ec0be12c8e29 Referer: fixed hostname buffer overflow check.
Valentin Bartenev <vbart@nginx.com>
parents: 5351
diff changeset
189 buf[i] = ngx_tolower(*p);
ec0be12c8e29 Referer: fixed hostname buffer overflow check.
Valentin Bartenev <vbart@nginx.com>
parents: 5351
diff changeset
190 key = ngx_hash(key, buf[i++]);
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
191 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
193 uri = ngx_hash_find_combined(&rlcf->hash, key, buf, p - ref);
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
195 if (uri) {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
196 goto uri;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
199 #if (NGX_PCRE)
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
200
5350
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
201 if (rlcf->server_name_regex) {
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
202 referer.len = p - ref;
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
203 referer.data = buf;
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
204
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
205 rc = ngx_regex_exec_array(rlcf->server_name_regex, &referer,
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
206 r->connection->log);
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
207
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
208 if (rc == NGX_OK) {
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
209 goto valid;
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
210 }
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
211
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
212 if (rc == NGX_ERROR) {
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
213 return rc;
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
214 }
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
215
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
216 /* NGX_DECLINED */
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
217 }
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
218
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
219 if (rlcf->regex) {
5321
9806f7932474 Referer module: fixed regex matching against HTTPS referers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5221
diff changeset
220 referer.len = len;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
221 referer.data = ref;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
222
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
223 rc = ngx_regex_exec_array(rlcf->regex, &referer, r->connection->log);
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
224
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
225 if (rc == NGX_OK) {
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
226 goto valid;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
227 }
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
228
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
229 if (rc == NGX_ERROR) {
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
230 return rc;
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
231 }
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
232
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
233 /* NGX_DECLINED */
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
234 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
235
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
236 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
237
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
238 invalid:
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
239
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 *v = ngx_http_variable_true_value;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 return NGX_OK;
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
243
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
244 uri:
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
245
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
246 for ( /* void */ ; p < last; p++) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
247 if (*p == '/') {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
248 break;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
249 }
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
250 }
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
251
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
252 len = last - p;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
253
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
254 if (uri == NGX_HTTP_REFERER_NO_URI_PART) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
255 goto valid;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
256 }
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
257
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
258 if (len < uri->len || ngx_strncmp(uri->data, p, uri->len) != 0) {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
259 goto invalid;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
260 }
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
261
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
262 valid:
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
263
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
264 *v = ngx_http_variable_null_value;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
265
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
266 return NGX_OK;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269
7079
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
270 static ngx_int_t
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
271 ngx_http_referer_add_variables(ngx_conf_t *cf)
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
272 {
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
273 ngx_http_variable_t *var;
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
274
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
275 var = ngx_http_add_variable(cf, &ngx_http_invalid_referer_name,
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
276 NGX_HTTP_VAR_CHANGEABLE);
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
277 if (var == NULL) {
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
278 return NGX_ERROR;
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
279 }
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
280
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
281 var->get_handler = ngx_http_referer_variable;
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
282
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
283 return NGX_OK;
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
284 }
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
285
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
286
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287 static void *
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288 ngx_http_referer_create_conf(ngx_conf_t *cf)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289 {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290 ngx_http_referer_conf_t *conf;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
292 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_referer_conf_t));
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293 if (conf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 1800
diff changeset
294 return NULL;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296
5351
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
297 /*
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
298 * set by ngx_pcalloc():
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
299 *
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
300 * conf->hash = { NULL };
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
301 * conf->server_names = 0;
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
302 * conf->keys = NULL;
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
303 */
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
304
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
305 #if (NGX_PCRE)
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
306 conf->regex = NGX_CONF_UNSET_PTR;
5350
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
307 conf->server_name_regex = NGX_CONF_UNSET_PTR;
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
308 #endif
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
309
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310 conf->no_referer = NGX_CONF_UNSET;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311 conf->blocked_referer = NGX_CONF_UNSET;
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
312 conf->referer_hash_max_size = NGX_CONF_UNSET_UINT;
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
313 conf->referer_hash_bucket_size = NGX_CONF_UNSET_UINT;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315 return conf;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319 static char *
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 ngx_http_referer_merge_conf(ngx_conf_t *cf, void *parent, void *child)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321 {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
322 ngx_http_referer_conf_t *prev = parent;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323 ngx_http_referer_conf_t *conf = child;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
324
5351
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
325 ngx_uint_t n;
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
326 ngx_hash_init_t hash;
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
327 ngx_http_server_name_t *sn;
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
328 ngx_http_core_srv_conf_t *cscf;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
329
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
330 if (conf->keys == NULL) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
331 conf->hash = prev->hash;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
332
1800
3e1c695258d3 fix building --without-pcre
Igor Sysoev <igor@sysoev.ru>
parents: 1785
diff changeset
333 #if (NGX_PCRE)
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
334 ngx_conf_merge_ptr_value(conf->regex, prev->regex, NULL);
5350
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
335 ngx_conf_merge_ptr_value(conf->server_name_regex,
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
336 prev->server_name_regex, NULL);
1800
3e1c695258d3 fix building --without-pcre
Igor Sysoev <igor@sysoev.ru>
parents: 1785
diff changeset
337 #endif
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 ngx_conf_merge_value(conf->no_referer, prev->no_referer, 0);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339 ngx_conf_merge_value(conf->blocked_referer, prev->blocked_referer, 0);
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
340 ngx_conf_merge_uint_value(conf->referer_hash_max_size,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
341 prev->referer_hash_max_size, 2048);
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
342 ngx_conf_merge_uint_value(conf->referer_hash_bucket_size,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
343 prev->referer_hash_bucket_size, 64);
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
344
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
345 return NGX_CONF_OK;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
346 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
347
5351
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
348 if (conf->server_names == 1) {
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
349 cscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_core_module);
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
350
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
351 sn = cscf->server_names.elts;
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
352 for (n = 0; n < cscf->server_names.nelts; n++) {
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
353
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
354 #if (NGX_PCRE)
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
355 if (sn[n].regex) {
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
356
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
357 if (ngx_http_add_regex_server_name(cf, conf, sn[n].regex)
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
358 != NGX_OK)
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
359 {
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
360 return NGX_CONF_ERROR;
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
361 }
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
362
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
363 continue;
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
364 }
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
365 #endif
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
366
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
367 if (ngx_http_add_referer(cf, conf->keys, &sn[n].name, NULL)
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
368 != NGX_OK)
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
369 {
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
370 return NGX_CONF_ERROR;
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
371 }
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
372 }
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
373 }
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
374
603
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
375 if ((conf->no_referer == 1 || conf->blocked_referer == 1)
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
376 && conf->keys->keys.nelts == 0
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
377 && conf->keys->dns_wc_head.nelts == 0
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
378 && conf->keys->dns_wc_tail.nelts == 0)
603
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
379 {
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
380 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
381 "the \"none\" or \"blocked\" referers are specified "
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
382 "in the \"valid_referers\" directive "
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
383 "without any valid referer");
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
384 return NGX_CONF_ERROR;
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
385 }
858700ae46b4 nginx-0.3.23-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 601
diff changeset
386
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
387 ngx_conf_merge_uint_value(conf->referer_hash_max_size,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
388 prev->referer_hash_max_size, 2048);
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
389 ngx_conf_merge_uint_value(conf->referer_hash_bucket_size,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
390 prev->referer_hash_bucket_size, 64);
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
391 conf->referer_hash_bucket_size = ngx_align(conf->referer_hash_bucket_size,
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
392 ngx_cacheline_size);
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
393
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
394 hash.key = ngx_hash_key_lc;
3939
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
395 hash.max_size = conf->referer_hash_max_size;
3cbbe86a7a95 referer_hash_max_size and referer_hash_bucket_size directives
Igor Sysoev <igor@sysoev.ru>
parents: 3516
diff changeset
396 hash.bucket_size = conf->referer_hash_bucket_size;
4008
debb2f235aa3 Fix names of the referer hash size directives introduced in r3940.
Igor Sysoev <igor@sysoev.ru>
parents: 3939
diff changeset
397 hash.name = "referer_hash";
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
398 hash.pool = cf->pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
399
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
400 if (conf->keys->keys.nelts) {
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
401 hash.hash = &conf->hash.hash;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
402 hash.temp_pool = NULL;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
403
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
404 if (ngx_hash_init(&hash, conf->keys->keys.elts, conf->keys->keys.nelts)
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
405 != NGX_OK)
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
406 {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
407 return NGX_CONF_ERROR;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
408 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
409 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
410
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
411 if (conf->keys->dns_wc_head.nelts) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
412
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
413 ngx_qsort(conf->keys->dns_wc_head.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
414 (size_t) conf->keys->dns_wc_head.nelts,
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
415 sizeof(ngx_hash_key_t),
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
416 ngx_http_cmp_referer_wildcards);
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
417
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
418 hash.hash = NULL;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
419 hash.temp_pool = cf->temp_pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
420
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
421 if (ngx_hash_wildcard_init(&hash, conf->keys->dns_wc_head.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
422 conf->keys->dns_wc_head.nelts)
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
423 != NGX_OK)
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
424 {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
425 return NGX_CONF_ERROR;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
426 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
427
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
428 conf->hash.wc_head = (ngx_hash_wildcard_t *) hash.hash;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
429 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
430
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
431 if (conf->keys->dns_wc_tail.nelts) {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
432
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
433 ngx_qsort(conf->keys->dns_wc_tail.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
434 (size_t) conf->keys->dns_wc_tail.nelts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
435 sizeof(ngx_hash_key_t),
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
436 ngx_http_cmp_referer_wildcards);
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
437
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
438 hash.hash = NULL;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
439 hash.temp_pool = cf->temp_pool;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
440
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
441 if (ngx_hash_wildcard_init(&hash, conf->keys->dns_wc_tail.elts,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
442 conf->keys->dns_wc_tail.nelts)
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
443 != NGX_OK)
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
444 {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
445 return NGX_CONF_ERROR;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
446 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
447
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
448 conf->hash.wc_tail = (ngx_hash_wildcard_t *) hash.hash;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450
1800
3e1c695258d3 fix building --without-pcre
Igor Sysoev <igor@sysoev.ru>
parents: 1785
diff changeset
451 #if (NGX_PCRE)
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
452 ngx_conf_merge_ptr_value(conf->regex, prev->regex, NULL);
5350
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
453 ngx_conf_merge_ptr_value(conf->server_name_regex, prev->server_name_regex,
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
454 NULL);
1800
3e1c695258d3 fix building --without-pcre
Igor Sysoev <igor@sysoev.ru>
parents: 1785
diff changeset
455 #endif
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
456
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
457 if (conf->no_referer == NGX_CONF_UNSET) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
458 conf->no_referer = 0;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
460
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
461 if (conf->blocked_referer == NGX_CONF_UNSET) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
462 conf->blocked_referer = 0;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464
611
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 603
diff changeset
465 conf->keys = NULL;
3f8a2132b93d nginx-0.3.27-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 603
diff changeset
466
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467 return NGX_CONF_OK;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
468 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
471 static char *
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
472 ngx_http_valid_referers(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473 {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
474 ngx_http_referer_conf_t *rlcf = conf;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475
7079
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
476 u_char *p;
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
477 ngx_str_t *value, uri;
7564a919d333 Referer: fixed $invalid_referer.
Ruslan Ermilov <ru@nginx.com>
parents: 6474
diff changeset
478 ngx_uint_t i;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
480 if (rlcf->keys == NULL) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
481 rlcf->keys = ngx_pcalloc(cf->temp_pool, sizeof(ngx_hash_keys_arrays_t));
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
482 if (rlcf->keys == NULL) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
483 return NGX_CONF_ERROR;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
484 }
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
486 rlcf->keys->pool = cf->pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
487 rlcf->keys->temp_pool = cf->pool;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
488
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
489 if (ngx_hash_keys_array_init(rlcf->keys, NGX_HASH_SMALL) != NGX_OK) {
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490 return NGX_CONF_ERROR;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494 value = cf->args->elts;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496 for (i = 1; i < cf->args->nelts; i++) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497 if (value[i].len == 0) {
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499 "invalid referer \"%V\"", &value[i]);
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
500 return NGX_CONF_ERROR;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 if (ngx_strcmp(value[i].data, "none") == 0) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
504 rlcf->no_referer = 1;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
505 continue;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
506 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
507
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
508 if (ngx_strcmp(value[i].data, "blocked") == 0) {
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
509 rlcf->blocked_referer = 1;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
510 continue;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
511 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
513 if (ngx_strcmp(value[i].data, "server_names") == 0) {
5351
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
514 rlcf->server_names = 1;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515 continue;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
517
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
518 if (value[i].data[0] == '~') {
5350
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
519 if (ngx_http_add_regex_referer(cf, rlcf, &value[i]) != NGX_OK) {
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
520 return NGX_CONF_ERROR;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
521 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
522
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
523 continue;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
524 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
525
5351
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
526 ngx_str_null(&uri);
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
527
1242
ae555e0549ca strstr() -> strchr()
Igor Sysoev <igor@sysoev.ru>
parents: 1107
diff changeset
528 p = (u_char *) ngx_strchr(value[i].data, '/');
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
530 if (p) {
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
531 uri.len = (value[i].data + value[i].len) - p;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
532 uri.data = p;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
533 value[i].len = p - value[i].data;
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
534 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
535
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
536 if (ngx_http_add_referer(cf, rlcf->keys, &value[i], &uri) != NGX_OK) {
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
537 return NGX_CONF_ERROR;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
538 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
539 }
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
540
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
541 return NGX_CONF_OK;
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
542 }
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
543
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
544
5349
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
545 static ngx_int_t
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
546 ngx_http_add_referer(ngx_conf_t *cf, ngx_hash_keys_arrays_t *keys,
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
547 ngx_str_t *value, ngx_str_t *uri)
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
548 {
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
549 ngx_int_t rc;
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
550 ngx_str_t *u;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
551
5351
a2c772963b04 Referer: "server_names" parsing deferred to merge phase.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5350
diff changeset
552 if (uri == NULL || uri->len == 0) {
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
553 u = NGX_HTTP_REFERER_NO_URI_PART;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
554
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
555 } else {
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
556 u = ngx_palloc(cf->pool, sizeof(ngx_str_t));
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
557 if (u == NULL) {
5349
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
558 return NGX_ERROR;
595
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
559 }
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
560
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
561 *u = *uri;
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
562 }
ebc68d8ca496 nginx-0.3.19-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 593
diff changeset
563
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
564 rc = ngx_hash_add_key(keys, value, u, NGX_HASH_WILDCARD_KEY);
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
565
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
566 if (rc == NGX_OK) {
5349
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
567 return NGX_OK;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
568 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
569
1253
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
570 if (rc == NGX_DECLINED) {
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
571 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
572 "invalid hostname or wildcard \"%V\"", value);
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
573 }
8ef04207c84f the "www.example.*" wildcard hash support
Igor Sysoev <igor@sysoev.ru>
parents: 1242
diff changeset
574
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
575 if (rc == NGX_BUSY) {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
576 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
577 "conflicting parameter \"%V\"", value);
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
578 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
579
5349
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
580 return NGX_ERROR;
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
581 }
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
582
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
583
5349
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
584 static ngx_int_t
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
585 ngx_http_add_regex_referer(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf,
5350
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
586 ngx_str_t *name)
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
587 {
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
588 #if (NGX_PCRE)
3325
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
589 ngx_regex_elt_t *re;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
590 ngx_regex_compile_t rc;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
591 u_char errstr[NGX_MAX_CONF_ERRSTR];
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
592
3122
3e994ac670dc test space between "~" and regex in server_name and invalid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
593 if (name->len == 1) {
3e994ac670dc test space between "~" and regex in server_name and invalid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
594 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty regex in \"%V\"", name);
5349
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
595 return NGX_ERROR;
3122
3e994ac670dc test space between "~" and regex in server_name and invalid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
596 }
3e994ac670dc test space between "~" and regex in server_name and invalid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 3116
diff changeset
597
1782
db07cb9d1cbc regex valid_referers were not inherited
Igor Sysoev <igor@sysoev.ru>
parents: 1704
diff changeset
598 if (rlcf->regex == NGX_CONF_UNSET_PTR) {
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
599 rlcf->regex = ngx_array_create(cf->pool, 2, sizeof(ngx_regex_elt_t));
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
600 if (rlcf->regex == NULL) {
5349
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
601 return NGX_ERROR;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
602 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
603 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
604
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
605 re = ngx_array_push(rlcf->regex);
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
606 if (re == NULL) {
5349
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
607 return NGX_ERROR;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
608 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
609
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
610 name->len--;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
611 name->data++;
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
612
3325
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
613 ngx_memzero(&rc, sizeof(ngx_regex_compile_t));
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
614
3325
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
615 rc.pattern = *name;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
616 rc.pool = cf->pool;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
617 rc.options = NGX_REGEX_CASELESS;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
618 rc.err.len = NGX_MAX_CONF_ERRSTR;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
619 rc.err.data = errstr;
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
620
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
621 if (ngx_regex_compile(&rc) != NGX_OK) {
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
622 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);
5349
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
623 return NGX_ERROR;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
624 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
625
3325
42c16d8bddbe regex named captures
Igor Sysoev <igor@sysoev.ru>
parents: 3122
diff changeset
626 re->regex = rc.regex;
1785
0673b54f34f7 use ngx_regex_exec_array()
Igor Sysoev <igor@sysoev.ru>
parents: 1782
diff changeset
627 re->name = name->data;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
628
5349
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
629 return NGX_OK;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
630
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
631 #else
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
632
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
633 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
634 "the using of the regex \"%V\" requires PCRE library",
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
635 name);
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
636
5349
9b8a634e348a Referer: fixed error type usage inconsistency for ngx_http_add*().
Sergey Kandaurov <pluknet@nginx.com>
parents: 5321
diff changeset
637 return NGX_ERROR;
1388
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
638
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
639 #endif
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
640 }
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
641
92bc89c5ff0f regex in valid_referers
Igor Sysoev <igor@sysoev.ru>
parents: 1253
diff changeset
642
5350
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
643 #if (NGX_PCRE)
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
644
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
645 static ngx_int_t
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
646 ngx_http_add_regex_server_name(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf,
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
647 ngx_http_regex_t *regex)
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
648 {
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
649 ngx_regex_elt_t *re;
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
650
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
651 if (rlcf->server_name_regex == NGX_CONF_UNSET_PTR) {
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
652 rlcf->server_name_regex = ngx_array_create(cf->pool, 2,
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
653 sizeof(ngx_regex_elt_t));
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
654 if (rlcf->server_name_regex == NULL) {
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
655 return NGX_ERROR;
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
656 }
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
657 }
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
658
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
659 re = ngx_array_push(rlcf->server_name_regex);
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
660 if (re == NULL) {
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
661 return NGX_ERROR;
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
662 }
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
663
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
664 re->regex = regex->regex;
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
665 re->name = regex->name.data;
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
666
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
667 return NGX_OK;
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
668 }
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
669
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
670 #endif
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
671
8220e393c241 Referer: fixed server_name regex matching.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5349
diff changeset
672
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
673 static int ngx_libc_cdecl
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
674 ngx_http_cmp_referer_wildcards(const void *one, const void *two)
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
675 {
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
676 ngx_hash_key_t *first, *second;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
677
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
678 first = (ngx_hash_key_t *) one;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
679 second = (ngx_hash_key_t *) two;
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
680
3116
98e288c6dac3 If .domain.com, .sub.domain.com, and .domain-some.com were defined,
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
681 return ngx_dns_strcmp(first->key.data, second->key.data);
593
425af804d968 nginx-0.3.18-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
682 }