Merge branch 'master' of git.freeside.biz:/home/git/freeside
[freeside.git] / rt / etc / upgrade / 4.1.4 / content
1 use strict;
2 use warnings;
3
4 our (@Final);
5
6 push @Final, sub {
7     my %global = %{ RT->System->AvailableRights };
8     my $handle = RT->DatabaseHandle;
9
10     for my $role (RT::System->Roles) {
11         my $group       = RT::Group->new( RT->SystemUser );
12         my ($ok, $msg)  = $group->LoadRoleGroup(
13             Object  => RT->System,
14             Name    => $role,
15         );
16
17         unless ($group->id) {
18             RT->Logger->error("Can't load role group $role: $msg");
19             next;
20         }
21
22         my %rights = %{ RT->System->AvailableRights( $group->PrincipalObj ) };
23
24         # Global rights which aren't available on the role anymore
25         my @remove = grep { not $rights{$_} }
26                      keys %global;
27         my $placeholders = join ",", map { "?" } 1 .. scalar @remove;
28
29         my $query = <<"        SQL";
30             DELETE FROM ACL
31                   WHERE PrincipalType = ?
32                     AND PrincipalId   = ?
33                     AND ObjectType    = 'RT::System'
34                     AND RightName    IN ($placeholders)
35         SQL
36
37         my $res = $handle->SimpleQuery(
38             $query,
39             $role,                  # Type
40             $group->PrincipalId,    # Id
41             @remove,                # Right names
42         );
43
44         unless ($res) {
45             RT->Logger->error("Failed to delete invalid rights on system role $role!");
46             next;
47         }
48     }
49 };