Commit 6d154983 authored by mkanat%bugzilla.org's avatar mkanat%bugzilla.org

Bug 349555: Move dependency validation from post_bug into Bugzilla::Bug

Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=bkor, a=justdave
parent 363f5a4e
...@@ -341,6 +341,35 @@ sub _check_component { ...@@ -341,6 +341,35 @@ sub _check_component {
return $obj; return $obj;
} }
# Takes two comma/space-separated strings and returns arrayrefs
# of valid bug IDs.
sub _check_dependencies {
my ($depends_on, $blocks) = @_;
# Only editbugs users can set dependencies on bug entry.
return ([], []) unless Bugzilla->user->in_group('editbugs');
$depends_on ||= '';
$blocks ||= '';
# Make sure all the bug_ids are valid.
my @results;
foreach my $string ($depends_on, $blocks) {
my @array = split(/[\s,]+/, $string);
# Eliminate nulls
@array = grep($_, @array);
# $field is not passed to ValidateBugID to prevent adding new
# dependencies on inaccessible bugs.
ValidateBugID($_) foreach (@array);
push(@results, \@array);
}
# dependson blocks
my %deps = ValidateDependencies($results[0], $results[1]);
return ($deps{'dependson'}, $deps{'blocked'});
}
sub _check_keywords { sub _check_keywords {
my ($keyword_string) = @_; my ($keyword_string) = @_;
$keyword_string = trim($keyword_string); $keyword_string = trim($keyword_string);
...@@ -1633,6 +1662,7 @@ sub ValidateBugAlias { ...@@ -1633,6 +1662,7 @@ sub ValidateBugAlias {
# Validate and return a hash of dependencies # Validate and return a hash of dependencies
sub ValidateDependencies { sub ValidateDependencies {
my $fields = {}; my $fields = {};
# These can be arrayrefs or they can be strings.
$fields->{'dependson'} = shift; $fields->{'dependson'} = shift;
$fields->{'blocked'} = shift; $fields->{'blocked'} = shift;
my $id = shift || 0; my $id = shift || 0;
...@@ -1653,7 +1683,9 @@ sub ValidateDependencies { ...@@ -1653,7 +1683,9 @@ sub ValidateDependencies {
next unless $fields->{$target}; next unless $fields->{$target};
my %seen; my %seen;
foreach my $i (split('[\s,]+', $fields->{$target})) { my $target_array = ref($fields->{$target}) ? $fields->{$target}
: [split(/[\s,]+/, $fields->{$target})];
foreach my $i (@$target_array) {
if ($id == $i) { if ($id == $i) {
ThrowUserError("dependency_loop_single"); ThrowUserError("dependency_loop_single");
} }
......
...@@ -227,26 +227,8 @@ my @keyword_ids = @{Bugzilla::Bug::_check_keywords($cgi->param('keywords'))}; ...@@ -227,26 +227,8 @@ my @keyword_ids = @{Bugzilla::Bug::_check_keywords($cgi->param('keywords'))};
Bugzilla::Bug::_check_strict_isolation($product, $cc_ids, Bugzilla::Bug::_check_strict_isolation($product, $cc_ids,
$cgi->param('assigned_to'), $cgi->param('qa_contact')); $cgi->param('assigned_to'), $cgi->param('qa_contact'));
# Check for valid dependency info. my ($depends_on_ids, $blocks_ids) = Bugzilla::Bug::_check_dependencies(
foreach my $field ("dependson", "blocked") { scalar $cgi->param('dependson'), scalar $cgi->param('blocked'));
if (UserInGroup("editbugs") && $cgi->param($field)) {
my @validvalues;
foreach my $id (split(/[\s,]+/, $cgi->param($field))) {
next unless $id;
# $field is not passed to ValidateBugID to prevent adding new
# dependencies on inaccessible bugs.
ValidateBugID($id);
push(@validvalues, $id);
}
$cgi->param(-name => $field, -value => join(",", @validvalues));
}
}
# Gather the dependency list, and make sure there are no circular refs
my %deps;
if (UserInGroup("editbugs")) {
%deps = Bugzilla::Bug::ValidateDependencies(scalar($cgi->param('dependson')),
scalar($cgi->param('blocked')));
}
# get current time # get current time
my $timestamp = $dbh->selectrow_array(q{SELECT NOW()}); my $timestamp = $dbh->selectrow_array(q{SELECT NOW()});
...@@ -415,6 +397,7 @@ if (UserInGroup("editbugs")) { ...@@ -415,6 +397,7 @@ if (UserInGroup("editbugs")) {
WHERE bug_id = ?}, undef, ($timestamp, $kw_list, $id)); WHERE bug_id = ?}, undef, ($timestamp, $kw_list, $id));
} }
if ($cgi->param('dependson') || $cgi->param('blocked')) { if ($cgi->param('dependson') || $cgi->param('blocked')) {
my %deps = (dependson => $depends_on_ids, blocked => $blocks_ids);
foreach my $pair (["blocked", "dependson"], ["dependson", "blocked"]) { foreach my $pair (["blocked", "dependson"], ["dependson", "blocked"]) {
my ($me, $target) = @{$pair}; my ($me, $target) = @{$pair};
my $sth_dep = $dbh->prepare(qq{ my $sth_dep = $dbh->prepare(qq{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment