fix ticketing system error on bootstrap of new install
[freeside.git] / rt / t / web / csrf-rest.t
1 use strict;
2 use warnings;
3
4 use RT::Test tests => undef;
5
6 my ($baseurl, $m) = RT::Test->started_ok;
7
8 # Get a non-REST session
9 diag "Standard web session";
10 ok $m->login, 'logged in';
11 $m->content_contains("RT at a glance", "Get full UI content");
12
13 # Requesting a REST page should be fine, as we have a Referer
14 $m->post("$baseurl/REST/1.0/ticket/new", [
15     format  => 'l',
16 ]);
17 $m->content_like(qr{^id: ticket/new}m, "REST request with referrer");
18
19 # Removing the Referer header gets us an interstitial
20 $m->add_header(Referer => undef);
21 $m->post("$baseurl/REST/1.0/ticket/new", [
22     format  => 'l',
23     foo     => 'bar',
24 ]);
25 $m->content_contains("Possible cross-site request forgery",
26                  "REST request without referrer is blocked");
27
28 # But passing username and password lets us though
29 $m->post("$baseurl/REST/1.0/ticket/new", [
30     user    => 'root',
31     pass    => 'password',
32     format  => 'l',
33 ]);
34 $m->content_like(qr{^id: ticket/new}m, "REST request without referrer, but username/password supplied, is OK");
35
36 # And we can still access non-REST urls
37 $m->get("$baseurl");
38 $m->content_contains("RT at a glance", "Full UI is still available");
39
40
41 # Now go get a REST session
42 diag "REST session";
43 $m = RT::Test::Web->new;
44 $m->post("$baseurl/REST/1.0/ticket/new", [
45     user    => 'root',
46     pass    => 'password',
47     format  => 'l',
48 ]);
49 $m->content_like(qr{^id: ticket/new}m, "REST request to log in");
50
51 # Requesting that page again, with a username/password but no referrer,
52 # is fine
53 $m->add_header(Referer => undef);
54 $m->post("$baseurl/REST/1.0/ticket/new", [
55     user    => 'root',
56     pass    => 'password',
57     format  => 'l',
58 ]);
59 $m->content_like(qr{^id: ticket/new}m, "REST request with no referrer, but username/pass");
60
61 # And it's still fine without both referer and username and password,
62 # because REST is special-cased
63 $m->post("$baseurl/REST/1.0/ticket/new", [
64     format  => 'l',
65 ]);
66 $m->content_like(qr{^id: ticket/new}m, "REST request with no referrer or username/pass is special-cased for REST sessions");
67
68 # But the REST page can't request normal pages
69 $m->get("$baseurl");
70 $m->content_lacks("RT at a glance", "Full UI is denied for REST sessions");
71 $m->content_contains("This login session belongs to a REST client", "Tells you why");
72 $m->warning_like(qr/This login session belongs to a REST client/, "Logs a warning");
73
74 undef $m;
75 done_testing;
76