]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 967883: modify_keywords() shouldn't throw an error when an unprivileged user...
authorFrédéric Buclin <LpSolit@gmail.com>
Tue, 25 Feb 2014 20:35:00 +0000 (21:35 +0100)
committerFrédéric Buclin <LpSolit@gmail.com>
Tue, 25 Feb 2014 20:35:00 +0000 (21:35 +0100)
r=gerv a=justdave

Bugzilla/Bug.pm
template/en/default/global/user-error.html.tmpl

index 128d2a4cd620d2ba6a5b9af38a4d55553281d35c..367804862217a3ffe2d93daceb95cf1ebf09936d 100644 (file)
@@ -2782,31 +2782,23 @@ sub add_comment {
     push(@{$self->{added_comments}}, $params);
 }
 
-# There was a lot of duplicate code when I wrote this as three separate
-# functions, so I just combined them all into one. This is also easier for
-# process_bug to use.
 sub modify_keywords {
     my ($self, $keywords, $action) = @_;
-    
-    $action ||= 'set';
-    if (!grep($action eq $_, qw(add remove set))) {
+
+    if (!$action || !grep { $action eq $_ } qw(add remove set)) {
         $action = 'set';
     }
-    
+
     $keywords = $self->_check_keywords($keywords);
+    my @old_keywords = @{ $self->keyword_objects };
+    my @result;
 
-    my (@result, $any_changes);
     if ($action eq 'set') {
         @result = @$keywords;
-        # Check if anything was added or removed.
-        my @old_ids = map { $_->id } @{$self->keyword_objects};
-        my @new_ids = map { $_->id } @result;
-        my ($removed, $added) = diff_arrays(\@old_ids, \@new_ids);
-        $any_changes = scalar @$removed || scalar @$added;
     }
     else {
         # We're adding or deleting specific keywords.
-        my %keys = map {$_->id => $_} @{$self->keyword_objects};
+        my %keys = map { $_->id => $_ } @old_keywords;
         if ($action eq 'add') {
             $keys{$_->id} = $_ foreach @$keywords;
         }
@@ -2814,11 +2806,17 @@ sub modify_keywords {
             delete $keys{$_->id} foreach @$keywords;
         }
         @result = values %keys;
-        $any_changes = scalar @$keywords;
     }
+
+    # Check if anything was added or removed.
+    my @old_ids = map { $_->id } @old_keywords;
+    my @new_ids = map { $_->id } @result;
+    my ($removed, $added) = diff_arrays(\@old_ids, \@new_ids);
+    my $any_changes = scalar @$removed || scalar @$added;
+
     # Make sure we retain the sort order.
     @result = sort {lc($a->name) cmp lc($b->name)} @result;
-    
+
     if ($any_changes) {
         my $privs;
         my $new = join(', ', (map {$_->name} @result));
index 29e3bf83ff672c20530b28fadc19623f311d4a04..d7648320cdf836f4f192d2e7119c0d388ec5bfa0 100644 (file)
     [% title = "Not allowed" %]
     You tried to change the
     <strong>[% field_descs.$field FILTER html %]</strong> field 
-    [% IF oldvalue.defined %]
+    [% IF oldvalue.defined AND oldvalue != "" %]
       from <em>[% oldvalue.join(', ') FILTER html %]</em>
     [% END %]
-    [% IF newvalue.defined %]
+    [% IF newvalue.defined AND newvalue != "" %]
       to <em>[% newvalue.join(', ') FILTER html %]</em>
-    [% END %]
-    but only
+    [% END %],
+    but only
     [% IF privs < constants.PRIVILEGES_REQUIRED_EMPOWERED %]
       the assignee
       [% IF privs < constants.PRIVILEGES_REQUIRED_ASSIGNEE %] or reporter [% END %]