From: preed%sigkill.com <> Date: Tue, 28 May 2002 11:32:38 +0000 (+0000) Subject: Bug 107718: backported patch for 2_14_1-BRANCH; backport=preed, r=bbaetz, 2r/testing... X-Git-Tag: bugzilla-2.14.2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=70366f79bf87168a06852483239bfbbdcd511524;p=thirdparty%2Fbugzilla.git Bug 107718: backported patch for 2_14_1-BRANCH; backport=preed, r=bbaetz, 2r/testing=mattyt --- diff --git a/process_bug.cgi b/process_bug.cgi index 6c56f34cce..ee30b07d87 100755 --- a/process_bug.cgi +++ b/process_bug.cgi @@ -43,7 +43,8 @@ use vars %::versions, %::legal_platform, %::legal_priority, %::target_milestone, - %::legal_severity; + %::legal_severity, + %::superusergroupset; my $whoid = confirm_login(); @@ -553,45 +554,30 @@ sub CheckonComment( $ ) { # select lists. This means that instead of looking for the bit-X values in # the form, we need to loop through all the bug groups this user has access # to, and for each one, see if it's selected. -# In addition, adding a little extra work so that we don't clobber groupsets -# for bugs where the user doesn't have access to the group, but does to the -# bug (as with the proposed reporter access patch.) +# In order to make mass changes work correctly, keep a sum of bits for groups +# added, and another one for groups removed, and then let mysql do the bit +# operations +# If the form element isn't present, or the user isn't in the group, leave +# it as-is if($::usergroupset ne '0') { - # We want to start from zero and build up, since if all boxes have been - # unchecked, we want to revert to 0. - DoComma(); - $::query .= "groupset = 0"; - my ($id) = (@idlist); - SendSQL(<<_EOQ_); - SELECT bit, bit & $::usergroupset != 0, bit & bugs.groupset != 0 - FROM groups, bugs - WHERE isbuggroup != 0 AND bug_id = $id - ORDER BY bit -_EOQ_ - while (my ($b, $userhasgroup, $bughasgroup) = FetchSQLData()) { - if (!$::FORM{"bit-$b"}) { - # If we make it here, the item didn't exist on the form or the user - # said to clear it. The only time we add this group back in is if - # the bug already has this group on it and the user can't access it. - if ($bughasgroup && !$userhasgroup) { - $::query .= " + $b"; - } - } elsif ($::FORM{"bit-$b"} == -1) { - # If we get here, the user came from the change several bugs form, and - # said not to change this group restriction. So we'll add this group - # back in only if the bug already has it. - if ($bughasgroup) { - $::query .= " + $b"; - } - } else { - # If we get here, the user said to set this group. If they don't have - # access to it, we'll use what's already on the bug, otherwise we'll - # add this one in. - if ($userhasgroup || $bughasgroup) { - $::query .= " + $b"; - } + my $groupAdd = "0"; + my $groupDel = "0"; + + SendSQL("SELECT bit, isactive FROM groups WHERE " . + "isbuggroup != 0 AND bit & $::usergroupset != 0 ORDER BY bit"); + while (my ($b, $isactive) = FetchSQLData()) { + if (!$::FORM{"bit-$b"}) { + $groupDel .= "+$b"; + } elsif ($::FORM{"bit-$b"} == 1 && $isactive) { + $groupAdd .= "+$b"; + } + } + if ($groupAdd ne "0" || $groupDel ne "0") { + DoComma(); + # mysql < 3.23.5 doesn't support the ~ operator, even though + # the docs say that it does + $::query .= "groupset = ((groupset & ($::superusergroupset - ($groupDel))) | ($groupAdd))"; } - } } foreach my $field ("rep_platform", "priority", "bug_severity",