enter_bug.cgi 16 KB
Newer Older
1 2
#!/usr/bonsaitools/bin/perl -w
# -*- Mode: perl; indent-tabs-mode: nil -*-
terry%netscape.com's avatar
terry%netscape.com committed
3
#
4 5 6 7 8 9 10 11 12 13
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
terry%netscape.com's avatar
terry%netscape.com committed
14
# The Original Code is the Bugzilla Bug Tracking System.
15
# 
terry%netscape.com's avatar
terry%netscape.com committed
16
# The Initial Developer of the Original Code is Netscape Communications
17 18 19
# Corporation. Portions created by Netscape are Copyright (C) 1998
# Netscape Communications Corporation. All Rights Reserved.
# 
terry%netscape.com's avatar
terry%netscape.com committed
20
# Contributor(s): Terry Weissman <terry@mozilla.org>
21
#                 Dave Miller <justdave@syndicomm.com>
22
#                 Joe Robins <jmrobins@tgix.com>
terry%netscape.com's avatar
terry%netscape.com committed
23

24 25 26 27 28 29 30 31 32 33 34

########################################################################
#
# enter_bug.cgi
# -------------
# Displays bug entry form. Bug fields are specified through popup menus, 
# drop-down lists, or text fields. Default for these values can be passed
# in as parameters to the cgi.
#
########################################################################

35 36
use diagnostics;
use strict;
terry%netscape.com's avatar
terry%netscape.com committed
37

38
require "CGI.pl";
39

40 41 42 43 44 45 46 47 48 49 50
# Shut up misguided -w warnings about "used only once".  "use vars" just
# doesn't work for me.

sub sillyness {
    my $zz;
    $zz = $::unconfirmedstate;
    $zz = @::legal_opsys;
    $zz = @::legal_platform;
    $zz = @::legal_priority;
    $zz = @::legal_severity;
}
51

52 53 54 55 56 57 58 59 60
# I've moved the call to confirm_login up to here, since if we're using bug
# groups to restrict bug entry, we need to know who the user is right from
# the start.  If that parameter is turned off, there's still no harm done in
# doing it now instead of a bit later.  -JMR, 2/18/00
# Except that it will cause people without cookies enabled to have to log
# in an extra time.  Only do it here if we really need to.  -terry, 3/10/00
if (Param("usebuggroupsentry")) {
    confirm_login();
}
61 62 63

if (!defined $::FORM{'product'}) {
    GetVersionTable();
64 65 66 67 68 69 70 71
    my @prodlist;
    foreach my $p (sort(keys %::versions)) {
        if (defined $::proddesc{$p} && $::proddesc{$p} eq '0') {
            # Special hack.  If we stuffed a "0" into proddesc, that means
            # that disallownew was set for this bug, and so we don't want
            # to allow people to specify that product here.
            next;
        }
72 73 74 75 76 77 78 79
        if(Param("usebuggroupsentry")
           && GroupExists($p)
           && !UserInGroup($p)) {
          # 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;
        }
80 81 82
        push(@prodlist, $p);
    }
    if (1 != @prodlist) {
83 84
        print "Content-type: text/html\n\n";
        PutHeader("Enter Bug");
85
        
86 87
        print "<H2>First, you must pick a product on which to enter\n";
        print "a bug.</H2>\n";
88
        print "<table>";
89
        foreach my $p (@prodlist) {
90 91 92 93 94 95
            if (defined $::proddesc{$p} && $::proddesc{$p} eq '0') {
                # Special hack.  If we stuffed a "0" into proddesc, that means
                # that disallownew was set for this bug, and so we don't want
                # to allow people to specify that product here.
                next;
            }
96 97 98 99 100 101 102 103
            if(Param("usebuggroupsentry")
               && GroupExists($p)
               && !UserInGroup($p)) {
                # 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;
            }
104
            print "<tr><th align=right valign=top><a href=\"enter_bug.cgi?product=" . url_quote($p) . "\">$p</a>:</th>\n";
105
            if (defined $::proddesc{$p}) {
106
                print "<td valign=top>$::proddesc{$p}</td>\n";
107 108
            }
            print "</tr>";
109
        }
110
        print "</table>\n";
111
        PutFooter();
112
        exit;
113
    }
114
    $::FORM{'product'} = $prodlist[0];
115 116
}

117
my $product = $::FORM{'product'};
terry%netscape.com's avatar
terry%netscape.com committed
118

