summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlpsolit%gmail.com <>2009-04-12 01:33:24 +0200
committerlpsolit%gmail.com <>2009-04-12 01:33:24 +0200
commita589e55a6f061ffbc223ccc99be1ff6052cf41bf (patch)
tree54aab3828565605b0fe1fbd97a5249fa5ac12b4a
parent0e4b2ce5a8e14a95d0eac6776731bcb37fec2741 (diff)
downloadbugzilla-a589e55a6f061ffbc223ccc99be1ff6052cf41bf.tar.gz
bugzilla-a589e55a6f061ffbc223ccc99be1ff6052cf41bf.tar.xz
Bug 487769: checksetup.pl can no longer create versions in TestProduct due to insufficient privileges (checksetup.pl fails) - Patch by Max Kanat-Alexander <mkanat@bugzilla.org> r/a=LpSolit
-rw-r--r--Bugzilla/Component.pm6
-rw-r--r--Bugzilla/Constants.pm4
-rw-r--r--Bugzilla/Install.pm53
-rw-r--r--Bugzilla/User.pm27
-rwxr-xr-xchecksetup.pl4
-rwxr-xr-xeditcomponents.cgi18
-rw-r--r--template/en/default/admin/products/create.html.tmpl2
7 files changed, 68 insertions, 46 deletions
diff --git a/Bugzilla/Component.pm b/Bugzilla/Component.pm
index f5719e82c..194a3957c 100644
--- a/Bugzilla/Component.pm
+++ b/Bugzilla/Component.pm
@@ -60,6 +60,7 @@ use constant UPDATE_COLUMNS => qw(
);
use constant VALIDATORS => {
+ create_series => \&Bugzilla::Object::check_boolean,
product => \&_check_product,
initialowner => \&_check_initialowner,
initialqacontact => \&_check_initialqacontact,
@@ -114,14 +115,15 @@ sub create {
$class->check_required_create_fields(@_);
my $params = $class->run_create_validators(@_);
my $cc_list = delete $params->{initial_cc};
+ my $create_series = delete $params->{create_series};
my $component = $class->insert_create_data($params);
# We still have to fill the component_cc table.
- $component->_update_cc_list($cc_list);
+ $component->_update_cc_list($cc_list) if $cc_list;
# Create series for the new component.
- $component->_create_series();
+ $component->_create_series() if $create_series;
$dbh->bz_commit_transaction();
return $component;
diff --git a/Bugzilla/Constants.pm b/Bugzilla/Constants.pm
index 91a97b7a2..294d03491 100644
--- a/Bugzilla/Constants.pm
+++ b/Bugzilla/Constants.pm
@@ -79,6 +79,7 @@ use File::Basename;
DEFAULT_COLUMN_LIST
DEFAULT_QUERY_NAME
+ DEFAULT_MILESTONE
QUERY_LIST
LIST_OF_BUGS
@@ -257,6 +258,9 @@ use constant DEFAULT_COLUMN_LIST => (
# for the default settings.
use constant DEFAULT_QUERY_NAME => '(Default query)';
+# The default "defaultmilestone" created for products.
+use constant DEFAULT_MILESTONE => '---';
+
# The possible types for saved searches.
use constant QUERY_LIST => 0;
use constant LIST_OF_BUGS => 1;
diff --git a/Bugzilla/Install.pm b/Bugzilla/Install.pm
index 8365f4182..65e19412c 100644
--- a/Bugzilla/Install.pm
+++ b/Bugzilla/Install.pm
@@ -26,6 +26,7 @@ package Bugzilla::Install;
use strict;
+use Bugzilla::Component;
use Bugzilla::Constants;
use Bugzilla::Error;
use Bugzilla::Group;
@@ -126,7 +127,10 @@ use constant DEFAULT_PRODUCT => {
name => 'TestProduct',
description => 'This is a test product.'
. ' This ought to be blown away and replaced with real stuff in a'
- . ' finished installation of bugzilla.'
+ . ' finished installation of bugzilla.',
+ version => Bugzilla::Version::DEFAULT_VERSION,
+ classification => 'Unclassified',
+ defaultmilestone => DEFAULT_MILESTONE,
};
use constant DEFAULT_COMPONENT => {
@@ -216,54 +220,33 @@ sub update_system_groups {
# This function should be called only after creating the admin user.
sub create_default_product {
my $dbh = Bugzilla->dbh;
-
# Make the default Classification if it doesn't already exist.
if (!$dbh->selectrow_array('SELECT 1 FROM classifications')) {
- my $class = DEFAULT_CLASSIFICATION;
print get_text('install_default_classification',
- { name => $class->{name} }) . "\n";
- $dbh->do('INSERT INTO classifications (name, description)
- VALUES (?, ?)',
- undef, $class->{name}, $class->{description});
+ { name => DEFAULT_CLASSIFICATION->{name} }) . "\n";
+ Bugzilla::Classification->create(DEFAULT_CLASSIFICATION);
}
# And same for the default product/component.
if (!$dbh->selectrow_array('SELECT 1 FROM products')) {
- my $default_prod = DEFAULT_PRODUCT;
print get_text('install_default_product',
- { name => $default_prod->{name} }) . "\n";
-
- $dbh->do(q{INSERT INTO products (name, description)
- VALUES (?,?)},
- undef, $default_prod->{name}, $default_prod->{description});
-
- my $product = new Bugzilla::Product({name => $default_prod->{name}});
+ { name => DEFAULT_PRODUCT->{name} }) . "\n";
- # The default version.
- Bugzilla::Version->create({name => Bugzilla::Version::DEFAULT_VERSION,
- product => $product});
+ my $product = Bugzilla::Product->create(DEFAULT_PRODUCT);
- # And we automatically insert the default milestone.
- $dbh->do(q{INSERT INTO milestones (product_id, value, sortkey)
- SELECT id, defaultmilestone, 0
- FROM products});
-
- # Get the user who will be the owner of the Product.
- # We pick the admin with the lowest id, or we insert
- # an invalid "0" into the database, just so that we can
- # create the component.
+ # Get the user who will be the owner of the Component.
+ # We pick the admin with the lowest id, which is probably the
+ # admin checksetup.pl just created.
my $admin_group = new Bugzilla::Group({name => 'admin'});
my ($admin_id) = $dbh->selectrow_array(
'SELECT user_id FROM user_group_map WHERE group_id = ?
ORDER BY user_id ' . $dbh->sql_limit(1),
- undef, $admin_group->id) || 0;
-
- my $default_comp = DEFAULT_COMPONENT;
-
- $dbh->do("INSERT INTO components (name, product_id, description,
- initialowner)
- VALUES (?, ?, ?, ?)", undef, $default_comp->{name},
- $product->id, $default_comp->{description}, $admin_id);
+ undef, $admin_group->id);
+ my $admin = Bugzilla::User->new($admin_id);
+
+ Bugzilla::Component->create({
+ %{ DEFAULT_COMPONENT() }, product => $product,
+ initialowner => $admin->login });
}
}
diff --git a/Bugzilla/User.pm b/Bugzilla/User.pm
index 2a616a145..661d2f167 100644
--- a/Bugzilla/User.pm
+++ b/Bugzilla/User.pm
@@ -50,8 +50,9 @@ use Bugzilla::Classification;
use Bugzilla::Field;
use Bugzilla::Group;
-use Scalar::Util qw(blessed);
use DateTime::TimeZone;
+use Scalar::Util qw(blessed);
+use Storable qw(dclone);
use base qw(Bugzilla::Object Exporter);
@Bugzilla::User::EXPORT = qw(is_available_username
@@ -135,6 +136,18 @@ sub new {
return $class->SUPER::new(@_);
}
+sub super_user {
+ my $invocant = shift;
+ my $class = ref($invocant) || $invocant;
+ my ($param) = @_;
+
+ my $user = dclone(DEFAULT_USER);
+ $user->{groups} = [Bugzilla::Group->get_all];
+ $user->{bless_groups} = [Bugzilla::Group->get_all];
+ bless $user, $class;
+ return $user;
+}
+
sub update {
my $self = shift;
my $changes = $self->SUPER::update(@_);
@@ -1762,6 +1775,18 @@ confirmation screen.
=head1 METHODS
+=head2 Constructors
+
+=over
+
+=item C<super_user>
+
+Returns a user who is in all groups, but who does not really exist in the
+database. Used for non-web scripts like L<checksetup> that need to make
+database changes and so on.
+
+=back
+
=head2 Saved and Shared Queries
=over
diff --git a/checksetup.pl b/checksetup.pl
index da368a822..53a709ebf 100755
--- a/checksetup.pl
+++ b/checksetup.pl
@@ -96,6 +96,7 @@ exit if $switch{'check-modules'};
# get a cryptic perl error about the missing module.
require Bugzilla;
+require Bugzilla::User;
require Bugzilla::Config;
import Bugzilla::Config qw(:admin);
@@ -196,6 +197,9 @@ Bugzilla::Install::DB::update_table_definitions(\%old_params);
Bugzilla::Install::update_system_groups();
+# "Log In" as the fake superuser who can do everything.
+Bugzilla->set_user(Bugzilla::User->super_user);
+
###########################################################################
# Create --SETTINGS-- users can adjust
###########################################################################
diff --git a/editcomponents.cgi b/editcomponents.cgi
index 7623be591..c550f0d8c 100755
--- a/editcomponents.cgi
+++ b/editcomponents.cgi
@@ -129,13 +129,17 @@ if ($action eq 'new') {
my $description = trim($cgi->param('description') || '');
my @initial_cc = $cgi->param('initialcc');
- my $component =
- Bugzilla::Component->create({ name => $comp_name,
- product => $product,
- description => $description,
- initialowner => $default_assignee,
- initialqacontact => $default_qa_contact,
- initial_cc => \@initial_cc });
+ my $component = Bugzilla::Component->create({
+ name => $comp_name,
+ product => $product,
+ description => $description,
+ initialowner => $default_assignee,
+ initialqacontact => $default_qa_contact,
+ initial_cc => \@initial_cc,
+ # XXX We should not be creating series for products that we
+ # didn't create series for.
+ create_series => 1,
+ });
$vars->{'message'} = 'component_created';
$vars->{'comp'} = $component;
diff --git a/template/en/default/admin/products/create.html.tmpl b/template/en/default/admin/products/create.html.tmpl
index 49c4ca71f..08da684c2 100644
--- a/template/en/default/admin/products/create.html.tmpl
+++ b/template/en/default/admin/products/create.html.tmpl
@@ -32,7 +32,7 @@
product.maxvotesperbug = "10000",
product.votestoconfirm = "0",
version = "unspecified",
- product.defaultmilestone = "---"
+ product.defaultmilestone = constants.DEFAULT_MILESTONE
%]
<form method="post" action="editproducts.cgi">