From 249199bd1c633c68947065102fb9aa830cc730ed Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 16 Nov 2021 00:05:43 +0100 Subject: [PATCH] cs fixes, bug fixes, code coverage --- .directory | 7 - Admin/Installer.php | 37 + Admin/Routes/Web/Api.php | 8 + Admin/Settings/Theme/Backend/settings.tpl.php | 1425 +++++++++-------- CONTRIBUTING.md | 4 +- Controller/ApiController.php | 179 ++- Controller/BackendController.php | 2 +- Theme/Backend/page-list.tpl.php | 1 + 8 files changed, 939 insertions(+), 724 deletions(-) delete mode 100755 .directory diff --git a/.directory b/.directory deleted file mode 100755 index 8ae7a0c..0000000 --- a/.directory +++ /dev/null @@ -1,7 +0,0 @@ -[Dolphin] -Timestamp=2021,5,23,18,49,35 -Version=4 -ViewMode=1 - -[Settings] -HiddenFilesShown=true diff --git a/Admin/Installer.php b/Admin/Installer.php index 9a6b732..11f0cfb 100755 --- a/Admin/Installer.php +++ b/Admin/Installer.php @@ -14,11 +14,15 @@ declare(strict_types=1); namespace Modules\Admin\Admin; +use Model\Setting; +use Model\SettingMapper; +use Model\SettingsEnum; use phpOMS\Application\ApplicationAbstract; use phpOMS\Config\SettingsInterface; use phpOMS\DataStorage\Database\Connection\SQLiteConnection; use phpOMS\DataStorage\Database\DatabasePool; use phpOMS\DataStorage\Database\Query\Builder; +use phpOMS\Message\Mail\SubmitType; use phpOMS\Module\InstallerAbstract; use phpOMS\Module\ModuleInfo; use phpOMS\System\File\PathException; @@ -56,10 +60,43 @@ final class Installer extends InstallerAbstract self::installCountries($sqlite, $dbPool); self::installLanguages($sqlite, $dbPool); self::installCurrencies($sqlite, $dbPool); + self::installDefaultSettings(); $sqlite->close(); } + /** + * Install settings + * + * @return void + * + * @since 1.0.0 + **/ + private static function installDefaultSettings() : void + { + SettingMapper::create(new Setting(0, SettingsEnum::PASSWORD_PATTERN, '')); + SettingMapper::create(new Setting(0, SettingsEnum::LOGIN_TRIES, '3', '\\d+')); + SettingMapper::create(new Setting(0, SettingsEnum::LOGIN_TIMEOUT, '3', '\\d+')); + SettingMapper::create(new Setting(0, SettingsEnum::PASSWORD_INTERVAL, '90', '\\d+')); + SettingMapper::create(new Setting(0, SettingsEnum::PASSWORD_HISTORY, '3', '\\d+')); + SettingMapper::create(new Setting(0, SettingsEnum::LOGGING_STATUS, '1', '[0-3]')); + SettingMapper::create(new Setting(0, SettingsEnum::LOGGING_PATH, '')); + SettingMapper::create(new Setting(0, SettingsEnum::DEFAULT_ORGANIZATION, '1', '\\d+')); + SettingMapper::create(new Setting(0, SettingsEnum::LOGIN_STATUS, '1', '[0-3]')); + SettingMapper::create(new Setting(0, SettingsEnum::DEFAULT_LOCALIZATION, '1', '\\d+')); + SettingMapper::create(new Setting(0, SettingsEnum::MAIL_SERVER_ADDR, 'admin@orange-management.email', "(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])", module: 'Admin')); + SettingMapper::create(new Setting(0, SettingsEnum::MAIL_SERVER_TYPE, SubmitType::MAIL, module: 'Admin')); + SettingMapper::create(new Setting(0, SettingsEnum::MAIL_SERVER_USER, '', module: 'Admin')); + SettingMapper::create(new Setting(0, SettingsEnum::MAIL_SERVER_PASS, '', module: 'Admin')); + SettingMapper::create(new Setting(0, SettingsEnum::MAIL_SERVER_CERT, '', module: 'Admin')); + SettingMapper::create(new Setting(0, SettingsEnum::MAIL_SERVER_KEY, '', module: 'Admin')); + SettingMapper::create(new Setting(0, SettingsEnum::MAIL_SERVER_KEYPASS, '', module: 'Admin')); + SettingMapper::create(new Setting(0, SettingsEnum::MAIL_SERVER_TLS, (string) false, module: 'Admin')); + + $l11n = Localization::fromLanguage($request->getData('defaultlang'), $request->getData('defaultcountry') ?? '*'); + LocalizationMapper::create($l11n); + } + /** * Install countries * diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php index 94e384e..a7a5089 100755 --- a/Admin/Routes/Web/Api.php +++ b/Admin/Routes/Web/Api.php @@ -44,6 +44,14 @@ return [ ], ], ], + '^.*/reset(\?.*|$)' => [ + [ + 'dest' => '\Modules\Admin\Controller\ApiController:apiResetPassword', + 'verb' => RouteVerb::SET, + 'permission' => [ + ], + ], + ], '^.*/admin/settings(\?.*|$)' => [ [ diff --git a/Admin/Settings/Theme/Backend/settings.tpl.php b/Admin/Settings/Theme/Backend/settings.tpl.php index a7b33e6..2598f2d 100644 --- a/Admin/Settings/Theme/Backend/settings.tpl.php +++ b/Admin/Settings/Theme/Backend/settings.tpl.php @@ -13,6 +13,7 @@ declare(strict_types=1); use Modules\Organization\Models\UnitMapper; +use phpOMS\Application\ApplicationStatus; use phpOMS\Localization\NullLocalization; use phpOMS\Uri\UriFactory; @@ -34,6 +35,8 @@ $lengths = \phpOMS\Utils\Converter\LengthType::getConstants(); $volumes = \phpOMS\Utils\Converter\VolumeType::getConstants(); $temperatures = \phpOMS\Utils\Converter\TemperatureType::getConstants(); +$serverModes = ApplicationStatus::getConstants(); + $l11n = $this->getData('defaultlocalization') ?? new NullLocalization(); echo $this->getData('nav')->render(); @@ -49,724 +52,742 @@ echo $this->getData('nav')->render();
- request->uri->fragment === 'c-tab-1' ? ' checked' : ''; ?>> -
-
-
-
-
-
getHtml('Settings'); ?>
-
-
- - -
+ request->uri->fragment === 'c-tab-1' ? ' checked' : ''; ?>> +
+
+
+
+ +
getHtml('Settings'); ?>
+
+
+ +
-
- -
-
- -
-
-
-
getHtml('Security'); ?>
-
-
- - - -
- -
- - - -
- -
- - - -
- -
- - - -
- -
- - - -
- -
-
- -
-
-
-
- -
-
-
-
getHtml('Logging'); ?>
-
-
- -
- -
- - -
-
-
- -
-
-
-
+
+
+ +
-
- request->uri->fragment === 'c-tab-2' ? ' checked' : ''; ?>> -
-
-
-
-
-
getHtml('Localization'); ?>
-
-
- -
-
-
-
-
-
-
- - -
- -
- - -
- -
- - -
-
-
- -
-
-
-
- -
-
-
getHtml('Time'); ?>
+
+
+
+
getHtml('ServerStatus'); ?>
- - -
- -
- - -
- -

