diff options
Diffstat (limited to 'bug_form.pl')
-rw-r--r-- | bug_form.pl | 825 |
1 files changed, 257 insertions, 568 deletions
diff --git a/bug_form.pl b/bug_form.pl index 6d52011c7..e51107bfb 100644 --- a/bug_form.pl +++ b/bug_form.pl @@ -28,604 +28,293 @@ use RelationSet; # Use the Attachment module to display attachments for the bug. use Attachment; -# Shut up misguided -w warnings about "used only once". For some reason, -# "use vars" chokes on me when I try it here. - -sub bug_form_pl_sillyness { - my $zz; - $zz = %::FORM; - $zz = %::components; - $zz = %::proddesc; - $zz = %::prodmaxvotes; - $zz = %::versions; - $zz = @::enterable_products; - $zz = @::legal_keywords; - $zz = @::legal_opsys; - $zz = @::legal_platform; - $zz = @::legal_priority; - $zz = @::settable_resolution; - $zz = @::legal_severity; - $zz = %::target_milestone; -} - -my $loginok = quietly_check_login(); - -my $id = $::FORM{'id'}; - -my $query = " -select - bugs.bug_id, - product, - version, - rep_platform, - op_sys, - bug_status, - resolution, - priority, - bug_severity, - component, - assigned_to, - reporter, - bug_file_loc, - short_desc, - target_milestone, - qa_contact, - status_whiteboard, - date_format(creation_ts,'%Y-%m-%d %H:%i'), - groupset, - delta_ts, - sum(votes.count) -from bugs left join votes using(bug_id) -where bugs.bug_id = $id -group by bugs.bug_id"; - -SendSQL($query); -my %bug; -my @row; -@row = FetchSQLData(); -my $count = 0; -foreach my $field ("bug_id", "product", "version", "rep_platform", - "op_sys", "bug_status", "resolution", "priority", - "bug_severity", "component", "assigned_to", "reporter", - "bug_file_loc", "short_desc", "target_milestone", - "qa_contact", "status_whiteboard", "creation_ts", - "groupset", "delta_ts", "votes") { - $bug{$field} = shift @row; - if (!defined $bug{$field}) { - $bug{$field} = ""; +sub show_bug { + # Shut up misguided -w warnings about "used only once". For some reason, + # "use vars" chokes on me when I try it here. + sub bug_form_pl_sillyness { + my $zz; + $zz = %::FORM; + $zz = %::proddesc; + $zz = %::prodmaxvotes; + $zz = @::enterable_products; + $zz = @::settable_resolution; + $zz = $::unconfirmedstate; + $zz = $::milestoneurl; + $zz = $::template; + $zz = $::vars; + $zz = @::legal_priority; + $zz = @::legal_platform; + $zz = @::legal_severity; + $zz = @::legal_bug_status; + $zz = @::target_milestone; + $zz = @::components; + $zz = @::legal_keywords; + $zz = @::versions; + $zz = @::legal_opsys; } - $count++; -} - -my $assignedtoid = $bug{'assigned_to'}; -my $reporterid = $bug{'reporter'}; -my $qacontactid = $bug{'qa_contact'}; - -$bug{'assigned_to_email'} = DBID_to_name($assignedtoid); -$bug{'assigned_to'} = DBID_to_real_or_loginname($bug{'assigned_to'}); -$bug{'reporter'} = DBID_to_real_or_loginname($bug{'reporter'}); - -print qq{<FORM NAME="changeform" METHOD="POST" ACTION="process_bug.cgi">\n}; - -# foreach my $i (sort(keys(%bug))) { -# my $q = value_quote($bug{$i}); -# print qq{<INPUT TYPE="HIDDEN" NAME="orig-$i" VALUE="$q">\n}; -# } - -$bug{'long_desc'} = GetLongDescriptionAsHTML($id); -my $longdesclength = length($bug{'long_desc'}); - -GetVersionTable(); - - -# -# These should be read from the database ... -# - -my $platform_popup = make_options(\@::legal_platform, $bug{'rep_platform'}); -my $priority_popup = make_options(\@::legal_priority, $bug{'priority'}); -my $sev_popup = make_options(\@::legal_severity, $bug{'bug_severity'}); - - -my $component_popup = make_options($::components{$bug{'product'}}, - $bug{'component'}); - -my $ccSet = new RelationSet; -$ccSet->mergeFromDB("select who from cc where bug_id=$id"); -my @ccList = $ccSet->toArrayOfStrings(); -my $cc_element = "<INPUT TYPE=HIDDEN NAME=cc VALUE=\"\">"; -if (scalar(@ccList) > 0) { - $cc_element = "<SELECT NAME=cc MULTIPLE SIZE=5>\n"; - foreach my $ccName ( @ccList ) { - $cc_element .= "<OPTION VALUE=\"$ccName\">$ccName\n"; - } - $cc_element .= "</SELECT><BR>\n" . - "<INPUT TYPE=CHECKBOX NAME=removecc>Remove selected CCs<br>\n"; -} - -my $URL = value_quote($bug{'bug_file_loc'}); - -if (defined $URL && $URL ne "none" && $URL ne "NULL" && $URL ne "") { - $URL = "<B><A HREF=\"$URL\">URL:</A></B>"; -} else { - $URL = "<B>URL:</B>"; -} - -# -# Make a list of products the user has access to -# - -my (@prodlist, $product_popup); -my $seen_currProd = 0; - -foreach my $p (@::enterable_products) { - if ($p eq $bug{'product'}) { - # if it's the product the bug is already in, it's ALWAYS in - # the popup, period, whether the user can see it or not, and - # regardless of the disallownew setting. - $seen_currProd = 1; - push(@prodlist, $p); - next; + # Use templates + my $template = $::template; + my $vars = $::vars; + + $vars->{'GetBugLink'} = \&GetBugLink; + $vars->{'quoteUrls'} = \"eUrls, + $vars->{'lsearch'} = \&lsearch, + $vars->{'header_done'} = (@_), + + quietly_check_login(); + + my $id = $::FORM{'id'}; + + if (!defined($id)) { + $template->process("show/choose_bug.html.tmpl", $vars) + || DisplayError("Template process failed: " . $template->error()); + exit; } - if(Param("usebuggroupsentry") - && GroupExists($p) - && !UserInGroup($p)) + + my %user; + my %bug; + + # Populate the bug hash with the info we get directly from the DB. + my $query = " + SELECT bugs.bug_id, product, version, rep_platform, + op_sys, bug_status, resolution, priority, + bug_severity, component, assigned_to, reporter, + bug_file_loc, short_desc, target_milestone, + qa_contact, status_whiteboard, + date_format(creation_ts,'%Y-%m-%d %H:%i'), + groupset, delta_ts, sum(votes.count) + FROM bugs LEFT JOIN votes USING(bug_id) + WHERE bugs.bug_id = $id + GROUP BY bugs.bug_id"; + + SendSQL($query); + + my $value; + my @row = FetchSQLData(); + foreach my $field ("bug_id", "product", "version", "rep_platform", + "op_sys", "bug_status", "resolution", "priority", + "bug_severity", "component", "assigned_to", "reporter", + "bug_file_loc", "short_desc", "target_milestone", + "qa_contact", "status_whiteboard", "creation_ts", + "groupset", "delta_ts", "votes") { - # If we're using bug groups to restrict entry on products, and - # this product has a bug group, and the user is not in that - # group, we don't want to include that product in this list. - next; + $value = shift(@row); + $bug{$field} = defined($value) ? $value : ""; } - push(@prodlist, $p); -} - -# The current product is part of the popup, even if new bugs are no longer -# allowed for that product -if (!$seen_currProd) { - push (@prodlist, $bug{'product'}); - @prodlist = sort @prodlist; -} -# If the user has access to multiple products, display a popup, otherwise -# display the current product. + # General arrays of info about the database state + GetVersionTable(); + + # Fiddle the product list. + my $seen_curr_prod; + my @prodlist; + + foreach my $product (@::enterable_products) { + if ($product eq $bug{'product'}) { + # if it's the product the bug is already in, it's ALWAYS in + # the popup, period, whether the user can see it or not, and + # regardless of the disallownew setting. + $seen_curr_prod = 1; + push(@prodlist, $product); + next; + } -if (1 < @prodlist) { - $product_popup = "<SELECT NAME=product>" . - make_options(\@prodlist, $bug{'product'}) . - "</SELECT>"; -} -else { - $product_popup = $bug{'product'} . - "<INPUT TYPE=\"HIDDEN\" NAME=\"product\" VALUE=\"$bug{'product'}\">"; -} + if (Param("usebuggroupsentry") + && GroupExists($product) + && !UserInGroup($product)) + { + # If we're using bug groups to restrict entry on products, and + # this product has a bug group, and the user is not in that + # group, we don't want to include that product in this list. + next; + } -print " -<INPUT TYPE=HIDDEN NAME=\"delta_ts\" VALUE=\"$bug{'delta_ts'}\"> -<INPUT TYPE=HIDDEN NAME=\"longdesclength\" VALUE=\"$longdesclength\"> -<INPUT TYPE=HIDDEN NAME=\"id\" VALUE=$id> - <TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0><TR> - <TD ALIGN=RIGHT><B>Bug#:</B></TD><TD><A HREF=\"" . Param('urlbase') . "show_bug.cgi?id=$bug{'bug_id'}\">$bug{'bug_id'}</A></TD> - <TD> </TD> - <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#rep_platform\">Platform:</A></B></TD> - <TD><SELECT NAME=rep_platform>$platform_popup</SELECT></TD> - <TD> </TD> - <TD ALIGN=RIGHT><B>Reporter:</B></TD><TD>$bug{'reporter'}</TD> -</TR><TR> - <TD ALIGN=RIGHT><B>Product:</B></TD> - <TD>$product_popup</TD> - <TD> </TD> - <TD ALIGN=RIGHT><B>OS:</B></TD> - <TD><SELECT NAME=op_sys>" . - make_options(\@::legal_opsys, $bug{'op_sys'}) . - "</SELECT></TD> - <TD> </TD> - <TD ALIGN=RIGHT NOWRAP><b>Add CC:</b></TD> - <TD><INPUT NAME=newcc SIZE=30 VALUE=\"\"></TD> -</TR><TR> - <TD ALIGN=RIGHT><B><A HREF=\"describecomponents.cgi?product=" . - url_quote($bug{'product'}) . "\">Component:</A></B></TD> - <TD><SELECT NAME=component>$component_popup</SELECT></TD> - <TD> </TD> - <TD ALIGN=RIGHT><B>Version:</B></TD> - <TD><SELECT NAME=version>" . - make_options($::versions{$bug{'product'}}, $bug{'version'}) . - "</SELECT></TD> - <TD> </TD> - <TD ROWSPAN=4 ALIGN=RIGHT VALIGN=TOP><B>CC:</B></TD> - <TD ROWSPAN=4 VALIGN=TOP> $cc_element </TD> -</TR><TR> - <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html\">Status:</A></B></TD> - <TD>$bug{'bug_status'}</TD> - <TD> </TD> - <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#priority\">Priority:</A></B></TD> - <TD><SELECT NAME=priority>$priority_popup</SELECT></TD> - <TD> </TD> -</TR><TR> - <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html\">Resolution:</A></B></TD> - <TD>$bug{'resolution'}</TD> - <TD> </TD> - <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#severity\">Severity:</A></B></TD> - <TD><SELECT NAME=bug_severity>$sev_popup</SELECT></TD> - <TD> </TD> -</TR><TR> - <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#assigned_to\">Assigned To: - </A></B></TD> - <TD>$bug{'assigned_to'}</TD> - <TD> </TD>"; - -if (Param("usetargetmilestone")) { - my $url = ""; - if (defined $::milestoneurl{$bug{'product'}}) { - $url = $::milestoneurl{$bug{'product'}}; + push(@prodlist, $product); } - if ($url eq "") { - $url = "notargetmilestone.html"; - } - if ($bug{'target_milestone'} eq "") { - $bug{'target_milestone'} = " "; - } - print " -<TD ALIGN=RIGHT><A href=\"$url\"><B>Target Milestone:</B></A></TD> -<TD><SELECT NAME=target_milestone>" . - make_options($::target_milestone{$bug{'product'}}, - $bug{'target_milestone'}) . - "</SELECT></TD> - <TD> </TD>"; -} else { print "<TD></TD><TD></TD><TD> </TD>"; } - -print " -</TR>"; - -if (Param("useqacontact")) { - my $name = $bug{'qa_contact'} > 0 ? DBID_to_name($bug{'qa_contact'}) : ""; - print " - <TR> - <TD ALIGN=\"RIGHT\"><B>QA Contact:</B> - <TD COLSPAN=7> - <INPUT NAME=qa_contact VALUE=\"" . - value_quote($name) . - "\" SIZE=60></TD> - </TR>"; -} - - -print " - <TR> - <TD ALIGN=\"RIGHT\">$URL - <TD COLSPAN=7> - <INPUT NAME=bug_file_loc VALUE=\"" . value_quote($bug{'bug_file_loc'}) . "\" SIZE=60></TD> - </TR><TR> - <TD ALIGN=\"RIGHT\"><B>Summary:</B> - <TD COLSPAN=7> - <INPUT NAME=short_desc VALUE=\"" . - value_quote($bug{'short_desc'}) . - "\" SIZE=60></TD> - </TR>"; - -if (Param("usestatuswhiteboard")) { - print " - <TR> - <TD ALIGN=\"RIGHT\"><B>Status Whiteboard:</B> - <TD COLSPAN=7> - <INPUT NAME=status_whiteboard VALUE=\"" . - value_quote($bug{'status_whiteboard'}) . - "\" SIZE=60></TD> - </TR>"; -} -if (@::legal_keywords) { - SendSQL("SELECT keyworddefs.name - FROM keyworddefs, keywords - WHERE keywords.bug_id = $id AND keyworddefs.id = keywords.keywordid - ORDER BY keyworddefs.name"); - my @list; - while (MoreSQLData()) { - push(@list, FetchOneColumn()); + # The current product is part of the popup, even if new bugs are no longer + # allowed for that product + if (!$seen_curr_prod) { + push (@prodlist, $bug{'product'}); + @prodlist = sort @prodlist; } - my $value = value_quote(join(', ', @list)); - print qq{ -<TR> -<TD ALIGN=right><B><A HREF="describekeywords.cgi">Keywords:</A></B> -<TD COLSPAN=7><INPUT NAME="keywords" VALUE="$value" SIZE=60></TD> -</TR> -}; -} -print "</TABLE>\n"; + $vars->{'product'} = \@prodlist; + $vars->{'rep_platform'} = \@::legal_platform; + $vars->{'priority'} = \@::legal_priority; + $vars->{'bug_severity'} = \@::legal_severity; + $vars->{'op_sys'} = \@::legal_opsys; + $vars->{'bug_status'} = \@::legal_bug_status; + + # Hack - this array contains "" for some reason. See bug 106589. + shift @::settable_resolution; + $vars->{'resolution'} = \@::settable_resolution; + + $vars->{'component_'} = $::components{$bug{'product'}}; + $vars->{'version'} = $::versions{$bug{'product'}}; + $vars->{'target_milestone'} = $::target_milestone{$bug{'product'}}; + $bug{'milestoneurl'} = $::milestoneurl{$bug{'product'}} || + "notargetmilestone.html"; + + $vars->{'use_votes'} = $::prodmaxvotes{$bug{'product'}}; + + # Add additional, calculated fields to the bug hash + if (@::legal_keywords) { + $vars->{'use_keywords'} = 1; + + SendSQL("SELECT keyworddefs.name + FROM keyworddefs, keywords + WHERE keywords.bug_id = $id + AND keyworddefs.id = keywords.keywordid + ORDER BY keyworddefs.name"); + my @keywords; + while (MoreSQLData()) { + push(@keywords, FetchOneColumn()); + } + + $bug{'keywords'} = \@keywords; + } -# Display attachments for this bug (if any). -&Attachment::list($id); + # Attachments + $bug{'attachments'} = Attachment::query($id); -sub EmitDependList { - my ($desc, $myfield, $targetfield) = (@_); - print "<th align=right>$desc:</th><td>"; + # Dependencies my @list; - SendSQL("select $targetfield from dependencies where - $myfield = $id order by $targetfield"); + SendSQL("SELECT dependson FROM dependencies WHERE + blocked = $id ORDER BY dependson"); while (MoreSQLData()) { - my ($i) = (FetchSQLData()); + my ($i) = FetchSQLData(); push(@list, $i); - print GetBugLink($i, $i); - print " "; - } - print "</td><td><input name=$targetfield value=\"" . - join(',', @list) . "\"></td>\n"; -} - -if (Param("usedependencies")) { - print "<table><tr>\n"; - EmitDependList("Bug $id depends on", "blocked", "dependson"); - print qq{ -<td rowspan=2><a href="showdependencytree.cgi?id=$id">Show dependency tree</a> -}; - if (Param("webdotbase") ne "") { - print qq{ -<br><a href="showdependencygraph.cgi?id=$id">Show dependency graph</a> -}; } - print "</td></tr><tr>"; - EmitDependList("Bug $id blocks", "dependson", "blocked"); - print "</tr></table>\n"; -} -if ($::prodmaxvotes{$bug{'product'}}) { - print qq{ -<table><tr> -<th><a href="votehelp.html">Votes:</a></th> -<td> -$bug{'votes'} -<a href="showvotes.cgi?bug_id=$id">Show votes for this bug</a> -<a href="showvotes.cgi?voteon=$id">Vote for this bug</a> -</td> -</tr></table> -}; -} + $bug{'dependson'} = \@list; -print " -<br> -<B>Additional Comments:</B> -<BR> -<TEXTAREA WRAP=HARD NAME=comment ROWS=10 COLS=80></TEXTAREA><BR>"; - - -if ($::usergroupset ne '0' || $bug{'groupset'} ne '0') { - SendSQL("select bit, name, description, (bit & $bug{'groupset'} != 0), " . - "(bit & $::usergroupset != 0) from groups where isbuggroup != 0 " . - # Include active groups as well as inactive groups to which - # the bug already belongs. This way the bug can be removed - # from an inactive group but can only be added to active ones. - "and ((isactive = 1 and (bit & $::usergroupset != 0)) or " . - "(bit & $bug{'groupset'} != 0)) " . - "order by description"); - # We only print out a header bit for this section if there are any - # results. - my $groupFound = 0; - my $inAllGroups = 1; + my @list2; + SendSQL("SELECT blocked FROM dependencies WHERE + dependson = $id ORDER BY blocked"); while (MoreSQLData()) { - my ($bit, $name, $description, $ison, $ingroup) = (FetchSQLData()); - # For product groups, we only want to display the checkbox if either - # (1) The bit is already set, or - # (2) The user is in the group, but either: - # (a) The group is a product group for the current product, or - # (b) The group name isn't a product name - # This measns that all product groups will be skipped, but non-product - # bug groups will still be displayed. - if($ison || ($ingroup && (($name eq $bug{'product'}) || - (!defined $::proddesc{$name})))) { - if(!$groupFound) { - print "<br><b>Only users in the selected groups can view this bug:</b><br>\n"; - print "<font size=\"-1\">(Unchecking all boxes makes this a public bug.)</font><br><br>\n"; - $groupFound = 1; - } - if(!$ingroup) { - $inAllGroups = 0; - } - # Modifying this to use checkboxes instead - my $checked = $ison ? " CHECKED" : ""; - my $disabled = $ingroup ? "" : " DISABLED=\"disabled\""; - # indent these a bit - print " "; - print "<input type=checkbox name=\"bit-$bit\" value=1$checked$disabled>\n"; - print "$description<br>\n"; - } - } - if (!$inAllGroups) { - print "<b>Only members of a group can change the visibility of a bug for that group</b><br>"; + my ($i) = FetchSQLData(); + push(@list2, $i); } - # If the bug is restricted to a group, display checkboxes that allow - # the user to set whether or not the reporter - # and cc list can see the bug even if they are not members of all - # groups to which the bug is restricted. - if ( $bug{'groupset'} != 0 ) { - # Determine whether or not the bug is always accessible by the reporter, - # QA contact, and/or users on the cc: list. - SendSQL("SELECT reporter_accessible, cclist_accessible - FROM bugs - WHERE bug_id = $id - "); - my ($reporter_accessible, $cclist_accessible) = FetchSQLData(); - - # Convert boolean data about which roles always have access to the bug - # into "checked" attributes for the HTML checkboxes by which users - # set and change these values. - my $reporter_checked = $reporter_accessible ? " checked" : ""; - my $cclist_checked = $cclist_accessible ? " checked" : ""; - - # Display interface for changing the values. - print qq| - <p> - <b>But users in the roles selected below can always view this bug:</b><br> - <small>(The assignee - |; - if (Param('useqacontact')) { - print " and qa contact"; - } - print qq| can always see a bug, and this does not take effect unless the bug is restricted to at least one group.)</small> - </p> - - <p> - <input type="checkbox" name="reporter_accessible" value="1" $reporter_checked>Reporter - <input type="checkbox" name="cclist_accessible" value="1" $cclist_checked>CC List - </p> - |; - } -} - - - - - -print "<br> -<INPUT TYPE=radio NAME=knob VALUE=none CHECKED> - Leave as <b>$bug{'bug_status'} $bug{'resolution'}</b><br>"; - - -# knum is which knob number we're generating, in javascript terms. - -my $knum = 1; - -my $status = $bug{'bug_status'}; - -# In the below, if the person hasn't logged in ($::userid == 0), then -# we treat them as if they can do anything. That's because we don't -# know why they haven't logged in; it may just be because they don't -# use cookies. Display everything as if they have all the permissions -# in the world; their permissions will get checked when they log in -# and actually try to make the change. - -my $canedit = UserInGroup("editbugs") || ($::userid == 0); -my $canconfirm; - -if ($status eq $::unconfirmedstate) { - $canconfirm = UserInGroup("canconfirm") || ($::userid == 0); - if ($canedit || $canconfirm) { - print "<INPUT TYPE=radio NAME=knob VALUE=confirm>"; - print "Confirm bug (change status to <b>NEW</b>)<br>"; - $knum++; - } -} - -my $movers = Param("movers"); -$movers =~ s/\s?,\s?/|/g; -$movers =~ s/@/\@/g; - -if ($canedit || $::userid == $assignedtoid || - $::userid == $reporterid || $::userid == $qacontactid) { - if (IsOpenedState($status)) { - if ($status ne "ASSIGNED") { - print "<INPUT TYPE=radio NAME=knob VALUE=accept>"; - my $extra = ""; - if ($status eq $::unconfirmedstate && ($canconfirm || $canedit)) { - $extra = "confirm bug, "; + $bug{'blocked'} = \@list2; + + # Groups + if ($::usergroupset ne '0' || $bug{'groupset'} ne '0') { + my $bug_groupset = $bug{'groupset'}; + + SendSQL("SELECT bit, name, description, (bit & $bug_groupset != 0), + (bit & $::usergroupset != 0) FROM groups + WHERE isbuggroup != 0 " . + # Include active groups as well as inactive groups to which + # the bug already belongs. This way the bug can be removed + # from an inactive group but can only be added to active ones. + "AND ((isactive = 1 AND (bit & $::usergroupset != 0)) OR + (bit & $bug_groupset != 0))"); + + my @groups; + $user{'inallgroups'} = 1; + + while (MoreSQLData()) { + my ($bit, $name, $description, $ison, $ingroup) = FetchSQLData(); + # For product groups, we only want to display the checkbox if either + # (1) The bit is already set, or + # (2) The user is in the group, but either: + # (a) The group is a product group for the current product, or + # (b) The group name isn't a product name + # This means that all product groups will be skipped, but + # non-product bug groups will still be displayed. + if($ison || + ($ingroup && (($name eq $bug{'product'}) || + (!defined $::proddesc{$name})))) + { + $user{'inallgroups'} &= $ingroup; + + push (@groups, { "bit" => $bit, + "ison" => $ison, + "ingroup" => $ingroup, + "description" => $description }); } - print "Accept bug (${extra}change status to <b>ASSIGNED</b>)<br>"; - $knum++; - } - if ($bug{'resolution'} ne "") { - print "<INPUT TYPE=radio NAME=knob VALUE=clearresolution>\n"; - print "Clear the resolution (remove the current resolution of\n"; - print "<b>$bug{'resolution'}</b>)<br>\n"; - $knum++; - } - my $resolution_popup = make_options(\@::settable_resolution, - $bug{'resolution'}); - print "<INPUT TYPE=radio NAME=knob VALUE=resolve> - Resolve bug, changing <A HREF=\"bug_status.html\">resolution</A> to - <SELECT NAME=resolution - ONCHANGE=\"document.changeform.knob\[$knum\].checked=true\"> - $resolution_popup</SELECT><br>\n"; - $knum++; - print "<INPUT TYPE=radio NAME=knob VALUE=duplicate> - Resolve bug, mark it as duplicate of bug # - <INPUT NAME=dup_id SIZE=6 ONCHANGE=\"if (this.value != '') {document.changeform.knob\[$knum\].checked=true}\"><br>\n"; - $knum++; - my $assign_element = "<INPUT NAME=\"assigned_to\" SIZE=32 ONCHANGE=\"if ((this.value != ".SqlQuote($bug{'assigned_to_email'}) .") && (this.value != '')) { document.changeform.knob\[$knum\].checked=true; }\" VALUE=\"$bug{'assigned_to_email'}\">"; - - print "<INPUT TYPE=radio NAME=knob VALUE=reassign> - <A HREF=\"bug_status.html#assigned_to\">Reassign</A> bug to - $assign_element - <br>\n"; - if ($status eq $::unconfirmedstate && ($canconfirm || $canedit)) { - print " <INPUT TYPE=checkbox NAME=andconfirm> and confirm bug (change status to <b>NEW</b>)<BR>"; - } - $knum++; - print "<INPUT TYPE=radio NAME=knob VALUE=reassignbycomponent> - Reassign bug to owner "; - if (Param("useqacontact")) { print "and QA contact "; } - print "of selected component<br>\n"; - if ($status eq $::unconfirmedstate && ($canconfirm || $canedit)) { - print " <INPUT TYPE=checkbox NAME=compconfirm> and confirm bug (change status to <b>NEW</b>)<BR>"; - } - $knum++; - } elsif ( Param("move-enabled") && ($bug{'resolution'} eq "MOVED") ) { - if ( (defined $::COOKIE{"Bugzilla_login"}) - && ($::COOKIE{"Bugzilla_login"} =~ /($movers)/) ){ - print "<INPUT TYPE=radio NAME=knob VALUE=reopen> Reopen bug<br>\n"; - $knum++; - if ($status eq "RESOLVED") { - print "<INPUT TYPE=radio NAME=knob VALUE=verify> - Mark bug as <b>VERIFIED</b><br>\n"; - $knum++; - } - if ($status ne "CLOSED") { - print "<INPUT TYPE=radio NAME=knob VALUE=close> - Mark bug as <b>CLOSED</b><br>\n"; - $knum++; - } } - } else { - print "<INPUT TYPE=radio NAME=knob VALUE=reopen> Reopen bug<br>\n"; - $knum++; - if ($status eq "RESOLVED") { - print "<INPUT TYPE=radio NAME=knob VALUE=verify> - Mark bug as <b>VERIFIED</b><br>\n"; - $knum++; - } - if ($status ne "CLOSED") { - print "<INPUT TYPE=radio NAME=knob VALUE=close> - Mark bug as <b>CLOSED</b><br>\n"; - $knum++; + + # If the bug is restricted to a group, display checkboxes that allow + # the user to set whether or not the reporter + # and cc list can see the bug even if they are not members of all + # groups to which the bug is restricted. + if ($bug{'groupset'} != 0) { + $bug{'inagroup'} = 1; + + # Determine whether or not the bug is always accessible by the + # reporter, QA contact, and/or users on the cc: list. + SendSQL("SELECT reporter_accessible, cclist_accessible + FROM bugs + WHERE bug_id = $id + "); + ($bug{'reporter_accessible'}, + $bug{'cclist_accessible'}) = FetchSQLData(); } + + $vars->{'groups'} = \@groups; } -} - -print " -<INPUT TYPE=\"submit\" VALUE=\"Commit\"> -<INPUT TYPE=\"reset\" VALUE=\"Reset\"> -<INPUT TYPE=\"hidden\" name=\"form_name\" VALUE=\"process_bug\"> -<P> -<FONT size=\"+1\"><B> - <A HREF=\"show_activity.cgi?id=$id\">View Bug Activity</A> - | - <A HREF=\"long_list.cgi?buglist=$id\">Format For Printing</A> -</B></FONT> -"; - -if ( Param("move-enabled") && (defined $::COOKIE{"Bugzilla_login"}) && ($::COOKIE{"Bugzilla_login"} =~ /($movers)/) ){ - print " <FONT size=\"+1\"><B> | </B></FONT> " - ."<INPUT TYPE=\"SUBMIT\" NAME=\"action\" VALUE=\"" - . Param("move-button-text") . "\">\n"; -} -print "<BR></FORM>"; - -print qq| -<table><tr><td align=left><B><a name="c0" href="#c0">Description:</a></B></td> -<td align=right width=100%>Opened: $bug{'creation_ts'}</td></tr></table> -<HR> -|; -print $bug{'long_desc'}; -print " -<HR>\n"; + my $movers = Param("movers"); + $user{'canmove'} = Param("move-enabled") + && (defined $::COOKIE{"Bugzilla_login"}) + && ($::COOKIE{"Bugzilla_login"} =~ /\Q$movers\E/); + + # User permissions + + # In the below, if the person hasn't logged in ($::userid == 0), then + # we treat them as if they can do anything. That's because we don't + # know why they haven't logged in; it may just be because they don't + # use cookies. Display everything as if they have all the permissions + # in the world; their permissions will get checked when they log in + # and actually try to make the change. + $user{'canedit'} = $::userid == 0 + || $::userid == $bug{'reporter'} + || $::userid == $bug{'qa_contact'} + || $::userid == $bug{'assigned_to'} + || UserInGroup("editbugs"); + $user{'canconfirm'} = ($::userid == 0) || UserInGroup("canconfirm"); + + # Bug states + $bug{'isunconfirmed'} = ($bug{'bug_status'} eq $::unconfirmedstate); + $bug{'isopened'} = IsOpenedState($bug{'bug_status'}); + + # People involved with the bug + $bug{'assigned_to_email'} = DBID_to_name($bug{'assigned_to'}); + $bug{'assigned_to'} = DBID_to_real_or_loginname($bug{'assigned_to'}); + $bug{'reporter'} = DBID_to_real_or_loginname($bug{'reporter'}); + $bug{'qa_contact'} = $bug{'qa_contact'} > 0 ? + DBID_to_name($bug{'qa_contact'}) : ""; + + my $ccset = new RelationSet; + $ccset->mergeFromDB("SELECT who FROM cc WHERE bug_id=$id"); + + my @cc = $ccset->toArrayOfStrings(); + $bug{'cc'} = \@cc if $cc[0]; + + # Next bug in list (if there is one) + if ($::COOKIE{"BUGLIST"} && $id) + { + my @bug_list = split(/:/, $::COOKIE{"BUGLIST"}); + $vars->{'bug_list'} = \@bug_list; + } -# To add back option of editing the long description, insert after the above -# long_list.cgi line: -# <A HREF=\"edit_desc.cgi?id=$id\">Edit Long Description</A> + $bug{'comments'} = GetComments($bug{'bug_id'}); -navigation_header(); + # This is length in number of comments + $bug{'longdesclength'} = scalar(@{$bug{'comments'}}); -PutFooter(); + # Add the bug and user hashes to the variables + $vars->{'bug'} = \%bug; + $vars->{'user'} = \%user; + # Generate and return the UI (HTML page) from the appropriate template. + $template->process("show/show_bug.html.tmpl", $vars) + || DisplayError("Template process failed: " . $template->error()) + && exit; +} + 1; |