comparison src/http/modules/ngx_http_referer_module.c @ 665:0b460e61bdcd default tip

Merge with nginx 1.0.0.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 25 Apr 2011 04:22:17 +0400
parents 8246d8a2c2be
children
comparison
equal deleted inserted replaced
572:06419a2298a9 665:0b460e61bdcd
122 } 122 }
123 123
124 len = r->headers_in.referer->value.len; 124 len = r->headers_in.referer->value.len;
125 ref = r->headers_in.referer->value.data; 125 ref = r->headers_in.referer->value.data;
126 126
127 if (len < sizeof("http://i.ru") - 1 127 if (len >= sizeof("http://i.ru") - 1) {
128 || (ngx_strncasecmp(ref, (u_char *) "http://", 7) != 0)) 128 last = ref + len;
129 { 129
130 if (rlcf->blocked_referer) { 130 if (ngx_strncasecmp(ref, (u_char *) "http://", 7) == 0) {
131 goto valid; 131 ref += 7;
132 } 132 goto valid_scheme;
133 133
134 goto invalid; 134 } else if (ngx_strncasecmp(ref, (u_char *) "https://", 8) == 0) {
135 } 135 ref += 8;
136 136 goto valid_scheme;
137 last = ref + len; 137 }
138 ref += 7; 138 }
139
140 if (rlcf->blocked_referer) {
141 goto valid;
142 }
143
144 goto invalid;
145
146 valid_scheme:
147
139 i = 0; 148 i = 0;
140 key = 0; 149 key = 0;
141 150
142 for (p = ref; p < last; p++) { 151 for (p = ref; p < last; p++) {
143 if (*p == '/' || *p == ':') { 152 if (*p == '/' || *p == ':') {
352 ngx_uint_t i, n; 361 ngx_uint_t i, n;
353 ngx_http_variable_t *var; 362 ngx_http_variable_t *var;
354 ngx_http_server_name_t *sn; 363 ngx_http_server_name_t *sn;
355 ngx_http_core_srv_conf_t *cscf; 364 ngx_http_core_srv_conf_t *cscf;
356 365
357 name.len = sizeof("invalid_referer") - 1; 366 ngx_str_set(&name, "invalid_referer");
358 name.data = (u_char *) "invalid_referer";
359 367
360 var = ngx_http_add_variable(cf, &name, 368 var = ngx_http_add_variable(cf, &name,
361 NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOHASH); 369 NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOHASH);
362 if (var == NULL) { 370 if (var == NULL) {
363 return NGX_CONF_ERROR; 371 return NGX_CONF_ERROR;
396 if (ngx_strcmp(value[i].data, "blocked") == 0) { 404 if (ngx_strcmp(value[i].data, "blocked") == 0) {
397 rlcf->blocked_referer = 1; 405 rlcf->blocked_referer = 1;
398 continue; 406 continue;
399 } 407 }
400 408
401 uri.len = 0; 409 ngx_str_null(&uri);
402 uri.data = NULL;
403 410
404 if (ngx_strcmp(value[i].data, "server_names") == 0) { 411 if (ngx_strcmp(value[i].data, "server_names") == 0) {
405 412
406 cscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_core_module); 413 cscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_core_module);
407 414
410 417
411 #if (NGX_PCRE) 418 #if (NGX_PCRE)
412 if (sn[n].regex) { 419 if (sn[n].regex) {
413 420
414 if (ngx_http_add_regex_referer(cf, rlcf, &sn[n].name, 421 if (ngx_http_add_regex_referer(cf, rlcf, &sn[n].name,
415 sn[n].regex) 422 sn[n].regex->regex)
416 != NGX_OK) 423 != NGX_OK)
417 { 424 {
418 return NGX_CONF_ERROR; 425 return NGX_CONF_ERROR;
419 } 426 }
420 427
500 static char * 507 static char *
501 ngx_http_add_regex_referer(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf, 508 ngx_http_add_regex_referer(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf,
502 ngx_str_t *name, ngx_regex_t *regex) 509 ngx_str_t *name, ngx_regex_t *regex)
503 { 510 {
504 #if (NGX_PCRE) 511 #if (NGX_PCRE)
505 ngx_str_t err; 512 ngx_regex_elt_t *re;
506 ngx_regex_elt_t *re; 513 ngx_regex_compile_t rc;
507 u_char errstr[NGX_MAX_CONF_ERRSTR]; 514 u_char errstr[NGX_MAX_CONF_ERRSTR];
508 515
509 if (name->len == 1) { 516 if (name->len == 1) {
510 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty regex in \"%V\"", name); 517 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty regex in \"%V\"", name);
511 return NGX_CONF_ERROR; 518 return NGX_CONF_ERROR;
512 } 519 }
528 re->name = name->data; 535 re->name = name->data;
529 536
530 return NGX_CONF_OK; 537 return NGX_CONF_OK;
531 } 538 }
532 539
533 err.len = NGX_MAX_CONF_ERRSTR;
534 err.data = errstr;
535
536 name->len--; 540 name->len--;
537 name->data++; 541 name->data++;
538 542
539 re->regex = ngx_regex_compile(name, NGX_REGEX_CASELESS, cf->pool, &err); 543 ngx_memzero(&rc, sizeof(ngx_regex_compile_t));
540 544
541 if (re->regex == NULL) { 545 rc.pattern = *name;
542 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%s", err.data); 546 rc.pool = cf->pool;
547 rc.options = NGX_REGEX_CASELESS;
548 rc.err.len = NGX_MAX_CONF_ERRSTR;
549 rc.err.data = errstr;
550
551 if (ngx_regex_compile(&rc) != NGX_OK) {
552 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);
543 return NGX_CONF_ERROR; 553 return NGX_CONF_ERROR;
544 } 554 }
545 555
556 re->regex = rc.regex;
546 re->name = name->data; 557 re->name = name->data;
547 558
548 return NGX_CONF_OK; 559 return NGX_CONF_OK;
549 560
550 #else 561 #else