getHtml('Timeformat'); ?>

- -
- - -
- -
- - -
- -
- - -
- -
- - -
-
-
-
- -
-
-
getHtml('Numeric'); ?>
-
-
- - -
- -
- - -
- -

getHtml('Numberformat'); ?>

- -
-
- - -
- -
- - -
-
-
-
-
- -
-
-
getHtml('Precision'); ?>
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
-
-
-
- -
-
-
getHtml('Weight'); ?>
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - + +
-
-
- -
-
-
getHtml('Speed'); ?>
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
-
-
-
- -
-
-
getHtml('Length'); ?>
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
-
-
-
- -
-
-
getHtml('Area'); ?>
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
-
-
-
- -
-
-
getHtml('Volume'); ?>
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
-
-
-
+
+ +
-
- request->uri->fragment === 'c-tab-3' ? ' checked' : ''; ?>> -
-
-
-
-
getHtml('Images'); ?>
+ +
+
+
+
getHtml('Security'); ?>
- -
- <?= $this->getHtml('LoginImage'); ?> - -
-
-
-
-
-
-
- request->uri->fragment === 'c-tab-5' ? ' checked' : ''; ?>> -
-
-
-
getHtml('Settings'); ?>
-
- - - - - getId() . '&ptype=p'; - $nextSettings = empty($settings) ? '{/prefix}admin/settings/general' : '{/prefix}admin/settings/general?{?}&sid=' . \end($settings)->getId() . '&ptype=n'; + + + + + +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
- foreach ($settings as $key => $setting) : ++$count; - ?> - -
- getHtml('ID', '0', '0'); ?> - - - - getHtml('Name'); ?> - - - - getHtml('Value'); ?> - getHtml('Module'); ?> - - - - getHtml('Group'); ?> - - - - getHtml('Account'); ?> - - - -
- getId(); ?> - printHtml($setting->name); ?> - printHtml($setting->content); ?> - printHtml($setting->module); ?> - printHtml($setting->group); ?> - printHtml($setting->account); ?> - - -
getHtml('Empty', '0', '0'); ?> - -
+ + +
+ +
+
+
+
getHtml('Logging'); ?>
+
+
+ +
+ +
+ + +
+
+
+ +
+
+
+
+
+
+ request->uri->fragment === 'c-tab-2' ? ' checked' : ''; ?>> +
+
+
+
+
+
getHtml('Localization'); ?>
+
+
+ +
+
+
+
+
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ +
+
+
+
+ +
+
+
getHtml('Time'); ?>
+
+
+ + +
+ +
+ + +
+ +

