\n"; + PutFooter(); + exit; +} + +my $action = trim($::FORM{action} || ''); + +# TestGroup: check if the group name exists +sub TestGroup ($) +{ + my $group = shift; + + # does the group exist? + SendSQL("SELECT name + FROM groups + WHERE name=" . SqlQuote($group)); + return FetchOneColumn(); +} + +sub ShowError ($) +{ + my $msgtext = shift; + print "
"; + print "$msgtext"; + print " |
"; + return 1; +} + +# +# Displays a text like "a.", "a or b.", "a, b or c.", "a, b, c or d." +# + +sub PutTrailer (@) +{ + my (@links) = ("Back to the Main Bugs Page", @_); + + my $count = $#links; + my $num = 0; + print "
\n"; + foreach (@links) { + print $_; + if ($num == $count) { + print ".\n"; + } + elsif ($num == $count-1) { + print " or "; + } + else { + print ", "; + } + $num++; + } + PutFooter(); +} + +# +# action='' -> No action specified, get a list. +# + +unless ($action) { + PutHeader("Edit Groups","Edit Groups","This lets you edit the groups available to put users in."); + + print "
\n"; + + print ""; + print "Name is what is used with the UserInGroup() function in any +customized cgi files you write that use a given group. It can also be used by +people submitting bugs by email to limit a bug to a certain groupset. It +may not contain any spaces.
"; + print "Description is what will be shown in the bug reports to +members of the group where they can choose whether the bug will be restricted +to others in the same group.
"; + print "User RegExp is optional, and if filled in, will automatically +grant membership to this group to anyone creating a new account with an +email address that matches this regular expression.
"; + print "In addition, the following groups that determine user privileges +exist. You can not edit these, but you need to know they are here, because +you can't duplicate the Names of any of them in your user groups either.
"; + + print "
Bit | "; + print "Name | "; + print "Description | "; + print "
---|---|---|
$bit | \n"; + print "$name | \n"; + print "$desc | \n"; + print "
\n"; + + PutFooter(); + exit; +} + +# +# action='add' -> present form for parameters for new group +# +# (next action will be 'new') +# + +if ($action eq 'add') { + PutHeader("Add group"); + + print "
"; + + print ""; + print "Name is what is used with the UserInGroup() function in any +customized cgi files you write that use a given group. It can also be used by +people submitting bugs by email to limit a bug to a certain groupset. It +may not contain any spaces.
"; + print "Description is what will be shown in the bug reports to +members of the group where they can choose whether the bug will be restricted +to others in the same group.
"; + print "User RegExp is optional, and if filled in, will automatically +grant membership to this group to anyone creating a new account with an +email address that matches this regular expression.
";
+
+ PutTrailer("Back to the group list");
+ exit;
+}
+
+
+
+#
+# action='new' -> add group entered in the 'action=add' screen
+#
+
+if ($action eq 'new') {
+ PutHeader("Adding new group");
+
+ # Cleanups and valididy checks
+ my $name = trim($::FORM{name} || '');
+ my $desc = trim($::FORM{desc} || '');
+ my $regexp = trim($::FORM{regexp} || '');
+
+ unless ($name) {
+ ShowError("You must enter a name for the new group.
" .
+ "Please click the Back button and try again.");
+ PutFooter();
+ exit;
+ }
+ unless ($desc) {
+ ShowError("You must enter a description for the new group.
" .
+ "Please click the Back button and try again.");
+ PutFooter();
+ exit;
+ }
+ if (TestGroup($name)) {
+ ShowError("The group '" . $name . "' already exists.
" .
+ "Please click the Back button and try again.");
+ PutFooter();
+ exit;
+ }
+
+ # Major hack for bit values... perl can't handle 64-bit ints, so I can't
+ # just do the math to get the next available bit number, gotta handle
+ # them as strings... also, we're actually only going to allow 63 bits
+ # because that's all that opblessgroupset masks for (the high bit is off
+ # to avoid signing issues).
+
+ my @bitvals = ('1','2','4','8','16','32','64','128','256','512','1024',
+ '2048','4096','8192','16384','32768',
+
+ '65535','131072','262144','524288','1048576','2097152',
+ '4194304','8388608','16777216','33554432','67108864',
+ '134217728','268435456','536870912','1073741824',
+ '2147483648',
+
+ '4294967296','8589934592','17179869184','34359738368',
+ '68719476736','137438953472','274877906944',
+ '549755813888','1099511627776','2199023255552',
+ '4398046511104','8796093022208','17592186044416',
+ '35184372088832','70368744177664','140737488355328',
+
+ '281474976710656','562949953421312','1125899906842624',
+ '2251799813685248','4503599627370496','9007199254740992',
+ '18014398509481984','36028797018963968','72057594037927936',
+ '144115188075855872','288230376151711744',
+ '576460752303423488','1152921504606846976',
+ '2305843009213693958','4611686018427387916');
+
+ # First the next available bit
+ my $bit = "";
+ foreach (@bitvals) {
+ if ($bit == "") {
+ SendSQL("SELECT bit FROM groups WHERE bit=" . SqlQuote($_));
+ if (!FetchOneColumn()) { $bit = $_; }
+ }
+ }
+ if ($bit == "") {
+ ShowError("Sorry, you already have the maximum number of groups " .
+ "defined.
You must delete a group first before you " .
+ "can add any more.");
+ PutTrailer("Back to the group list");
+ exit;
+ }
+
+ # Add the new group
+ SendSQL("INSERT INTO groups ( " .
+ "bit, name, description, isbuggroup, userregexp" .
+ " ) VALUES ( " .
+ $bit . "," .
+ SqlQuote($name) . "," .
+ SqlQuote($desc) . "," .
+ "1," .
+ SqlQuote($regexp) . ")" );
+
+ print "OK, done.
\n"; + print "Your new group was assigned bit #$bit.
";
+ PutTrailer("Add another group",
+ "Back to the group list");
+ exit;
+}
+
+#
+# action='del' -> ask if user really wants to delete
+#
+# (next action would be 'delete')
+#
+
+if ($action eq 'del') {
+ PutHeader("Delete group");
+ my $bit = trim($::FORM{group} || '');
+ unless ($bit) {
+ ShowError("No group specified.
" .
+ "Click the Back button and try again.");
+ PutFooter();
+ exit;
+ }
+ SendSQL("SELECT bit FROM groups WHERE bit=" . SqlQuote($bit));
+ if (!FetchOneColumn()) {
+ ShowError("That group doesn't exist.
" .
+ "Click the Back button and try again.");
+ PutFooter();
+ exit;
+ }
+ SendSQL("SELECT name,description " .
+ "FROM groups " .
+ "WHERE bit = " . SqlQuote($bit));
+
+ my ($name, $desc) = FetchSQLData();
+ print "
Bit | "; + print "Name | "; + print "Description | "; + print "
---|---|---|
$bit | \n"; + print "$name | \n"; + print "$desc | \n"; + print "
Do you really want to delete this group?
\n"; + + print "
"; + + PutTrailer("No, go back to the group list"); + exit; +} + +# +# action='delete' -> really delete the group +# + +if ($action eq 'delete') { + PutHeader("Deleting user"); + ShowError("This function has not been implemented yet! (Sorry)+
+Deleting a group will be implemented very shortly, stay tuned! +I just figured most people would be more interested in adding and editing +groups for the time being, so I would get that done first, so I could get this out here for people to use. :)
+Watch Bug 25010 on Mozilla's bugzilla for details. +
+";
+
+ PutTrailer("Back to group list");
+ exit;
+}
+
+#
+# action='update' -> update the groups
+#
+
+if ($action eq 'update') {
+ PutHeader("Updating groups");
+
+ my $chgs = 0;
+
+ foreach my $b (grep(/^name-\d*$/, keys %::FORM)) {
+ if ($::FORM{$b}) {
+ my $v = substr($b, 5);
+
+# print "Old: '" . $::FORM{"oldname-$v"} . "', '" . $::FORM{"olddesc-$v"} .
+# "', '" . $::FORM{"oldregexp-$v"} . "'
";
+# print "New: '" . $::FORM{"name-$v"} . "', '" . $::FORM{"desc-$v"} .
+# "', '" . $::FORM{"regexp-$v"} . "'
";
+
+ if ($::FORM{"oldname-$v"} ne $::FORM{"name-$v"}) {
+ $chgs = 1;
+ SendSQL("SELECT name FROM groups WHERE name=" .
+ SqlQuote($::FORM{"name-$v"}));
+ if (!FetchOneColumn()) {
+ SendSQL("UPDATE groups SET name=" .
+ SqlQuote($::FORM{"name-$v"}) .
+ " WHERE bit=" . SqlQuote($v));
+ print "Group $v name updated.
\n";
+ } else {
+ ShowError("Duplicate name '" . $::FORM{"name-$v"} .
+ "' specified for group $v.
" .
+ "Update of group $v name skipped.");
+ }
+ }
+ if ($::FORM{"olddesc-$v"} ne $::FORM{"desc-$v"}) {
+ $chgs = 1;
+ SendSQL("SELECT description FROM groups WHERE description=" .
+ SqlQuote($::FORM{"desc-$v"}));
+ if (!FetchOneColumn()) {
+ SendSQL("UPDATE groups SET description=" .
+ SqlQuote($::FORM{"desc-$v"}) .
+ " WHERE bit=" . SqlQuote($v));
+ print "Group $v description updated.
\n";
+ } else {
+ ShowError("Duplicate description '" . $::FORM{"desc-$v"} .
+ "' specified for group $v.
" .
+ "Update of group $v description skipped.");
+ }
+ }
+ if ($::FORM{"oldregexp-$v"} ne $::FORM{"regexp-$v"}) {
+ $chgs = 1;
+ SendSQL("UPDATE groups SET userregexp=" .
+ SqlQuote($::FORM{"regexp-$v"}) .
+ " WHERE bit=" . SqlQuote($v));
+ print "Group $v user regexp updated.
\n";
+ }
+ }
+ }
+ if (!$chgs) {
+ print "You didn't change anything!
\n";
+ print "If you really meant it, hit the Back button and try again.
\n"; + } else { + print "Done.
\n";
+ }
+ PutTrailer("Back to the group list");
+ exit;
+}
+
+#
+# No valid action found
+#
+
+PutHeader("Error");
+print "I don't have a clue what you want.
\n";
+
+foreach ( sort keys %::FORM) {
+ print "$_: $::FORM{$_}
\n";
+}
+
+PutTrailer("Try the group list");
diff --git a/enter_bug.cgi b/enter_bug.cgi
index f89f2f436..086372d23 100755
--- a/enter_bug.cgi
+++ b/enter_bug.cgi
@@ -250,15 +250,17 @@ PutHeader ("Enter Bug","Enter Bug","This page lets you enter a new bug into Bugz
# 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.
-if(Param("usebuggroupsentry")) {
- if(!UserInGroup($product)) {
- print "
\n"; - PutFooter(); - exit; - } +# 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 "
\n";
+ PutFooter();
+ exit;
}
# Modified, -JMR, 2/18/00
@@ -271,14 +273,17 @@ if(Param("usebuggroupsentry")) {
# 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.
+# 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.
# First we get the bit and description for the group.
my $group_bit=0;
-my $group_desc;
if(Param("usebuggroups") && GroupExists($product)) {
- SendSQL("select bit, description from groups ".
+ SendSQL("select bit from groups ".
"where name = ".SqlQuote($product)." ".
"and isbuggroup != 0");
- ($group_bit, $group_desc) = FetchSQLData();
+ ($group_bit) = FetchSQLData();
}
print "
@@ -388,33 +393,6 @@ print "
value_quote(formvalue('comment')) .
"
";
-# In between the Description field and the Submit buttons, we'll put in the
-# select box for the bug group, if necessary.
-# 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
-if($group_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
- # groupset passed with a value other than the current bit. If so, then we're
- # coming from a template, and we don't have group_bit set, so turn it off.
- my $check0 = (formvalue("groupset",$group_bit) == $group_bit) ? "" : " SELECTED";
- my $check1 = ($check0 eq "") ? " SELECTED" : "";
- print "
-