Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
24f47bc58b | ||
|
|
c769c074e0 | ||
|
|
2ecb8eb034 | ||
|
|
6827c100c3 | ||
|
|
c402acd1bd | ||
|
|
c4ec2509fa | ||
|
|
0f382586ce | ||
|
|
9c2f12ecb1 | ||
|
|
12da117cab | ||
|
|
ef48f4b48e | ||
|
|
aae6db52b5 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,6 +2,7 @@ install/update.log
|
|||||||
install/*.json
|
install/*.json
|
||||||
lib/userdata.inc.php
|
lib/userdata.inc.php
|
||||||
lib/userdata.inc.php.bak
|
lib/userdata.inc.php.bak
|
||||||
|
lib/config.inc.php
|
||||||
logs/*
|
logs/*
|
||||||
!logs/index.html
|
!logs/index.html
|
||||||
.buildpath
|
.buildpath
|
||||||
|
|||||||
@@ -180,7 +180,9 @@ return [
|
|||||||
'letsencrypt' => 'Let\'s Encrypt (Live)',
|
'letsencrypt' => 'Let\'s Encrypt (Live)',
|
||||||
'buypass_test' => 'Buypass (Test / Staging)',
|
'buypass_test' => 'Buypass (Test / Staging)',
|
||||||
'buypass' => 'Buypass (Live)',
|
'buypass' => 'Buypass (Live)',
|
||||||
'zerossl' => 'ZeroSSL (Live)'
|
'zerossl' => 'ZeroSSL (Live)',
|
||||||
|
'google' => 'Google (Live)',
|
||||||
|
'google_test' => 'Google (Test / Staging)',
|
||||||
],
|
],
|
||||||
'save_method' => 'storeSettingField'
|
'save_method' => 'storeSettingField'
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -43,12 +43,6 @@ use PHPMailer\PHPMailer\PHPMailer;
|
|||||||
const AREA = 'admin';
|
const AREA = 'admin';
|
||||||
require __DIR__ . '/lib/init.php';
|
require __DIR__ . '/lib/init.php';
|
||||||
|
|
||||||
// get sql-root access data
|
|
||||||
Database::needRoot(true);
|
|
||||||
Database::needSqlData();
|
|
||||||
$sql_root = Database::getSqlData();
|
|
||||||
Database::needRoot(false);
|
|
||||||
|
|
||||||
if ($page == 'overview' && $userinfo['change_serversettings'] == '1') {
|
if ($page == 'overview' && $userinfo['change_serversettings'] == '1') {
|
||||||
$settings_data = PhpHelper::loadConfigArrayDir('./actions/admin/settings/');
|
$settings_data = PhpHelper::loadConfigArrayDir('./actions/admin/settings/');
|
||||||
Settings::loadSettingsInto($settings_data);
|
Settings::loadSettingsInto($settings_data);
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ if ($page == 'overview' || $page == 'domains') {
|
|||||||
$domain_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/customer/tablelisting.domains.php';
|
$domain_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/customer/tablelisting.domains.php';
|
||||||
$collection = (new Collection(SubDomains::class, $userinfo))
|
$collection = (new Collection(SubDomains::class, $userinfo))
|
||||||
->withPagination($domain_list_data['domain_list']['columns'], $domain_list_data['domain_list']['default_sorting']);
|
->withPagination($domain_list_data['domain_list']['columns'], $domain_list_data['domain_list']['default_sorting']);
|
||||||
$parentDomainCollection = (new Collection(SubDomains::class, $userinfo, ['sql_search' => ['d.parentdomainid' => 0]]));
|
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
Response::dynamicError($e->getMessage());
|
Response::dynamicError($e->getMessage());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ if ($page == 'overview' || $page == 'mysqls') {
|
|||||||
$result = json_decode($json_result, true)['data'];
|
$result = json_decode($json_result, true)['data'];
|
||||||
|
|
||||||
if (isset($result['databasename']) && $result['databasename'] != '') {
|
if (isset($result['databasename']) && $result['databasename'] != '') {
|
||||||
Database::needRoot(true, $result['dbserver']);
|
Database::needRoot(true, $result['dbserver'], false);
|
||||||
Database::needSqlData();
|
Database::needSqlData();
|
||||||
$sql_root = Database::getSqlData();
|
$sql_root = Database::getSqlData();
|
||||||
Database::needRoot(false);
|
Database::needRoot(false);
|
||||||
|
|||||||
@@ -67,6 +67,11 @@ if (!empty($errid)) {
|
|||||||
$mail_body .= "User-Area: " . AREA . "\n";
|
$mail_body .= "User-Area: " . AREA . "\n";
|
||||||
$mail_body .= "Froxlor-version: " . Froxlor::VERSION . "\n";
|
$mail_body .= "Froxlor-version: " . Froxlor::VERSION . "\n";
|
||||||
$mail_body .= "DB-version: " . Froxlor::DBVERSION . "\n\n";
|
$mail_body .= "DB-version: " . Froxlor::DBVERSION . "\n\n";
|
||||||
|
try {
|
||||||
|
$mail_body .= "Database: " . Database::getAttribute(PDO::ATTR_SERVER_VERSION);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
/* ignore */
|
||||||
|
}
|
||||||
$mail_body .= "End of report";
|
$mail_body .= "End of report";
|
||||||
$mail_html = nl2br($mail_body);
|
$mail_html = nl2br($mail_body);
|
||||||
|
|
||||||
|
|||||||
@@ -225,7 +225,7 @@ CREATE TABLE `panel_customers` (
|
|||||||
`allowed_mysqlserver` text NOT NULL,
|
`allowed_mysqlserver` text NOT NULL,
|
||||||
PRIMARY KEY (`customerid`),
|
PRIMARY KEY (`customerid`),
|
||||||
UNIQUE KEY `loginname` (`loginname`)
|
UNIQUE KEY `loginname` (`loginname`)
|
||||||
) ENGINE=InnoDB CHARSET=utf8 COLLATE=utf8_general_ci;
|
) ENGINE=InnoDB CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC;
|
||||||
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `panel_databases`;
|
DROP TABLE IF EXISTS `panel_databases`;
|
||||||
@@ -696,7 +696,7 @@ opcache.validate_timestamps'),
|
|||||||
('system', 'distribution', ''),
|
('system', 'distribution', ''),
|
||||||
('system', 'update_channel', 'stable'),
|
('system', 'update_channel', 'stable'),
|
||||||
('system', 'updatecheck_data', ''),
|
('system', 'updatecheck_data', ''),
|
||||||
('system', 'update_notify_last', '2.0.2'),
|
('system', 'update_notify_last', '2.0.6'),
|
||||||
('system', 'traffictool', 'goaccess'),
|
('system', 'traffictool', 'goaccess'),
|
||||||
('api', 'enabled', '0'),
|
('api', 'enabled', '0'),
|
||||||
('2fa', 'enabled', '1'),
|
('2fa', 'enabled', '1'),
|
||||||
@@ -740,7 +740,7 @@ opcache.validate_timestamps'),
|
|||||||
('panel', 'logo_overridetheme', '0'),
|
('panel', 'logo_overridetheme', '0'),
|
||||||
('panel', 'logo_overridecustom', '0'),
|
('panel', 'logo_overridecustom', '0'),
|
||||||
('panel', 'settings_mode', '0'),
|
('panel', 'settings_mode', '0'),
|
||||||
('panel', 'version', '2.0.2'),
|
('panel', 'version', '2.0.6'),
|
||||||
('panel', 'db_version', '202212060');
|
('panel', 'db_version', '202212060');
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -67,9 +67,10 @@ if (Froxlor::isFroxlorVersion('0.10.38.3')) {
|
|||||||
) ENGINE=InnoDB CHARSET=utf8 COLLATE=utf8_general_ci;";
|
) ENGINE=InnoDB CHARSET=utf8 COLLATE=utf8_general_ci;";
|
||||||
Database::query($sql);
|
Database::query($sql);
|
||||||
// new customer allowed_mysqlserver field
|
// new customer allowed_mysqlserver field
|
||||||
Database::query("ALTER TABLE `" . TABLE_PANEL_CUSTOMERS . "` ADD `allowed_mysqlserver` text NOT NULL;");
|
Database::query("ALTER TABLE `" . TABLE_PANEL_CUSTOMERS . "` ROW_FORMAT=DYNAMIC;");
|
||||||
Database::query("ALTER TABLE `" . TABLE_PANEL_CUSTOMERS . "` CHANGE COLUMN `allowed_phpconfigs` `allowed_phpconfigs` text NOT NULL;");
|
|
||||||
Database::query("ALTER TABLE `" . TABLE_PANEL_CUSTOMERS . "` CHANGE COLUMN `customernumber` `customernumber` varchar(100) NOT NULL default '';");
|
Database::query("ALTER TABLE `" . TABLE_PANEL_CUSTOMERS . "` CHANGE COLUMN `customernumber` `customernumber` varchar(100) NOT NULL default '';");
|
||||||
|
Database::query("ALTER TABLE `" . TABLE_PANEL_CUSTOMERS . "` CHANGE COLUMN `allowed_phpconfigs` `allowed_phpconfigs` text NOT NULL;");
|
||||||
|
Database::query("ALTER TABLE `" . TABLE_PANEL_CUSTOMERS . "` ADD `allowed_mysqlserver` text NOT NULL;");
|
||||||
$has_customer_table_update_200 = true;
|
$has_customer_table_update_200 = true;
|
||||||
// ftp_users adjustments
|
// ftp_users adjustments
|
||||||
Database::query("ALTER TABLE `" . TABLE_FTP_USERS . "` CHANGE COLUMN `password` `password` varchar(255) NOT NULL default '';");
|
Database::query("ALTER TABLE `" . TABLE_FTP_USERS . "` CHANGE COLUMN `password` `password` varchar(255) NOT NULL default '';");
|
||||||
@@ -182,10 +183,10 @@ if (Froxlor::isFroxlorVersion('0.10.38.3')) {
|
|||||||
Update::lastStepStatus(0);
|
Update::lastStepStatus(0);
|
||||||
|
|
||||||
Update::showUpdateStep("Updating email account password-hashes");
|
Update::showUpdateStep("Updating email account password-hashes");
|
||||||
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password` = REPLACE(`password`, '$1$', '{MD5-CRYPT}$1$') WHERE SUBSTRING(`password`, 1, 3) = '$1$'");
|
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password_enc` = REPLACE(`password_enc`, '$1$', '{MD5-CRYPT}$1$') WHERE SUBSTRING(`password_enc`, 1, 3) = '$1$'");
|
||||||
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password` = REPLACE(`password`, '$5$', '{SHA256-CRYPT}$5$') WHERE SUBSTRING(`password`, 1, 3) = '$5$'");
|
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password_enc` = REPLACE(`password_enc`, '$5$', '{SHA256-CRYPT}$5$') WHERE SUBSTRING(`password_enc`, 1, 3) = '$5$'");
|
||||||
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password` = REPLACE(`password`, '$6$', '{SHA512-CRYPT}$6$') WHERE SUBSTRING(`password`, 1, 3) = '$6$'");
|
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password_enc` = REPLACE(`password_enc`, '$6$', '{SHA512-CRYPT}$6$') WHERE SUBSTRING(`password_enc`, 1, 3) = '$6$'");
|
||||||
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password` = REPLACE(`password`, '$2y$', '{BLF-CRYPT}$2y$') WHERE SUBSTRING(`password`, 1, 4) = '$2y$'");
|
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password_enc` = REPLACE(`password_enc`, '$2y$', '{BLF-CRYPT}$2y$') WHERE SUBSTRING(`password_enc`, 1, 4) = '$2y$'");
|
||||||
Update::lastStepStatus(0);
|
Update::lastStepStatus(0);
|
||||||
|
|
||||||
Froxlor::updateToVersion($update_to);
|
Froxlor::updateToVersion($update_to);
|
||||||
@@ -210,7 +211,7 @@ if (Froxlor::isDatabaseVersion('202211030')) {
|
|||||||
$newCronBin = Froxlor::getInstallDir().'/bin/froxlor-cli';
|
$newCronBin = Froxlor::getInstallDir().'/bin/froxlor-cli';
|
||||||
$compCron = <<<EOF
|
$compCron = <<<EOF
|
||||||
<?php
|
<?php
|
||||||
chmod($newCronBin, 0755);
|
chmod('$newCronBin', 0755);
|
||||||
// re-create cron.d configuration file
|
// re-create cron.d configuration file
|
||||||
exec('$newCronBin froxlor:cron -r 99');
|
exec('$newCronBin froxlor:cron -r 99');
|
||||||
exit;
|
exit;
|
||||||
@@ -245,3 +246,48 @@ if (Froxlor::isFroxlorVersion('2.0.1')) {
|
|||||||
Update::showUpdateStep("Updating from 2.0.1 to 2.0.2", false);
|
Update::showUpdateStep("Updating from 2.0.1 to 2.0.2", false);
|
||||||
Froxlor::updateToVersion('2.0.2');
|
Froxlor::updateToVersion('2.0.2');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Froxlor::isFroxlorVersion('2.0.2')) {
|
||||||
|
Update::showUpdateStep("Updating from 2.0.2 to 2.0.3", false);
|
||||||
|
Froxlor::updateToVersion('2.0.3');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Froxlor::isFroxlorVersion('2.0.3')) {
|
||||||
|
Update::showUpdateStep("Updating from 2.0.3 to 2.0.4", false);
|
||||||
|
|
||||||
|
$complete_filedir = Froxlor::getInstallDir() . '/scripts';
|
||||||
|
// check if compat. cronjob still exists (most likely didn't run successfully b/c of error from former 2.0 release)
|
||||||
|
if (@file_exists($complete_filedir.'/froxlor_master_cronjob.php')) {
|
||||||
|
Update::showUpdateStep("Adjusting backward compatibility for cronjob");
|
||||||
|
$newCronBin = Froxlor::getInstallDir() . '/bin/froxlor-cli';
|
||||||
|
$compCron = <<<EOF
|
||||||
|
<?php
|
||||||
|
chmod('$newCronBin', 0755);
|
||||||
|
// re-create cron.d configuration file
|
||||||
|
exec('$newCronBin froxlor:cron -r 99');
|
||||||
|
exit;
|
||||||
|
EOF;
|
||||||
|
file_put_contents($complete_filedir . '/froxlor_master_cronjob.php', $compCron);
|
||||||
|
Update::lastStepStatus(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Froxlor::updateToVersion('2.0.4');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Froxlor::isFroxlorVersion('2.0.4')) {
|
||||||
|
Update::showUpdateStep("Updating from 2.0.4 to 2.0.5", false);
|
||||||
|
Froxlor::updateToVersion('2.0.5');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Froxlor::isFroxlorVersion('2.0.5')) {
|
||||||
|
Update::showUpdateStep("Updating from 2.0.5 to 2.0.6", false);
|
||||||
|
|
||||||
|
Update::showUpdateStep("Updating possible missing email account password-hashes");
|
||||||
|
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password_enc` = REPLACE(`password_enc`, '$1$', '{MD5-CRYPT}$1$') WHERE SUBSTRING(`password_enc`, 1, 3) = '$1$'");
|
||||||
|
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password_enc` = REPLACE(`password_enc`, '$5$', '{SHA256-CRYPT}$5$') WHERE SUBSTRING(`password_enc`, 1, 3) = '$5$'");
|
||||||
|
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password_enc` = REPLACE(`password_enc`, '$6$', '{SHA512-CRYPT}$6$') WHERE SUBSTRING(`password_enc`, 1, 3) = '$6$'");
|
||||||
|
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password_enc` = REPLACE(`password_enc`, '$2y$', '{BLF-CRYPT}$2y$') WHERE SUBSTRING(`password_enc`, 1, 4) = '$2y$'");
|
||||||
|
Update::lastStepStatus(0);
|
||||||
|
|
||||||
|
Froxlor::updateToVersion('2.0.6');
|
||||||
|
}
|
||||||
|
|||||||
@@ -90,7 +90,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-9]+$/', '', 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, false);
|
||||||
Database::needSqlData();
|
Database::needSqlData();
|
||||||
$sql_root = Database::getSqlData();
|
$sql_root = Database::getSqlData();
|
||||||
Database::needRoot(false);
|
Database::needRoot(false);
|
||||||
@@ -150,7 +150,7 @@ class Mysqls extends ApiCommand implements ResourceEntity
|
|||||||
$pma = Settings::Get('panel.phpmyadmin_url');
|
$pma = Settings::Get('panel.phpmyadmin_url');
|
||||||
}
|
}
|
||||||
|
|
||||||
Database::needRoot(true, $dbserver);
|
Database::needRoot(true, $dbserver, false);
|
||||||
Database::needSqlData();
|
Database::needSqlData();
|
||||||
$sql_root = Database::getSqlData();
|
$sql_root = Database::getSqlData();
|
||||||
Database::needRoot(false);
|
Database::needRoot(false);
|
||||||
@@ -287,7 +287,7 @@ class Mysqls extends ApiCommand implements ResourceEntity
|
|||||||
}
|
}
|
||||||
$result = Database::pexecute_first($result_stmt, $params, true, true);
|
$result = Database::pexecute_first($result_stmt, $params, true, true);
|
||||||
if ($result) {
|
if ($result) {
|
||||||
Database::needRoot(true, $result['dbserver']);
|
Database::needRoot(true, $result['dbserver'], false);
|
||||||
$mbdata_stmt = Database::prepare("
|
$mbdata_stmt = Database::prepare("
|
||||||
SELECT SUM(data_length + index_length) as MB FROM information_schema.TABLES
|
SELECT SUM(data_length + index_length) as MB FROM information_schema.TABLES
|
||||||
WHERE table_schema = :table_schema
|
WHERE table_schema = :table_schema
|
||||||
@@ -364,7 +364,7 @@ class Mysqls extends ApiCommand implements ResourceEntity
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Begin root-session
|
// Begin root-session
|
||||||
Database::needRoot(true, $result['dbserver']);
|
Database::needRoot(true, $result['dbserver'], false);
|
||||||
$dbmgr = new DbManager($this->logger());
|
$dbmgr = new DbManager($this->logger());
|
||||||
foreach (array_map('trim', explode(',', Settings::Get('system.mysql_access_host'))) as $mysql_access_host) {
|
foreach (array_map('trim', explode(',', Settings::Get('system.mysql_access_host'))) as $mysql_access_host) {
|
||||||
$dbmgr->getManager()->grantPrivilegesTo($result['databasename'], $password, $mysql_access_host, false, true);
|
$dbmgr->getManager()->grantPrivilegesTo($result['databasename'], $password, $mysql_access_host, false, true);
|
||||||
@@ -449,7 +449,7 @@ class Mysqls extends ApiCommand implements ResourceEntity
|
|||||||
'dbserver' => $_dbserver['dbserver']
|
'dbserver' => $_dbserver['dbserver']
|
||||||
], $query_fields), true, true);
|
], $query_fields), true, true);
|
||||||
// Begin root-session
|
// Begin root-session
|
||||||
Database::needRoot(true, $_dbserver['dbserver']);
|
Database::needRoot(true, $_dbserver['dbserver'], false);
|
||||||
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
|
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||||
$mbdata_stmt = Database::prepare("
|
$mbdata_stmt = Database::prepare("
|
||||||
SELECT SUM(data_length + index_length) as MB FROM information_schema.TABLES
|
SELECT SUM(data_length + index_length) as MB FROM information_schema.TABLES
|
||||||
@@ -536,7 +536,7 @@ class Mysqls extends ApiCommand implements ResourceEntity
|
|||||||
$id = $result['id'];
|
$id = $result['id'];
|
||||||
|
|
||||||
// Begin root-session
|
// Begin root-session
|
||||||
Database::needRoot(true, $result['dbserver']);
|
Database::needRoot(true, $result['dbserver'], false);
|
||||||
$dbm = new DbManager($this->logger());
|
$dbm = new DbManager($this->logger());
|
||||||
$dbm->getManager()->deleteDatabase($result['databasename']);
|
$dbm->getManager()->deleteDatabase($result['databasename']);
|
||||||
Database::needRoot(false);
|
Database::needRoot(false);
|
||||||
|
|||||||
@@ -701,11 +701,13 @@ class SubDomains extends ApiCommand implements ResourceEntity
|
|||||||
$wwwserveralias = ($selectserveralias == '1') ? '1' : '0';
|
$wwwserveralias = ($selectserveralias == '1') ? '1' : '0';
|
||||||
|
|
||||||
// if allowed, check for 'is email domain'-flag
|
// if allowed, check for 'is email domain'-flag
|
||||||
if ($result['parentdomainid'] != '0' && ($result['subcanemaildomain'] == '1' || $result['subcanemaildomain'] == '2') && $isemaildomain != $result['isemaildomain']) {
|
if ($isemaildomain != $result['isemaildomain']) {
|
||||||
|
if ($result['parentdomainid'] != '0' && ($result['subcanemaildomain'] == '1' || $result['subcanemaildomain'] == '2')) {
|
||||||
$isemaildomain = intval($isemaildomain);
|
$isemaildomain = intval($isemaildomain);
|
||||||
} elseif ($result['parentdomainid'] != '0') {
|
} elseif ($result['parentdomainid'] != '0') {
|
||||||
$isemaildomain = $result['subcanemaildomain'] == '3' ? 1 : 0;
|
$isemaildomain = $result['subcanemaildomain'] == '3' ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// check changes of openbasedir-path variable
|
// check changes of openbasedir-path variable
|
||||||
if ($openbasedir_path > 2 && $openbasedir_path < 0) {
|
if ($openbasedir_path > 2 && $openbasedir_path < 0) {
|
||||||
|
|||||||
@@ -46,7 +46,9 @@ class AcmeSh extends FroxlorCron
|
|||||||
'letsencrypt_test' => "https://acme-staging-v02.api.letsencrypt.org/directory",
|
'letsencrypt_test' => "https://acme-staging-v02.api.letsencrypt.org/directory",
|
||||||
'buypass' => "https://api.buypass.com/acme/directory",
|
'buypass' => "https://api.buypass.com/acme/directory",
|
||||||
'buypass_test' => "https://api.test4.buypass.no/acme/directory",
|
'buypass_test' => "https://api.test4.buypass.no/acme/directory",
|
||||||
'zerossl' => "https://acme.zerossl.com/v2/DV90"
|
'zerossl' => "https://acme.zerossl.com/v2/DV90",
|
||||||
|
'google' => "https://dv.acme-v02.api.pki.goog/directory",
|
||||||
|
'google_test' => "https://dv.acme-v02.test-api.pki.goog/directory",
|
||||||
];
|
];
|
||||||
public static $no_inserttask = false;
|
public static $no_inserttask = false;
|
||||||
private static $apiserver = "";
|
private static $apiserver = "";
|
||||||
|
|||||||
@@ -146,6 +146,7 @@ class BackupCron extends FroxlorCron
|
|||||||
FileDir::safe_exec('mkdir -p ' . escapeshellarg(FileDir::makeCorrectDir($tmpdir . '/mysql')));
|
FileDir::safe_exec('mkdir -p ' . escapeshellarg(FileDir::makeCorrectDir($tmpdir . '/mysql')));
|
||||||
|
|
||||||
// get all customer database-names
|
// get all customer database-names
|
||||||
|
// @fixme respect multiple dbservers
|
||||||
$sel_stmt = Database::prepare("SELECT `databasename` FROM `" . TABLE_PANEL_DATABASES . "` WHERE `customerid` = :cid");
|
$sel_stmt = Database::prepare("SELECT `databasename` FROM `" . TABLE_PANEL_DATABASES . "` WHERE `customerid` = :cid");
|
||||||
Database::pexecute($sel_stmt, [
|
Database::pexecute($sel_stmt, [
|
||||||
'cid' => $data['customerid']
|
'cid' => $data['customerid']
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ class TrafficCron extends FroxlorCron
|
|||||||
|
|
||||||
while ($row_database = $databases_stmt->fetch(PDO::FETCH_ASSOC)) {
|
while ($row_database = $databases_stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||||
if ($last_dbserver != $row_database['dbserver']) {
|
if ($last_dbserver != $row_database['dbserver']) {
|
||||||
Database::needRoot(true, $row_database['dbserver']);
|
Database::needRoot(true, $row_database['dbserver'], true);
|
||||||
$last_dbserver = $row_database['dbserver'];
|
$last_dbserver = $row_database['dbserver'];
|
||||||
|
|
||||||
$databases_list = [];
|
$databases_list = [];
|
||||||
|
|||||||
@@ -79,6 +79,8 @@ class Database
|
|||||||
|
|
||||||
private static $sqldata = null;
|
private static $sqldata = null;
|
||||||
|
|
||||||
|
private static $need_dbname = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper for PDOStatement::execute so we can catch the PDOException
|
* Wrapper for PDOStatement::execute so we can catch the PDOException
|
||||||
* and display the error nicely on the panel - also fetches the
|
* and display the error nicely on the panel - also fetches the
|
||||||
@@ -341,12 +343,13 @@ class Database
|
|||||||
* @param int $dbserver
|
* @param int $dbserver
|
||||||
* optional
|
* optional
|
||||||
*/
|
*/
|
||||||
public static function needRoot($needroot = false, $dbserver = 0)
|
public static function needRoot(bool $needroot = false, int $dbserver = 0, bool $need_db = true)
|
||||||
{
|
{
|
||||||
// force re-connecting to the db with corresponding user
|
// force re-connecting to the db with corresponding user
|
||||||
// and set the $dbserver (mostly to 0 = default)
|
// and set the $dbserver (mostly to 0 = default)
|
||||||
self::setServer($dbserver);
|
self::setServer($dbserver);
|
||||||
self::$needroot = $needroot;
|
self::$needroot = $needroot;
|
||||||
|
self::$need_dbname = $need_db;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -465,10 +468,11 @@ class Database
|
|||||||
'ATTR_ERRMODE' => 'ERRMODE_EXCEPTION'
|
'ATTR_ERRMODE' => 'ERRMODE_EXCEPTION'
|
||||||
];
|
];
|
||||||
|
|
||||||
$dbconf["dsn"] = [
|
$dbconf["dsn"] = ['charset' => 'utf8'];
|
||||||
'dbname' => $sql["db"],
|
|
||||||
'charset' => 'utf8'
|
if (self::$need_dbname) {
|
||||||
];
|
$dbconf["dsn"]['dbname'] = $sql["db"];
|
||||||
|
}
|
||||||
|
|
||||||
if ($socket != null) {
|
if ($socket != null) {
|
||||||
$dbconf["dsn"]['unix_socket'] = FileDir::makeCorrectFile($socket);
|
$dbconf["dsn"]['unix_socket'] = FileDir::makeCorrectFile($socket);
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ class DbManager
|
|||||||
$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
|
// require privileged access for target db-server
|
||||||
Database::needRoot(true, $dbserver['dbserver']);
|
Database::needRoot(true, $dbserver['dbserver'], false);
|
||||||
|
|
||||||
$dbm = new DbManager(FroxlorLogger::getInstanceOf());
|
$dbm = new DbManager(FroxlorLogger::getInstanceOf());
|
||||||
$users = $dbm->getManager()->getAllSqlUsers(false);
|
$users = $dbm->getManager()->getAllSqlUsers(false);
|
||||||
@@ -144,7 +144,7 @@ class DbManager
|
|||||||
*/
|
*/
|
||||||
public function createDatabase($loginname = null, $password = null, int $dbserver = 0, $last_accnumber = 0)
|
public function createDatabase($loginname = null, $password = null, int $dbserver = 0, $last_accnumber = 0)
|
||||||
{
|
{
|
||||||
Database::needRoot(true, $dbserver);
|
Database::needRoot(true, $dbserver, false);
|
||||||
|
|
||||||
// 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') {
|
||||||
@@ -169,18 +169,17 @@ class DbManager
|
|||||||
|
|
||||||
// now create the database itself
|
// now create the database itself
|
||||||
$this->getManager()->createDatabase($username);
|
$this->getManager()->createDatabase($username);
|
||||||
$this->log->logAction(FroxlorLogger::USR_ACTION, LOG_INFO, "created database '" . $username . "'");
|
|
||||||
|
|
||||||
// and give permission to the user on every access-host we have
|
// and give permission to the user on every access-host we have
|
||||||
foreach (array_map('trim', explode(',', Settings::Get('system.mysql_access_host'))) as $mysql_access_host) {
|
foreach (array_map('trim', explode(',', Settings::Get('system.mysql_access_host'))) as $mysql_access_host) {
|
||||||
$this->getManager()->grantPrivilegesTo($username, $password, $mysql_access_host);
|
$this->getManager()->grantPrivilegesTo($username, $password, $mysql_access_host);
|
||||||
$this->log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, "grant all privileges for '" . $username . "'@'" . $mysql_access_host . "'");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->getManager()->flushPrivileges();
|
$this->getManager()->flushPrivileges();
|
||||||
|
|
||||||
Database::needRoot(false);
|
Database::needRoot(false);
|
||||||
|
|
||||||
|
$this->log->logAction(FroxlorLogger::USR_ACTION, LOG_INFO, "created database '" . $username . "'");
|
||||||
|
|
||||||
return $username;
|
return $username;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ final class Froxlor
|
|||||||
{
|
{
|
||||||
|
|
||||||
// Main version variable
|
// Main version variable
|
||||||
const VERSION = '2.0.2';
|
const VERSION = '2.0.6';
|
||||||
|
|
||||||
// Database version (YYYYMMDDC where C is a daily counter)
|
// Database version (YYYYMMDDC where C is a daily counter)
|
||||||
const DBVERSION = '202212060';
|
const DBVERSION = '202212060';
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class Mysql
|
|||||||
public static function dbserver(array $attributes): string
|
public static function dbserver(array $attributes): string
|
||||||
{
|
{
|
||||||
// get sql-root access data
|
// get sql-root access data
|
||||||
Database::needRoot(true, (int)$attributes['data']);
|
Database::needRoot(true, (int)$attributes['data'], false);
|
||||||
Database::needSqlData();
|
Database::needSqlData();
|
||||||
$sql_root = Database::getSqlData();
|
$sql_root = Database::getSqlData();
|
||||||
Database::needRoot(false);
|
Database::needRoot(false);
|
||||||
|
|||||||
@@ -4678,7 +4678,7 @@ aliases: files
|
|||||||
<command><![CDATA[mkdir -p {{settings.system.mod_fcgid_configdir}}]]></command>
|
<command><![CDATA[mkdir -p {{settings.system.mod_fcgid_configdir}}]]></command>
|
||||||
<command><![CDATA[mkdir -p {{settings.system.mod_fcgid_tmpdir}}]]></command>
|
<command><![CDATA[mkdir -p {{settings.system.mod_fcgid_tmpdir}}]]></command>
|
||||||
<command><![CDATA[chmod 1777 {{settings.system.mod_fcgid_tmpdir}}]]></command>
|
<command><![CDATA[chmod 1777 {{settings.system.mod_fcgid_tmpdir}}]]></command>
|
||||||
<command><![CDATA[a2dismod php7.2]]></command>
|
<command><![CDATA[a2dismod php7.4]]></command>
|
||||||
</commands>
|
</commands>
|
||||||
<!-- instead of just restarting apache, we let the cronjob do all the
|
<!-- instead of just restarting apache, we let the cronjob do all the
|
||||||
dirty work -->
|
dirty work -->
|
||||||
@@ -4711,7 +4711,7 @@ aliases: files
|
|||||||
</visibility>
|
</visibility>
|
||||||
<visibility mode="true">{{settings.phpfpm.enabled_ownvhost}}
|
<visibility mode="true">{{settings.phpfpm.enabled_ownvhost}}
|
||||||
</visibility>
|
</visibility>
|
||||||
<command><![CDATA[a2dismod php7.2]]></command>
|
<command><![CDATA[a2dismod php7.4]]></command>
|
||||||
</commands>
|
</commands>
|
||||||
<!-- instead of just restarting apache, we let the cronjob do all the
|
<!-- instead of just restarting apache, we let the cronjob do all the
|
||||||
dirty work -->
|
dirty work -->
|
||||||
|
|||||||
@@ -33,10 +33,16 @@ return [
|
|||||||
'value' => $result['databasename']
|
'value' => $result['databasename']
|
||||||
],
|
],
|
||||||
'mysql_server' => [
|
'mysql_server' => [
|
||||||
|
'visible' => count($mysql_servers) > 1,
|
||||||
|
'type' => 'hidden',
|
||||||
|
'value' => $result['dbserver'] ?? 0,
|
||||||
|
],
|
||||||
|
'mysql_server_info' => [
|
||||||
'visible' => count($mysql_servers) > 1,
|
'visible' => count($mysql_servers) > 1,
|
||||||
'label' => lng('mysql.mysql_server'),
|
'label' => lng('mysql.mysql_server'),
|
||||||
'type' => 'label',
|
'type' => 'label',
|
||||||
'value' => $mysql_servers[$result['dbserver']] ?? 'unknown db server'
|
'disabled' => true,
|
||||||
|
'value' => $mysql_servers[$result['dbserver']] ?? 'unknown db server',
|
||||||
],
|
],
|
||||||
'description' => [
|
'description' => [
|
||||||
'label' => lng('mysql.databasedescription'),
|
'label' => lng('mysql.databasedescription'),
|
||||||
|
|||||||
36
package-lock.json
generated
36
package-lock.json
generated
@@ -5103,9 +5103,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/img-loader/node_modules/json5": {
|
"node_modules/img-loader/node_modules/json5": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"minimist": "^1.2.0"
|
"minimist": "^1.2.0"
|
||||||
@@ -5437,9 +5437,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/json5": {
|
"node_modules/json5": {
|
||||||
"version": "2.2.1",
|
"version": "2.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
|
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"json5": "lib/cli.js"
|
"json5": "lib/cli.js"
|
||||||
@@ -8448,9 +8448,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vue-style-loader/node_modules/json5": {
|
"node_modules/vue-style-loader/node_modules/json5": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"minimist": "^1.2.0"
|
"minimist": "^1.2.0"
|
||||||
@@ -12919,9 +12919,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"json5": {
|
"json5": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"minimist": "^1.2.0"
|
"minimist": "^1.2.0"
|
||||||
@@ -13165,9 +13165,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"json5": {
|
"json5": {
|
||||||
"version": "2.2.1",
|
"version": "2.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
|
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"jsonfile": {
|
"jsonfile": {
|
||||||
@@ -15379,9 +15379,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"json5": {
|
"json5": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"minimist": "^1.2.0"
|
"minimist": "^1.2.0"
|
||||||
|
|||||||
@@ -197,7 +197,7 @@
|
|||||||
{% if field.next_to is defined %}
|
{% if field.next_to is defined %}
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<select {% if field.visible is defined and field.visible == false %} disabled {% endif %} class="form-select {% if field.valid is defined and field.valid == false %}is-invalid{% endif %}" name="{{ id }}{% if field.select_mode is defined and field.select_mode == 'multiple' %}[]{% endif %}" id="{{ id }}" {% if field.mandatory is defined and field.mandatory %} required {% endif %} {% if field.select_mode is defined and field.select_mode == 'multiple' %} multiple="multiple" {% endif %}>
|
<select {% if field.visible is defined and field.visible == false %} disabled {% endif %} class="form-select {% if field.valid is defined and field.valid == false %}is-invalid{% endif %}" name="{{ id }}{% if field.select_mode is defined and field.select_mode == 'multiple' %}[]{% endif %}" id="{{ id }}" {% if field.mandatory is defined and field.mandatory %} required {% endif %} {% if field.select_mode is defined and field.select_mode == 'multiple' %} multiple="multiple" {% endif %}{% if field.readonly is defined and field.readonly %} readonly {% endif %}>
|
||||||
{% for val,txt in field.select_var %}
|
{% for val,txt in field.select_var %}
|
||||||
<option value="{{ val }}" {% if field.selected is defined and ((field.selected is not iterable and field.selected == val) or (field.selected is iterable and val in field.selected|keys)) %} selected="selected" {% endif %}>{{ txt|raw }}</option>
|
<option value="{{ val }}" {% if field.selected is defined and ((field.selected is not iterable and field.selected == val) or (field.selected is iterable and val in field.selected|keys)) %} selected="selected" {% endif %}>{{ txt|raw }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|||||||
Reference in New Issue
Block a user