lemonldap-ng/lemonldap-ng-handler/t/60-Lemonldap-NG-Handler-PSGI.t

324 lines
8.7 KiB
Perl
Raw Permalink Normal View History

2016-02-01 12:11:31 +01:00
use Test::More;
use JSON;
2016-02-01 21:10:28 +01:00
use MIME::Base64;
2019-02-05 11:23:09 +01:00
use Data::Dumper;
use URI::Escape;
2016-02-01 12:11:31 +01:00
2016-02-01 21:10:28 +01:00
require 't/test-psgi-lib.pm';
2016-02-01 12:11:31 +01:00
2016-02-01 13:15:27 +01:00
init('Lemonldap::NG::Handler::PSGI');
2016-02-01 20:05:14 +01:00
my $res;
2019-12-10 16:06:17 +01:00
my $SKIPUSER = 0;
2016-02-01 20:05:14 +01:00
2016-02-01 21:10:28 +01:00
# Unauthentified query
2019-10-29 22:14:34 +01:00
# --------------------
2016-02-01 21:10:28 +01:00
ok( $res = $client->_get('/'), 'Unauthentified query' );
2016-02-01 20:05:14 +01:00
ok( ref($res) eq 'ARRAY', 'Response is an array' ) or explain( $res, 'array' );
2022-02-16 17:43:29 +01:00
ok( $res->[0] == 302, ' Code is 302' ) or explain( $res->[0], 302 );
2016-02-01 20:05:14 +01:00
my %h = @{ $res->[1] };
ok(
$h{Location} eq 'http://auth.example.com/?url='
. uri_escape( encode_base64( 'http://test1.example.com/', '' ) ),
2016-02-01 20:05:14 +01:00
'Redirection points to portal'
)
or explain(
\%h,
'Location => http://auth.example.com/?url='
. uri_escape( encode_base64( 'http://test1.example.com/', '' ) )
2016-02-01 20:05:14 +01:00
);
count(4);
2016-02-01 21:10:28 +01:00
# Authentified queries
# --------------------
2019-08-26 21:57:13 +02:00
# Authorized query
2016-06-09 13:45:10 +02:00
ok( $res = $client->_get( '/', undef, undef, "lemonldap=$sessionId" ),
'Authentified query' );
2020-05-06 10:30:03 +02:00
ok( $res->[0] == 200, ' Code is 200' ) or explain( $res, 200 );
2016-02-01 21:10:28 +01:00
count(2);
2019-11-05 17:16:07 +01:00
# Request an URI protected by custom function -> allowed
2019-12-10 16:06:17 +01:00
ok(
$res =
$client->_get( '/test-uri1/dwho', undef, undef, "lemonldap=$sessionId" ),
'Authentified query'
);
2019-11-05 17:16:07 +01:00
ok( $res->[0] == 200, '/test-uri1 -> Code is 200' ) or explain( $res, 200 );
count(2);
# Request an URI protected by custom function -> allowed
2019-12-10 16:06:17 +01:00
ok(
$res = $client->_get(
'/test-uri2/dwho/dummy', undef, undef, "lemonldap=$sessionId"
),
'Authentified query'
);
2019-11-05 17:16:07 +01:00
ok( $res->[0] == 200, '/test-uri2 -> Code is 200' ) or explain( $res, 200 );
count(2);
# Request an URI protected by custom function -> denied
2019-12-10 16:06:17 +01:00
ok(
$res =
$client->_get( '/test-uri1/dwho/', undef, undef, "lemonldap=$sessionId" ),
'Denied query'
);
ok( $res->[0] == 403, '/test-uri1 -> Code is 403' )
or explain( $res->[0], 403 );
2019-11-05 17:16:07 +01:00
count(2);
# Request an URI protected by custom function -> denied
2019-12-10 16:06:17 +01:00
ok(
$res =
$client->_get( '/test-uri1/dwh', undef, undef, "lemonldap=$sessionId" ),
'Denied query'
);
ok( $res->[0] == 403, '/test-uri1 -> Code is 403' )
or explain( $res->[0], 403 );
2019-11-05 17:16:07 +01:00
count(2);
2016-02-01 21:10:28 +01:00
# Denied query
2016-06-09 13:45:10 +02:00
ok( $res = $client->_get( '/deny', undef, undef, "lemonldap=$sessionId" ),
'Denied query' );
2020-05-06 10:30:03 +02:00
ok( $res->[0] == 403, ' Code is 403' ) or explain( $res->[0], 403 );
2019-10-29 22:14:34 +01:00
count(2);
2016-02-01 21:10:28 +01:00
# Required "timelords" group
ok(
$res =
$client->_get( '/fortimelords', undef, undef, "lemonldap=$sessionId" ),
'Require Timelords group'
);
2020-05-06 10:30:03 +02:00
ok( $res->[0] == 200, ' Code is 200' ) or explain( $res, 200 );
count(2);
# Required "dalek" group
ok(
$res = $client->_get( '/fordaleks', undef, undef, "lemonldap=$sessionId" ),
'Require Dalek group'
);
2020-05-06 10:30:03 +02:00
ok( $res->[0] == 403, ' Code is 403' ) or explain( $res, 403 );
count(2);
2019-10-29 22:14:34 +01:00
# Required AuthnLevel = 1
ok( $res = $client->_get( '/AuthWeak', undef, undef, "lemonldap=$sessionId" ),
2019-10-29 22:35:21 +01:00
'Weak Authentified query' );
2020-05-06 10:30:03 +02:00
ok( $res->[0] == 200, ' Code is 200' ) or explain( $res, 200 );
2016-02-01 21:10:28 +01:00
count(2);
2019-10-29 22:14:34 +01:00
# Required AuthnLevel = 5
ok(
$res = $client->_get( '/AuthStrong', undef, undef, "lemonldap=$sessionId" ),
2019-10-29 22:35:21 +01:00
'Strong Authentified query'
2019-10-29 22:14:34 +01:00
);
2020-05-06 10:30:03 +02:00
ok( $res->[0] == 302, ' Code is 302' ) or explain( $res, 302 );
2019-10-29 22:14:34 +01:00
%h = @{ $res->[1] };
ok(
$h{Location} eq 'http://auth.example.com//upgradesession?url='
. uri_escape(
encode_base64( 'http://test1.example.com/AuthStrong', '' ) ),
2019-10-29 22:14:34 +01:00
'Redirection points to http://test1.example.com/AuthStrong'
)
or explain(
\%h,
'http://auth.example.com//upgradesession?url='
. uri_escape( encode_base64( 'http://test1.example.com/AuthStrong', '' ) )
2019-10-29 22:14:34 +01:00
);
count(3);
# Bad cookie name
ok( $res = $client->_get( '/', undef, undef, "fakelemonldap=$sessionId" ),
'Bad cookie name' );
ok( $res->[0] == 302, ' Code is 302 (name)' ) or explain( $res, 302 );
count(2);
# Bad cookie name
ok( $res = $client->_get( '/', undef, undef, "fake-lemonldap=$sessionId" ),
'Bad cookie name (-)' );
ok( $res->[0] == 302, ' Code is 302 (-)' ) or explain( $res, 302 );
count(2);
# Bad cookie name
ok( $res = $client->_get( '/', undef, undef, "fake.lemonldap=$sessionId" ),
'Bad cookie name (.)' );
ok( $res->[0] == 302, ' Code is 302 (.)' ) or explain( $res, 302 );
count(2);
# Bad cookie name
ok( $res = $client->_get( '/', undef, undef, "fake_lemonldap=$sessionId" ),
'Bad cookie name (_)' );
ok( $res->[0] == 302, ' Code is 302 (_)' ) or explain( $res, 302 );
count(2);
# Bad cookie name
ok( $res = $client->_get( '/', undef, undef, "fake~lemonldap=$sessionId" ),
'Bad cookie name (~)' );
ok( $res->[0] == 302, ' Code is 302 (~)' ) or explain( $res, 302 );
count(2);
2016-02-01 21:10:28 +01:00
# Bad cookie
ok(
$res = $client->_get(
'/deny',
undef,
'manager.example.com',
'lemonldap=e5eec18ebb9bc96352595e2d8ce962e8ecf7af7c9a98cb9a43f9cd181cf4b545'
),
'Bad cookie'
);
2020-05-06 10:30:03 +02:00
ok( $res->[0] == 302, ' Code is 302' ) or explain( $res->[0], 302 );
2016-02-17 11:12:19 +01:00
unlink(
't/sessions/lock/Apache-Session-e5eec18ebb9bc96352595e2d8ce962e8ecf7af7c9a98cb9a43f9cd181cf4b545.lock'
);
2019-10-29 22:14:34 +01:00
count(2);
2016-02-01 21:10:28 +01:00
2019-10-29 22:14:34 +01:00
# Required AuthnLevel = 1
ok(
$res = $client->_get(
'/AuthWeak', undef, 'test2.example.com', "lemonldap=$sessionId"
),
2019-10-29 22:35:21 +01:00
'Weak Authentified query'
2019-10-29 22:14:34 +01:00
);
2020-05-06 10:30:03 +02:00
ok( $res->[0] == 200, ' Code is 200' ) or explain( $res, 200 );
2016-02-01 21:10:28 +01:00
count(2);
2019-10-29 22:14:34 +01:00
# Required AuthnLevel = 5
ok(
$res =
$client->_get( '/', undef, 'test2.example.com', "lemonldap=$sessionId" ),
2019-10-29 22:35:21 +01:00
'Default Authentified query'
2019-10-29 22:14:34 +01:00
);
2020-05-06 10:30:03 +02:00
ok( $res->[0] == 302, ' Code is 302' ) or explain( $res, 302 );
2019-10-29 22:14:34 +01:00
%h = @{ $res->[1] };
ok(
$h{Location} eq 'http://auth.example.com//upgradesession?url='
. uri_escape( encode_base64( 'http://test2.example.com/', '' ) ),
2019-10-29 22:14:34 +01:00
'Redirection points to http://test2.example.com/'
)
or explain(
\%h,
'http://auth.example.com//upgradesession?url='
. uri_escape( encode_base64( 'http://test2.example.com/', '' ) )
2019-10-29 22:14:34 +01:00
);
count(3);
2019-12-10 16:06:17 +01:00
ok( $res = $client->_get( '/skipif/za', undef, 'test1.example.com' ),
'Test skip() rule 1' );
2020-05-06 10:30:03 +02:00
ok( $res->[0] == 302, ' Code is 302' ) or explain( $res, 302 );
count(2);
2019-12-10 16:06:17 +01:00
2020-05-06 10:30:03 +02:00
# Wildcards
2020-05-06 13:05:27 +02:00
ok(
$res =
$client->_get( '/', undef, 'foo.example.org', "lemonldap=$sessionId" ),
'Accept "*.example.org"'
);
2020-05-06 10:30:03 +02:00
ok( $res->[0] == 200, ' Code is 200' ) or explain( $res, 200 );
count(2);
# SKIP TESTS
$SKIPUSER = 1;
ok( $res = $client->_get( '/skipif/zz', undef, 'test1.example.com' ),
'Test skip() rule 2' );
ok( $res->[0] == 200, ' Code is 200' ) or explain( $res, 200 );
count(2);
# Forged headers
2022-02-16 17:43:29 +01:00
ok(
$res = $client->_get(
'/skipif/zz', undef, 'test1.example.com', undef,
HTTP_AUTH_USER => 'rtyler'
),
'Test skip() with forged header'
);
ok( $res->[0] == 200, ' Code is 200' ) or explain( $res, 200 );
count(2);
2020-05-06 13:05:27 +02:00
ok(
$res =
$client->_get( '/', undef, 'foo.example.fr', "lemonldap=$sessionId" ),
'Reject "foo.example.fr"'
);
2021-06-19 19:21:31 +02:00
ok( $res->[0] == 403, ' Code is 403' ) or explain( $res, 403 );
2020-05-06 10:30:03 +02:00
count(2);
2020-05-06 13:05:27 +02:00
ok(
$res = $client->_get(
'/orgdeny', undef, 'foo.example.org', "lemonldap=$sessionId"
),
'Reject "foo.example.org/orgdeny"'
);
2021-06-19 19:21:31 +02:00
ok( $res->[0] == 403, ' Code is 403' ) or explain( $res, 403 );
count(2);
2020-05-06 13:05:27 +02:00
ok(
$res = $client->_get(
'/orgdeny', undef, 'afoo.example.org', "lemonldap=$sessionId"
),
'Accept "afoo.example.org/orgdeny"'
);
ok( $res->[0] == 200, ' Code is 200' ) or explain( $res, 200 );
count(2);
2020-05-06 13:05:27 +02:00
ok(
$res = $client->_get(
'/orgdeny', undef, 'abfoo.example.org', "lemonldap=$sessionId"
),
'Reject "abfoo.example.org/orgdeny"'
);
2021-06-19 19:21:31 +02:00
ok( $res->[0] == 403, ' Code is 403' ) or explain( $res, 403 );
2020-05-06 13:05:27 +02:00
count(2);
ok(
$res = $client->_get(
'/', undef, 'abfoo.a.example.org', "lemonldap=$sessionId"
),
'Accept "abfoo.a.example.org/"'
);
ok( $res->[0] == 200, ' Code is 200' ) or explain( $res, 200 );
count(2);
ok(
$res = $client->_get(
'/orgdeny', undef, 'abfoo.a.example.org', "lemonldap=$sessionId"
),
'Accept "abfoo.a.example.org/orgdeny"'
);
ok( $res->[0] == 200, ' Code is 200' ) or explain( $res, 200 );
count(2);
2020-05-06 13:05:27 +02:00
ok(
$res =
$client->_get( '/', undef, 'abfoo.example.org', "lemonldap=$sessionId" ),
2020-05-06 13:07:12 +02:00
'Reject "abfoo.example.org/"'
2020-05-06 13:05:27 +02:00
);
2021-06-19 19:21:31 +02:00
ok( $res->[0] == 403, ' Code is 403' ) or explain( $res, 403 );
2020-05-06 13:02:57 +02:00
count(2);
2020-05-06 13:05:27 +02:00
ok(
$res = $client->_get(
'/', undef, 'test-foo.example.fr', "lemonldap=$sessionId"
),
'Accept "test*.example.fr"'
);
2020-05-06 10:30:03 +02:00
ok( $res->[0] == 200, ' Code is 200' ) or explain( $res, 200 );
count(2);
2016-02-01 12:11:31 +01:00
done_testing( count() );
2016-02-01 21:10:28 +01:00
2016-06-09 13:45:10 +02:00
clean();
sub Lemonldap::NG::Handler::PSGI::handler {
2016-02-01 21:10:28 +01:00
my ( $self, $req ) = @_;
if ($SKIPUSER) {
ok( !$req->env->{HTTP_AUTH_USER}, 'No HTTP_AUTH_USER' )
or explain( $req->env->{HTTP_AUTH_USER}, '<empty>' );
}
else {
2019-12-10 16:06:17 +01:00
ok( $req->env->{HTTP_AUTH_USER} eq 'dwho', 'Header is given to app' )
or explain( $req->env->{HTTP_AUTH_USER}, 'dwho' );
}
count(1);
2016-02-01 21:10:28 +01:00
return [ 200, [ 'Content-Type', 'text/plain' ], ['Hello'] ];
}