]> source.dussan.org Git - nextcloud-server.git/commitdiff
simplify mysql user creation flow
authorMichael Göhler <somebody.here@gmx.de>
Tue, 29 Jul 2014 08:52:51 +0000 (10:52 +0200)
committerThomas Müller <thomas.mueller@tmit.eu>
Tue, 16 Sep 2014 09:53:54 +0000 (11:53 +0200)
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

index 3327965fb49e6301be1a43ac7c063f223f1ad09d..5558a2d1e51415dc4821df17adb8e6b048f23979 100644 (file)
@@ -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';";