use correct target-dbserver to add db and user when using multiple database servers

Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
This commit is contained in:
Michael Kaufmann
2022-07-29 09:35:11 +02:00
parent 4d1a6728f6
commit dfb2d625c9
4 changed files with 26 additions and 30 deletions

View File

@@ -89,7 +89,7 @@ class Mysqls extends ApiCommand implements ResourceEntity
} }
// validate whether the dbserver exists // validate whether the dbserver exists
$dbserver = Validate::validate($dbserver, html_entity_decode(lng('mysql.mysql_server')), '', '', 0, true); $dbserver = Validate::validate($dbserver, html_entity_decode(lng('mysql.mysql_server')), '/^[0-9]+$/', '', 0, true);
Database::needRoot(true, $dbserver); Database::needRoot(true, $dbserver);
Database::needSqlData(); Database::needSqlData();
$sql_root = Database::getSqlData(); $sql_root = Database::getSqlData();
@@ -110,9 +110,9 @@ class Mysqls extends ApiCommand implements ResourceEntity
$dbm = new DbManager($this->logger()); $dbm = new DbManager($this->logger());
if (strtoupper(Settings::Get('customer.mysqlprefix')) == 'DBNAME' && !empty($databasename)) { if (strtoupper(Settings::Get('customer.mysqlprefix')) == 'DBNAME' && !empty($databasename)) {
$username = $dbm->createDatabase($newdb_params['loginname'] . '_' . $databasename, $password); $username = $dbm->createDatabase($newdb_params['loginname'] . '_' . $databasename, $password, $dbserver);
} else { } else {
$username = $dbm->createDatabase($newdb_params['loginname'], $password, $newdb_params['mysql_lastaccountnumber']); $username = $dbm->createDatabase($newdb_params['loginname'], $password, $dbserver, $newdb_params['mysql_lastaccountnumber']);
} }
// we've checked against the password in dbm->createDatabase // we've checked against the password in dbm->createDatabase
@@ -230,6 +230,8 @@ class Mysqls extends ApiCommand implements ResourceEntity
$dbname = $this->getParam('dbname', $dn_optional, ''); $dbname = $this->getParam('dbname', $dn_optional, '');
$dbserver = $this->getParam('mysql_server', true, -1); $dbserver = $this->getParam('mysql_server', true, -1);
$dbserver = Validate::validate($dbserver, html_entity_decode(lng('mysql.mysql_server')), '/^[0-9]+$/', '', 0, true);
if ($this->isAdmin()) { if ($this->isAdmin()) {
if ($this->getUserDetail('customers_see_all') != 1) { if ($this->getUserDetail('customers_see_all') != 1) {
// if it's a reseller or an admin who cannot see all customers, we need to check // if it's a reseller or an admin who cannot see all customers, we need to check

View File

@@ -79,37 +79,29 @@ class DbManager
public static function correctMysqlUsers($mysql_access_host_array) public static function correctMysqlUsers($mysql_access_host_array)
{ {
// get sql-root access data // get all databases for all dbservers
Database::needRoot(true); $databases = [];
Database::needSqlData(); $databases_result_stmt = Database::prepare("
$sql_root = Database::getSqlData(); SELECT * FROM `" . TABLE_PANEL_DATABASES . "`
Database::needRoot(false); ORDER BY `dbserver` ASC
");
Database::pexecute($databases_result_stmt);
while ($databases_row = $databases_result_stmt->fetch(PDO::FETCH_ASSOC)) {
if (!isset($databases[$databases_row['dbserver']])) {
$databases[$databases_row['dbserver']] = [];
}
$databases[$databases_row['dbserver']][] = $databases_row['databasename'];
}
$dbservers_stmt = Database::query("SELECT DISTINCT `dbserver` FROM `" . TABLE_PANEL_DATABASES . "`"); $dbservers_stmt = Database::query("SELECT DISTINCT `dbserver` FROM `" . TABLE_PANEL_DATABASES . "`");
while ($dbserver = $dbservers_stmt->fetch(PDO::FETCH_ASSOC)) { while ($dbserver = $dbservers_stmt->fetch(PDO::FETCH_ASSOC)) {
// require privileged access for target db-server
Database::needRoot(true, $dbserver['dbserver']); Database::needRoot(true, $dbserver['dbserver']);
Database::needSqlData();
$sql_root = Database::getSqlData();
$dbm = new DbManager(FroxlorLogger::getInstanceOf()); $dbm = new DbManager(FroxlorLogger::getInstanceOf());
$users = $dbm->getManager()->getAllSqlUsers(false); $users = $dbm->getManager()->getAllSqlUsers(false);
$databases = [ foreach ($databases[$dbserver] as $username) {
$sql_root['db']
];
$databases_result_stmt = Database::prepare("
SELECT * FROM `" . TABLE_PANEL_DATABASES . "`
WHERE `dbserver` = :mysqlserver
");
Database::pexecute($databases_result_stmt, [
'mysqlserver' => $dbserver['dbserver']
]);
while ($databases_row = $databases_result_stmt->fetch(PDO::FETCH_ASSOC)) {
$databases[] = $databases_row['databasename'];
}
foreach ($databases as $username) {
if (isset($users[$username]) && is_array($users[$username]) && isset($users[$username]['hosts']) && is_array($users[$username]['hosts'])) { if (isset($users[$username]) && is_array($users[$username]) && isset($users[$username]['hosts']) && is_array($users[$username]['hosts'])) {
$password = [ $password = [
@@ -150,9 +142,9 @@ class DbManager
* *
* @return string|bool $username if successful or false of username is equal to the password * @return string|bool $username if successful or false of username is equal to the password
*/ */
public function createDatabase($loginname = null, $password = null, $last_accnumber = 0) public function createDatabase($loginname = null, $password = null, int $dbserver = 0, $last_accnumber = 0)
{ {
Database::needRoot(true); Database::needRoot(true, $dbserver);
// check whether we shall create a random username // check whether we shall create a random username
if (strtoupper(Settings::Get('customer.mysqlprefix')) == 'RANDOM') { if (strtoupper(Settings::Get('customer.mysqlprefix')) == 'RANDOM') {

View File

@@ -51,7 +51,8 @@ return [
'label' => lng('customer.generated_pwd'), 'label' => lng('customer.generated_pwd'),
'type' => 'text', 'type' => 'text',
'visible' => (Settings::Get('panel.password_regex') == ''), 'visible' => (Settings::Get('panel.password_regex') == ''),
'value' => Crypt::generatePassword() 'value' => Crypt::generatePassword(),
'readonly' => true
], ],
'sendinfomail' => [ 'sendinfomail' => [
'label' => lng('customer.sendinfomail'), 'label' => lng('customer.sendinfomail'),

View File

@@ -52,7 +52,8 @@ return [
'label' => lng('customer.generated_pwd'), 'label' => lng('customer.generated_pwd'),
'type' => 'text', 'type' => 'text',
'visible' => (Settings::Get('panel.password_regex') == ''), 'visible' => (Settings::Get('panel.password_regex') == ''),
'value' => Crypt::generatePassword() 'value' => Crypt::generatePassword(),
'readonly' => true
] ]
] ]
] ]