Bug 289372: Remove %FORM from editflagtypes.cgi - Patch by Teemu Mannermaa <wicked@etlicon.fi> r=LpSolit a=myk

This commit is contained in:
lpsolit%gmail.com 2005-04-09 23:12:11 +00:00
parent 4eb17107f9
commit 776c625d1d

View File

@ -50,6 +50,7 @@ UserInGroup("editcomponents")
# Suppress "used only once" warnings.
use vars qw(@legal_product @legal_components %components);
my $cgi = Bugzilla->cgi;
my $product_id;
my $component_id;
@ -62,10 +63,10 @@ my $component_id;
# that variable and runs the appropriate code.
# Determine whether to use the action specified by the user or the default.
my $action = $::FORM{'action'} || 'list';
my $action = $cgi->param('action') || 'list';
my @categoryActions;
if (@categoryActions = grep(/^categoryAction-.+/, keys(%::FORM))) {
if (@categoryActions = grep(/^categoryAction-.+/, $cgi->param())) {
$categoryActions[0] =~ s/^categoryAction-//;
processCategoryChange($categoryActions[0]);
exit;
@ -94,13 +95,13 @@ sub list {
# Define the variables and functions that will be passed to the UI template.
$vars->{'bug_types'} =
Bugzilla::FlagType::match({ 'target_type' => 'bug',
'group' => $::FORM{'group'} }, 1);
'group' => scalar $cgi->param('group') }, 1);
$vars->{'attachment_types'} =
Bugzilla::FlagType::match({ 'target_type' => 'attachment',
'group' => $::FORM{'group'} }, 1);
'group' => scalar $cgi->param('group') }, 1);
# Return the appropriate HTTP response headers.
print Bugzilla->cgi->header();
print $cgi->header();
# Generate and return the UI (HTML page) from the appropriate template.
$template->process("admin/flag-type/list.html.tmpl", $vars)
@ -109,7 +110,7 @@ sub list {
sub edit {
$action eq 'enter' ? validateTargetType() : validateID();
$action eq 'enter' ? validateTargetType() : (my $id = validateID());
# Get this installation's products and components.
GetVersionTable();
@ -121,8 +122,8 @@ sub edit {
$vars->{'components'} = \@::legal_components;
$vars->{'components_by_product'} = \%::components;
$vars->{'last_action'} = $::FORM{'action'};
if ($::FORM{'action'} eq 'enter' || $::FORM{'action'} eq 'copy') {
$vars->{'last_action'} = $cgi->param('action');
if ($cgi->param('action') eq 'enter' || $cgi->param('action') eq 'copy') {
$vars->{'action'} = "insert";
}
else {
@ -130,10 +131,10 @@ sub edit {
}
# If copying or editing an existing flag type, retrieve it.
if ($::FORM{'action'} eq 'copy' || $::FORM{'action'} eq 'edit') {
$vars->{'type'} = Bugzilla::FlagType::get($::FORM{'id'});
$vars->{'type'}->{'inclusions'} = Bugzilla::FlagType::get_inclusions($::FORM{'id'});
$vars->{'type'}->{'exclusions'} = Bugzilla::FlagType::get_exclusions($::FORM{'id'});
if ($cgi->param('action') eq 'copy' || $cgi->param('action') eq 'edit') {
$vars->{'type'} = Bugzilla::FlagType::get($id);
$vars->{'type'}->{'inclusions'} = Bugzilla::FlagType::get_inclusions($id);
$vars->{'type'}->{'exclusions'} = Bugzilla::FlagType::get_exclusions($id);
# Users want to see group names, not IDs
foreach my $group ("grant_gid", "request_gid") {
my $gid = $vars->{'type'}->{$group};
@ -146,12 +147,12 @@ sub edit {
# that the template needs to know) from the URL parameter and default
# the list of inclusions to all categories.
else {
$vars->{'type'} = { 'target_type' => $::FORM{'target_type'} ,
$vars->{'type'} = { 'target_type' => scalar $cgi->param('target_type'),
'inclusions' => ["__Any__:__Any__"] };
}
# Return the appropriate HTTP response headers.
print Bugzilla->cgi->header();
print $cgi->header();
# Generate and return the UI (HTML page) from the appropriate template.
$template->process("admin/flag-type/edit.html.tmpl", $vars)
@ -165,25 +166,25 @@ sub processCategoryChange {
validateIsRequesteeble();
validateAllowMultiple();
my @inclusions = $::MFORM{'inclusions'} ? @{$::MFORM{'inclusions'}} : ();
my @exclusions = $::MFORM{'exclusions'} ? @{$::MFORM{'exclusions'}} : ();
my @inclusions = $cgi->param('inclusions');
my @exclusions = $cgi->param('exclusions');
if ($categoryAction eq 'include') {
validateProduct();
validateComponent();
my $category = ($::FORM{'product'} || "__Any__") . ":" . ($::FORM{'component'} || "__Any__");
my $category = ($cgi->param('product') || "__Any__") . ":" . ($cgi->param('component') || "__Any__");
push(@inclusions, $category) unless grep($_ eq $category, @inclusions);
}
elsif ($categoryAction eq 'exclude') {
validateProduct();
validateComponent();
my $category = ($::FORM{'product'} || "__Any__") . ":" . ($::FORM{'component'} || "__Any__");
my $category = ($cgi->param('product') || "__Any__") . ":" . ($cgi->param('component') || "__Any__");
push(@exclusions, $category) unless grep($_ eq $category, @exclusions);
}
elsif ($categoryAction eq 'removeInclusion') {
@inclusions = map(($_ eq $::FORM{'inclusion_to_remove'} ? () : $_), @inclusions);
@inclusions = map(($_ eq $cgi->param('inclusion_to_remove') ? () : $_), @inclusions);
}
elsif ($categoryAction eq 'removeExclusion') {
@exclusions = map(($_ eq $::FORM{'exclusion_to_remove'} ? () : $_), @exclusions);
@exclusions = map(($_ eq $cgi->param('exclusion_to_remove') ? () : $_), @exclusions);
}
# Get this installation's products and components.
@ -195,15 +196,15 @@ sub processCategoryChange {
$vars->{'components'} = \@::legal_components;
$vars->{'components_by_product'} = \%::components;
$vars->{'action'} = $::FORM{'action'};
$vars->{'action'} = $cgi->param('action');
my $type = {};
foreach my $key (keys %::FORM) { $type->{$key} = $::FORM{$key} }
foreach my $key ($cgi->param()) { $type->{$key} = $cgi->param($key) }
$type->{'inclusions'} = \@inclusions;
$type->{'exclusions'} = \@exclusions;
$vars->{'type'} = $type;
# Return the appropriate HTTP response headers.
print Bugzilla->cgi->header();
print $cgi->header();
# Generate and return the UI (HTML page) from the appropriate template.
$template->process("admin/flag-type/edit.html.tmpl", $vars)
@ -224,10 +225,10 @@ sub insert {
my $dbh = Bugzilla->dbh;
my $name = SqlQuote($::FORM{'name'});
my $description = SqlQuote($::FORM{'description'});
my $cc_list = SqlQuote($::FORM{'cc_list'});
my $target_type = $::FORM{'target_type'} eq "bug" ? "b" : "a";
my $name = SqlQuote($cgi->param('name'));
my $description = SqlQuote($cgi->param('description'));
my $cc_list = SqlQuote($cgi->param('cc_list'));
my $target_type = $cgi->param('target_type') eq "bug" ? "b" : "a";
$dbh->bz_lock_tables('flagtypes WRITE', 'products READ',
'components READ', 'flaginclusions WRITE',
@ -242,15 +243,18 @@ sub insert {
target_type, sortkey, is_active, is_requestable,
is_requesteeble, is_multiplicable,
grant_group_id, request_group_id)
VALUES ($id, $name, $description, $cc_list, '$target_type',
$::FORM{'sortkey'}, $::FORM{'is_active'},
$::FORM{'is_requestable'}, $::FORM{'is_requesteeble'},
$::FORM{'is_multiplicable'}, $::FORM{'grant_gid'},
$::FORM{'request_gid'})");
VALUES ($id, $name, $description, $cc_list, '$target_type', " .
$cgi->param('sortkey') . ", " .
$cgi->param('is_active') . ", " .
$cgi->param('is_requestable') . ", " .
$cgi->param('is_requesteeble') . ", " .
$cgi->param('is_multiplicable') . ", " .
$cgi->param('grant_gid') . ", " .
$cgi->param('request_gid') . ")");
# Populate the list of inclusions/exclusions for this flag type.
foreach my $category_type ("inclusions", "exclusions") {
foreach my $category (@{$::MFORM{$category_type}}) {
foreach my $category ($cgi->param($category_type)) {
my ($product, $component) = split(/:/, $category);
my $product_id = get_product_id($product) || "NULL";
my $component_id =
@ -262,11 +266,11 @@ sub insert {
$dbh->bz_unlock_tables();
$vars->{'name'} = $::FORM{'name'};
$vars->{'name'} = $cgi->param('name');
$vars->{'message'} = "flag_type_created";
# Return the appropriate HTTP response headers.
print Bugzilla->cgi->header();
print $cgi->header();
# Generate and return the UI (HTML page) from the appropriate template.
$template->process("global/message.html.tmpl", $vars)
@ -275,7 +279,7 @@ sub insert {
sub update {
validateID();
my $id = validateID();
validateName();
validateDescription();
validateCCList();
@ -289,9 +293,9 @@ sub update {
my $dbh = Bugzilla->dbh;
my $name = SqlQuote($::FORM{'name'});
my $description = SqlQuote($::FORM{'description'});
my $cc_list = SqlQuote($::FORM{'cc_list'});
my $name = SqlQuote($cgi->param('name'));
my $description = SqlQuote($cgi->param('description'));
my $cc_list = SqlQuote($cgi->param('cc_list'));
$dbh->bz_lock_tables('flagtypes WRITE', 'products READ',
'components READ', 'flaginclusions WRITE',
@ -300,26 +304,25 @@ sub update {
SET name = $name ,
description = $description ,
cc_list = $cc_list ,
sortkey = $::FORM{'sortkey'} ,
is_active = $::FORM{'is_active'} ,
is_requestable = $::FORM{'is_requestable'} ,
is_requesteeble = $::FORM{'is_requesteeble'} ,
is_multiplicable = $::FORM{'is_multiplicable'} ,
grant_group_id = $::FORM{'grant_gid'} ,
request_group_id = $::FORM{'request_gid'}
WHERE id = $::FORM{'id'}");
sortkey = " . $cgi->param('sortkey') . ",
is_active = " . $cgi->param('is_active') . ",
is_requestable = " . $cgi->param('is_requestable') . ",
is_requesteeble = " . $cgi->param('is_requesteeble') . ",
is_multiplicable = " . $cgi->param('is_multiplicable') . ",
grant_group_id = " . $cgi->param('grant_gid') . ",
request_group_id = " . $cgi->param('request_gid') . "
WHERE id = $id");
# Update the list of inclusions/exclusions for this flag type.
foreach my $category_type ("inclusions", "exclusions") {
SendSQL("DELETE FROM flag$category_type WHERE type_id = $::FORM{'id'}");
foreach my $category (@{$::MFORM{$category_type}}) {
SendSQL("DELETE FROM flag$category_type WHERE type_id = $id");
foreach my $category ($cgi->param($category_type)) {
my ($product, $component) = split(/:/, $category);
my $product_id = get_product_id($product) || "NULL";
my $component_id =
get_component_id($product_id, $component) || "NULL";
SendSQL("INSERT INTO flag$category_type (type_id, product_id, " .
"component_id) VALUES ($::FORM{'id'}, $product_id, " .
"$component_id)");
"component_id) VALUES ($id, $product_id, $component_id)");
}
}
@ -336,7 +339,7 @@ sub update {
ON (flags.type_id = i.type_id
AND (bugs.product_id = i.product_id OR i.product_id IS NULL)
AND (bugs.component_id = i.component_id OR i.component_id IS NULL))
WHERE flags.type_id = $::FORM{'id'}
WHERE flags.type_id = $id
AND flags.is_active = 1
AND i.type_id IS NULL
");
@ -349,18 +352,18 @@ sub update {
ON flags.bug_id = bugs.bug_id
INNER JOIN flagexclusions AS e
ON flags.type_id = e.type_id
WHERE flags.type_id = $::FORM{'id'}
WHERE flags.type_id = $id
AND flags.is_active = 1
AND (bugs.product_id = e.product_id OR e.product_id IS NULL)
AND (bugs.component_id = e.component_id OR e.component_id IS NULL)
");
Bugzilla::Flag::clear(FetchOneColumn()) while MoreSQLData();
$vars->{'name'} = $::FORM{'name'};
$vars->{'name'} = $cgi->param('name');
$vars->{'message'} = "flag_type_changes_saved";
# Return the appropriate HTTP response headers.
print Bugzilla->cgi->header();
print $cgi->header();
# Generate and return the UI (HTML page) from the appropriate template.
$template->process("global/message.html.tmpl", $vars)
@ -370,18 +373,19 @@ sub update {
sub confirmDelete
{
validateID();
my $id = validateID();
# check if we need confirmation to delete:
my $count = Bugzilla::Flag::count({ 'type_id' => $::FORM{'id'},
my $count = Bugzilla::Flag::count({ 'type_id' => $id,
'is_active' => 1 });
if ($count > 0) {
$vars->{'flag_type'} = Bugzilla::FlagType::get($::FORM{'id'});
$vars->{'flag_type'} = Bugzilla::FlagType::get($id);
$vars->{'flag_count'} = scalar($count);
# Return the appropriate HTTP response headers.
print Bugzilla->cgi->header();
print $cgi->header();
# Generate and return the UI (HTML page) from the appropriate template.
$template->process("admin/flag-type/confirm-delete.html.tmpl", $vars)
@ -394,8 +398,7 @@ sub confirmDelete
sub deleteType {
validateID();
my $id = validateID();
my $dbh = Bugzilla->dbh;
$dbh->bz_lock_tables('flagtypes WRITE', 'flags WRITE',
@ -403,19 +406,19 @@ sub deleteType {
# Get the name of the flag type so we can tell users
# what was deleted.
SendSQL("SELECT name FROM flagtypes WHERE id = $::FORM{'id'}");
SendSQL("SELECT name FROM flagtypes WHERE id = $id");
$vars->{'name'} = FetchOneColumn();
SendSQL("DELETE FROM flags WHERE type_id = $::FORM{'id'}");
SendSQL("DELETE FROM flaginclusions WHERE type_id = $::FORM{'id'}");
SendSQL("DELETE FROM flagexclusions WHERE type_id = $::FORM{'id'}");
SendSQL("DELETE FROM flagtypes WHERE id = $::FORM{'id'}");
SendSQL("DELETE FROM flags WHERE type_id = $id");
SendSQL("DELETE FROM flaginclusions WHERE type_id = $id");
SendSQL("DELETE FROM flagexclusions WHERE type_id = $id");
SendSQL("DELETE FROM flagtypes WHERE id = $id");
$dbh->bz_unlock_tables();
$vars->{'message'} = "flag_type_deleted";
# Return the appropriate HTTP response headers.
print Bugzilla->cgi->header();
print $cgi->header();
# Generate and return the UI (HTML page) from the appropriate template.
$template->process("global/message.html.tmpl", $vars)
@ -424,20 +427,20 @@ sub deleteType {
sub deactivate {
validateID();
my $id = validateID();
validateIsActive();
my $dbh = Bugzilla->dbh;
$dbh->bz_lock_tables('flagtypes WRITE');
SendSQL("UPDATE flagtypes SET is_active = 0 WHERE id = $::FORM{'id'}");
SendSQL("UPDATE flagtypes SET is_active = 0 WHERE id = $id");
$dbh->bz_unlock_tables();
$vars->{'message'} = "flag_type_deactivated";
$vars->{'flag_type'} = Bugzilla::FlagType::get($::FORM{'id'});
$vars->{'flag_type'} = Bugzilla::FlagType::get($id);
# Return the appropriate HTTP response headers.
print Bugzilla->cgi->header();
print $cgi->header();
# Generate and return the UI (HTML page) from the appropriate template.
$template->process("global/message.html.tmpl", $vars)
@ -450,102 +453,108 @@ sub deactivate {
################################################################################
sub validateID {
# $::FORM{'id'} is destroyed if detaint_natural fails.
my $flagtype_id = $::FORM{'id'};
detaint_natural($::FORM{'id'})
|| ThrowCodeError("flag_type_id_invalid", { id => $flagtype_id });
# $flagtype_id is destroyed if detaint_natural fails.
my $flagtype_id = $cgi->param('id');
detaint_natural($flagtype_id)
|| ThrowCodeError("flag_type_id_invalid",
{ id => scalar $cgi->param('id') });
SendSQL("SELECT 1 FROM flagtypes WHERE id = $::FORM{'id'}");
SendSQL("SELECT 1 FROM flagtypes WHERE id = $flagtype_id");
FetchOneColumn()
|| ThrowCodeError("flag_type_nonexistent", { id => $::FORM{'id'} });
|| ThrowCodeError("flag_type_nonexistent", { id => $flagtype_id });
return $flagtype_id;
}
sub validateName {
$::FORM{'name'}
&& $::FORM{'name'} !~ /[ ,]/
&& length($::FORM{'name'}) <= 50
|| ThrowUserError("flag_type_name_invalid", { name => $::FORM{'name'} });
$cgi->param('name')
&& $cgi->param('name') !~ /[ ,]/
&& length($cgi->param('name')) <= 50
|| ThrowUserError("flag_type_name_invalid",
{ name => scalar $cgi->param('name') });
}
sub validateDescription {
length($::FORM{'description'}) < 2**16-1
length($cgi->param('description')) < 2**16-1
|| ThrowUserError("flag_type_description_invalid");
}
sub validateCCList {
length($::FORM{'cc_list'}) <= 200
length($cgi->param('cc_list')) <= 200
|| ThrowUserError("flag_type_cc_list_invalid",
{ cc_list => $::FORM{'cc_list'} });
{ cc_list => $cgi->param('cc_list') });
my @addresses = split(/[, ]+/, $::FORM{'cc_list'});
my @addresses = split(/[, ]+/, $cgi->param('cc_list'));
foreach my $address (@addresses) { CheckEmailSyntax($address) }
}
sub validateProduct {
return if !$::FORM{'product'};
return if !$cgi->param('product');
$product_id = get_product_id($::FORM{'product'});
$product_id = get_product_id($cgi->param('product'));
defined($product_id)
|| ThrowCodeError("flag_type_product_nonexistent",
{ product => $::FORM{'product'} });
{ product => $cgi->param('product') });
}
sub validateComponent {
return if !$::FORM{'component'};
return if !$cgi->param('component');
$product_id
|| ThrowCodeError("flag_type_component_without_product");
$component_id = get_component_id($product_id, $::FORM{'component'});
$component_id = get_component_id($product_id, $cgi->param('component'));
defined($component_id)
|| ThrowCodeError("flag_type_component_nonexistent",
{ product => $::FORM{'product'},
name => $::FORM{'component'} });
{ product => $cgi->param('product'),
name => $cgi->param('component') });
}
sub validateSortKey {
# $::FORM{'sortkey'} is destroyed if detaint_natural fails.
my $sortkey = $::FORM{'sortkey'};
detaint_natural($::FORM{'sortkey'})
&& $::FORM{'sortkey'} < 32768
# $sortkey is destroyed if detaint_natural fails.
my $sortkey = $cgi->param('sortkey');
detaint_natural($sortkey)
&& $sortkey < 32768
|| ThrowUserError("flag_type_sortkey_invalid",
{ sortkey => $sortkey });
{ sortkey => scalar $cgi->param('sortkey') });
$cgi->param('sortkey', $sortkey);
}
sub validateTargetType {
grep($::FORM{'target_type'} eq $_, ("bug", "attachment"))
grep($cgi->param('target_type') eq $_, ("bug", "attachment"))
|| ThrowCodeError("flag_type_target_type_invalid",
{ target_type => $::FORM{'target_type'} });
{ target_type => scalar $cgi->param('target_type') });
}
sub validateIsActive {
$::FORM{'is_active'} = $::FORM{'is_active'} ? 1 : 0;
$cgi->param('is_active', $cgi->param('is_active') ? 1 : 0);
}
sub validateIsRequestable {
$::FORM{'is_requestable'} = $::FORM{'is_requestable'} ? 1 : 0;
$cgi->param('is_requestable', $cgi->param('is_requestable') ? 1 : 0);
}
sub validateIsRequesteeble {
$::FORM{'is_requesteeble'} = $::FORM{'is_requesteeble'} ? 1 : 0;
$cgi->param('is_requesteeble', $cgi->param('is_requesteeble') ? 1 : 0);
}
sub validateAllowMultiple {
$::FORM{'is_multiplicable'} = $::FORM{'is_multiplicable'} ? 1 : 0;
$cgi->param('is_multiplicable', $cgi->param('is_multiplicable') ? 1 : 0);
}
sub validateGroups {
# Convert group names to group IDs
foreach my $col ("grant_gid", "request_gid") {
my $name = $::FORM{$col};
$::FORM{$col} ||= "NULL";
my $name = $cgi->param($col);
$cgi->param($col, "NULL") unless $name;
next if (!$name);
SendSQL("SELECT id FROM groups WHERE name = " . SqlQuote($name));
$::FORM{$col} = FetchOneColumn();
if (!$::FORM{$col}) {
my $gid = FetchOneColumn();
if (!$gid) {
ThrowUserError("group_unknown", { name => $name });
}
$cgi->param($col, $gid);
}
}