From a589e55a6f061ffbc223ccc99be1ff6052cf41bf Mon Sep 17 00:00:00 2001 From: "lpsolit%gmail.com" <> Date: Sat, 11 Apr 2009 23:33:24 +0000 Subject: Bug 487769: checksetup.pl can no longer create versions in TestProduct due to insufficient privileges (checksetup.pl fails) - Patch by Max Kanat-Alexander r/a=LpSolit --- Bugzilla/Component.pm | 6 ++- Bugzilla/Constants.pm | 4 ++ Bugzilla/Install.pm | 53 ++++++++-------------- Bugzilla/User.pm | 27 ++++++++++- checksetup.pl | 4 ++ editcomponents.cgi | 18 +++++--- .../en/default/admin/products/create.html.tmpl | 2 +- 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 + +Returns a user who is in all groups, but who does not really exist in the +database. Used for non-web scripts like L 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 %]
-- cgit v1.2.3-24-g4f1b