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