summaryrefslogtreecommitdiff
path: root/rt/t/api/rights_show_ticket.t
diff options
context:
space:
mode:
Diffstat (limited to 'rt/t/api/rights_show_ticket.t')
-rw-r--r--rt/t/api/rights_show_ticket.t262
1 files changed, 262 insertions, 0 deletions
diff --git a/rt/t/api/rights_show_ticket.t b/rt/t/api/rights_show_ticket.t
new file mode 100644
index 0000000..3e1d074
--- /dev/null
+++ b/rt/t/api/rights_show_ticket.t
@@ -0,0 +1,262 @@
+#!/usr/bin/perl -w
+
+use RT::Test tests => 264;
+
+use strict;
+use warnings;
+
+
+my $queue_a = RT::Test->load_or_create_queue( Name => 'A' );
+ok $queue_a && $queue_a->id, 'loaded or created queue_a';
+my $qa_id = $queue_a->id;
+
+my $queue_b = RT::Test->load_or_create_queue( Name => 'B' );
+ok $queue_b && $queue_b->id, 'loaded or created queue_b';
+my $qb_id = $queue_b->id;
+
+my $user_a = RT::Test->load_or_create_user(
+ Name => 'user_a', Password => 'password',
+);
+ok $user_a && $user_a->id, 'loaded or created user';
+
+my $user_b = RT::Test->load_or_create_user(
+ Name => 'user_b', Password => 'password',
+);
+ok $user_b && $user_b->id, 'loaded or created user';
+
+foreach my $option (0 .. 1 ) { RT->Config->Set( 'UseSQLForACLChecks' => $option );
+
+diag "Testing with UseSQLForACLChecks => $option";
+
+# Global Cc has right, a User is nobody
+{
+ cleanup();
+ RT::Test->set_rights(
+ { Principal => 'Everyone', Right => [qw(SeeQueue)] },
+ { Principal => 'Cc', Right => [qw(ShowTicket)] },
+ );
+ create_tickets_set();
+ have_no_rights($user_a, $user_b);
+}
+
+# Global Cc has right, a User is Queue Cc
+{
+ cleanup();
+ RT::Test->set_rights(
+ { Principal => 'Everyone', Right => [qw(SeeQueue)] },
+ { Principal => 'Cc', Right => [qw(ShowTicket)] },
+ );
+ create_tickets_set();
+ have_no_rights($user_a, $user_b);
+
+ my ($status, $msg) = $queue_a->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
+ ok($status, "user A is now queue A watcher");
+
+ foreach my $q (
+ '',
+ "Queue = $qa_id OR Queue = $qb_id",
+ "Queue = $qb_id OR Queue = $qa_id",
+ ) {
+ my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
+ $q? $tickets->FromSQL($q) : $tickets->UnLimit;
+ my $found = 0;
+ while ( my $t = $tickets->Next ) {
+ $found++;
+ is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
+ }
+ is($found, 2, "user sees tickets");
+ }
+ have_no_rights( $user_b );
+}
+
+# global Cc has right, a User is ticket Cc
+{
+ cleanup();
+ RT::Test->set_rights(
+ { Principal => 'Everyone', Right => [qw(SeeQueue)] },
+ { Principal => 'Cc', Right => [qw(ShowTicket)] },
+ );
+ my @tickets = create_tickets_set();
+ have_no_rights($user_a, $user_b);
+
+ my ($status, $msg) = $tickets[1]->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
+ ok($status, "user A is now queue A watcher");
+
+ foreach my $q (
+ '',
+ "Queue = $qa_id OR Queue = $qb_id",
+ "Queue = $qb_id OR Queue = $qa_id",
+ ) {
+ my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
+ $q? $tickets->FromSQL($q) : $tickets->UnLimit;
+ my $found = 0;
+ while ( my $t = $tickets->Next ) {
+ $found++;
+ is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
+ is( $t->id, $tickets[1]->id, "correct ticket");
+ }
+ is($found, 1, "user sees tickets");
+ }
+ have_no_rights($user_b);
+}
+
+# Queue Cc has right, a User is nobody
+{
+ cleanup();
+ RT::Test->set_rights(
+ { Principal => 'Everyone', Right => [qw(SeeQueue)] },
+ { Principal => 'Cc', Object => $queue_a, Right => [qw(ShowTicket)] },
+ );
+ create_tickets_set();
+ have_no_rights($user_a, $user_b);
+}
+
+# Queue Cc has right, Users are Queue Ccs
+{
+ cleanup();
+ RT::Test->set_rights(
+ { Principal => 'Everyone', Right => [qw(SeeQueue)] },
+ { Principal => 'Cc', Object => $queue_a, Right => [qw(ShowTicket)] },
+ );
+ create_tickets_set();
+ have_no_rights($user_a, $user_b);
+
+ my ($status, $msg) = $queue_a->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
+ ok($status, "user A is now queue A watcher");
+
+ ($status, $msg) = $queue_b->AddWatcher( Type => 'Cc', PrincipalId => $user_b->id );
+ ok($status, "user B is now queue B watcher");
+
+ foreach my $q (
+ '',
+ "Queue = $qa_id OR Queue = $qb_id",
+ "Queue = $qb_id OR Queue = $qa_id",
+ ) {
+ my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
+ $q? $tickets->FromSQL($q) : $tickets->UnLimit;
+ my $found = 0;
+ while ( my $t = $tickets->Next ) {
+ $found++;
+ is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
+ }
+ is($found, 2, "user sees tickets");
+ }
+ have_no_rights( $user_b );
+}
+
+# Queue Cc has right, Users are ticket Ccs
+{
+ cleanup();
+ RT::Test->set_rights(
+ { Principal => 'Everyone', Right => [qw(SeeQueue)] },
+ { Principal => 'Cc', Object => $queue_a, Right => [qw(ShowTicket)] },
+ );
+ my @tickets = create_tickets_set();
+ have_no_rights($user_a, $user_b);
+
+ my ($status, $msg) = $tickets[1]->AddWatcher( Type => 'Cc', PrincipalId => $user_a->id );
+ ok($status, "user A is now Cc on a ticket in queue A");
+
+ ($status, $msg) = $tickets[2]->AddWatcher( Type => 'Cc', PrincipalId => $user_b->id );
+ ok($status, "user B is now Cc on a ticket in queue B");
+
+ foreach my $q (
+ '',
+ "Queue = $qa_id OR Queue = $qb_id",
+ "Queue = $qb_id OR Queue = $qa_id",
+ ) {
+ my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
+ $q? $tickets->FromSQL($q) : $tickets->UnLimit;
+ my $found = 0;
+ while ( my $t = $tickets->Next ) {
+ $found++;
+ is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
+ is( $t->id, $tickets[1]->id, )
+ }
+ is($found, 1, "user sees tickets");
+ }
+ have_no_rights( $user_b );
+}
+
+# Users has direct right on queue
+{
+ cleanup();
+ RT::Test->set_rights(
+ { Principal => 'Everyone', Right => [qw(SeeQueue)] },
+ { Principal => $user_a, Object => $queue_a, Right => [qw(ShowTicket)] },
+ );
+ my @tickets = create_tickets_set();
+
+ foreach my $q (
+ '',
+ "Queue = $qa_id OR Queue = $qb_id",
+ "Queue = $qb_id OR Queue = $qa_id",
+ ) {
+ my $tickets = RT::Tickets->new( RT::CurrentUser->new( $user_a ) );
+ $q? $tickets->FromSQL($q) : $tickets->UnLimit;
+ my $found = 0;
+ while ( my $t = $tickets->Next ) {
+ $found++;
+ is( $t->Queue, $queue_a->id, "user sees tickets only in queue A" );
+ }
+ is($found, 2, "user sees tickets");
+ }
+ have_no_rights( $user_b );
+}
+
+
+}
+
+sub have_no_rights {
+ $SIG{'INT'} = $SIG{'TERM'} = sub { print STDERR Carp::longmess('boo'); exit 1 };
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+ foreach my $u ( @_ ) {
+ foreach my $q (
+ '',
+ "Queue = $qa_id OR Queue = $qb_id",
+ "Queue = $qb_id OR Queue = $qa_id",
+ ) {
+ my $tickets = RT::Tickets->new( RT::CurrentUser->new( $u ) );
+ $q? $tickets->FromSQL($q) : $tickets->UnLimit;
+ ok(!$tickets->First, "no tickets");
+ }
+ }
+}
+
+sub create_tickets_set{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+ my @res;
+ foreach my $q ($queue_a, $queue_b) {
+ foreach my $n (1 .. 2) {
+ my $ticket = RT::Ticket->new( $RT::SystemUser );
+ my ($tid) = $ticket->Create(
+ Queue => $q->id, Subject => $q->Name .' - '. $n
+ );
+ ok( $tid, "created ticket #$tid");
+ push @res, $ticket;
+ }
+ }
+ return @res;
+}
+
+sub cleanup { delete_tickets(); delete_watchers() };
+
+sub delete_tickets {
+ my $tickets = RT::Tickets->new( $RT::SystemUser );
+ $tickets->FromSQL( "Queue = $qa_id OR Queue = $qb_id" );
+ while ( my $ticket = $tickets->Next ) {
+ $ticket->Delete;
+ }
+}
+
+sub delete_watchers {
+ foreach my $q ($queue_a, $queue_b) {
+ foreach my $u ($user_a, $user_b) {
+ foreach my $t (qw(Cc AdminCc) ) {
+ $q->DeleteWatcher( Type => $t, PrincipalId => $u->id )
+ if $q->IsWatcher( Type => $t, PrincipalId => $u->id );
+ }
+ }
+ }
+}
+