Merge pull request #11102 from owncloud/visit1985-issue_108

mysql setup: if dbuser exists try a different one (owncloud/core#108)
This commit is contained in:
Lukas Reschke 2014-09-16 18:54:37 +02:00
commit 4ebc11aa8d
1 changed files with 37 additions and 23 deletions

View File

@ -12,37 +12,51 @@ class MySQL extends AbstractDatabase {
throw new \DatabaseSetupException($this->trans->t('MySQL/MariaDB username and/or password not valid'),
$this->trans->t('You need to enter either an existing account or the administrator.'));
}
//user already specified in config
$oldUser=\OC_Config::getValue('dbuser', false);
//this should be enough to check for admin rights in mysql
$query="SELECT user FROM mysql.user WHERE user='$this->dbuser'";
if(mysql_query($query, $connection)) {
//use the admin login data for the new database user
//we don't have a dbuser specified in config
if($this->dbuser!=$oldUser) {
//add prefix to the admin username to prevent collisions
$adminUser=substr('oc_'.$username, 0, 16);
//add prefix to the mysql user name to prevent collisions
$this->dbuser=substr('oc_'.$username, 0, 16);
if($this->dbuser!=$oldUser) {
//hash the password so we don't need to store the admin config in the config file
$this->dbpassword=\OC_Util::generateRandomBytes(30);
$i = 1;
while(true) {
//this should be enough to check for admin rights in mysql
$query="SELECT user FROM mysql.user WHERE user='$adminUser'";
$this->createDBUser($connection);
$result = mysql_query($query, $connection);
\OC_Config::setValue('dbuser', $this->dbuser);
\OC_Config::setValue('dbpassword', $this->dbpassword);
}
//current dbuser has admin rights
if($result) {
//new dbuser does not exist
if(mysql_num_rows($result) === 0) {
//use the admin login data for the new database user
$this->dbuser=$adminUser;
//create the database
$this->createDatabase($connection);
//create a random password so we don't need to store the admin password in the config file
$this->dbpassword=\OC_Util::generateRandomBytes(30);
$this->createDBUser($connection);
break;
} else {
//repeat with different username
$length=strlen((string)$i);
$adminUser=substr('oc_'.$username, 0, 16 - $length).$i;
$i++;
}
} else {
break;
}
};
\OC_Config::setValue('dbuser', $this->dbuser);
\OC_Config::setValue('dbpassword', $this->dbpassword);
}
else {
if($this->dbuser!=$oldUser) {
\OC_Config::setValue('dbuser', $this->dbuser);
\OC_Config::setValue('dbpassword', $this->dbpassword);
}
//create the database
$this->createDatabase($connection);
}
//create the database
$this->createDatabase($connection);
//fill the database if needed
$query='select count(*) from information_schema.tables'