fix for 17773: Checksetup.pl should create maintainer if database is empty.

patch submitted by dave@intrec.com (Dave Miller)
create an administrator if we don't find one in the db or if new.
This commit is contained in:
cyeh%bluemartini.com 2001-02-16 17:56:05 +00:00
Родитель 627eefeaa6
Коммит 85d34d02e0
1 изменённых файлов: 126 добавлений и 17 удалений

Просмотреть файл

@ -21,6 +21,7 @@
# Contributor(s): Holger Schurig <holgerschurig@nikocity.de>
# Terry Weissman <terry@mozilla.org>
# Dan Mosedale <dmose@mozilla.org>
# Dave Miller <dave@intrec.com>
#
#
# Direct any questions on this source code to
@ -78,6 +79,7 @@
# add more MySQL-related checks --MYSQL--
# change table definitions --TABLE--
# add more groups --GROUPS--
# create initial administrator account --ADMIN--
#
# Note: sometimes those special comments occur more then once. For
# example, --LOCAL-- is at least 3 times in this code! --TABLE--
@ -1233,31 +1235,138 @@ CheckEnumField('bugs', 'op_sys', @my_opsys);
CheckEnumField('bugs', 'rep_platform', @my_platforms);
###########################################################################
# Promote first user into every group
# Create Administrator --ADMIN--
###########################################################################
#
# Assume you just logged in. Now how can you administrate the system? Just
# execute checksetup.pl again. If there is only 1 user in bugzilla, then
# this user is promoted into every group.
#
# Prompt the user for the email address and name of an administrator. Create
# that login, if it doesn't exist already, and make it a member of all groups.
$sth = $dbh->prepare("SELECT login_name FROM profiles");
$sth->execute;
# when we have exactly one user ...
if ($sth->rows == 1) {
my @row = $sth->fetchrow_array;
print "Putting user $row[0] into every group ...\n";
# are this enought f's for now? :-)
$dbh->do("update profiles set groupset=0xffffffffffff");
sub bailout { # this is just in case we get interrupted while getting passwd
system("stty echo"); # re-enable input echoing
exit 1;
}
$sth = $dbh->prepare(<<_End_Of_SQL_);
SELECT login_name
FROM profiles
WHERE groupset=9223372036854775807
_End_Of_SQL_
$sth->execute;
# when we have no admin users, prompt for admin email address and password ...
if ($sth->rows == 0) {
my $login = "";
my $realname = "";
my $pass1 = "";
my $pass2 = "*";
my $admin_ok = 0;
my $admin_create = 1;
print "\nLooks like we don't have an administrator set up yet. Either this is your\n";
print "first time using Bugzilla, or your administrator's privs might have accidently\n";
print "gotten deleted at some point.\n";
while(! $admin_ok ) {
while( $login eq "" ) {
print "Enter the e-mail address of the administrator: ";
$login = <STDIN>;
chomp $login;
if(! $login ) {
print "\nYou DO want an administrator, don't you?\n";
}
}
$login = $dbh->quote($login);
$sth = $dbh->prepare(<<_End_Of_SQL_);
SELECT login_name
FROM profiles
WHERE login_name=$login
_End_Of_SQL_
$sth->execute;
if ($sth->rows > 0) {
print "$login already has an account.\n";
print "Make this user the administrator? [Y/n] ";
my $ok = <STDIN>;
chomp $ok;
if ($ok !~ /^n/i) {
$admin_ok = 1;
$admin_create = 0;
} else {
print "OK, well, someone has to be the administrator. Try someone else.\n";
$login = "";
}
} else {
print "You entered $login. Is this correct? [Y/n] ";
my $ok = <STDIN>;
chomp $ok;
if ($ok !~ /^n/i) {
$admin_ok = 1;
} else {
print "That's okay, typos happen. Give it another shot.\n";
$login = "";
}
}
}
if ($admin_create) {
while( $realname eq "" ) {
print "Enter the real name of the administrator: ";
$realname = <STDIN>;
chomp $realname;
if(! $realname ) {
print "\nReally. We need a full name.\n";
}
}
# trap a few interrupts so we can fix the echo if we get aborted.
$SIG{HUP} = \&bailout;
$SIG{INT} = \&bailout;
$SIG{QUIT} = \&bailout;
$SIG{TERM} = \&bailout;
system("stty -echo"); # disable input echoing
while( $pass1 ne $pass2 ) {
while( $pass1 eq "" ) {
print "Enter a password for the administrator account: ";
$pass1 = <STDIN>;
chomp $pass1;
if(! $pass1 ) {
print "\n\nIt's just plain stupid to not have a password. Try again!\n";
}
}
print "\nPlease retype the password to verify: ";
$pass2 = <STDIN>;
chomp $pass2;
if ($pass1 ne $pass2) {
print "\n\nPasswords don't match. Try again!\n";
$pass1 = "";
$pass2 = "*";
}
}
system("stty echo"); # re-enable input echoing
$SIG{HUP} = 'DEFAULT'; # and remove our interrupt hooks
$SIG{INT} = 'DEFAULT';
$SIG{QUIT} = 'DEFAULT';
$SIG{TERM} = 'DEFAULT';
$realname = $dbh->quote($realname);
$pass1 = $dbh->quote($pass1);
$dbh->do(<<_End_Of_SQL_);
INSERT INTO profiles
(login_name, realname, password, cryptpassword, groupset, newemailtech)
VALUES ($login, $realname, $pass1, encrypt($pass1), 0x7fffffffffffffff, 1)
_End_Of_SQL_
} else {
$dbh->do(<<_End_Of_SQL_);
UPDATE profiles
SET groupset=0x7fffffffffffffff
WHERE login_name=$login
_End_Of_SQL_
}
print "\n$login is now set up as the administrator account.\n";
}