diff --git a/lib/private/setup/mysql.php b/lib/private/setup/mysql.php index 3327965fb4..5558a2d1e5 100644 --- a/lib/private/setup/mysql.php +++ b/lib/private/setup/mysql.php @@ -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'