119
confirm_login();
terry%netscape.com's avatar
terry%netscape.com committed
120

121
print "Content-type: text/html\n\n";
terry%netscape.com's avatar
terry%netscape.com committed
122

123 124 125 126 127 128 129 130 131 132
sub formvalue {
    my ($name, $default) = (@_);
    if (exists $::FORM{$name}) {
        return $::FORM{$name};
    }
    if (defined $default) {
        return $default;
    }
    return "";
}
terry%netscape.com's avatar
terry%netscape.com committed
133

134 135 136 137
sub pickplatform {
    my $value = formvalue("rep_platform");
    if ($value ne "") {
        return $value;
terry%netscape.com's avatar
terry%netscape.com committed
138
    }
139
    if ( Param('usebrowserinfo') ) {
140 141 142 143
        for ($ENV{'HTTP_USER_AGENT'}) {
            /Mozilla.*\(Windows/ && do {return "PC";};
            /Mozilla.*\(Macintosh/ && do {return "Macintosh";};
            /Mozilla.*\(Win/ && do {return "PC";};
144
	    /Mozilla.*Windows NT/ && do {return "PC";};
145 146 147 148 149 150
            /Mozilla.*Linux.*86/ && do {return "PC";};
            /Mozilla.*Linux.*alpha/ && do {return "DEC";};
            /Mozilla.*OSF/ && do {return "DEC";};
            /Mozilla.*HP-UX/ && do {return "HP";};
            /Mozilla.*IRIX/ && do {return "SGI";};
            /Mozilla.*(SunOS|Solaris)/ && do {return "Sun";};
151
        }
terry%netscape.com's avatar
terry%netscape.com committed
152
    }
153 154
    # default
    return "Other";
terry%netscape.com's avatar
terry%netscape.com committed
155 156
}

157

terry%netscape.com's avatar
terry%netscape.com committed
158

159 160
sub pickversion {
    my $version = formvalue('version');
161 162

    if ( Param('usebrowserinfo') ) {
163 164 165 166
        if ($version eq "") {
            if ($ENV{'HTTP_USER_AGENT'} =~ m@Mozilla[ /]([^ ]*)@) {
                $version = $1;
            }
terry%netscape.com's avatar
terry%netscape.com committed
167 168 169
        }
    }
    
170 171
    if (lsearch($::versions{$product}, $version) >= 0) {
        return $version;
terry%netscape.com's avatar
terry%netscape.com committed
172
    } else {
173 174 175 176
        if (defined $::COOKIE{"VERSION-$product"}) {
            if (lsearch($::versions{$product},
                        $::COOKIE{"VERSION-$product"}) >= 0) {
                return $::COOKIE{"VERSION-$product"};
terry%netscape.com's avatar
terry%netscape.com committed
177 178 179
            }
        }
    }
180
    return $::versions{$product}->[0];
terry%netscape.com's avatar
terry%netscape.com committed
181 182 183
}


184 185 186 187
sub pickcomponent {
    my $result =formvalue('component');
    if ($result ne "" && lsearch($::components{$product}, $result) < 0) {
        $result = "";
terry%netscape.com's avatar
terry%netscape.com committed
188
    }
189
    return $result;
terry%netscape.com's avatar
terry%netscape.com committed
190 191 192
}


193 194 195
sub pickos {
    if (formvalue('op_sys') ne "") {
        return formvalue('op_sys');
terry%netscape.com's avatar
terry%netscape.com committed
196
    }
197
    if ( Param('usebrowserinfo') ) {
198 199 200 201 202
        for ($ENV{'HTTP_USER_AGENT'}) {
            /Mozilla.*\(.*;.*; IRIX.*\)/    && do {return "IRIX";};
            /Mozilla.*\(.*;.*; 32bit.*\)/   && do {return "Windows 95";};
            /Mozilla.*\(.*;.*; 16bit.*\)/   && do {return "Windows 3.1";};
            /Mozilla.*\(.*;.*; 68K.*\)/     && do {return "Mac System 8.5";};
203
            /Mozilla.*\(.*;.*; PPC.*\)/     && do {return "Mac System 8.5";};
204 205 206 207 208 209 210
            /Mozilla.*\(.*;.*; OSF.*\)/     && do {return "OSF/1";};
            /Mozilla.*\(.*;.*; Linux.*\)/   && do {return "Linux";};
            /Mozilla.*\(.*;.*; SunOS 5.*\)/ && do {return "Solaris";};
            /Mozilla.*\(.*;.*; SunOS.*\)/   && do {return "SunOS";};
            /Mozilla.*\(.*;.*; SunOS.*\)/   && do {return "SunOS";};
            /Mozilla.*\(.*;.*; BSD\/OS.*\)/ && do {return "BSDI";};
            /Mozilla.*\(Win16.*\)/          && do {return "Windows 3.1";};
211
            /Mozilla.*\(.*Win95.*\)/        && do {return "Windows 95";};
terry%mozilla.org's avatar
terry%mozilla.org committed
212
            /Mozilla.*\(Win98.*\)/          && do {return "Windows 98";};
213
            /Mozilla.*\(WinNT.*\)/          && do {return "Windows NT";};
214
            /Mozilla.*Windows NT 5.*\)/     && do {return "Windows 2000";};
215
            /Mozilla.*\(Windows.*NT/        && do {return "Windows NT";};
216
        }
terry%netscape.com's avatar
terry%netscape.com committed
217
    }
218 219
    # default
    return "other";
terry%netscape.com's avatar
terry%netscape.com committed
220 221 222
}


223
GetVersionTable();
terry%netscape.com's avatar
terry%netscape.com committed
224

225 226
my $assign_element = GeneratePersonInput('assigned_to', 1,
                                         formvalue('assigned_to'));
227
my $cc_element = GeneratePeopleInput('cc', formvalue('cc'));
terry%netscape.com's avatar
terry%netscape.com committed
228 229


230 231
my $priority = Param('defaultpriority');

232
my $priority_popup = make_popup('priority', \@::legal_priority,
233
                                formvalue('priority', $priority), 0);
234 235 236 237 238
my $sev_popup = make_popup('bug_severity', \@::legal_severity,
                           formvalue('bug_severity', 'normal'), 0);
my $platform_popup = make_popup('rep_platform', \@::legal_platform,
                                pickplatform(), 0);
my $opsys_popup = make_popup('op_sys', \@::legal_opsys, pickos(), 0);
terry%netscape.com's avatar
terry%netscape.com committed
239

240 241 242 243 244 245 246 247 248
if (0 == $::components{$product}) {
	print "<H1>Permission Denied</H1>\n";
	print "Sorry.  You need to have at least one component for this product\n";
	print "in order to create a new bug.  Go to the \"Components\" link to create\n";
	print "a new component\n";
	print "<P>\n";
	PutFooter();
	exit;
} elsif (1 == @{$::components{$product}}) {
249 250 251 252
    # Only one component; just pick it.
    $::FORM{'component'} = $::components{$product}->[0];
}

253 254
my $component_popup = make_popup('component', $::components{$product},
                                 formvalue('component'), 1);
terry%netscape.com's avatar
terry%netscape.com committed
255

256
PutHeader ("Enter Bug","Enter Bug","This page lets you enter a new bug into Bugzilla.");
terry%netscape.com's avatar
terry%netscape.com committed
257

258 259 260
# Modified, -JMR, 2/24,00
# If the usebuggroupsentry parameter is set, we need to check and make sure
# that the user has permission to enter a bug against this product.
261 262 263 264 265 266 267 268 269 270 271
# Modified, -DDM, 3/11/00
# added GroupExists check so we don't choke on a groupless product
if(Param("usebuggroupsentry")
   && GroupExists($product)
   && !UserInGroup($product)) {
  print "<H1>Permission denied.</H1>\n";
  print "Sorry; you do not have the permissions necessary to enter\n";
  print "a bug against this product.\n";
  print "<P>\n";
  PutFooter();
  exit;
272 273 274 275 276 277 278 279 280 281 282 283
}

# Modified, -JMR, 2/18/00
# I'm putting in a select box in order to select whether to restrict this bug to
# the product's bug group or not, if the usebuggroups parameter is set, and if
# this product has a bug group.  This box will default to selected, but can be
# turned off if this bug should be world-viewable for some reason.
#
# To do this, I need to (1) get the bit and description for the bug group from
# the database, (2) insert the select box in the giant print statements below,
# and (3) update post_bug.cgi to process the additional input field.

284 285 286 287
# Modified, -DDM, 3/11/00
# Only need the bit here, and not the description.  Description is gotten
# when the select boxes for all the groups this user has access to are read
# in later on.
288 289 290
# First we get the bit and description for the group.
my $group_bit=0;
if(Param("usebuggroups") && GroupExists($product)) {
291
    SendSQL("select bit from groups ".
292 293
            "where name = ".SqlQuote($product)." ".
            "and isbuggroup != 0");
294
    ($group_bit) = FetchSQLData();
295 296
}

297
print "
298 299
<FORM METHOD=POST ACTION=\"post_bug.cgi\">
<INPUT TYPE=HIDDEN NAME=reporter VALUE=\"$::COOKIE{'Bugzilla_login'}\">
300
<INPUT TYPE=HIDDEN NAME=product VALUE=\""  . value_quote($product) . "\">
301 302 303 304 305 306 307 308 309 310 311 312 313 314
  <TABLE CELLSPACING=2 CELLPADDING=0 BORDER=0>";

if (Param("entryheaderhtml")){
  print "
  <TR>
    <td></td>
    <td colspan=3>" .
  Param("entryheaderhtml") . "\n" .
  " </td> 
  </TR>
  <TR><td><br></td></TR>";
}

print "
terry%netscape.com's avatar
terry%netscape.com committed
315
  <TR>
316 317
    <td ALIGN=right valign=top><B>Reporter:</B></td>
    <td valign=top>$::COOKIE{'Bugzilla_login'}</td>
terry%netscape.com's avatar
terry%netscape.com committed
318
    <td ALIGN=right valign=top><B>Product:</B></td>
319 320 321
    <td valign=top>$product</td>
  </TR>
  <TR>
terry%netscape.com's avatar
terry%netscape.com committed
322
    <td ALIGN=right valign=top><B>Version:</B></td>
323
    <td>" . Version_element(pickversion(), $product) . "</td>
324
    <td align=right valign=top><b><a href=\"describecomponents.cgi?product=" .
325
    url_quote($product) . "\">Component:</a></b></td>
terry%netscape.com's avatar
terry%netscape.com committed
326 327 328 329
    <td>$component_popup</td>
  </TR>
  <tr><td>&nbsp<td> <td> <td> <td> <td> </tr>
  <TR>
330
    <td align=right><B><A HREF=\"bug_status.html#rep_platform\">Platform:</A></B></td>
terry%netscape.com's avatar
terry%netscape.com committed
331
    <TD>$platform_popup</TD>
332
    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#op_sys\">OS:</A></B></TD>
terry%netscape.com's avatar
terry%netscape.com committed
333 334 335 336 337
    <TD>$opsys_popup</TD>
    <td align=right valign=top></td>
    <td rowspan=3></td>
    <td></td>
  </TR>
338 339 340
  <TR>";
if (Param('letsubmitterchoosepriority')) {
    print "
341
    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#priority\">Resolution<br>Priority</A>:</B></TD>
342 343 344 345 346 347
    <TD>$priority_popup</TD>";
} else {
    print '<INPUT TYPE=HIDDEN NAME=priority VALUE="' .
        value_quote($priority) . '">';
}
print "
348
    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#severity\">Severity:</A></B></TD>
terry%netscape.com's avatar
terry%netscape.com committed
349 350 351 352 353
    <TD>$sev_popup</TD>
    <td></td>
    <td></td>
  </TR>
  <tr><td>&nbsp<td> <td> <td> <td> <td> </tr>
354 355
";

356
if (UserInGroup("editbugs") || UserInGroup("canconfirm")) {
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373
    SendSQL("SELECT votestoconfirm FROM products WHERE product = " .
            SqlQuote($product));
    if (FetchOneColumn()) {
        print qq{
  <TR>
    <TD ALIGN="right"><B><A HREF="bug_status.html#status">Initial state:</B></A></TD>
    <TD COLSPAN="5">
};
        print BuildPulldown("bug_status",
                            [[$::unconfirmedstate], ["NEW"]],
                            "NEW");
        print "</TD></TR>";
    }
}


print "
terry%netscape.com's avatar
terry%netscape.com committed
374
  <tr>
375
    <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#assigned_to\">Assigned To:</A></B></TD>
terry%netscape.com's avatar
terry%netscape.com committed
376
    <TD colspan=5>$assign_element
377
    (Leave blank to assign to default component owner)</td>
terry%netscape.com's avatar
terry%netscape.com committed
378 379
  </tr>
  <tr>
380
    <TD ALIGN=RIGHT><B>Cc:</B></TD>
terry%netscape.com's avatar
terry%netscape.com committed
381 382 383 384 385 386
    <TD colspan=5>$cc_element</TD>
  </tr>
  <tr><td>&nbsp<td> <td> <td> <td> <td> </tr>
  <TR>
    <TD ALIGN=RIGHT><B>URL:</B>
    <TD COLSPAN=5>
387
      <INPUT NAME=bug_file_loc SIZE=60 value=\"http://" .
388 389
    value_quote(formvalue('bug_file_loc')) .
    "\"></TD>
terry%netscape.com's avatar
terry%netscape.com committed
390 391 392 393
  </TR>
  <TR>
    <TD ALIGN=RIGHT><B>Summary:</B>
    <TD COLSPAN=5>
394 395 396
      <INPUT NAME=short_desc SIZE=60 value=\"" .
    value_quote(formvalue('short_desc')) .
    "\"></TD>
terry%netscape.com's avatar
terry%netscape.com committed
397
  </TR>
398 399
  <tr><td align=right valign=top><B>Description:</b></td>
<!--  </tr> <tr> -->
400 401 402
    <td colspan=5><TEXTAREA WRAP=HARD NAME=comment ROWS=10 COLS=80>" .
    value_quote(formvalue('comment')) .
    "</TEXTAREA><BR></td>
403 404 405
  </tr>";

print "
406 407 408 409 410 411 412
  <tr>
   <td></td><td colspan=5>
";

if ($::usergroupset ne '0') {
    SendSQL("SELECT bit, description FROM groups " .
            "WHERE bit & $::usergroupset != 0 " .
413
            "  AND isbuggroup != 0 ORDER BY description");
414 415
     while (MoreSQLData()) {
        my ($bit, $description) = (FetchSQLData());
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431
        # Rather than waste time with another Param check and another database
        # access, $group_bit will only have a non-zero value if we're using
        # bug groups and have  one for this product, so I'll check on that
        # instead here.  -JMR, 2/18/00
        # Moved this check to this location to fix conflict with existing
        # select-box patch.  Also, if $group_bit is 0, it won't match the
        # current group, either, so I'll compare it to the current bit
        # instead of checking for non-zero. -DDM, 3/11/00
        my $check = 0; # default selection
        if($group_bit == $bit) {
            # In addition, we need to handle the possibility that we're coming
            # from a bookmark template.  We'll simply check if we've got a
            # parameter called bit-# passed.  If so, then we're coming from a
            # template, and we'll use the template value.
            $check = formvalue("bit-$bit","1");
        }
432 433 434 435 436
        print BuildPulldown("bit-$bit",
                            [["0",
                             "People not in the \"$description\" group can see this bug"],
                             ["1",
                              "Only people in the \"$description\" group can see this bug"]],
437
                            $check);
438 439 440 441 442 443 444
        print "<BR>\n";
    }
}

print "
   </td>
  </tr>
terry%netscape.com's avatar
terry%netscape.com committed
445 446 447
  <tr>
    <td></td>
    <td colspan=5>
448
       <INPUT TYPE=\"submit\" VALUE=\"    Commit    \" ONCLICK=\"if (this.form.short_desc.value =='') { alert('Please enter a summary sentence for this bug.'); return false; }\">
terry%netscape.com's avatar
terry%netscape.com committed
449 450 451 452 453
       &nbsp;&nbsp;&nbsp;&nbsp;
       <INPUT TYPE=\"reset\" VALUE=\"Reset\">
       &nbsp;&nbsp;&nbsp;&nbsp;
       <INPUT TYPE=\"submit\" NAME=maketemplate VALUE=\"Remember values as bookmarkable template\">
    </td>
454 455 456 457 458 459 460 461 462 463 464 465 466 467 468
  </tr>";

if ( Param('usebrowserinfo') ) {
    print "
  <tr>
    <td></td>
    <td colspan=3>
     <br>
     Some fields initialized from your user-agent, 
     <b>$ENV{'HTTP_USER_AGENT'}</b>.  If you think it got it wrong, 
     please tell " . Param('maintainer') . " what it should have been.
    </td>
  </tr>";
}
print "
terry%netscape.com's avatar
terry%netscape.com committed
469 470
  </TABLE>
  <INPUT TYPE=hidden name=form_name VALUE=enter_bug>
471
</FORM>\n";
terry%netscape.com's avatar
terry%netscape.com committed
472

473 474
PutFooter();

475
print "</BODY></HTML>\n";
terry%netscape.com's avatar
terry%netscape.com committed
476