getHtml('Timeformat'); ?>

+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ +
+
+
getHtml('Numeric'); ?>
+
+
+ + +
+ +
+ + +
+ +

getHtml('Numberformat'); ?>

+ +
+
+ + +
+ +
+ + +
+
+
+
+
+ +
+
+
getHtml('Precision'); ?>
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ +
+
+
getHtml('Weight'); ?>
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ +
+
+
getHtml('Speed'); ?>
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ +
+
+
getHtml('Length'); ?>
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ +
+
+
getHtml('Area'); ?>
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ +
+
+
getHtml('Volume'); ?>
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+
+
+ request->uri->fragment === 'c-tab-3' ? ' checked' : ''; ?>> +
+
+
+
+
getHtml('Images'); ?>
+
+
+ +
+ <?= $this->getHtml('LoginImage'); ?> + +
+
+
+
+
+
+
+ request->uri->fragment === 'c-tab-5' ? ' checked' : ''; ?>> +
+
+
+
getHtml('Settings'); ?>
+
+ + + + + getId() . '&ptype=p'; + $nextSettings = empty($settings) ? '{/prefix}admin/settings/general' : '{/prefix}admin/settings/general?{?}&sid=' . \end($settings)->getId() . '&ptype=n'; + + foreach ($settings as $key => $setting) : ++$count; + ?> + +
+ getHtml('ID', '0', '0'); ?> + + + + getHtml('Name'); ?> + + + + getHtml('Value'); ?> + getHtml('Module'); ?> + + + + getHtml('Group'); ?> + + + + getHtml('Account'); ?> + + + +
+ getId(); ?> + printHtml($setting->name); ?> + printHtml($setting->content); ?> + printHtml($setting->module); ?> + printHtml($setting->group); ?> + printHtml($setting->account); ?> + + +
getHtml('Empty', '0', '0'); ?> + +
+
+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cab9f5e..ad8944e 100755 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,9 +12,7 @@ If you have a good idea for improvement feel free to create a new issue with all ### Issues -Feel free to grab any open issue implement it and create a new pull request. Most issues can be found in the `Project.md` file in the `Docs` repository. - -The issue information can be used to provide additional information such as priority, difficulty and type. For your first issue try to find a issue marked `[d:first]` or `[d:beginner]`. +Feel free to grab any open issue implement it and create a new pull request. Most issues can be found in the code marked with `@todo` or in the [PROJECT.md](https://github.com/Orange-Management/Docs/blob/master/Project/PROJECT.md) file. ### Code Style diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 511f173..d657b72 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -15,6 +15,7 @@ declare(strict_types=1); namespace Modules\Admin\Controller; use Model\App; +use Model\SettingsEnum; use Modules\Admin\Models\Account; use Modules\Admin\Models\AccountMapper; use Modules\Admin\Models\AccountPermission; @@ -142,6 +143,41 @@ final class ApiController extends Controller ]); } + /** + * Create basic server mail handler + * + * @return MailHandler + * + * @since 1.0.0 + **/ + public function setUpServerMailHandler() : MailHandler + { + $emailSettings = $this->app->appSettings->get( + names: [ + SettingsEnum::MAIL_SERVER_ADDR, + SettingsEnum::MAIL_SERVER_TYPE, + SettingsEnum::MAIL_SERVER_USER, + SettingsEnum::MAIL_SERVER_PASS, + SettingsEnum::MAIL_SERVER_TLS, + ], + module: self::NAME + ); + + $handler = new MailHandler(); + $handler->setMailer((int) ($emailSettings[SettingsEnum::MAIL_SERVER_TYPE] ?? SubmitType::MAIL)); + $handler->useAutoTLS = (bool) ($emailSettings[SettingsEnum::MAIL_SERVER_TLS] ?? false); + + if ((int) ($emailSettings[SettingsEnum::MAIL_SERVER_TYPE] ?? SubmitType::MAIL) === SubmitType::SMTP) { + $smtp = new Smtp(); + $handler->smtp = $smtp; + } + + $handler->username = $emailSettings[SettingsEnum::MAIL_SERVER_USER] ?? ''; + $handler->password = $emailSettings[SettingsEnum::MAIL_SERVER_PASS] ?? ''; + + return $handler; + } + /** * Api method to send forgotten password email * @@ -157,15 +193,25 @@ final class ApiController extends Controller */ public function apiForgot(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { - $account = AccountMapper::getBy((string) $request->getData('login'), 'login'); - + $account = AccountMapper::getBy((string) $request->getData('login'), 'login'); $forgotten = $this->app->appSettings->get( - names: ['forgott_date', 'forgrott_count'], + names: [SettingsEnum::LOGIN_FORGOTTEN_DATE, SettingsEnum::LOGIN_FORGOTTEN_COUNT], module: self::NAME, account: $account->getId() ); - if ((int) $forgotten['forgrotten_count'] > 3) { + $emailSettings = $this->app->appSettings->get( + names: [ + SettingsEnum::MAIL_SERVER_ADDR, + SettingsEnum::MAIL_SERVER_CERT, + SettingsEnum::MAIL_SERVER_KEY, + SettingsEnum::MAIL_SERVER_KEYPASS, + SettingsEnum::MAIL_SERVER_TLS, + ], + module: self::NAME + ); + + if ((int) $forgotten[SettingsEnum::LOGIN_FORGOTTEN_COUNT] > 3) { $response->header->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true); $response->set($request->uri->__toString(), [ 'status' => NotificationLevel::ERROR, @@ -175,20 +221,48 @@ final class ApiController extends Controller ]); } - $handler = new MailHandler(); - $handler->setMailer(SubmitType::MAIL); + $token = (string) \random_bytes(64); + $handler = $this->setUpServerMailHandler(); + $resetLink = UriFactory::build('{/backend}reset?user=' . $account->getId() . '&token=' . $token); $mail = new Email(); - $mail->setFrom('test1@orange-management.email', 'Orange-Management'); + $mail->setFrom($emailSettings[SettingsEnum::MAIL_SERVER_ADDR], 'Orange-Management'); $mail->addTo($account->email, \trim($account->name1 . ' ' . $account->name2 . ' ' . $account->name3)); $mail->subject = 'Orange Management: Forgot Password'; - $mail->body = 'Please reset your password at: .....'; + $mail->body = ''; + $mail->msgHTML('Please reset your password at: ' . $resetLink . ''); $this->app->appSettings->set([ - ['name' => 'forgott_date', 'module' => self::NAME, 'account' => $account->getId(), 'content' => (string) \time()], - ['name' => 'forgotten_count', 'module' => self::NAME, 'account' => $account->getId(), 'content' => (string) (((int) $forgotten['forgrotten_count']) + 1)], + [ + 'name' => SettingsEnum::LOGIN_FORGOTTEN_DATE, + 'module' => self::NAME, + 'account' => $account->getId(), + 'content' => (string) \time(), + ], + [ + 'name' => SettingsEnum::LOGIN_FORGOTTEN_COUNT, + 'module' => self::NAME, + 'account' => $account->getId(), + 'content' => (string) (((int) $forgotten[SettingsEnum::LOGIN_FORGOTTEN_COUNT]) + 1), + ], + [ + 'name' => SettingsEnum::LOGIN_FORGOTTEN_TOKEN, + 'module' => self::NAME, + 'account' => $account->getId(), + 'content' => $token, + ], ], true); + if (!empty($emailSettings[SettingsEnum::MAIL_SERVER_CERT] ?? '') && !empty($emailSettings[SettingsEnum::MAIL_SERVER_KEY] ?? '')) { + $mail->sign( + $emailSettings[SettingsEnum::MAIL_SERVER_CERT], + $emailSettings[SettingsEnum::MAIL_SERVER_KEY], + $emailSettings[SettingsEnum::MAIL_SERVER_KEYPASS] + ); + } + + $handler->send($mail); + $response->header->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true); $response->set($request->uri->__toString(), [ 'status' => NotificationLevel::OK, @@ -213,7 +287,90 @@ final class ApiController extends Controller */ public function apiResetPassword(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { - // @todo: implement + $forgotten = $this->app->appSettings->get( + names: [SettingsEnum::LOGIN_FORGOTTEN_DATE, SettingsEnum::LOGIN_FORGOTTEN_TOKEN], + module: self::NAME, + account: (int) $request->getData('user') + ); + + $date = new \DateTime($forgotten[SettingsEnum::LOGIN_FORGOTTEN_DATE] ?? '1970-01-01'); + $token = $forgotten[SettingsEnum::LOGIN_FORGOTTEN_TOKEN] ?? ''; + + if ($date->getTimestamp() < \time() - 60 * 10 + || empty($request->getData('token')) + || $request->getData('token') !== $token + ) { + $response->header->status = RequestStatusCode::R_405; + $response->set($request->uri->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Password Reset', + 'message' => 'Invalid reset credentials (username/token).', + 'response' => null, + ]); + + return; + } + + $account = AccountMapper::get((int) $request->getData('user')); + $account->generatePassword($pass = StringUtils::generateString(10, 14, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_-+=/\\{}<>?')); + + AccountMapper::update($account); + + $emailSettings = $this->app->appSettings->get( + names: [ + SettingsEnum::MAIL_SERVER_ADDR, + SettingsEnum::MAIL_SERVER_CERT, + SettingsEnum::MAIL_SERVER_KEY, + SettingsEnum::MAIL_SERVER_KEYPASS, + SettingsEnum::MAIL_SERVER_TLS, + ], + module: self::NAME + ); + + $handler = $this->setUpServerMailHandler(); + $loginLink = UriFactory::build('{/backend}'); + + $mail = new Email(); + $mail->setFrom($emailSettings[SettingsEnum::MAIL_SERVER_ADDR], 'Orange-Management'); + $mail->addTo($account->email, \trim($account->name1 . ' ' . $account->name2 . ' ' . $account->name3)); + $mail->subject = 'Orange Management: Password reset'; + $mail->body = ''; + $mail->msgHTML('Your new password: ' . $pass . '' + . "\n\n" + . 'Please remember to change your password after logging in!'); + + $this->app->appSettings->set([ + [ + 'name' => SettingsEnum::LOGIN_FORGOTTEN_COUNT, + 'module' => self::NAME, + 'account' => $account->getId(), + 'content' => '0', + ], + [ + 'name' => SettingsEnum::LOGIN_FORGOTTEN_TOKEN, + 'module' => self::NAME, + 'account' => $account->getId(), + 'content' => '', + ], + ], true); + + if (!empty($emailSettings[SettingsEnum::MAIL_SERVER_CERT] ?? '') && !empty($emailSettings[SettingsEnum::MAIL_SERVER_KEY] ?? '')) { + $mail->sign( + $emailSettings[SettingsEnum::MAIL_SERVER_CERT], + $emailSettings[SettingsEnum::MAIL_SERVER_KEY], + $emailSettings[SettingsEnum::MAIL_SERVER_KEYPASS] + ); + } + + $handler->send($mail); + + $response->header->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true); + $response->set($request->uri->__toString(), [ + 'status' => NotificationLevel::OK, + 'title' => 'Password Reset', + 'message' => 'You received a new password.', + 'response' => null, + ]); } /** diff --git a/Controller/BackendController.php b/Controller/BackendController.php index e841585..c8d03ad 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -432,7 +432,7 @@ final class BackendController extends Controller $generalSettings = $this->app->appSettings->get(null, [ SettingsEnum::PASSWORD_PATTERN, SettingsEnum::LOGIN_TIMEOUT, SettingsEnum::PASSWORD_INTERVAL, SettingsEnum::PASSWORD_HISTORY, SettingsEnum::LOGIN_TRIES, SettingsEnum::LOGGING_STATUS, SettingsEnum::LOGGING_PATH, SettingsEnum::DEFAULT_ORGANIZATION, - SettingsEnum::LOGIN_STATUS, SettingsEnum::DEFAULT_LOCALIZATION, SettingsEnum::ADMIN_MAIL, + SettingsEnum::LOGIN_STATUS, SettingsEnum::DEFAULT_LOCALIZATION, SettingsEnum::MAIL_SERVER_ADDR, ]); $view->setData('generalSettings', $generalSettings); diff --git a/Theme/Backend/page-list.tpl.php b/Theme/Backend/page-list.tpl.php index 7840ada..c17895f 100644 --- a/Theme/Backend/page-list.tpl.php +++ b/Theme/Backend/page-list.tpl.php @@ -12,6 +12,7 @@ */ declare(strict_types=1); +use phpOMS\Account\AccountStatus; use phpOMS\Uri\UriFactory; /**