Bug 324784: editgroups.cgi should make sure groups it edits/removes are not used by editparams.cgi (in data/params) - Patch by Fr�d�ric Buclin <LpSolit@gmail.com> r=wicked a=justdave

This commit is contained in:
lpsolit%gmail.com 2006-05-29 18:11:04 +00:00
parent 52c8070cd5
commit 8197b2c33f
3 changed files with 62 additions and 3 deletions

View File

@ -31,6 +31,7 @@ use lib ".";
use Bugzilla;
use Bugzilla::Constants;
use Bugzilla::Config qw(:DEFAULT :admin);
use Bugzilla::Group;
use Bugzilla::User;
require "globals.pl";
@ -338,6 +339,17 @@ if ($action eq 'del') {
if (!$isbuggroup) {
ThrowUserError("system_group_not_deletable", { name => $name });
}
# Groups having a special role cannot be deleted.
my @special_groups;
foreach my $special_group ('chartgroup', 'insidergroup', 'timetrackinggroup') {
if ($name eq Param($special_group)) {
push(@special_groups, $special_group);
}
}
if (scalar(@special_groups)) {
ThrowUserError('group_has_special_role', {'name' => $name,
'groups' => \@special_groups});
}
# Group inheritance no longer appears in user_group_map.
my $grouplist = join(',', @{Bugzilla::User->flatten_group_membership($gid)});
@ -391,6 +403,17 @@ if ($action eq 'delete') {
if (!$isbuggroup) {
ThrowUserError("system_group_not_deletable", { name => $name });
}
# Groups having a special role cannot be deleted.
my @special_groups;
foreach my $special_group ('chartgroup', 'insidergroup', 'timetrackinggroup') {
if ($name eq Param($special_group)) {
push(@special_groups, $special_group);
}
}
if (scalar(@special_groups)) {
ThrowUserError('group_has_special_role', {'name' => $name,
'groups' => \@special_groups});
}
my $cantdelete = 0;
@ -596,6 +619,16 @@ sub doGroupChanges {
$chgs = 1;
$dbh->do('UPDATE groups SET name = ? WHERE id = ?',
undef, ($name, $gid));
# If the group is used by some parameters, we have to update
# these parameters too.
my $update_params = 0;
foreach my $group ('chartgroup', 'insidergroup', 'timetrackinggroup') {
if ($cgi->param('oldname') eq Param($group)) {
SetParam($group, $name);
$update_params = 1;
}
}
WriteParams() if $update_params;
}
if ($desc ne $cgi->param('olddesc')) {
$chgs = 1;

View File

@ -84,10 +84,22 @@
content => "&nbsp;"
}]
overrides.action = [ {
match_value => "0"
match_field => 'isbuggroup'
match_value => Param("chartgroup")
match_field => 'name'
override_content => 1
content => "&nbsp;"
content => "(used as the 'chartgroup')"
},
{
match_value => Param("insidergroup")
match_field => 'name'
override_content => 1
content => "(used as the 'insidergroup')"
},
{
match_value => Param("timetrackinggroup")
match_field => 'name'
override_content => 1
content => "(used as the 'timetrackinggroup')"
},
{
match_value => "1"

View File

@ -519,6 +519,20 @@
[% title = "The group already exists" %]
The group [% name FILTER html %] already exists.
[% ELSIF error == "group_has_special_role" %]
[% title = "Group not deletable" %]
[% IF groups.size == 1 %]
[% attr = "it" %]
[% param = "parameter" %]
[% ELSE %]
[% attr = "them" %]
[% param = "parameters" %]
[% END %]
The group '[% name FILTER html %]' is used by the
'[% groups.join("' and '") FILTER html %]' [% param FILTER html %].
In order to delete this group, you first have to change the
[%+ param FILTER html %] to make [% attr FILTER html %] point to another group.
[% ELSIF error == "group_not_specified" %]
[% title = "Group not specified" %]
No group was specified.