From e6609d09707daf78716b649d98e85e2c8eff55e1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Michael=20G=C3=B6hler?= Date: Tue, 29 Jul 2014 10:52:51 +0200 Subject: [PATCH] simplify mysql user creation flow if dbuser exists try a different one, owncloud/core#108 changed outdated comment corrected length calculation changed indentation for else clauses --- lib/private/setup/mysql.php | 62 +++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/lib/private/setup/mysql.php b/lib/private/setup/mysql.php index 3327965fb49..5558a2d1e51 100644 --- a/lib/private/setup/mysql.php +++ b/lib/private/setup/mysql.php @@ -12,38 +12,52 @@ 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); - } - else { - if($this->dbuser!=$oldUser) { - \OC_Config::setValue('dbuser', $this->dbuser); - \OC_Config::setValue('dbpassword', $this->dbpassword); - } - - //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); } + //create the database + $this->createDatabase($connection); + //fill the database if needed $query='select count(*) from information_schema.tables' ." where table_schema='".$this->dbname."' AND table_name = '".$this->tableprefix."users';"; -- 2.39.5