Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1347b877a5 | ||
|
|
a862307bce | ||
|
|
2f03eee9aa | ||
|
|
f4183b020b | ||
|
|
9a3d88e8c9 | ||
|
|
c9460fd58f | ||
|
|
6ef532b470 | ||
|
|
5909401cdd | ||
|
|
809e8ef45b | ||
|
|
0a091a99e8 | ||
|
|
e299fbe665 | ||
|
|
67e8b622d8 | ||
|
|
ce509273d4 | ||
|
|
bcf588a2e4 | ||
|
|
f08d540e66 | ||
|
|
e06db3d8c5 | ||
|
|
c5c04ebe9c | ||
|
|
c9faa38f6c | ||
|
|
c188f047dc | ||
|
|
775d50306c | ||
|
|
3821144c3b | ||
|
|
a1da70c221 | ||
|
|
bb2db0fed0 | ||
|
|
9680f24640 | ||
|
|
c732fbd81b | ||
|
|
7980b8d14d | ||
|
|
13e88f5b47 | ||
|
|
031596301b | ||
|
|
b34ab45746 | ||
|
|
dbf83c6f24 | ||
|
|
4cb974839c | ||
|
|
1fa714ef2c |
2
.github/workflows/build-mariadb.yml
vendored
2
.github/workflows/build-mariadb.yml
vendored
@@ -53,7 +53,7 @@ jobs:
|
|||||||
name: Create nightly/testing tarball
|
name: Create nightly/testing tarball
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: froxlor
|
needs: froxlor
|
||||||
if: ${{ github.event_name == 'push' }}
|
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ With that, good luck hacking us ;)
|
|||||||
|
|
||||||
## Supported versions
|
## Supported versions
|
||||||
|
|
||||||
- ️✅ **2.1.x** (`main` git-branch)
|
- ️✅ **2.2.x** (`main` git-branch)
|
||||||
|
- ️✅ **2.1.x** (`v2.1` git-branch)
|
||||||
- ❌ 2.0.x (`2.0.x`-tags)
|
- ❌ 2.0.x (`2.0.x`-tags)
|
||||||
- ❌ 0.10.x (`0.10.x`-tags)
|
- ❌ 0.10.x (`0.10.x`-tags)
|
||||||
- ❌ other git-branches
|
- ❌ other git-branches
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ return [
|
|||||||
'varname' => 'sessiontimeout',
|
'varname' => 'sessiontimeout',
|
||||||
'type' => 'number',
|
'type' => 'number',
|
||||||
'min' => 60,
|
'min' => 60,
|
||||||
|
'max' => 31536000,
|
||||||
'default' => 600,
|
'default' => 600,
|
||||||
'save_method' => 'storeSettingField'
|
'save_method' => 'storeSettingField'
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -142,8 +142,10 @@ if (($page == 'ipsandports' || $page == 'overview') && $userinfo['change_servers
|
|||||||
}
|
}
|
||||||
} elseif ($action == 'jqCheckIP') {
|
} elseif ($action == 'jqCheckIP') {
|
||||||
$ip = $_POST['ip'] ?? "";
|
$ip = $_POST['ip'] ?? "";
|
||||||
if ((filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) || filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) && filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE | FILTER_FLAG_NO_PRIV_RANGE) == false) {
|
if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6)) {
|
||||||
// returns notice if private network detected so we can display it
|
echo json_encode('<div id="ipnote" class="invalid-feedback">'.lng('error.invalidip', [$ip]).'</div>');
|
||||||
|
} elseif (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE | FILTER_FLAG_NO_PRIV_RANGE)) {
|
||||||
|
// returns notice if private network detected, so we can display it
|
||||||
echo json_encode(lng('admin.ipsandports.ipnote'));
|
echo json_encode(lng('admin.ipsandports.ipnote'));
|
||||||
} else {
|
} else {
|
||||||
echo 0;
|
echo 0;
|
||||||
|
|||||||
@@ -248,7 +248,7 @@ if ($action == '2fa_entercode') {
|
|||||||
$rstlog = FroxlorLogger::getInstanceOf([
|
$rstlog = FroxlorLogger::getInstanceOf([
|
||||||
'loginname' => $_SERVER['REMOTE_ADDR']
|
'loginname' => $_SERVER['REMOTE_ADDR']
|
||||||
]);
|
]);
|
||||||
$rstlog->logAction(FroxlorLogger::LOGIN_ACTION, LOG_WARNING, "Unknown user '" . $loginname . "' tried to login.");
|
$rstlog->logAction(FroxlorLogger::LOGIN_ACTION, LOG_WARNING, "Unknown user tried to login.");
|
||||||
|
|
||||||
Response::redirectTo('index.php', [
|
Response::redirectTo('index.php', [
|
||||||
'showmessage' => '2'
|
'showmessage' => '2'
|
||||||
@@ -305,7 +305,7 @@ if ($action == '2fa_entercode') {
|
|||||||
$rstlog = FroxlorLogger::getInstanceOf([
|
$rstlog = FroxlorLogger::getInstanceOf([
|
||||||
'loginname' => $_SERVER['REMOTE_ADDR']
|
'loginname' => $_SERVER['REMOTE_ADDR']
|
||||||
]);
|
]);
|
||||||
$rstlog->logAction(FroxlorLogger::LOGIN_ACTION, LOG_WARNING, "User '" . $loginname . "' tried to login with wrong password.");
|
$rstlog->logAction(FroxlorLogger::LOGIN_ACTION, LOG_WARNING, "User tried to login with wrong password.");
|
||||||
|
|
||||||
unset($userinfo);
|
unset($userinfo);
|
||||||
Response::redirectTo('index.php', [
|
Response::redirectTo('index.php', [
|
||||||
@@ -624,7 +624,7 @@ if ($action == 'forgotpwd') {
|
|||||||
$rstlog = FroxlorLogger::getInstanceOf([
|
$rstlog = FroxlorLogger::getInstanceOf([
|
||||||
'loginname' => 'password_reset'
|
'loginname' => 'password_reset'
|
||||||
]);
|
]);
|
||||||
$rstlog->logAction(FroxlorLogger::USR_ACTION, LOG_WARNING, "User '" . $loginname . "' requested to set a new password, but was not found in database!");
|
$rstlog->logAction(FroxlorLogger::USR_ACTION, LOG_WARNING, "Unknown user requested to set a new password, but was not found in database!");
|
||||||
$message = lng('login.usernotfound');
|
$message = lng('login.usernotfound');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -726,7 +726,7 @@ opcache.validate_timestamps'),
|
|||||||
('panel', 'logo_overridecustom', '0'),
|
('panel', 'logo_overridecustom', '0'),
|
||||||
('panel', 'settings_mode', '0'),
|
('panel', 'settings_mode', '0'),
|
||||||
('panel', 'menu_collapsed', '1'),
|
('panel', 'menu_collapsed', '1'),
|
||||||
('panel', 'version', '2.1.4'),
|
('panel', 'version', '2.1.9'),
|
||||||
('panel', 'db_version', '202312120');
|
('panel', 'db_version', '202312120');
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -279,3 +279,28 @@ if (Froxlor::isFroxlorVersion('2.1.3')) {
|
|||||||
Update::showUpdateStep("Updating from 2.1.3 to 2.1.4", false);
|
Update::showUpdateStep("Updating from 2.1.3 to 2.1.4", false);
|
||||||
Froxlor::updateToVersion('2.1.4');
|
Froxlor::updateToVersion('2.1.4');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Froxlor::isFroxlorVersion('2.1.4')) {
|
||||||
|
Update::showUpdateStep("Updating from 2.1.4 to 2.1.5", false);
|
||||||
|
Froxlor::updateToVersion('2.1.5');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Froxlor::isFroxlorVersion('2.1.5')) {
|
||||||
|
Update::showUpdateStep("Updating from 2.1.5 to 2.1.6", false);
|
||||||
|
Froxlor::updateToVersion('2.1.6');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Froxlor::isFroxlorVersion('2.1.6')) {
|
||||||
|
Update::showUpdateStep("Updating from 2.1.6 to 2.1.7", false);
|
||||||
|
Froxlor::updateToVersion('2.1.7');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Froxlor::isFroxlorVersion('2.1.7')) {
|
||||||
|
Update::showUpdateStep("Updating from 2.1.7 to 2.1.8", false);
|
||||||
|
Froxlor::updateToVersion('2.1.8');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Froxlor::isFroxlorVersion('2.1.8')) {
|
||||||
|
Update::showUpdateStep("Updating from 2.1.8 to 2.1.9", false);
|
||||||
|
Froxlor::updateToVersion('2.1.9');
|
||||||
|
}
|
||||||
|
|||||||
@@ -400,8 +400,11 @@ class Customers extends ApiCommand implements ResourceEntity
|
|||||||
$allowed_phpconfigs = array_map('intval', $allowed_phpconfigs);
|
$allowed_phpconfigs = array_map('intval', $allowed_phpconfigs);
|
||||||
|
|
||||||
if (empty($allowed_phpconfigs) && $phpenabled == 1) {
|
if (empty($allowed_phpconfigs) && $phpenabled == 1) {
|
||||||
|
// only required if not using mod_php
|
||||||
|
if ((int)Settings::Get('system.mod_fcgid') == 1 || (int)Settings::Get('phpfpm.enabled') == 1) {
|
||||||
Response::standardError('customerphpenabledbutnoconfig', '', true);
|
Response::standardError('customerphpenabledbutnoconfig', '', true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$allowed_mysqlserver = array();
|
$allowed_mysqlserver = array();
|
||||||
if (! empty($p_allowed_mysqlserver) && is_array($p_allowed_mysqlserver)) {
|
if (! empty($p_allowed_mysqlserver) && is_array($p_allowed_mysqlserver)) {
|
||||||
@@ -1114,8 +1117,11 @@ class Customers extends ApiCommand implements ResourceEntity
|
|||||||
$allowed_phpconfigs = array_map('intval', $allowed_phpconfigs);
|
$allowed_phpconfigs = array_map('intval', $allowed_phpconfigs);
|
||||||
}
|
}
|
||||||
if (empty($allowed_phpconfigs) && $phpenabled == 1) {
|
if (empty($allowed_phpconfigs) && $phpenabled == 1) {
|
||||||
|
// only required if not using mod_php
|
||||||
|
if ((int)Settings::Get('system.mod_fcgid') == 1 || (int)Settings::Get('phpfpm.enabled') == 1) {
|
||||||
Response::standardError('customerphpenabledbutnoconfig', '', true);
|
Response::standardError('customerphpenabledbutnoconfig', '', true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// add permission for allowed mysql usage if customer was not allowed to use mysql prior
|
// add permission for allowed mysql usage if customer was not allowed to use mysql prior
|
||||||
if ($result['mysqls'] == 0 && ($mysqls == -1 || $mysqls > 0)) {
|
if ($result['mysqls'] == 0 && ($mysqls == -1 || $mysqls > 0)) {
|
||||||
|
|||||||
@@ -519,7 +519,8 @@ class Domains extends ApiCommand implements ResourceEntity
|
|||||||
$mod_fcgid_maxrequests = '-1';
|
$mod_fcgid_maxrequests = '-1';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$phpenabled = '1';
|
// set default to whether the customer has php enabled or not
|
||||||
|
$phpenabled = $customer['phpenabled'];
|
||||||
$openbasedir = '1';
|
$openbasedir = '1';
|
||||||
|
|
||||||
if ((int)Settings::Get('phpfpm.enabled') == 1) {
|
if ((int)Settings::Get('phpfpm.enabled') == 1) {
|
||||||
@@ -1527,13 +1528,12 @@ class Domains extends ApiCommand implements ResourceEntity
|
|||||||
// enabled ssl for the domain but no ssl ip/port is selected
|
// enabled ssl for the domain but no ssl ip/port is selected
|
||||||
Response::standardError('nosslippportgiven', '', true);
|
Response::standardError('nosslippportgiven', '', true);
|
||||||
}
|
}
|
||||||
if (Settings::Get('system.use_ssl') == "0" || empty($ssl_ipandports)) {
|
if (Settings::Get('system.use_ssl') == "0" || empty($ssl_ipandports) || !$sslenabled) {
|
||||||
$ssl_redirect = 0;
|
$ssl_redirect = 0;
|
||||||
$letsencrypt = 0;
|
$letsencrypt = 0;
|
||||||
$http2 = 0;
|
$http2 = 0;
|
||||||
// we need this for the json_encode
|
// act like $remove_ssl_ipandport
|
||||||
// if ssl is disabled or no ssl-ip/port exists
|
$ssl_ipandports = [];
|
||||||
$ssl_ipandports[] = -1;
|
|
||||||
|
|
||||||
// HSTS
|
// HSTS
|
||||||
$hsts_maxage = 0;
|
$hsts_maxage = 0;
|
||||||
|
|||||||
@@ -157,10 +157,10 @@ class EmailAccounts extends ApiCommand implements ResourceEntity
|
|||||||
|
|
||||||
// prefix hash-algo
|
// prefix hash-algo
|
||||||
switch (Settings::Get('system.passwordcryptfunc')) {
|
switch (Settings::Get('system.passwordcryptfunc')) {
|
||||||
case PASSWORD_ARGON2I:
|
case 'argon2i':
|
||||||
$cpPrefix = '{ARGON2I}';
|
$cpPrefix = '{ARGON2I}';
|
||||||
break;
|
break;
|
||||||
case PASSWORD_ARGON2ID:
|
case 'argon2id':
|
||||||
$cpPrefix = '{ARGON2ID}';
|
$cpPrefix = '{ARGON2ID}';
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -404,10 +404,10 @@ class EmailAccounts extends ApiCommand implements ResourceEntity
|
|||||||
$password = Crypt::validatePassword($password, true);
|
$password = Crypt::validatePassword($password, true);
|
||||||
// prefix hash-algo
|
// prefix hash-algo
|
||||||
switch (Settings::Get('system.passwordcryptfunc')) {
|
switch (Settings::Get('system.passwordcryptfunc')) {
|
||||||
case PASSWORD_ARGON2I:
|
case 'argon2i':
|
||||||
$cpPrefix = '{ARGON2I}';
|
$cpPrefix = '{ARGON2I}';
|
||||||
break;
|
break;
|
||||||
case PASSWORD_ARGON2ID:
|
case 'argon2id':
|
||||||
$cpPrefix = '{ARGON2ID}';
|
$cpPrefix = '{ARGON2ID}';
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -222,8 +222,8 @@ class PhpSettings extends ApiCommand implements ResourceEntity
|
|||||||
* optional request terminate timeout if FPM is used, default is '60s'
|
* optional request terminate timeout if FPM is used, default is '60s'
|
||||||
* @param string $phpfpm_reqslowtimeout
|
* @param string $phpfpm_reqslowtimeout
|
||||||
* optional request slowlog timeout if FPM is used, default is '5s'
|
* optional request slowlog timeout if FPM is used, default is '5s'
|
||||||
* @param bool $phpfpm_pass_authorizationheader
|
* @param bool $pass_authorizationheader
|
||||||
* optional whether to pass authorization header to webserver if FPM is used, default is 0 (false)
|
* optional whether to pass authorization header to webserver if FPM/FCGID is used, default is 0 (false)
|
||||||
* @param bool $override_fpmconfig
|
* @param bool $override_fpmconfig
|
||||||
* optional whether to override fpm-daemon-config value for the following settings if FPM is used,
|
* optional whether to override fpm-daemon-config value for the following settings if FPM is used,
|
||||||
* default is 0 (false)
|
* default is 0 (false)
|
||||||
@@ -276,7 +276,7 @@ class PhpSettings extends ApiCommand implements ResourceEntity
|
|||||||
$fpm_enableslowlog = $this->getBoolParam('phpfpm_enable_slowlog', true, 0);
|
$fpm_enableslowlog = $this->getBoolParam('phpfpm_enable_slowlog', true, 0);
|
||||||
$fpm_reqtermtimeout = $this->getParam('phpfpm_reqtermtimeout', true, "60s");
|
$fpm_reqtermtimeout = $this->getParam('phpfpm_reqtermtimeout', true, "60s");
|
||||||
$fpm_reqslowtimeout = $this->getParam('phpfpm_reqslowtimeout', true, "5s");
|
$fpm_reqslowtimeout = $this->getParam('phpfpm_reqslowtimeout', true, "5s");
|
||||||
$fpm_pass_authorizationheader = $this->getBoolParam('phpfpm_pass_authorizationheader', true, 0);
|
$pass_authorizationheader = $this->getBoolParam('pass_authorizationheader', true, 0);
|
||||||
|
|
||||||
$override_fpmconfig = $this->getBoolParam('override_fpmconfig', true, 0);
|
$override_fpmconfig = $this->getBoolParam('override_fpmconfig', true, 0);
|
||||||
$def_fpmconfig = $this->apiCall('FpmDaemons.get', [
|
$def_fpmconfig = $this->apiCall('FpmDaemons.get', [
|
||||||
@@ -312,7 +312,6 @@ class PhpSettings extends ApiCommand implements ResourceEntity
|
|||||||
$fpm_enableslowlog = 0;
|
$fpm_enableslowlog = 0;
|
||||||
$fpm_reqtermtimeout = 0;
|
$fpm_reqtermtimeout = 0;
|
||||||
$fpm_reqslowtimeout = 0;
|
$fpm_reqslowtimeout = 0;
|
||||||
$fpm_pass_authorizationheader = 0;
|
|
||||||
$override_fpmconfig = 0;
|
$override_fpmconfig = 0;
|
||||||
} elseif (Settings::Get('phpfpm.enabled') == 1) {
|
} elseif (Settings::Get('phpfpm.enabled') == 1) {
|
||||||
$fpm_reqtermtimeout = Validate::validate($fpm_reqtermtimeout, 'phpfpm_reqtermtimeout', '/^([0-9]+)(|s|m|h|d)$/', '', [], true);
|
$fpm_reqtermtimeout = Validate::validate($fpm_reqtermtimeout, 'phpfpm_reqtermtimeout', '/^([0-9]+)(|s|m|h|d)$/', '', [], true);
|
||||||
@@ -377,7 +376,7 @@ class PhpSettings extends ApiCommand implements ResourceEntity
|
|||||||
'fpmreqslow' => $fpm_reqslowtimeout,
|
'fpmreqslow' => $fpm_reqslowtimeout,
|
||||||
'phpsettings' => $phpsettings,
|
'phpsettings' => $phpsettings,
|
||||||
'fpmsettingid' => $fpm_config_id,
|
'fpmsettingid' => $fpm_config_id,
|
||||||
'fpmpassauth' => $fpm_pass_authorizationheader,
|
'fpmpassauth' => $pass_authorizationheader,
|
||||||
'ofc' => $override_fpmconfig,
|
'ofc' => $override_fpmconfig,
|
||||||
'pm' => $pmanager,
|
'pm' => $pmanager,
|
||||||
'max_children' => $max_children,
|
'max_children' => $max_children,
|
||||||
@@ -464,7 +463,7 @@ class PhpSettings extends ApiCommand implements ResourceEntity
|
|||||||
* optional request terminate timeout if FPM is used, default is '60s'
|
* optional request terminate timeout if FPM is used, default is '60s'
|
||||||
* @param string $phpfpm_reqslowtimeout
|
* @param string $phpfpm_reqslowtimeout
|
||||||
* optional request slowlog timeout if FPM is used, default is '5s'
|
* optional request slowlog timeout if FPM is used, default is '5s'
|
||||||
* @param bool $phpfpm_pass_authorizationheader
|
* @param bool $pass_authorizationheader
|
||||||
* optional whether to pass authorization header to webserver if FPM is used, default is 0 (false)
|
* optional whether to pass authorization header to webserver if FPM is used, default is 0 (false)
|
||||||
* @param bool $override_fpmconfig
|
* @param bool $override_fpmconfig
|
||||||
* optional whether to override fpm-daemon-config value for the following settings if FPM is used,
|
* optional whether to override fpm-daemon-config value for the following settings if FPM is used,
|
||||||
@@ -516,7 +515,7 @@ class PhpSettings extends ApiCommand implements ResourceEntity
|
|||||||
$fpm_enableslowlog = $this->getBoolParam('phpfpm_enable_slowlog', true, $result['fpm_slowlog']);
|
$fpm_enableslowlog = $this->getBoolParam('phpfpm_enable_slowlog', true, $result['fpm_slowlog']);
|
||||||
$fpm_reqtermtimeout = $this->getParam('phpfpm_reqtermtimeout', true, $result['fpm_reqterm']);
|
$fpm_reqtermtimeout = $this->getParam('phpfpm_reqtermtimeout', true, $result['fpm_reqterm']);
|
||||||
$fpm_reqslowtimeout = $this->getParam('phpfpm_reqslowtimeout', true, $result['fpm_reqslow']);
|
$fpm_reqslowtimeout = $this->getParam('phpfpm_reqslowtimeout', true, $result['fpm_reqslow']);
|
||||||
$fpm_pass_authorizationheader = $this->getBoolParam('phpfpm_pass_authorizationheader', true, $result['pass_authorizationheader']);
|
$pass_authorizationheader = $this->getBoolParam('pass_authorizationheader', true, $result['pass_authorizationheader']);
|
||||||
$override_fpmconfig = $this->getBoolParam('override_fpmconfig', true, $result['override_fpmconfig']);
|
$override_fpmconfig = $this->getBoolParam('override_fpmconfig', true, $result['override_fpmconfig']);
|
||||||
$pmanager = $this->getParam('pm', true, $result['pm']);
|
$pmanager = $this->getParam('pm', true, $result['pm']);
|
||||||
$max_children = $this->getParam('max_children', true, $result['max_children']);
|
$max_children = $this->getParam('max_children', true, $result['max_children']);
|
||||||
@@ -548,7 +547,6 @@ class PhpSettings extends ApiCommand implements ResourceEntity
|
|||||||
$fpm_enableslowlog = 0;
|
$fpm_enableslowlog = 0;
|
||||||
$fpm_reqtermtimeout = 0;
|
$fpm_reqtermtimeout = 0;
|
||||||
$fpm_reqslowtimeout = 0;
|
$fpm_reqslowtimeout = 0;
|
||||||
$fpm_pass_authorizationheader = 0;
|
|
||||||
$override_fpmconfig = 0;
|
$override_fpmconfig = 0;
|
||||||
} elseif (Settings::Get('phpfpm.enabled') == 1) {
|
} elseif (Settings::Get('phpfpm.enabled') == 1) {
|
||||||
$fpm_reqtermtimeout = Validate::validate($fpm_reqtermtimeout, 'phpfpm_reqtermtimeout', '/^([0-9]+)(|s|m|h|d)$/', '', [], true);
|
$fpm_reqtermtimeout = Validate::validate($fpm_reqtermtimeout, 'phpfpm_reqtermtimeout', '/^([0-9]+)(|s|m|h|d)$/', '', [], true);
|
||||||
@@ -614,7 +612,7 @@ class PhpSettings extends ApiCommand implements ResourceEntity
|
|||||||
'fpmreqslow' => $fpm_reqslowtimeout,
|
'fpmreqslow' => $fpm_reqslowtimeout,
|
||||||
'phpsettings' => $phpsettings,
|
'phpsettings' => $phpsettings,
|
||||||
'fpmsettingid' => $fpm_config_id,
|
'fpmsettingid' => $fpm_config_id,
|
||||||
'fpmpassauth' => $fpm_pass_authorizationheader,
|
'fpmpassauth' => $pass_authorizationheader,
|
||||||
'ofc' => $override_fpmconfig,
|
'ofc' => $override_fpmconfig,
|
||||||
'pm' => $pmanager,
|
'pm' => $pmanager,
|
||||||
'max_children' => $max_children,
|
'max_children' => $max_children,
|
||||||
|
|||||||
@@ -296,6 +296,8 @@ class SubDomains extends ApiCommand implements ResourceEntity
|
|||||||
// assign default config
|
// assign default config
|
||||||
$phpsid_result['phpsettingid'] = 1;
|
$phpsid_result['phpsettingid'] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($domain_check['phpenabled'] == 1) {
|
||||||
// check whether the customer has chosen its own php-config
|
// check whether the customer has chosen its own php-config
|
||||||
if ($phpsettingid > 0 && $phpsettingid != $phpsid_result['phpsettingid']) {
|
if ($phpsettingid > 0 && $phpsettingid != $phpsid_result['phpsettingid']) {
|
||||||
$phpsid_result['phpsettingid'] = intval($phpsettingid);
|
$phpsid_result['phpsettingid'] = intval($phpsettingid);
|
||||||
@@ -313,6 +315,7 @@ class SubDomains extends ApiCommand implements ResourceEntity
|
|||||||
Response::standardError('notallowedphpconfigused', '', true);
|
Response::standardError('notallowedphpconfigused', '', true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// actually insert domain
|
// actually insert domain
|
||||||
$stmt = Database::prepare("
|
$stmt = Database::prepare("
|
||||||
@@ -797,7 +800,7 @@ class SubDomains extends ApiCommand implements ResourceEntity
|
|||||||
$allowed_phpconfigs = [];
|
$allowed_phpconfigs = [];
|
||||||
}
|
}
|
||||||
// only with fcgid/fpm enabled will it be possible to select a php-setting
|
// only with fcgid/fpm enabled will it be possible to select a php-setting
|
||||||
if ((int)Settings::Get('system.mod_fcgid') == 1 || (int)Settings::Get('phpfpm.enabled') == 1) {
|
if ((int)$result['phpenabled'] == 1 && ((int)Settings::Get('system.mod_fcgid') == 1 || (int)Settings::Get('phpfpm.enabled') == 1)) {
|
||||||
if (!in_array($phpsettingid, $allowed_phpconfigs)) {
|
if (!in_array($phpsettingid, $allowed_phpconfigs)) {
|
||||||
Response::standardError('notallowedphpconfigused', '', true);
|
Response::standardError('notallowedphpconfigused', '', true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,6 +90,8 @@ class SysLog extends ApiCommand implements ResourceEntity
|
|||||||
}
|
}
|
||||||
Database::pexecute($result_stmt, $query_fields, true, true);
|
Database::pexecute($result_stmt, $query_fields, true, true);
|
||||||
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
|
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||||
|
// clean log-text
|
||||||
|
$row['text'] = preg_replace("/[^\w @#\"':.()\[\]+\-_\/\\\!]/i", "_", $row['text']);
|
||||||
$result[] = $row;
|
$result[] = $row;
|
||||||
}
|
}
|
||||||
$this->logger()->logAction($this->isAdmin() ? FroxlorLogger::ADM_ACTION : FroxlorLogger::USR_ACTION, LOG_INFO, "[API] list log-entries");
|
$this->logger()->logAction($this->isAdmin() ? FroxlorLogger::ADM_ACTION : FroxlorLogger::USR_ACTION, LOG_INFO, "[API] list log-entries");
|
||||||
|
|||||||
@@ -55,12 +55,10 @@ class Bind extends DnsBase
|
|||||||
$domains = $this->getDomainList();
|
$domains = $this->getDomainList();
|
||||||
|
|
||||||
if (empty($domains)) {
|
if (empty($domains)) {
|
||||||
$this->logger->logAction(FroxlorLogger::CRON_ACTION, LOG_INFO, 'No domains found for nameserver-config, skipping...');
|
$this->logger->logAction(FroxlorLogger::CRON_ACTION, LOG_INFO, 'No domains found for nameserver-config, not creating any zones...');
|
||||||
return;
|
$this->bindconf_file = '';
|
||||||
}
|
} else {
|
||||||
|
|
||||||
$this->bindconf_file = '# ' . Settings::Get('system.bindconf_directory') . 'froxlor_bind.conf' . "\n" . '# Created ' . date('d.m.Y H:i') . "\n" . '# Do NOT manually edit this file, all changes will be deleted after the next domain change at the panel.' . "\n\n";
|
$this->bindconf_file = '# ' . Settings::Get('system.bindconf_directory') . 'froxlor_bind.conf' . "\n" . '# Created ' . date('d.m.Y H:i') . "\n" . '# Do NOT manually edit this file, all changes will be deleted after the next domain change at the panel.' . "\n\n";
|
||||||
|
|
||||||
foreach ($domains as $domain) {
|
foreach ($domains as $domain) {
|
||||||
if ($domain['is_child']) {
|
if ($domain['is_child']) {
|
||||||
// domains that are subdomains to other main domains are handled by recursion within walkDomainList()
|
// domains that are subdomains to other main domains are handled by recursion within walkDomainList()
|
||||||
@@ -68,6 +66,7 @@ class Bind extends DnsBase
|
|||||||
}
|
}
|
||||||
$this->walkDomainList($domain, $domains);
|
$this->walkDomainList($domain, $domains);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$bindconf_file_handler = fopen(FileDir::makeCorrectFile(Settings::Get('system.bindconf_directory') . '/froxlor_bind.conf'), 'w');
|
$bindconf_file_handler = fopen(FileDir::makeCorrectFile(Settings::Get('system.bindconf_directory') . '/froxlor_bind.conf'), 'w');
|
||||||
fwrite($bindconf_file_handler, $this->bindconf_file);
|
fwrite($bindconf_file_handler, $this->bindconf_file);
|
||||||
|
|||||||
@@ -45,10 +45,8 @@ class PowerDNS extends DnsBase
|
|||||||
$this->clearZoneTables($domains);
|
$this->clearZoneTables($domains);
|
||||||
|
|
||||||
if (empty($domains)) {
|
if (empty($domains)) {
|
||||||
$this->logger->logAction(FroxlorLogger::CRON_ACTION, LOG_INFO, 'No domains found for nameserver-config, skipping...');
|
$this->logger->logAction(FroxlorLogger::CRON_ACTION, LOG_INFO, 'No domains found for nameserver-config, not creating any zones...');
|
||||||
return;
|
} else {
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($domains as $domain) {
|
foreach ($domains as $domain) {
|
||||||
if ($domain['is_child']) {
|
if ($domain['is_child']) {
|
||||||
// domains that are subdomains to other main domains are handled by recursion within walkDomainList()
|
// domains that are subdomains to other main domains are handled by recursion within walkDomainList()
|
||||||
@@ -56,7 +54,7 @@ class PowerDNS extends DnsBase
|
|||||||
}
|
}
|
||||||
$this->walkDomainList($domain, $domains);
|
$this->walkDomainList($domain, $domains);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
$this->logger->logAction(FroxlorLogger::CRON_ACTION, LOG_INFO, 'PowerDNS database updated');
|
$this->logger->logAction(FroxlorLogger::CRON_ACTION, LOG_INFO, 'PowerDNS database updated');
|
||||||
$this->reloadDaemon();
|
$this->reloadDaemon();
|
||||||
$this->logger->logAction(FroxlorLogger::CRON_ACTION, LOG_INFO, 'Task4 finished');
|
$this->logger->logAction(FroxlorLogger::CRON_ACTION, LOG_INFO, 'Task4 finished');
|
||||||
|
|||||||
@@ -25,19 +25,21 @@
|
|||||||
|
|
||||||
namespace Froxlor\Cron\Http;
|
namespace Froxlor\Cron\Http;
|
||||||
|
|
||||||
use Froxlor\Froxlor;
|
|
||||||
use Froxlor\Cron\Http\Php\PhpInterface;
|
use Froxlor\Cron\Http\Php\PhpInterface;
|
||||||
|
use Froxlor\Cron\TaskId;
|
||||||
use Froxlor\Customer\Customer;
|
use Froxlor\Customer\Customer;
|
||||||
use Froxlor\Database\Database;
|
use Froxlor\Database\Database;
|
||||||
use Froxlor\Domain\Domain;
|
use Froxlor\Domain\Domain;
|
||||||
use Froxlor\FileDir;
|
use Froxlor\FileDir;
|
||||||
|
use Froxlor\Froxlor;
|
||||||
use Froxlor\FroxlorLogger;
|
use Froxlor\FroxlorLogger;
|
||||||
use Froxlor\Http\Directory;
|
use Froxlor\Http\Directory;
|
||||||
use Froxlor\Http\Statistics;
|
use Froxlor\Http\Statistics;
|
||||||
use Froxlor\PhpHelper;
|
use Froxlor\PhpHelper;
|
||||||
use Froxlor\Settings;
|
use Froxlor\Settings;
|
||||||
use Froxlor\Validate\Validate;
|
use Froxlor\System\Cronjob;
|
||||||
use Froxlor\System\Crypt;
|
use Froxlor\System\Crypt;
|
||||||
|
use Froxlor\Validate\Validate;
|
||||||
use PDO;
|
use PDO;
|
||||||
|
|
||||||
class Apache extends HttpConfigBase
|
class Apache extends HttpConfigBase
|
||||||
@@ -133,6 +135,7 @@ class Apache extends HttpConfigBase
|
|||||||
if (Settings::Get('system.le_froxlor_enabled') && ($this->froxlorVhostHasLetsEncryptCert() == false || $this->froxlorVhostLetsEncryptNeedsRenew())) {
|
if (Settings::Get('system.le_froxlor_enabled') && ($this->froxlorVhostHasLetsEncryptCert() == false || $this->froxlorVhostLetsEncryptNeedsRenew())) {
|
||||||
$this->virtualhosts_data[$vhosts_filename] .= '# temp. disabled ssl-redirect due to Let\'s Encrypt certificate generation.' . PHP_EOL;
|
$this->virtualhosts_data[$vhosts_filename] .= '# temp. disabled ssl-redirect due to Let\'s Encrypt certificate generation.' . PHP_EOL;
|
||||||
$is_redirect = false;
|
$is_redirect = false;
|
||||||
|
Cronjob::inserttask(TaskId::REBUILD_VHOST);
|
||||||
} else {
|
} else {
|
||||||
$_sslport = $this->checkAlternativeSslPort();
|
$_sslport = $this->checkAlternativeSslPort();
|
||||||
|
|
||||||
@@ -205,7 +208,9 @@ class Apache extends HttpConfigBase
|
|||||||
];
|
];
|
||||||
$php = new PhpInterface($domain);
|
$php = new PhpInterface($domain);
|
||||||
$phpconfig = $php->getPhpConfig(Settings::Get('system.mod_fcgid_defaultini_ownvhost'));
|
$phpconfig = $php->getPhpConfig(Settings::Get('system.mod_fcgid_defaultini_ownvhost'));
|
||||||
|
if ($phpconfig['pass_authorizationheader'] == '1') {
|
||||||
|
$this->virtualhosts_data[$vhosts_filename] .= ' FcgidPassHeader Authorization' . "\n";
|
||||||
|
}
|
||||||
$starter_filename = FileDir::makeCorrectFile($configdir . '/php-fcgi-starter');
|
$starter_filename = FileDir::makeCorrectFile($configdir . '/php-fcgi-starter');
|
||||||
$this->virtualhosts_data[$vhosts_filename] .= ' SuexecUserGroup "' . Settings::Get('system.mod_fcgid_httpuser') . '" "' . Settings::Get('system.mod_fcgid_httpgroup') . '"' . "\n";
|
$this->virtualhosts_data[$vhosts_filename] .= ' SuexecUserGroup "' . Settings::Get('system.mod_fcgid_httpuser') . '" "' . Settings::Get('system.mod_fcgid_httpgroup') . '"' . "\n";
|
||||||
$this->virtualhosts_data[$vhosts_filename] .= ' <Directory "' . $mypath . '">' . "\n";
|
$this->virtualhosts_data[$vhosts_filename] .= ' <Directory "' . $mypath . '">' . "\n";
|
||||||
@@ -276,7 +281,9 @@ class Apache extends HttpConfigBase
|
|||||||
// start block, cut off last pipe and close block
|
// start block, cut off last pipe and close block
|
||||||
$filesmatch = '(' . str_replace(".", "\.", substr($filesmatch, 0, -1)) . ')';
|
$filesmatch = '(' . str_replace(".", "\.", substr($filesmatch, 0, -1)) . ')';
|
||||||
$this->virtualhosts_data[$vhosts_filename] .= ' <FilesMatch \.' . $filesmatch . '$>' . "\n";
|
$this->virtualhosts_data[$vhosts_filename] .= ' <FilesMatch \.' . $filesmatch . '$>' . "\n";
|
||||||
|
$this->virtualhosts_data[$vhosts_filename] .= ' <If "-f %{SCRIPT_FILENAME}">' . "\n";
|
||||||
$this->virtualhosts_data[$vhosts_filename] .= ' SetHandler proxy:unix:' . $php->getInterface()->getSocketFile() . '|fcgi://localhost' . "\n";
|
$this->virtualhosts_data[$vhosts_filename] .= ' SetHandler proxy:unix:' . $php->getInterface()->getSocketFile() . '|fcgi://localhost' . "\n";
|
||||||
|
$this->virtualhosts_data[$vhosts_filename] .= ' </If>' . "\n";
|
||||||
$this->virtualhosts_data[$vhosts_filename] .= ' </FilesMatch>' . "\n";
|
$this->virtualhosts_data[$vhosts_filename] .= ' </FilesMatch>' . "\n";
|
||||||
if ($phpconfig['pass_authorizationheader'] == '1') {
|
if ($phpconfig['pass_authorizationheader'] == '1') {
|
||||||
$this->virtualhosts_data[$vhosts_filename] .= ' <Directory "' . $mypath . '">' . "\n";
|
$this->virtualhosts_data[$vhosts_filename] .= ' <Directory "' . $mypath . '">' . "\n";
|
||||||
@@ -816,6 +823,7 @@ class Apache extends HttpConfigBase
|
|||||||
$modrew_red = ' [R=' . $code . ';L,NE]';
|
$modrew_red = ' [R=' . $code . ';L,NE]';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$vhost_content .= $this->getLogfiles($domain);
|
||||||
// redirect everything, not only root-directory, #541
|
// redirect everything, not only root-directory, #541
|
||||||
$vhost_content .= ' <IfModule mod_rewrite.c>' . "\n";
|
$vhost_content .= ' <IfModule mod_rewrite.c>' . "\n";
|
||||||
$vhost_content .= ' RewriteEngine On' . "\n";
|
$vhost_content .= ' RewriteEngine On' . "\n";
|
||||||
@@ -842,6 +850,7 @@ class Apache extends HttpConfigBase
|
|||||||
}
|
}
|
||||||
$vhost_content .= $this->getLogfiles($domain);
|
$vhost_content .= $this->getLogfiles($domain);
|
||||||
|
|
||||||
|
if ($this->deactivated == false) {
|
||||||
if ($domain['specialsettings'] != '' && ($ssl_vhost == false || ($ssl_vhost == true && $domain['include_specialsettings'] == 1))) {
|
if ($domain['specialsettings'] != '' && ($ssl_vhost == false || ($ssl_vhost == true && $domain['include_specialsettings'] == 1))) {
|
||||||
$vhost_content .= $this->processSpecialConfigTemplate($domain['specialsettings'], $domain, $domain['ip'], $domain['port'], $ssl_vhost) . "\n";
|
$vhost_content .= $this->processSpecialConfigTemplate($domain['specialsettings'], $domain, $domain['ip'], $domain['port'], $ssl_vhost) . "\n";
|
||||||
}
|
}
|
||||||
@@ -862,6 +871,7 @@ class Apache extends HttpConfigBase
|
|||||||
$vhost_content .= $this->processSpecialConfigTemplate(Settings::Get('system.default_sslvhostconf'), $domain, $domain['ip'], $domain['port'], $ssl_vhost) . "\n";
|
$vhost_content .= $this->processSpecialConfigTemplate(Settings::Get('system.default_sslvhostconf'), $domain, $domain['ip'], $domain['port'], $ssl_vhost) . "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$vhost_content .= '</VirtualHost>' . "\n";
|
$vhost_content .= '</VirtualHost>' . "\n";
|
||||||
|
|
||||||
|
|||||||
@@ -521,6 +521,8 @@ EOC;
|
|||||||
self::runAcmeSh($certrow, $domains, $cronlog, $do_force);
|
self::runAcmeSh($certrow, $domains, $cronlog, $do_force);
|
||||||
} else {
|
} else {
|
||||||
$cronlog->logAction(FroxlorLogger::CRON_ACTION, LOG_WARNING, "Skipping Let's Encrypt generation for " . $certrow['domain'] . " due to an enabled ssl_redirect");
|
$cronlog->logAction(FroxlorLogger::CRON_ACTION, LOG_WARNING, "Skipping Let's Encrypt generation for " . $certrow['domain'] . " due to an enabled ssl_redirect");
|
||||||
|
// we need another reconfigure in order to get the certificate
|
||||||
|
Cronjob::inserttask(TaskId::REBUILD_VHOST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -406,6 +406,7 @@ class Lighttpd extends HttpConfigBase
|
|||||||
// Get domain's redirect code
|
// Get domain's redirect code
|
||||||
$code = Domain::getDomainRedirectCode($domain['id']);
|
$code = Domain::getDomainRedirectCode($domain['id']);
|
||||||
|
|
||||||
|
$vhost_content .= $this->getLogFiles($domain);
|
||||||
$vhost_content .= ' url.redirect-code = ' . $code . "\n";
|
$vhost_content .= ' url.redirect-code = ' . $code . "\n";
|
||||||
$vhost_content .= ' url.redirect = (' . "\n";
|
$vhost_content .= ' url.redirect = (' . "\n";
|
||||||
$vhost_content .= ' "^/(.*)$" => "' . $uri . '$1"' . "\n";
|
$vhost_content .= ' "^/(.*)$" => "' . $uri . '$1"' . "\n";
|
||||||
|
|||||||
@@ -586,6 +586,7 @@ class Nginx extends HttpConfigBase
|
|||||||
// Get domain's redirect code
|
// Get domain's redirect code
|
||||||
$code = Domain::getDomainRedirectCode($domain['id']);
|
$code = Domain::getDomainRedirectCode($domain['id']);
|
||||||
|
|
||||||
|
$vhost_content .= $this->getLogFiles($domain);
|
||||||
$vhost_content .= "\t" . 'location / {' . "\n";
|
$vhost_content .= "\t" . 'location / {' . "\n";
|
||||||
$vhost_content .= "\t\t" . 'return ' . $code . ' ' . $uri . '$request_uri;' . "\n";
|
$vhost_content .= "\t\t" . 'return ' . $code . ' ' . $uri . '$request_uri;' . "\n";
|
||||||
$vhost_content .= "\t" . '}' . "\n";
|
$vhost_content .= "\t" . '}' . "\n";
|
||||||
|
|||||||
@@ -115,6 +115,21 @@ class ExportCron extends FroxlorCron
|
|||||||
|
|
||||||
$has_dbs = false;
|
$has_dbs = false;
|
||||||
$current_dbserver = -1;
|
$current_dbserver = -1;
|
||||||
|
|
||||||
|
// look for mysqldump
|
||||||
|
$section = 'mysqldump';
|
||||||
|
if (file_exists("/usr/bin/mysqldump")) {
|
||||||
|
$mysql_dump = '/usr/bin/mysqldump';
|
||||||
|
} elseif (file_exists("/usr/local/bin/mysqldump")) {
|
||||||
|
$mysql_dump = '/usr/local/bin/mysqldump';
|
||||||
|
} elseif (file_exists("/usr/bin/mariadb-dump")) {
|
||||||
|
$mysql_dump = '/usr/bin/mariadb-dump';
|
||||||
|
$section = 'mariadb-dump';
|
||||||
|
}
|
||||||
|
if (!isset($mysql_dump)) {
|
||||||
|
$cronlog->logAction(FroxlorLogger::CRON_ACTION, LOG_ERR, 'mysqldump/mariadb-dump executable could not be found. Please install mysql-client/mariadb-client package.');
|
||||||
|
} else {
|
||||||
|
|
||||||
while ($row = $sel_stmt->fetch()) {
|
while ($row = $sel_stmt->fetch()) {
|
||||||
// Get sql_root data for the specific database-server the database resides on
|
// Get sql_root data for the specific database-server the database resides on
|
||||||
if ($current_dbserver != $row['dbserver']) {
|
if ($current_dbserver != $row['dbserver']) {
|
||||||
@@ -124,7 +139,7 @@ class ExportCron extends FroxlorCron
|
|||||||
Database::needRoot(false);
|
Database::needRoot(false);
|
||||||
// create temporary mysql-defaults file for the connection-credentials/details
|
// create temporary mysql-defaults file for the connection-credentials/details
|
||||||
$mysqlcnf_file = tempnam("/tmp", "frx");
|
$mysqlcnf_file = tempnam("/tmp", "frx");
|
||||||
$mysqlcnf = "[mysqldump]\npassword=" . $sql_root['passwd'] . "\nhost=" . $sql_root['host'] . "\n";
|
$mysqlcnf = "[".$section."]\npassword=" . $sql_root['passwd'] . "\nhost=" . $sql_root['host'] . "\n";
|
||||||
if (!empty($sql_root['port'])) {
|
if (!empty($sql_root['port'])) {
|
||||||
$mysqlcnf .= "port=" . $sql_root['port'] . "\n";
|
$mysqlcnf .= "port=" . $sql_root['port'] . "\n";
|
||||||
} elseif (!empty($sql_root['socket'])) {
|
} elseif (!empty($sql_root['socket'])) {
|
||||||
@@ -132,14 +147,15 @@ class ExportCron extends FroxlorCron
|
|||||||
}
|
}
|
||||||
file_put_contents($mysqlcnf_file, $mysqlcnf);
|
file_put_contents($mysqlcnf_file, $mysqlcnf);
|
||||||
}
|
}
|
||||||
$cronlog->logAction(FroxlorLogger::CRON_ACTION, LOG_DEBUG, 'shell> mysqldump -u ' . escapeshellarg($sql_root['user']) . ' -pXXXXX ' . $row['databasename'] . ' > ' . FileDir::makeCorrectFile($tmpdir . '/mysql/' . $row['databasename'] . '_' . date('YmdHi', time()) . '.sql'));
|
$cronlog->logAction(FroxlorLogger::CRON_ACTION, LOG_DEBUG, 'shell> '.basename($mysql_dump) . ' -u ' . escapeshellarg($sql_root['user']) . ' -pXXXXX ' . $row['databasename'] . ' > ' . FileDir::makeCorrectFile($tmpdir . '/mysql/' . $row['databasename'] . '_' . date('YmdHi', time()) . '.sql'));
|
||||||
$bool_false = false;
|
$bool_false = false;
|
||||||
FileDir::safe_exec('mysqldump --defaults-file=' . escapeshellarg($mysqlcnf_file) . ' -u ' . escapeshellarg($sql_root['user']) . ' ' . $row['databasename'] . ' > ' . FileDir::makeCorrectFile($tmpdir . '/mysql/' . $row['databasename'] . '_' . date('YmdHi', time()) . '.sql'), $bool_false, [
|
FileDir::safe_exec($mysql_dump . ' --defaults-file=' . escapeshellarg($mysqlcnf_file) . ' -u ' . escapeshellarg($sql_root['user']) . ' ' . $row['databasename'] . ' > ' . FileDir::makeCorrectFile($tmpdir . '/mysql/' . $row['databasename'] . '_' . date('YmdHi', time()) . '.sql'), $bool_false, [
|
||||||
'>'
|
'>'
|
||||||
]);
|
]);
|
||||||
$has_dbs = true;
|
$has_dbs = true;
|
||||||
$current_dbserver = $row['dbserver'];
|
$current_dbserver = $row['dbserver'];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ($has_dbs) {
|
if ($has_dbs) {
|
||||||
$create_export_tar_data .= './mysql ';
|
$create_export_tar_data .= './mysql ';
|
||||||
|
|||||||
@@ -140,6 +140,12 @@ class FileDir
|
|||||||
if (is_link($check_dir)) {
|
if (is_link($check_dir)) {
|
||||||
$original_target = $check_dir;
|
$original_target = $check_dir;
|
||||||
$check_dir = readlink($check_dir);
|
$check_dir = readlink($check_dir);
|
||||||
|
$link_dir = dirname($original_target);
|
||||||
|
// check whether the link is relative or absolute
|
||||||
|
if (substr($check_dir, 0, 1) != '/') {
|
||||||
|
// relative directory, prepend link_dir
|
||||||
|
$check_dir = $link_dir . '/' . $check_dir;
|
||||||
|
}
|
||||||
if (substr($check_dir, 0, strlen($fixed_homedir)) != $fixed_homedir) {
|
if (substr($check_dir, 0, strlen($fixed_homedir)) != $fixed_homedir) {
|
||||||
throw new Exception("Found symlink pointing outside of customer home directory: " . substr($original_target, strlen($fixed_homedir)));
|
throw new Exception("Found symlink pointing outside of customer home directory: " . substr($original_target, strlen($fixed_homedir)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ final class Froxlor
|
|||||||
{
|
{
|
||||||
|
|
||||||
// Main version variable
|
// Main version variable
|
||||||
const VERSION = '2.1.4';
|
const VERSION = '2.1.9';
|
||||||
|
|
||||||
// Database version (YYYYMMDDC where C is a daily counter)
|
// Database version (YYYYMMDDC where C is a daily counter)
|
||||||
const DBVERSION = '202312120';
|
const DBVERSION = '202312120';
|
||||||
|
|||||||
@@ -175,6 +175,9 @@ class FroxlorLogger
|
|||||||
$this->initMonolog();
|
$this->initMonolog();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// clean log-text
|
||||||
|
$text = preg_replace("/[^\w @#\"':.()\[\]+\-_\/\\\!]/i", "_", $text);
|
||||||
|
|
||||||
if (self::$crondebug_flag || ($action == FroxlorLogger::CRON_ACTION && $type <= LOG_WARNING)) {
|
if (self::$crondebug_flag || ($action == FroxlorLogger::CRON_ACTION && $type <= LOG_WARNING)) {
|
||||||
echo "[" . $this->getLogLevelDesc($type) . "] " . $text . PHP_EOL;
|
echo "[" . $this->getLogLevelDesc($type) . "] " . $text . PHP_EOL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ class AutoUpdate
|
|||||||
if (Settings::Get('system.update_channel') == 'testing') {
|
if (Settings::Get('system.update_channel') == 'testing') {
|
||||||
$channel = '/testing';
|
$channel = '/testing';
|
||||||
} elseif (Settings::Get('system.update_channel') == 'nightly') {
|
} elseif (Settings::Get('system.update_channel') == 'nightly') {
|
||||||
if (empty(Froxlor::BRANDING)) {
|
if (empty(Froxlor::BRANDING) || substr(Froxlor::BRANDING, 0, 1) == '-') {
|
||||||
$channel = '/nightly.0000000';
|
$channel = '/nightly.0000000';
|
||||||
} else {
|
} else {
|
||||||
$channel = '/' . substr(Froxlor::BRANDING, 1);
|
$channel = '/' . substr(Froxlor::BRANDING, 1);
|
||||||
|
|||||||
@@ -176,15 +176,19 @@ class Core
|
|||||||
$filename = "/tmp/froxlor_backup_" . date('YmdHi') . ".sql";
|
$filename = "/tmp/froxlor_backup_" . date('YmdHi') . ".sql";
|
||||||
|
|
||||||
// look for mysqldump
|
// look for mysqldump
|
||||||
|
$section = 'mysqldump';
|
||||||
if (file_exists("/usr/bin/mysqldump")) {
|
if (file_exists("/usr/bin/mysqldump")) {
|
||||||
$mysql_dump = '/usr/bin/mysqldump';
|
$mysql_dump = '/usr/bin/mysqldump';
|
||||||
} elseif (file_exists("/usr/local/bin/mysqldump")) {
|
} elseif (file_exists("/usr/local/bin/mysqldump")) {
|
||||||
$mysql_dump = '/usr/local/bin/mysqldump';
|
$mysql_dump = '/usr/local/bin/mysqldump';
|
||||||
|
} elseif (file_exists("/usr/bin/mariadb-dump")) {
|
||||||
|
$mysql_dump = '/usr/bin/mariadb-dump';
|
||||||
|
$section = 'mariadb-dump';
|
||||||
}
|
}
|
||||||
|
|
||||||
// create temporary .cnf file
|
// create temporary .cnf file
|
||||||
$cnffilename = "/tmp/froxlor_dump.cnf";
|
$cnffilename = "/tmp/froxlor_dump.cnf";
|
||||||
$dumpcnf = "[mysqldump]" . PHP_EOL . "password=\"" . $this->validatedData['mysql_root_pass'] . "\"" . PHP_EOL;
|
$dumpcnf = "[".$section."]" . PHP_EOL . "password=\"" . $this->validatedData['mysql_root_pass'] . "\"" . PHP_EOL;
|
||||||
file_put_contents($cnffilename, $dumpcnf);
|
file_put_contents($cnffilename, $dumpcnf);
|
||||||
|
|
||||||
// make the backup
|
// make the backup
|
||||||
@@ -379,7 +383,7 @@ class Core
|
|||||||
$this->updateSetting($upd_stmt, 1, 'system', 'leenabled');
|
$this->updateSetting($upd_stmt, 1, 'system', 'leenabled');
|
||||||
$this->updateSetting($upd_stmt, 1, 'system', 'le_froxlor_enabled');
|
$this->updateSetting($upd_stmt, 1, 'system', 'le_froxlor_enabled');
|
||||||
}
|
}
|
||||||
$this->updateSetting($upd_stmt, $this->validatedData['servername'], 'system', 'hostname');
|
$this->updateSetting($upd_stmt, strtolower($this->validatedData['servername']), 'system', 'hostname');
|
||||||
$this->updateSetting($upd_stmt, 'en', 'panel', 'standardlanguage'); // TODO: set language
|
$this->updateSetting($upd_stmt, 'en', 'panel', 'standardlanguage'); // TODO: set language
|
||||||
$this->updateSetting($upd_stmt, $this->validatedData['mysql_access_host'], 'system', 'mysql_access_host');
|
$this->updateSetting($upd_stmt, $this->validatedData['mysql_access_host'], 'system', 'mysql_access_host');
|
||||||
$this->updateSetting($upd_stmt, $this->validatedData['webserver'], 'system', 'webserver');
|
$this->updateSetting($upd_stmt, $this->validatedData['webserver'], 'system', 'webserver');
|
||||||
|
|||||||
@@ -465,6 +465,7 @@ class PhpHelper
|
|||||||
'mysql_unprivileged_pass',
|
'mysql_unprivileged_pass',
|
||||||
'admin_pass',
|
'admin_pass',
|
||||||
'admin_pass_confirm',
|
'admin_pass_confirm',
|
||||||
|
'panel_password_special_char',
|
||||||
];
|
];
|
||||||
if (!empty($global)) {
|
if (!empty($global)) {
|
||||||
$tmp = $global;
|
$tmp = $global;
|
||||||
|
|||||||
@@ -102,6 +102,14 @@ class Traffic
|
|||||||
$years_avail = $sel_stmt->fetchAll(\PDO::FETCH_ASSOC);
|
$years_avail = $sel_stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sort users by total traffic
|
||||||
|
uasort($users, function ($user_a, $user_b) {
|
||||||
|
if ($user_a['total'] == $user_b['total']) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return ($user_a['total'] < $user_b['total']) ? 1 : -1;
|
||||||
|
});
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'metrics' => $metrics,
|
'metrics' => $metrics,
|
||||||
'users' => $users,
|
'users' => $users,
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
namespace Froxlor\UI\Callbacks;
|
namespace Froxlor\UI\Callbacks;
|
||||||
|
|
||||||
|
use Froxlor\CurrentUser;
|
||||||
use Froxlor\Database\Database;
|
use Froxlor\Database\Database;
|
||||||
use Froxlor\Domain\Domain as DDomain;
|
use Froxlor\Domain\Domain as DDomain;
|
||||||
use Froxlor\FileDir;
|
use Froxlor\FileDir;
|
||||||
@@ -113,7 +114,7 @@ class Domain
|
|||||||
|
|
||||||
public static function canViewLogs(array $attributes): bool
|
public static function canViewLogs(array $attributes): bool
|
||||||
{
|
{
|
||||||
if ((int)$attributes['fields']['email_only'] == 0 && !$attributes['fields']['deactivated']) {
|
if ((!CurrentUser::isAdmin() || (CurrentUser::isAdmin() && (int)$attributes['fields']['email_only'] == 0)) && !$attributes['fields']['deactivated']) {
|
||||||
if ((int)UI::getCurrentUser()['adminsession'] == 0 && (bool)UI::getCurrentUser()['logviewenabled']) {
|
if ((int)UI::getCurrentUser()['adminsession'] == 0 && (bool)UI::getCurrentUser()['logviewenabled']) {
|
||||||
return true;
|
return true;
|
||||||
} elseif ((int)UI::getCurrentUser()['adminsession'] == 1) {
|
} elseif ((int)UI::getCurrentUser()['adminsession'] == 1) {
|
||||||
@@ -155,7 +156,7 @@ class Domain
|
|||||||
|
|
||||||
public static function hasLetsEncryptActivated(array $attributes): bool
|
public static function hasLetsEncryptActivated(array $attributes): bool
|
||||||
{
|
{
|
||||||
return ((bool)$attributes['fields']['letsencrypt'] && (int)$attributes['fields']['email_only'] == 0);
|
return ((bool)$attributes['fields']['letsencrypt'] && (!CurrentUser::isAdmin() || (CurrentUser::isAdmin() && (int)$attributes['fields']['email_only'] == 0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function canEditSSL(array $attributes): bool
|
public static function canEditSSL(array $attributes): bool
|
||||||
@@ -165,7 +166,7 @@ class Domain
|
|||||||
&& DDomain::domainHasSslIpPort($attributes['fields']['id'])
|
&& DDomain::domainHasSslIpPort($attributes['fields']['id'])
|
||||||
&& (int)$attributes['fields']['caneditdomain'] == 1
|
&& (int)$attributes['fields']['caneditdomain'] == 1
|
||||||
&& (int)$attributes['fields']['letsencrypt'] == 0
|
&& (int)$attributes['fields']['letsencrypt'] == 0
|
||||||
&& (int)$attributes['fields']['email_only'] == 0
|
&& (!CurrentUser::isAdmin() || (CurrentUser::isAdmin() && (int)$attributes['fields']['email_only'] == 0))
|
||||||
&& !$attributes['fields']['deactivated']
|
&& !$attributes['fields']['deactivated']
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
namespace Froxlor\UI\Callbacks;
|
namespace Froxlor\UI\Callbacks;
|
||||||
|
|
||||||
|
use Froxlor\CurrentUser;
|
||||||
use Froxlor\Settings;
|
use Froxlor\Settings;
|
||||||
|
|
||||||
class Style
|
class Style
|
||||||
@@ -68,7 +69,7 @@ class Style
|
|||||||
$termination_css = 'table-danger';
|
$termination_css = 'table-danger';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$deactivated = $attributes['fields']['deactivated'] || $attributes['fields']['customer_deactivated'];
|
$deactivated = $attributes['fields']['deactivated'] || (CurrentUser::isAdmin() && $attributes['fields']['customer_deactivated']);
|
||||||
return $deactivated ? 'table-info' : $termination_css;
|
return $deactivated ? 'table-info' : $termination_css;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -90,9 +90,10 @@ class Text
|
|||||||
public static function customerNoteDetailModal(array $attributes): array
|
public static function customerNoteDetailModal(array $attributes): array
|
||||||
{
|
{
|
||||||
$note = $attributes['fields']['custom_notes'] ?? '';
|
$note = $attributes['fields']['custom_notes'] ?? '';
|
||||||
|
$key = $attributes['fields']['customerid'] ?? $attributes['fields']['adminid'];
|
||||||
return [
|
return [
|
||||||
'entry' => $attributes['fields']['id'],
|
'entry' => $key,
|
||||||
'id' => 'cnModal' . $attributes['fields']['id'],
|
'id' => 'cnModal' . $key,
|
||||||
'title' => lng('usersettings.custom_notes.title') . ': ' . ($attributes['fields']['loginname'] ?? $attributes['fields']['adminname']),
|
'title' => lng('usersettings.custom_notes.title') . ': ' . ($attributes['fields']['loginname'] ?? $attributes['fields']['adminname']),
|
||||||
'body' => nl2br(Markdown::cleanCustomNotes($note))
|
'body' => nl2br(Markdown::cleanCustomNotes($note))
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -217,7 +217,8 @@ class Form
|
|||||||
{
|
{
|
||||||
$returnvalue = [];
|
$returnvalue = [];
|
||||||
if (is_array($fielddata) && isset($fielddata['type']) && $fielddata['type'] == 'select') {
|
if (is_array($fielddata) && isset($fielddata['type']) && $fielddata['type'] == 'select') {
|
||||||
if ((!is_array($fielddata['select_var']) || empty($fielddata['select_var'])) && (isset($fielddata['option_options_method']))) {
|
if ((empty($fielddata['select_var']) || !is_array($fielddata['select_var'])) && (isset($fielddata['option_options_method']))
|
||||||
|
) {
|
||||||
$returnvalue['select_var'] = call_user_func($fielddata['option_options_method']);
|
$returnvalue['select_var'] = call_user_func($fielddata['option_options_method']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2547,6 +2547,7 @@ plugin {
|
|||||||
</file>
|
</file>
|
||||||
</files>
|
</files>
|
||||||
<commands index="1">
|
<commands index="1">
|
||||||
|
<command><![CDATA[sed -i.bak 's/^!include auth-system.conf.ext/#!include auth-system.conf.ext/' /etc/dovecot/conf.d/10-auth.conf]]></command>
|
||||||
<command><![CDATA[service dovecot restart]]></command>
|
<command><![CDATA[service dovecot restart]]></command>
|
||||||
</commands>
|
</commands>
|
||||||
</general>
|
</general>
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ return [
|
|||||||
'maxlength' => 10,
|
'maxlength' => 10,
|
||||||
'value' => '5s'
|
'value' => '5s'
|
||||||
],
|
],
|
||||||
'phpfpm_pass_authorizationheader' => [
|
'pass_authorizationheader' => [
|
||||||
'visible' => Settings::Get('system.webserver') == "apache2",
|
'visible' => Settings::Get('system.webserver') == "apache2",
|
||||||
'label' => lng('admin.phpsettings.pass_authorizationheader'),
|
'label' => lng('admin.phpsettings.pass_authorizationheader'),
|
||||||
'type' => 'checkbox',
|
'type' => 'checkbox',
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ return [
|
|||||||
'maxlength' => 10,
|
'maxlength' => 10,
|
||||||
'value' => $result['fpm_reqslow']
|
'value' => $result['fpm_reqslow']
|
||||||
],
|
],
|
||||||
'phpfpm_pass_authorizationheader' => [
|
'pass_authorizationheader' => [
|
||||||
'visible' => Settings::Get('system.webserver') == "apache2",
|
'visible' => Settings::Get('system.webserver') == "apache2",
|
||||||
'label' => lng('admin.phpsettings.pass_authorizationheader'),
|
'label' => lng('admin.phpsettings.pass_authorizationheader'),
|
||||||
'type' => 'checkbox',
|
'type' => 'checkbox',
|
||||||
|
|||||||
@@ -369,7 +369,7 @@ if (CurrentUser::hasSession()) {
|
|||||||
}
|
}
|
||||||
// update cookie lifetime
|
// update cookie lifetime
|
||||||
$cookie_params = [
|
$cookie_params = [
|
||||||
'expires' => time() + Settings::Get('session.sessiontimeout'),
|
'expires' => time() + min(Settings::Get('session.sessiontimeout'), 31536000),
|
||||||
'path' => '/',
|
'path' => '/',
|
||||||
'domain' => UI::getCookieHost(),
|
'domain' => UI::getCookieHost(),
|
||||||
'secure' => UI::requestIsHttps(),
|
'secure' => UI::requestIsHttps(),
|
||||||
|
|||||||
@@ -2270,7 +2270,7 @@ Vielen Dank, Ihr Administrator',
|
|||||||
'install' => [
|
'install' => [
|
||||||
'top' => 'Abschluss',
|
'top' => 'Abschluss',
|
||||||
'title' => 'Ein letzter Schritt...',
|
'title' => 'Ein letzter Schritt...',
|
||||||
'description' => 'Der untenstehende Befehl lädt, installiert und konfiguriert die benötigten Dienste auf dem System aufgrund der Angaben die während des Installationsprozessen gesammelt wurden.<br><br><span class="text-danger">Führe die gezeigten Befehle als <b>root</b> in der Shell/Konsole des Servers aus.</span>',
|
'description' => 'Der untenstehende Befehl lädt, installiert und konfiguriert die benötigten Dienste auf dem System aufgrund der Angaben die während des Installationsprozessen gesammelt wurden.<br><br><span class="text-danger">Führe die gezeigten Befehle als <b>root</b> in der Shell/Konsole des Servers aus. <b>Beachte bitte</b> das dieser Befehl vorhandene Konfigurationen <b>überschreibt</b> (Sicherungsdateien werden erstellt)!<br>Sollte dies nicht gewünscht sein, wähle <i>Ich werden die Dienste manuell konfigurieren</i> am Ende dieser Seite.</span>',
|
||||||
'runcmd' => 'Folgende Befehle ausführen, um die Installation abzuschließen:',
|
'runcmd' => 'Folgende Befehle ausführen, um die Installation abzuschließen:',
|
||||||
'manual_config' => 'Ich werden die Dienste manuell konfigurieren, direkt zum Login umleiten',
|
'manual_config' => 'Ich werden die Dienste manuell konfigurieren, direkt zum Login umleiten',
|
||||||
'waitforconfig' => 'Warte auf Abschluss der Dienstkonfiguration...',
|
'waitforconfig' => 'Warte auf Abschluss der Dienstkonfiguration...',
|
||||||
|
|||||||
@@ -2406,7 +2406,7 @@ Yours sincerely, your administrator',
|
|||||||
'install' => [
|
'install' => [
|
||||||
'top' => 'Finish setup',
|
'top' => 'Finish setup',
|
||||||
'title' => 'One last step...',
|
'title' => 'One last step...',
|
||||||
'description' => 'The command below will download, install and configure required services on your system according to the data you have given in this installation process.<br><br><span class="text-danger">Be sure to run the following command as <b>root</b> on the server\'s shell/terminal.</span>',
|
'description' => 'The command below will download, install and configure required services on your system according to the data you have given in this installation process.<br><br><span class="text-danger">Be sure to run the following command as <b>root</b> on the server\'s shell/terminal and <b>be aware</b> that this command will <b>overwrite</b> any existing configuration for the used services (backups will be created)!.<br>If you do not want to overwrite any configurations, select <i>I will manually configure the services</i> at the bottom of this page!</span>',
|
||||||
'runcmd' => 'Run the following command to finish the installation:',
|
'runcmd' => 'Run the following command to finish the installation:',
|
||||||
'manual_config' => 'I will manually configure the services, just take me to the login',
|
'manual_config' => 'I will manually configure the services, just take me to the login',
|
||||||
'waitforconfig' => 'Waiting for services to be configured...',
|
'waitforconfig' => 'Waiting for services to be configured...',
|
||||||
|
|||||||
6
package-lock.json
generated
6
package-lock.json
generated
@@ -776,9 +776,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/follow-redirects": {
|
"node_modules/follow-redirects": {
|
||||||
"version": "1.15.3",
|
"version": "1.15.6",
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
|
||||||
"integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
|
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,6 +13,9 @@ export default function () {
|
|||||||
customerid: cid
|
customerid: cid
|
||||||
},
|
},
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
|
beforeSend: function (request) {
|
||||||
|
request.setRequestHeader('X-CSRF-TOKEN', document.querySelector('meta[name="csrf-token"]').getAttribute('content'));
|
||||||
|
},
|
||||||
success: function (json) {
|
success: function (json) {
|
||||||
if (json.length > 0) {
|
if (json.length > 0) {
|
||||||
$('#phpsettingid option').each(function () {
|
$('#phpsettingid option').each(function () {
|
||||||
@@ -45,6 +48,10 @@ export default function () {
|
|||||||
id: $('input[name=id]').val(), newval: +$('#speciallogfile').is(':checked')
|
id: $('input[name=id]').val(), newval: +$('#speciallogfile').is(':checked')
|
||||||
},
|
},
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
|
async: false,
|
||||||
|
beforeSend: function (request) {
|
||||||
|
request.setRequestHeader('X-CSRF-TOKEN', document.querySelector('meta[name="csrf-token"]').getAttribute('content'));
|
||||||
|
},
|
||||||
success: function (json) {
|
success: function (json) {
|
||||||
if (json.changed) {
|
if (json.changed) {
|
||||||
$('#speciallogfile').addClass('is-invalid');
|
$('#speciallogfile').addClass('is-invalid');
|
||||||
|
|||||||
@@ -15,6 +15,9 @@ export default function () {
|
|||||||
ip: ipval
|
ip: ipval
|
||||||
},
|
},
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
|
beforeSend: function (request) {
|
||||||
|
request.setRequestHeader('X-CSRF-TOKEN', document.querySelector('meta[name="csrf-token"]').getAttribute('content'));
|
||||||
|
},
|
||||||
success: function (json) {
|
success: function (json) {
|
||||||
if (json != 0) {
|
if (json != 0) {
|
||||||
$('#ip').addClass('is-invalid');
|
$('#ip').addClass('is-invalid');
|
||||||
|
|||||||
@@ -159,7 +159,7 @@
|
|||||||
{% if field.next_to is defined %}
|
{% if field.next_to is defined %}
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<input type="{{ field.type }}" {% if field.visible is defined and field.visible == false %} disabled {% endif %} {% if field.type == 'number' and field.min is defined %} min="{{ field.min }}" {% endif %} {% if field.type == 'number' and field.max is defined %} max="{{ field.max }}" {% endif %} {% if field.type != 'number' and field.maxlength is defined %} maxlength="{{ field.maxlength }}" {% endif %} id="{{ id }}" name="{{ id }}" value="{{ field.value|raw }}" class="form-control {% if field.valid is defined and field.valid == false %}is-invalid{% endif %}" {% if field.mandatory is defined and field.mandatory %} required {% endif %} {% if field.readonly is defined and field.readonly %} readonly {% endif %} {% if field.autocomplete is defined %} autocomplete="{{ field.autocomplete }}" {% endif %} {% if field.placeholder is defined %} placeholder="{{ field.placeholder }}" {% endif %} {% if field.type == 'file' and field.accept is defined %} accept="{{ field.accept }}" {% endif %} {% if field.pattern is defined %} pattern="{{ field.pattern }}" {% endif %}/>
|
<input type="{{ field.type }}" {% if (field.visible is defined and field.visible == false) or (field.disabled is defined and field.disabled == true) %} disabled {% endif %} {% if field.type == 'number' and field.min is defined %} min="{{ field.min }}" {% endif %} {% if field.type == 'number' and field.max is defined %} max="{{ field.max }}" {% endif %} {% if field.type != 'number' and field.maxlength is defined %} maxlength="{{ field.maxlength }}" {% endif %} id="{{ id }}" name="{{ id }}" value="{{ field.value|raw }}" class="form-control {% if field.valid is defined and field.valid == false %}is-invalid{% endif %}" {% if field.mandatory is defined and field.mandatory %} required {% endif %} {% if field.readonly is defined and field.readonly %} readonly {% endif %} {% if field.autocomplete is defined %} autocomplete="{{ field.autocomplete }}" {% endif %} {% if field.placeholder is defined %} placeholder="{{ field.placeholder }}" {% endif %} {% if field.type == 'file' and field.accept is defined %} accept="{{ field.accept }}" {% endif %} {% if field.pattern is defined %} pattern="{{ field.pattern }}" {% endif %}/>
|
||||||
{% if field.type == 'hidden' and field.display is defined %}
|
{% if field.type == 'hidden' and field.display is defined %}
|
||||||
<input type="text" readonly class="form-control-plaintext" value="{{ field.display|raw }}">
|
<input type="text" readonly class="form-control-plaintext" value="{{ field.display|raw }}">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -21,6 +21,9 @@
|
|||||||
<p>{{ message }}</p>
|
<p>{{ message }}</p>
|
||||||
{% if get_config('enable_webupdate') %}
|
{% if get_config('enable_webupdate') %}
|
||||||
<a class='btn d-block btn-outline-warning' href='admin_autoupdate.php?page=overview'>Open updater</a>
|
<a class='btn d-block btn-outline-warning' href='admin_autoupdate.php?page=overview'>Open updater</a>
|
||||||
|
{% else %}
|
||||||
|
<p>Run the following command in your shell to update:</p>
|
||||||
|
<code>{{ call_static('\\Froxlor\\Froxlor', 'getInstallDir') }}bin/froxlor-cli froxlor:update</code>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|||||||
@@ -152,7 +152,7 @@
|
|||||||
{% if userinfo.adminsession == 1 %}
|
{% if userinfo.adminsession == 1 %}
|
||||||
const labelsC = [];
|
const labelsC = [];
|
||||||
const dataValues = [];
|
const dataValues = [];
|
||||||
{% for user in users|sort((a, b) => a.total <=> b.total)|slice(0, 5) %}
|
{% for user in users|slice(0, 5) %}
|
||||||
labelsC.push('{{ user.loginname }}');
|
labelsC.push('{{ user.loginname }}');
|
||||||
dataValues.push({value: '{{ user.total|default(0) }}', formatted: '{{ user.total|formatBytes }}'});
|
dataValues.push({value: '{{ user.total|default(0) }}', formatted: '{{ user.total|formatBytes }}'});
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|||||||
@@ -426,10 +426,10 @@ class MailsTest extends TestCase
|
|||||||
$this->assertEquals(1, $result['popaccountid']);
|
$this->assertEquals(1, $result['popaccountid']);
|
||||||
|
|
||||||
switch (Settings::Get('system.passwordcryptfunc')) {
|
switch (Settings::Get('system.passwordcryptfunc')) {
|
||||||
case PASSWORD_ARGON2I:
|
case 'argon2i':
|
||||||
$cpPrefix = '{ARGON2I}';
|
$cpPrefix = '{ARGON2I}';
|
||||||
break;
|
break;
|
||||||
case PASSWORD_ARGON2ID:
|
case 'argon2id':
|
||||||
$cpPrefix = '{ARGON2ID}';
|
$cpPrefix = '{ARGON2ID}';
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
Reference in New Issue
Block a user