diff -Nru nginx-1.17.9/CHANGES nginx-1.17.10/CHANGES --- nginx-1.17.9/CHANGES 2020-03-03 15:04:25.000000000 +0000 +++ nginx-1.17.10/CHANGES 2020-04-14 14:19:29.000000000 +0000 @@ -1,4 +1,9 @@ +Changes with nginx 1.17.10 14 Apr 2020 + + *) Feature: the "auth_delay" directive. + + Changes with nginx 1.17.9 03 Mar 2020 *) Change: now nginx does not allow several "Host" request header lines. diff -Nru nginx-1.17.9/CHANGES.ru nginx-1.17.10/CHANGES.ru --- nginx-1.17.9/CHANGES.ru 2020-03-03 15:04:24.000000000 +0000 +++ nginx-1.17.10/CHANGES.ru 2020-04-14 14:19:28.000000000 +0000 @@ -1,4 +1,9 @@ +Изменения в nginx 1.17.10 14.04.2020 + + *) Добавление: директива auth_delay. + + Изменения в nginx 1.17.9 03.03.2020 *) Изменение: теперь nginx не разрешает несколько строк "Host" в diff -Nru nginx-1.17.9/debian/changelog nginx-1.17.10/debian/changelog --- nginx-1.17.9/debian/changelog 2020-03-26 14:53:52.000000000 +0000 +++ nginx-1.17.10/debian/changelog 2020-04-14 16:53:34.000000000 +0000 @@ -1,3 +1,32 @@ +nginx (1.17.10-0ubuntu1) focal; urgency=medium + + * New upstream release (1.17.9) - full changelog available from + http://nginx.org/en/CHANGES + * Remaining Ubuntu-specific changes: + - debian/patches/ubuntu-branding.patch: add Ubuntu branding (refreshed) + - d/{control,rules,nginx-core.*}: add new binary package for main, + nginx-core, which contains only source-tarball-included modules + and no third-party modules. + - debian/tests/control: add nginx-core test. + - debian/apport/source_nginx.py: Add apport hooks for additional bug + information gathering. + - debian/nginx-common.install: Add install rule for apport hooks. + - d/nginx-{core,light,full,extras}.postinst: Add checks for whether + port 80 is in use or not to determine whether or not to attempt + starting of the NGINX service during install/upgrade + - d/control: Add dependencies to nginx-{core,light,full,extras} on + `iproute2` as the postinst scripts now use `ss` to determine if + Port 80 is open or not. + - d/rules: Enable --with-compat build option for all nginx package + flavors + - d/{control,rules,copyright,modules/http-geoip2*}: Add GeoIP2 third party + module to nginx-full and nginx-extras (and use proper DEP5 syntax for + d/copyright). + - d/control, d/rules: Drop GeoIP from nginx-core due to demotion of + libgeoip. + + -- Thomas Ward Tue, 14 Apr 2020 12:53:34 -0400 + nginx (1.17.9-0ubuntu3) focal; urgency=medium * d/conf/sites-available/default: Update PHP path for PHP 7.4. diff -Nru nginx-1.17.9/debian/patches/ubuntu-branding.patch nginx-1.17.10/debian/patches/ubuntu-branding.patch --- nginx-1.17.9/debian/patches/ubuntu-branding.patch 2020-03-03 16:06:56.000000000 +0000 +++ nginx-1.17.10/debian/patches/ubuntu-branding.patch 2020-04-14 16:53:34.000000000 +0000 @@ -1,7 +1,7 @@ Description: Add Ubuntu token to NGINX_VER Author: Adam Conrad Forwarded: not-needed -Last-Update: 2020-03-03 +Last-Update: 2020-04-14 --- src/core/nginx.h | 2 +- @@ -11,8 +11,8 @@ +++ b/src/core/nginx.h @@ -11,7 +11,7 @@ - #define nginx_version 1017009 - #define NGINX_VERSION "1.17.9" + #define nginx_version 1017010 + #define NGINX_VERSION "1.17.10" -#define NGINX_VER "nginx/" NGINX_VERSION +#define NGINX_VER "nginx/" NGINX_VERSION " (Ubuntu)" diff -Nru nginx-1.17.9/src/core/nginx.h nginx-1.17.10/src/core/nginx.h --- nginx-1.17.9/src/core/nginx.h 2020-03-03 15:04:21.000000000 +0000 +++ nginx-1.17.10/src/core/nginx.h 2020-04-14 14:19:26.000000000 +0000 @@ -9,8 +9,8 @@ #define _NGINX_H_INCLUDED_ -#define nginx_version 1017009 -#define NGINX_VERSION "1.17.9" +#define nginx_version 1017010 +#define NGINX_VERSION "1.17.10" #define NGINX_VER "nginx/" NGINX_VERSION #ifdef NGX_BUILD diff -Nru nginx-1.17.9/src/http/modules/ngx_http_auth_basic_module.c nginx-1.17.10/src/http/modules/ngx_http_auth_basic_module.c --- nginx-1.17.9/src/http/modules/ngx_http_auth_basic_module.c 2020-03-03 15:04:21.000000000 +0000 +++ nginx-1.17.10/src/http/modules/ngx_http_auth_basic_module.c 2020-04-14 14:19:26.000000000 +0000 @@ -25,7 +25,6 @@ ngx_str_t *passwd, ngx_str_t *realm); static ngx_int_t ngx_http_auth_basic_set_realm(ngx_http_request_t *r, ngx_str_t *realm); -static void ngx_http_auth_basic_close(ngx_file_t *file); static void *ngx_http_auth_basic_create_loc_conf(ngx_conf_t *cf); static char *ngx_http_auth_basic_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child); @@ -177,8 +176,8 @@ offset); if (n == NGX_ERROR) { - ngx_http_auth_basic_close(&file); - return NGX_HTTP_INTERNAL_SERVER_ERROR; + rc = NGX_HTTP_INTERNAL_SERVER_ERROR; + goto cleanup; } if (n == 0) { @@ -219,12 +218,11 @@ if (buf[i] == LF || buf[i] == CR || buf[i] == ':') { buf[i] = '\0'; - ngx_http_auth_basic_close(&file); - pwd.len = i - passwd; pwd.data = &buf[passwd]; - return ngx_http_auth_basic_crypt_handler(r, &pwd, &realm); + rc = ngx_http_auth_basic_crypt_handler(r, &pwd, &realm); + goto cleanup; } break; @@ -251,8 +249,6 @@ offset += n; } - ngx_http_auth_basic_close(&file); - if (state == sw_passwd) { pwd.len = i - passwd; pwd.data = ngx_pnalloc(r->pool, pwd.len + 1); @@ -262,14 +258,26 @@ ngx_cpystrn(pwd.data, &buf[passwd], pwd.len + 1); - return ngx_http_auth_basic_crypt_handler(r, &pwd, &realm); + rc = ngx_http_auth_basic_crypt_handler(r, &pwd, &realm); + goto cleanup; } ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "user \"%V\" was not found in \"%s\"", &r->headers_in.user, user_file.data); - return ngx_http_auth_basic_set_realm(r, &realm); + rc = ngx_http_auth_basic_set_realm(r, &realm); + +cleanup: + + if (ngx_close_file(file.fd) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, + ngx_close_file_n " \"%s\" failed", user_file.data); + } + + ngx_explicit_memzero(buf, NGX_HTTP_AUTH_BUF_SIZE); + + return rc; } @@ -338,15 +346,6 @@ return NGX_HTTP_UNAUTHORIZED; } -static void -ngx_http_auth_basic_close(ngx_file_t *file) -{ - if (ngx_close_file(file->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, file->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", file->name.data); - } -} - static void * ngx_http_auth_basic_create_loc_conf(ngx_conf_t *cf) diff -Nru nginx-1.17.9/src/http/ngx_http_core_module.c nginx-1.17.10/src/http/ngx_http_core_module.c --- nginx-1.17.9/src/http/ngx_http_core_module.c 2020-03-03 15:04:21.000000000 +0000 +++ nginx-1.17.10/src/http/ngx_http_core_module.c 2020-04-14 14:19:26.000000000 +0000 @@ -21,6 +21,9 @@ #define NGX_HTTP_REQUEST_BODY_FILE_CLEAN 2 +static ngx_int_t ngx_http_core_auth_delay(ngx_http_request_t *r); +static void ngx_http_core_auth_delay_handler(ngx_http_request_t *r); + static ngx_int_t ngx_http_core_find_location(ngx_http_request_t *r); static ngx_int_t ngx_http_core_find_static_location(ngx_http_request_t *r, ngx_http_location_tree_node_t *node); @@ -520,6 +523,13 @@ offsetof(ngx_http_core_loc_conf_t, satisfy), &ngx_http_core_satisfy }, + { ngx_string("auth_delay"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_HTTP_LOC_CONF_OFFSET, + offsetof(ngx_http_core_loc_conf_t, auth_delay), + NULL }, + { ngx_string("internal"), NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS, ngx_http_core_internal, @@ -1124,6 +1134,10 @@ /* rc == NGX_ERROR || rc == NGX_HTTP_... */ + if (rc == NGX_HTTP_UNAUTHORIZED) { + return ngx_http_core_auth_delay(r); + } + ngx_http_finalize_request(r, rc); return NGX_OK; } @@ -1141,12 +1155,17 @@ access_code = r->access_code; if (access_code) { + r->access_code = 0; + if (access_code == NGX_HTTP_FORBIDDEN) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "access forbidden by rule"); } - r->access_code = 0; + if (access_code == NGX_HTTP_UNAUTHORIZED) { + return ngx_http_core_auth_delay(r); + } + ngx_http_finalize_request(r, access_code); return NGX_OK; } @@ -1156,6 +1175,65 @@ } +static ngx_int_t +ngx_http_core_auth_delay(ngx_http_request_t *r) +{ + ngx_http_core_loc_conf_t *clcf; + + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + + if (clcf->auth_delay == 0) { + ngx_http_finalize_request(r, NGX_HTTP_UNAUTHORIZED); + return NGX_OK; + } + + ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, + "delaying unauthorized request"); + + if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + r->read_event_handler = ngx_http_test_reading; + r->write_event_handler = ngx_http_core_auth_delay_handler; + + r->connection->write->delayed = 1; + ngx_add_timer(r->connection->write, clcf->auth_delay); + + /* + * trigger an additional event loop iteration + * to ensure constant-time processing + */ + + ngx_post_event(r->connection->write, &ngx_posted_next_events); + + return NGX_OK; +} + + +static void +ngx_http_core_auth_delay_handler(ngx_http_request_t *r) +{ + ngx_event_t *wev; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "auth delay handler"); + + wev = r->connection->write; + + if (wev->delayed) { + + if (ngx_handle_write_event(wev, 0) != NGX_OK) { + ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + } + + return; + } + + ngx_http_finalize_request(r, NGX_HTTP_UNAUTHORIZED); +} + + ngx_int_t ngx_http_core_content_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph) @@ -3394,6 +3472,7 @@ clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE; clcf->client_body_timeout = NGX_CONF_UNSET_MSEC; clcf->satisfy = NGX_CONF_UNSET_UINT; + clcf->auth_delay = NGX_CONF_UNSET_MSEC; clcf->if_modified_since = NGX_CONF_UNSET_UINT; clcf->max_ranges = NGX_CONF_UNSET_UINT; clcf->client_body_in_file_only = NGX_CONF_UNSET_UINT; @@ -3609,6 +3688,7 @@ |NGX_HTTP_KEEPALIVE_DISABLE_MSIE6)); ngx_conf_merge_uint_value(conf->satisfy, prev->satisfy, NGX_HTTP_SATISFY_ALL); + ngx_conf_merge_msec_value(conf->auth_delay, prev->auth_delay, 0); ngx_conf_merge_uint_value(conf->if_modified_since, prev->if_modified_since, NGX_HTTP_IMS_EXACT); ngx_conf_merge_uint_value(conf->max_ranges, prev->max_ranges, diff -Nru nginx-1.17.9/src/http/ngx_http_core_module.h nginx-1.17.10/src/http/ngx_http_core_module.h --- nginx-1.17.9/src/http/ngx_http_core_module.h 2020-03-03 15:04:21.000000000 +0000 +++ nginx-1.17.10/src/http/ngx_http_core_module.h 2020-04-14 14:19:26.000000000 +0000 @@ -363,6 +363,7 @@ ngx_msec_t lingering_time; /* lingering_time */ ngx_msec_t lingering_timeout; /* lingering_timeout */ ngx_msec_t resolver_timeout; /* resolver_timeout */ + ngx_msec_t auth_delay; /* auth_delay */ ngx_resolver_t *resolver; /* resolver */