Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b542b140c6 | ||
|
|
ac89fc7120 | ||
|
|
150858485d | ||
|
|
e7810e2066 | ||
|
|
4879446567 | ||
|
|
43eff78088 | ||
|
|
55a2ae3801 |
@@ -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.2'),
|
('panel', 'version', '2.1.3'),
|
||||||
('panel', 'db_version', '202312120');
|
('panel', 'db_version', '202312120');
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -269,3 +269,8 @@ if (Froxlor::isFroxlorVersion('2.1.1')) {
|
|||||||
Update::showUpdateStep("Updating from 2.1.1 to 2.1.2", false);
|
Update::showUpdateStep("Updating from 2.1.1 to 2.1.2", false);
|
||||||
Froxlor::updateToVersion('2.1.2');
|
Froxlor::updateToVersion('2.1.2');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Froxlor::isFroxlorVersion('2.1.2')) {
|
||||||
|
Update::showUpdateStep("Updating from 2.1.2 to 2.1.3", false);
|
||||||
|
Froxlor::updateToVersion('2.1.3');
|
||||||
|
}
|
||||||
|
|||||||
@@ -259,14 +259,15 @@ class Froxlor extends ApiCommand
|
|||||||
* returns a random password based on froxlor settings for min-length, included characters, etc.
|
* returns a random password based on froxlor settings for min-length, included characters, etc.
|
||||||
*
|
*
|
||||||
* @param int $length
|
* @param int $length
|
||||||
* optional length of password, defaults to 10
|
* optional length of password, defaults to 0 (panel.password_min_length)
|
||||||
*
|
*
|
||||||
* @access admin, customer
|
* @access admin, customer
|
||||||
* @return string
|
* @return string
|
||||||
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function generatePassword()
|
public function generatePassword(): string
|
||||||
{
|
{
|
||||||
$length = $this->getParam('length', true, 10);
|
$length = $this->getParam('length', true, 0);
|
||||||
return $this->response(Crypt::generatePassword($length));
|
return $this->response(Crypt::generatePassword($length));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ final class InstallCommand extends Command
|
|||||||
$ask_field = false;
|
$ask_field = false;
|
||||||
}
|
}
|
||||||
$fielddata['value'] = $this->formfielddata[$fieldname] ?? ($fielddata['value'] ?? null);
|
$fielddata['value'] = $this->formfielddata[$fieldname] ?? ($fielddata['value'] ?? null);
|
||||||
$fielddata['label'] = strip_tags(str_replace("<br>", " ", $fielddata['label']));
|
$fielddata['label'] = $this->cliTextFormat($fielddata['label'], " ");
|
||||||
if ($ask_field) {
|
if ($ask_field) {
|
||||||
if ($fielddata['type'] == 'password') {
|
if ($fielddata['type'] == 'password') {
|
||||||
$this->formfielddata[$fieldname] = $this->io->askHidden($fielddata['label'], function ($value) use ($fielddata) {
|
$this->formfielddata[$fieldname] = $this->io->askHidden($fielddata['label'], function ($value) use ($fielddata) {
|
||||||
@@ -267,14 +267,16 @@ final class InstallCommand extends Command
|
|||||||
case 4:
|
case 4:
|
||||||
$section = $inst->formfield['install']['sections']['step' . $step] ?? [];
|
$section = $inst->formfield['install']['sections']['step' . $step] ?? [];
|
||||||
$this->io->section($section['title']);
|
$this->io->section($section['title']);
|
||||||
$this->io->note($section['description']);
|
$this->io->note($this->cliTextFormat($section['description']));
|
||||||
$cmdfield = $section['fields']['system'];
|
$cmdfield = $section['fields']['system'];
|
||||||
$this->io->success([
|
$this->io->success([
|
||||||
$cmdfield['label'],
|
$cmdfield['label'],
|
||||||
$cmdfield['value']
|
$cmdfield['value']
|
||||||
]);
|
]);
|
||||||
if (!empty($decoded_input) || $this->io->confirm('Execute command now?', false)) {
|
if (!isset($decoded_input['manual_config']) || (bool)$decoded_input['manual_config'] === false) {
|
||||||
passthru($cmdfield['value']);
|
if (!empty($decoded_input) || $this->io->confirm('Execute command now?', false)) {
|
||||||
|
passthru($cmdfield['value']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -305,7 +307,7 @@ final class InstallCommand extends Command
|
|||||||
$json_output = [];
|
$json_output = [];
|
||||||
foreach ($fields['install']['sections'] as $section => $section_fields) {
|
foreach ($fields['install']['sections'] as $section => $section_fields) {
|
||||||
foreach ($section_fields['fields'] as $name => $field) {
|
foreach ($section_fields['fields'] as $name => $field) {
|
||||||
if ($name == 'system' || $name == 'manual_config' || $name == 'target_servername') {
|
if ($name == 'system' || $name == 'target_servername') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ($field['type'] == 'text' || $field['type'] == 'email') {
|
if ($field['type'] == 'text' || $field['type'] == 'email') {
|
||||||
@@ -318,7 +320,7 @@ final class InstallCommand extends Command
|
|||||||
$fieldval = '******';
|
$fieldval = '******';
|
||||||
} elseif ($field['type'] == 'select') {
|
} elseif ($field['type'] == 'select') {
|
||||||
$fieldval = implode("|", array_keys($field['select_var']));
|
$fieldval = implode("|", array_keys($field['select_var']));
|
||||||
} else if ($field['type'] == 'checkbox') {
|
} elseif ($field['type'] == 'checkbox') {
|
||||||
$fieldval = "1|0";
|
$fieldval = "1|0";
|
||||||
} else {
|
} else {
|
||||||
$fieldval = "?";
|
$fieldval = "?";
|
||||||
@@ -346,4 +348,10 @@ final class InstallCommand extends Command
|
|||||||
curl_close($ch);
|
curl_close($ch);
|
||||||
fclose($fp);
|
fclose($fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function cliTextFormat(string $text, string $nl_char = "\n"): string
|
||||||
|
{
|
||||||
|
$text = str_replace(['<br>', '<br/>', '<br />'], [$nl_char, $nl_char, $nl_char], $text);
|
||||||
|
return strip_tags($text);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class TrafficCron extends FroxlorCron
|
|||||||
|
|
||||||
public static function run()
|
public static function run()
|
||||||
{
|
{
|
||||||
self::runFork([self::class, 'handle']);
|
self::runFork([self::class, 'handle'], [true]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function handle()
|
public static function handle()
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ final class Froxlor
|
|||||||
{
|
{
|
||||||
|
|
||||||
// Main version variable
|
// Main version variable
|
||||||
const VERSION = '2.1.2';
|
const VERSION = '2.1.3';
|
||||||
|
|
||||||
// Database version (YYYYMMDDC where C is a daily counter)
|
// Database version (YYYYMMDDC where C is a daily counter)
|
||||||
const DBVERSION = '202312120';
|
const DBVERSION = '202312120';
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ 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 ((!isset($fielddata['select_var']) || !is_array($fielddata['select_var']) || empty($fielddata['select_var'])) && (isset($fielddata['option_options_method']))) {
|
if ((!is_array($fielddata['select_var']) || empty($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']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -236,8 +236,8 @@ class Form
|
|||||||
if (\Froxlor\Validate\Form::validateFieldDefinition($groupdetails)) {
|
if (\Froxlor\Validate\Form::validateFieldDefinition($groupdetails)) {
|
||||||
// Prefetch form fields
|
// Prefetch form fields
|
||||||
foreach ($groupdetails['fields'] as $fieldname => $fielddetails) {
|
foreach ($groupdetails['fields'] as $fieldname => $fielddetails) {
|
||||||
if (!$only_enabledisable || ($only_enabledisable && isset($fielddetails['overview_option']))) {
|
if (!$only_enabledisable || isset($fielddetails['overview_option'])) {
|
||||||
$groupdetails['fields'][$fieldname] = self::arrayMergePrefix($fielddetails, $fielddetails['type'], self::prefetchFormFieldData($fieldname, $fielddetails));
|
$groupdetails['fields'][$fieldname] = array_merge($fielddetails, self::prefetchFormFieldData($fieldname, $fielddetails));
|
||||||
$form['groups'][$groupname]['fields'][$fieldname] = $groupdetails['fields'][$fieldname];
|
$form['groups'][$groupname]['fields'][$fieldname] = $groupdetails['fields'][$fieldname];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -347,7 +347,7 @@ class Form
|
|||||||
if (\Froxlor\Validate\Form::validateFieldDefinition($groupdetails)) {
|
if (\Froxlor\Validate\Form::validateFieldDefinition($groupdetails)) {
|
||||||
// Save fields
|
// Save fields
|
||||||
foreach ($groupdetails['fields'] as $fieldname => $fielddetails) {
|
foreach ($groupdetails['fields'] as $fieldname => $fielddetails) {
|
||||||
if (!$only_enabledisable || ($only_enabledisable && isset($fielddetails['overview_option']))) {
|
if (!$only_enabledisable || (isset($fielddetails['overview_option']))) {
|
||||||
if (isset($changed_fields[$fieldname])) {
|
if (isset($changed_fields[$fieldname])) {
|
||||||
if (($saved_field = self::saveFormField($fieldname, $fielddetails, self::manipulateFormFieldData($fieldname, $fielddetails, $changed_fields[$fieldname]))) !== false) {
|
if (($saved_field = self::saveFormField($fieldname, $fielddetails, self::manipulateFormFieldData($fieldname, $fielddetails, $changed_fields[$fieldname]))) !== false) {
|
||||||
$saved_fields = array_merge($saved_fields, $saved_field);
|
$saved_fields = array_merge($saved_fields, $saved_field);
|
||||||
@@ -364,24 +364,7 @@ class Form
|
|||||||
// Save form
|
// Save form
|
||||||
return self::saveForm($form, $saved_fields);
|
return self::saveForm($form, $saved_fields);
|
||||||
}
|
}
|
||||||
}
|
return false;
|
||||||
|
|
||||||
private static function arrayMergePrefix($array1, $key_prefix, $array2)
|
|
||||||
{
|
|
||||||
if (is_array($array1) && is_array($array2)) {
|
|
||||||
if ($key_prefix != '') {
|
|
||||||
foreach ($array2 as $key => $value) {
|
|
||||||
$array1[$key_prefix . '_' . $key] = $value;
|
|
||||||
unset($array2[$key]);
|
|
||||||
}
|
|
||||||
unset($array2);
|
|
||||||
return $array1;
|
|
||||||
} else {
|
|
||||||
return array_merge($array1, $array2);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return $array1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function getFormFieldData($fieldname, $fielddata, &$input)
|
public static function getFormFieldData($fieldname, $fielddata, &$input)
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ class Validate
|
|||||||
}
|
}
|
||||||
|
|
||||||
// special case where localhost ip is allowed (mysql-access-hosts for example)
|
// special case where localhost ip is allowed (mysql-access-hosts for example)
|
||||||
if ($allow_localhost && $ip == '127.0.0.1') {
|
if ($allow_localhost && ($ip == '127.0.0.1' || $ip == '::1')) {
|
||||||
return $ip . $cidr;
|
return $ip . $cidr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -112,9 +112,14 @@ function vite($basehref, array $filenames): string
|
|||||||
$assetDirectory = '/templates/' . $matches[1] . '/build/';
|
$assetDirectory = '/templates/' . $matches[1] . '/build/';
|
||||||
$viteManifest = dirname(__DIR__) . $assetDirectory . '/manifest.json';
|
$viteManifest = dirname(__DIR__) . $assetDirectory . '/manifest.json';
|
||||||
$manifest = json_decode(file_get_contents($viteManifest), true);
|
$manifest = json_decode(file_get_contents($viteManifest), true);
|
||||||
$links[] = $basehref . ltrim($assetDirectory, '/') . $manifest[$filename]['file'];
|
if (!empty($manifest[$filename]['file'])) {
|
||||||
|
$links[] = $basehref . ltrim($assetDirectory, '/') . $manifest[$filename]['file'];
|
||||||
|
} else {
|
||||||
|
// additional asset from config.json that was not prebuilt on release (e.g. custom.css)
|
||||||
|
$links[] = $filename;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$links = $filenames;
|
$links[] = $filename;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ if ($req_host != Settings::Get('system.hostname') &&
|
|||||||
(!empty(Settings::Get('system.froxloraliases')) && !in_array($req_host, array_map('trim', explode(',', Settings::Get('system.froxloraliases')))))
|
(!empty(Settings::Get('system.froxloraliases')) && !in_array($req_host, array_map('trim', explode(',', Settings::Get('system.froxloraliases')))))
|
||||||
)) {
|
)) {
|
||||||
// not the froxlor system-hostname, show info page for domains not configured in froxlor
|
// not the froxlor system-hostname, show info page for domains not configured in froxlor
|
||||||
$redirect_file = FileDir::getUnknownDomainTemplate($req_host);
|
$redirect_file = FileDir::getUnknownDomainTemplate($req_host ?? "non-detectable http-host");
|
||||||
header('Location: '.$redirect_file);
|
header('Location: '.$redirect_file);
|
||||||
die();
|
die();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ return [
|
|||||||
'field' => 'domains',
|
'field' => 'domains',
|
||||||
'callback' => [PHPConf::class, 'domainList'],
|
'callback' => [PHPConf::class, 'domainList'],
|
||||||
'searchable' => false,
|
'searchable' => false,
|
||||||
|
'sortable' => false,
|
||||||
],
|
],
|
||||||
'fpmdesc' => [
|
'fpmdesc' => [
|
||||||
'label' => lng('admin.phpsettings.fpmdesc'),
|
'label' => lng('admin.phpsettings.fpmdesc'),
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"global": {
|
"global": {
|
||||||
"css": [
|
"css": [
|
||||||
"assets/css/custom.css",
|
"assets/scss/app.scss",
|
||||||
"assets/scss/app.scss"
|
"assets/css/custom.css"
|
||||||
],
|
],
|
||||||
"js": [
|
"js": [
|
||||||
"assets/js/app.js",
|
"assets/js/app.js",
|
||||||
|
|||||||
Reference in New Issue
Block a user