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:
@@ -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
|
||||||
|
|||||||
@@ -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') {
|
||||||
|
|||||||
@@ -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'),
|
||||||
|
|||||||
@@ -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
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user