1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
|
use strict;
use warnings;
use RT;
use RT::Test plan => 'no_plan';
sub stop_server {
my $mech = shift;
# Ensure we're logged in for the final warnings check
$$mech->auth("root");
# Force the warnings check before we stop the server
undef $$mech;
RT::Test->stop_server;
}
diag "Continuous + Fallback";
{
RT->Config->Set( DevelMode => 0 );
RT->Config->Set( WebRemoteUserAuth => 1 );
RT->Config->Set( WebRemoteUserAuthContinuous => 1 );
RT->Config->Set( WebFallbackToRTLogin => 1 );
RT->Config->Set( WebRemoteUserAutocreate => 0 );
my ( $url, $m ) = RT::Test->started_ok( basic_auth => 'anon' );
diag "Internal auth";
{
# Empty REMOTE_USER
$m->auth("");
# First request gets the login form
$m->get_ok($url, "No basic auth is OK");
$m->content_like(qr/Login/, "Login form");
# Log in using RT's form
$m->submit_form_ok({
with_fields => {
user => 'root',
pass => 'password',
},
}, "Submitted login form");
ok $m->logged_in_as("root"), "Logged in as root";
# Still logged in on another request without REMOTE_USER
$m->follow_link_ok({ text => 'My Tickets' });
ok $m->logged_in_as("root"), "Logged in as root";
ok $m->logout, "Logged out";
# We're definitely logged out?
$m->get_ok($url);
$m->content_like(qr/Login/, "Login form");
}
diag "External auth";
{
# REMOTE_USER of root
$m->auth("root");
# Automatically logged in as root without Login page
$m->get_ok($url);
ok $m->logged_in_as("root"), "Logged in as root";
# Still logged in on another request
$m->follow_link_ok({ text => 'My Tickets' });
ok $m->logged_in_as("root"), "Still logged in as root";
# Drop credentials and...
$m->auth("");
# ...see if RT notices
$m->get($url);
is $m->status, 403, "403 Forbidden from RT";
# Next request gets us the login form
$m->get_ok($url);
$m->content_like(qr/Login/, "Login form");
}
diag "External auth with invalid user, login internally";
{
# REMOTE_USER of invalid
$m->auth("invalid");
# Login internally via the login link
$m->get("$url/Search/Build.html");
is $m->status, 403, "403 Forbidden";
$m->follow_link_ok({ url_regex => qr'NoAuth/Login\.html' }, "follow logout link");
$m->content_like(qr/Login/, "Login form");
# Log in using RT's form
$m->submit_form_ok({
with_fields => {
user => 'root',
pass => 'password',
},
}, "Submitted login form");
ok $m->logged_in_as("root"), "Logged in as root";
like $m->uri, qr'Search/Build\.html', "at our originally requested page";
# Still logged in on another request
$m->follow_link_ok({ text => 'Tools' });
ok $m->logged_in_as("root"), "Logged in as root";
ok $m->logout, "Logged out";
$m->next_warning_like(qr/Couldn't find internal user for 'invalid'/, "found warning for first request");
$m->next_warning_like(qr/Couldn't find internal user for 'invalid'/, "found warning for second request");
}
stop_server(\$m);
}
diag "Fallback OFF";
{
RT->Config->Set( DevelMode => 0 );
RT->Config->Set( WebRemoteUserAuth => 1 );
RT->Config->Set( WebRemoteUserContinuous => 0 );
RT->Config->Set( WebFallbackToRTLogin => 0 );
RT->Config->Set( WebRemoteUserAutocreate => 0 );
my ( $url, $m ) = RT::Test->started_ok( basic_auth => 'anon' );
diag "No remote user";
{
$m->auth("");
$m->get($url);
is $m->status, 403, "Forbidden";
}
stop_server(\$m);
}
diag "WebRemoteUserAutocreate";
{
RT->Config->Set( DevelMode => 0 );
RT->Config->Set( WebRemoteUserAuth => 1 );
RT->Config->Set( WebRemoteUserContinuous => 1 );
RT->Config->Set( WebFallbackToRTLogin => 0 );
RT->Config->Set( WebRemoteUserAutocreate => 1 );
RT->Config->Set( UserAutocreateDefaultsOnLogin => { Organization => "BPS" } );
my ( $url, $m ) = RT::Test->started_ok( basic_auth => 'anon' );
diag "New user";
{
$m->auth("anewuser");
$m->get_ok($url);
ok $m->logged_in_as("anewuser"), "Logged in as anewuser";
my $user = RT::User->new( RT->SystemUser );
$user->Load("anewuser");
ok $user->id, "Found newly created user";
is $user->Organization, "BPS", "Found Organization from UserAutocreateDefaultsOnLogin hash";
ok $user->Privileged, "Privileged by default";
}
stop_server(\$m);
RT->Config->Set(
UserAutocreateDefaultsOnLogin => {
Privileged => 0,
EmailAddress => 'foo@example.com',
},
);
( $url, $m ) = RT::Test->started_ok( basic_auth => 'anon' );
diag "Create unprivileged users";
{
$m->auth("unpriv");
$m->get_ok($url);
ok $m->logged_in_as("unpriv"), "Logged in as an unpriv user";
like $m->uri->path, RT->Config->Get('SelfServiceRegex'), "SelfService URL";
my $user = RT::User->new( RT->SystemUser );
$user->Load("unpriv");
ok $user->id, "Found newly created user";
ok !$user->Privileged, "Unprivileged per config";
is $user->EmailAddress, 'foo@example.com', "Email address per config";
}
diag "User creation failure";
{
$m->auth("conflicting");
$m->get($url);
is $m->status, 403, "Forbidden";
$m->next_warning_like(qr/Couldn't auto-create user 'conflicting' when attempting WebRemoteUser: Email address in use/, 'found failed auth warning');
my $user = RT::User->new( RT->SystemUser );
$user->Load("conflicting");
ok !$user->id, "Couldn't find conflicting user";
}
stop_server(\$m);
}
|