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