package RTx::RightsMatrix; use strict; use Data::Dumper; use Storable; use RTx::RightsMatrix::Util; use RTx::RightsMatrix::RolePrincipal; =head1 NAME RTx::RightsMatrix - Bulk editing GUI for RT rights =head1 SYNOPSIS Point, click, drool =head2 Documentation Patches are wellcome. =head2 Todo =head2 Repository You can find repository of this project at L =cut our $VERSION = '0.03.00'; { no warnings qw(redefine); package RT::System; sub Name { return 'System'; } } # Teach RT how to ask if a Principal has a right assigned directly as opposed # to being ingerited from a group or role. { no warnings qw(redefine); package RT::Principal; sub _HasDirectRight { my $self = shift; my %args = @_; my $cu = $self->CurrentUser; my $PrincipalType = 'Group'; # if we are calling this on a Role, set the PrincipalType to that role if ($self->IsGroup) { # Groups.Type to ACL.Principal my @roles = qw( AdminCc Cc Admin Owner Requestor ); $PrincipalType = $self->Object->Type if grep { $self->Object->Type eq $_ } @roles; } my $acl = RT::ACL->new($cu); $acl->Limit( FIELD => 'RightName', VALUE => $args{Right} ); $acl->Limit( FIELD => 'PrincipalType', VALUE => $PrincipalType ); $acl->Limit( FIELD => 'ObjectType', VALUE => ref($args{Object}) ); $acl->Limit( FIELD => 'ObjectId', VALUE => $args{Object}->id ); #$acl->Limit( FIELD => 'ObjectId', VALUE => 0, ENTRYAGGREGATOR => 'OR' ) if ref($args{Object}) =~ /RT::System/; if ($self->IsUser) { my $groups = RT::Groups->new($cu); $groups->Limit(FIELD => 'Instance', VALUE => $self->id); $groups->Limit(FIELD => 'Domain', VALUE => 'ACLEquivalence'); my $equiv_group = $groups->First; $acl->Limit( FIELD => 'PrincipalId', VALUE => $equiv_group->id ); } elsif ($self->IsGroup) { $acl->Limit( FIELD => 'PrincipalId', VALUE => $self->id ); } return $acl->Count; } sub __RolesForObject { my $self = shift; my $type = shift; my $id = shift; #unless ($id) { #$id = '0'; #} if ( !$id or $type =~ /RTx?.*::System$/) { $id = 0; } # This should never be true. unless ($id =~ /^\d+$/) { $RT::Logger->crit("RT::Prinicipal::_RolesForObject called with type $type and a non-integer id: '$id'"); $id = "'$id'"; } my $clause = "(Groups.Domain = '".$type."-Role' AND Groups.Instance = $id) "; return($clause); } } =head1 AUTHOR Todd Chapman, C<< >> =head1 BUGS Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. =head1 ACKNOWLEDGEMENTS =head1 COPYRIGHT & LICENSE Copyright 2005 Todd Chapman, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut 1; # End of RTx::RightsMatrix