diff options
-rwxr-xr-x | Bugzilla/Bug.pm | 33 | ||||
-rwxr-xr-x | post_bug.cgi | 24 |
2 files changed, 52 insertions, 5 deletions
diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm index 469b6ff60..841b6f14f 100755 --- a/Bugzilla/Bug.pm +++ b/Bugzilla/Bug.pm @@ -1351,6 +1351,36 @@ sub AppendComment { undef, $timestamp, $bugid); } +sub update_comment { + my ($self, $comment_id, $new_comment) = @_; + + # Some validation checks. + if ($self->{'error'}) { + ThrowCodeError("bug_error", { bug => $self }); + } + detaint_natural($comment_id) + || ThrowCodeError('bad_arg', {argument => 'comment_id', function => 'update_comment'}); + + # The comment ID must belong to this bug. + my @current_comment_obj = grep {$_->{'id'} == $comment_id} @{$self->longdescs}; + scalar(@current_comment_obj) + || ThrowCodeError('bad_arg', {argument => 'comment_id', function => 'update_comment'}); + + # If the new comment is undefined, then there is nothing to update. + # To delete a comment, an empty string should be passed. + return unless defined $new_comment; + $new_comment =~ s/\s*$//s; # Remove trailing whitespaces. + $new_comment =~ s/\r\n?/\n/g; # Handle Windows and Mac-style line endings. + trick_taint($new_comment); + + # We assume ValidateComment() has already been called earlier. + Bugzilla->dbh->do('UPDATE longdescs SET thetext = ? WHERE comment_id = ?', + undef, ($new_comment, $comment_id)); + + # Update the comment object with this new text. + $current_comment_obj[0]->{'body'} = $new_comment; +} + # Represents which fields from the bugs table are handled by process_bug.cgi. sub editable_bug_fields { my @fields = Bugzilla->dbh->bz_table_columns('bugs'); @@ -1416,7 +1446,8 @@ sub GetComments { my @comments; my @args = ($id); - my $query = 'SELECT profiles.realname AS name, profiles.login_name AS email, ' . + my $query = 'SELECT longdescs.comment_id AS id, profiles.realname AS name, + profiles.login_name AS email, ' . $dbh->sql_date_format('longdescs.bug_when', '%Y.%m.%d %H:%i:%s') . ' AS time, longdescs.thetext AS body, longdescs.work_time, isprivate, already_wrapped, type, extra_data diff --git a/post_bug.cgi b/post_bug.cgi index 715437141..2c40a4441 100755 --- a/post_bug.cgi +++ b/post_bug.cgi @@ -187,10 +187,26 @@ if (defined $cgi->param('version')) { # Add an attachment if requested. if (defined($cgi->upload('data')) || $cgi->param('attachurl')) { $cgi->param('isprivate', $cgi->param('commentprivacy')); - Bugzilla::Attachment->insert_attachment_for_bug(!THROW_ERROR, - $bug, $user, $timestamp, - \$vars) - || ($vars->{'message'} = 'attachment_creation_failed'); + my $attach_id = Bugzilla::Attachment->insert_attachment_for_bug(!THROW_ERROR, + $bug, $user, $timestamp, \$vars); + + if ($attach_id) { + # Update the comment to include the new attachment ID. + # This string is hardcoded here because Template::quoteUrls() + # expects to find this exact string. + my $new_comment = "Created an attachment (id=$attach_id)\n" . + $cgi->param('description') . "\n"; + # We can use $bug->longdescs here because we are sure that the bug + # description is of type CMT_NORMAL. No need to include it if it's + # empty, though. + if ($bug->longdescs->[0]->{'body'} !~ /^\s+$/) { + $new_comment .= "\n" . $bug->longdescs->[0]->{'body'}; + } + $bug->update_comment($bug->longdescs->[0]->{'id'}, $new_comment); + } + else { + $vars->{'message'} = 'attachment_creation_failed'; + } # Determine if Patch Viewer is installed, for Diff link eval { |