summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xBugzilla/Bug.pm33
-rwxr-xr-xpost_bug.cgi24
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 {