| #!/usr/bin/perl |
| |
| # (C) Maxim Dounin |
| |
| # Tests for auth request module with satisfy directive. |
| |
| ############################################################################### |
| |
| use warnings; |
| use strict; |
| |
| use Test::More; |
| |
| BEGIN { use FindBin; chdir($FindBin::Bin); } |
| |
| use lib 'lib'; |
| use Test::Nginx; |
| |
| ############################################################################### |
| |
| select STDERR; $| = 1; |
| select STDOUT; $| = 1; |
| |
| my $t = Test::Nginx->new() |
| ->has(qw/http rewrite access auth_basic auth_request/) |
| ->plan(18); |
| |
| $t->write_file_expand('nginx.conf', <<'EOF'); |
| |
| %%TEST_GLOBALS%% |
| |
| daemon off; |
| |
| events { |
| } |
| |
| http { |
| %%TEST_GLOBALS_HTTP%% |
| |
| server { |
| listen 127.0.0.1:8080; |
| server_name localhost; |
| |
| location / { |
| return 444; |
| } |
| |
| location /all/allow { |
| satisfy all; |
| allow all; |
| auth_request /auth; |
| } |
| |
| location /all/deny { |
| satisfy all; |
| deny all; |
| auth_request /auth; |
| } |
| |
| location /all/basic { |
| satisfy all; |
| auth_basic "restricted"; |
| auth_basic_user_file %%TESTDIR%%/htpasswd; |
| auth_request /auth; |
| } |
| |
| location /any/allow { |
| satisfy any; |
| allow all; |
| auth_request /auth; |
| } |
| |
| location /any/deny { |
| satisfy any; |
| deny all; |
| auth_request /auth; |
| } |
| |
| location /any/basic { |
| satisfy any; |
| auth_basic "restricted"; |
| auth_basic_user_file %%TESTDIR%%/htpasswd; |
| auth_request /auth; |
| } |
| |
| location = /auth { |
| if ($request_uri ~ "open$") { |
| return 204; |
| } |
| if ($request_uri ~ "unauthorized$") { |
| return 401; |
| } |
| if ($request_uri ~ "forbidden$") { |
| return 403; |
| } |
| } |
| } |
| } |
| |
| EOF |
| |
| $t->write_file('htpasswd', 'user:{PLAIN}secret' . "\n"); |
| $t->run(); |
| |
| ############################################################################### |
| |
| # satisfy all - first 401/403 wins |
| |
| like(http_get('/all/allow+open'), qr/ 404 /, 'all allow+open'); |
| like(http_get('/all/allow+unauthorized'), qr/ 401 /, 'all allow+unauthorized'); |
| like(http_get('/all/allow+forbidden'), qr/ 403 /, 'all allow+forbidden'); |
| |
| like(http_get('/all/deny+open'), qr/ 403 /, 'all deny+open'); |
| like(http_get('/all/deny+unauthorized'), qr/ 403 /, 'all deny+unauthorized'); |
| like(http_get('/all/deny+forbidden'), qr/ 403 /, 'all deny+forbidden'); |
| |
| like(http_get('/all/basic+open'), qr/ 401 /, 'all basic+open'); |
| like(http_get('/all/basic+unauthorized'), qr/ 401 /, 'all basic+unauthorized'); |
| like(http_get('/all/basic+forbidden'), qr/ 401 /, 'all basic+forbidden'); |
| |
| # satisfy any - first ok wins |
| # additionally, 403 shouldn't override 401 status |
| |
| like(http_get('/any/allow+open'), qr/ 404 /, 'any allow+open'); |
| like(http_get('/any/allow+unauthorized'), qr/ 404 /, 'any allow+unauthorized'); |
| like(http_get('/any/allow+forbidden'), qr/ 404 /, 'any allow+forbidden'); |
| |
| like(http_get('/any/deny+open'), qr/ 404 /, 'any deny+open'); |
| like(http_get('/any/deny+unauthorized'), qr/ 401 /, 'any deny+unauthorized'); |
| like(http_get('/any/deny+forbidden'), qr/ 403 /, 'any deny+forbidden'); |
| |
| like(http_get('/any/basic+open'), qr/ 404 /, 'any basic+open'); |
| like(http_get('/any/basic+unauthorized'), qr/ 401 /, 'any basic+unauthorized'); |
| like(http_get('/any/basic+forbidden'), qr/ 401 /, 'any basic+forbidden'); |
| |
| ############################################################################### |