diff --git a/Admin/Install/Media.install.json b/Admin/Install/Media.install.json index 5f3875f..1a3c13a 100755 --- a/Admin/Install/Media.install.json +++ b/Admin/Install/Media.install.json @@ -62,6 +62,7 @@ "virtualPath": "/Modules/Admin/Templates/Global", "user": 1 }, + { "type": "upload", "create_collection": true, @@ -76,44 +77,13 @@ { "type": "upload", "create_collection": true, - "name": "Pdf Default Template", + "name": "Default Templates", "virtualPath": "/Modules/Admin/Templates/Global/Helper", - "path": "/Modules/Admin/Templates/Global/Helper/Pdf Default Template", + "path": "/Modules/Admin/Templates/Global/Helper/Default Templates", "files": [ - "/Modules/Admin/Admin/Install/Media/PdfDefaultTemplate" - ], - "user": 1 - }, - { - "type": "upload", - "create_collection": true, - "name": "Word Default Template", - "virtualPath": "/Modules/Admin/Templates/Global/Helper", - "path": "/Modules/Admin/Templates/Global/Helper/Word Default Template", - "files": [ - "/Modules/Admin/Admin/Install/Media/WordDefaultTemplate" - ], - "user": 1 - }, - { - "type": "upload", - "create_collection": true, - "name": "Word Plain Template", - "virtualPath": "/Modules/Admin/Templates/Global/Helper", - "path": "/Modules/Admin/Templates/Global/Helper/Word Plain Template", - "files": [ - "/Modules/Admin/Admin/Install/Media/WordPlainTemplate" - ], - "user": 1 - }, - { - "type": "upload", - "create_collection": true, - "name": "Excel Default Template", - "virtualPath": "/Modules/Admin/Templates/Global/Helper", - "path": "/Modules/Admin/Templates/Global/Helper/Excel Default Template", - "files": [ - "/Modules/Admin/Admin/Install/Media/ExcelDefaultTemplate" + "/Modules/Admin/Admin/Install/Media/PdfDefaultTemplate/pdfTemplate.pdf.php", + "/Modules/Admin/Admin/Install/Media/WordDefaultTemplate/docTemplate.doc.php", + "/Modules/Admin/Admin/Install/Media/ExcelDefaultTemplate/spreadsheetTemplate.xls.php" ], "user": 1 }, @@ -184,65 +154,5 @@ "/Modules/Admin/Admin/Install/Media/EmailExporter" ], "user": 1 - }, - - { - "type": "reference", - "name": "Assets", - "from": "/Modules/Admin/Templates/Global/Helper/Pdf Default Template", - "to": "/Modules/Admin/Templates/Global/Helper/Assets", - "user": 1 - }, - { - "type": "reference", - "name": "Assets", - "from": "/Modules/Admin/Templates/Global/Helper/Word Default Template", - "to": "/Modules/Admin/Templates/Global/Helper/Assets", - "user": 1 - }, - { - "type": "reference", - "name": "Assets", - "from": "/Modules/Admin/Templates/Global/Helper/Word Plain Template", - "to": "/Modules/Admin/Templates/Global/Helper/Assets", - "user": 1 - }, - - { - "type": "reference", - "name": "Assets", - "from": "/Modules/Admin/Templates/Global/Helper/Excel Default Template", - "to": "/Modules/Admin/Templates/Global/Helper/Assets", - "user": 1 - }, - - { - "type": "reference", - "name": "Helper", - "from": "/Modules/Admin/Templates/Global/Lists/Pdf List Exporter", - "to": "/Modules/Admin/Templates/Global/Helper/Pdf Default Template", - "user": 1 - }, - { - "type": "reference", - "name": "Helper", - "from": "/Modules/Admin/Templates/Global/Lists/Word List Exporter", - "to": "/Modules/Admin/Templates/Global/Helper/Word Default Template", - "user": 1 - }, - { - "type": "reference", - "name": "Helper", - "from": "/Modules/Admin/Templates/Global/Lists/Excel List Exporter", - "to": "/Modules/Admin/Templates/Global/Helper/Excel Default Template", - "user": 1 - }, - - { - "type": "reference", - "name": "Helper", - "from": "/Modules/Admin/Templates/Global/Letters/Word Letter Exporter", - "to": "/Modules/Admin/Templates/Global/Helper/Word Default Template", - "user": 1 } ] \ No newline at end of file diff --git a/Admin/Install/Media.php b/Admin/Install/Media.php index 464f745..d7c47d7 100755 --- a/Admin/Install/Media.php +++ b/Admin/Install/Media.php @@ -49,7 +49,6 @@ class Media SettingsEnum::DEFAULT_LIST_EXPORTS, (string) $media['collection'][4]['id'], '\\d+', - unit: 1, module: 'Admin' ) ); @@ -60,7 +59,26 @@ class Media SettingsEnum::DEFAULT_LETTERS, (string) $media['collection'][5]['id'], '\\d+', - unit: 1, + module: 'Admin' + ) + ); + + SettingMapper::create()->execute( + new Setting( + 0, + SettingsEnum::DEFAULT_ASSETS, + (string) $media['upload'][0]['id'], + '\\d+', + module: 'Admin' + ) + ); + + SettingMapper::create()->execute( + new Setting( + 0, + SettingsEnum::DEFAULT_TEMPLATES, + (string) $media['upload'][1]['id'], + '\\d+', module: 'Admin' ) ); diff --git a/Admin/Install/Media/ExcelDefaultTemplate/template.php b/Admin/Install/Media/ExcelDefaultTemplate/spreadsheetTemplate.xls.php similarity index 89% rename from Admin/Install/Media/ExcelDefaultTemplate/template.php rename to Admin/Install/Media/ExcelDefaultTemplate/spreadsheetTemplate.xls.php index 1479aa2..cfcba4b 100644 --- a/Admin/Install/Media/ExcelDefaultTemplate/template.php +++ b/Admin/Install/Media/ExcelDefaultTemplate/spreadsheetTemplate.xls.php @@ -1,15 +1,10 @@ header_xobjid = $this->startTemplate($this->w, 0); // Set Logo - $image_file = __DIR__ . '/../Web/Backend/img/logo.png'; + $image_file = '/home/spl1nes/Orange-Management/Web/Backend/img/logo.png'; $this->Image($image_file, 15, 15, 15, 15, 'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false); // Set Title diff --git a/Admin/Install/Media/WordDefaultTemplate/template.php b/Admin/Install/Media/WordDefaultTemplate/docTemplate.doc.php similarity index 98% rename from Admin/Install/Media/WordDefaultTemplate/template.php rename to Admin/Install/Media/WordDefaultTemplate/docTemplate.doc.php index 51e3a14..011d4c0 100644 --- a/Admin/Install/Media/WordDefaultTemplate/template.php +++ b/Admin/Install/Media/WordDefaultTemplate/docTemplate.doc.php @@ -1,11 +1,6 @@ execute(new Setting(0, SettingsEnum::PASSWORD_PATTERN, '^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$', module: 'Admin')); - SettingMapper::create()->execute(new Setting(0, SettingsEnum::LOGIN_TRIES, '3', '\\d+', module: 'Admin')); - SettingMapper::create()->execute(new Setting(0, SettingsEnum::LOGIN_TIMEOUT, '3', '\\d+', module: 'Admin')); - SettingMapper::create()->execute(new Setting(0, SettingsEnum::PASSWORD_INTERVAL, '90', '\\d+', module: 'Admin')); - SettingMapper::create()->execute(new Setting(0, SettingsEnum::PASSWORD_HISTORY, '3', '\\d+', module: 'Admin')); - SettingMapper::create()->execute(new Setting(0, SettingsEnum::LOGGING_STATUS, '1', '[0-3]', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::PASSWORD_PATTERN, '/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::LOGIN_TRIES, '3', pattern: '/\\d+/', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::LOGIN_TIMEOUT, '3', pattern: '/\\d+/', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::PASSWORD_INTERVAL, '90', pattern: '/\\d+/', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::PASSWORD_HISTORY, '3', pattern: '/\\d+/', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::LOGGING_STATUS, '1', pattern: '/[0-3]/', module: 'Admin')); SettingMapper::create()->execute(new Setting(0, SettingsEnum::LOGGING_PATH, '', module: 'Admin')); - SettingMapper::create()->execute(new Setting(0, SettingsEnum::DEFAULT_UNIT, '1', '\\d+', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::DEFAULT_UNIT, '1', pattern: '/\\d+/', module: 'Admin')); - SettingMapper::create()->execute(new Setting(0, SettingsEnum::LOGIN_STATUS, '1', '[0-3]', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::LOGIN_STATUS, '1', pattern: '/[0-3]', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::LOGIN_MAIL_REGISTRATION_TEMPLATE, '', pattern: '/\\d*/', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::LOGIN_MAIL_FORGOT_PASSWORD_TEMPLATE, '', pattern: '/\\d*/', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::LOGIN_MAIL_FAILED_TEMPLATE, '', pattern: '/\\d*/', module: 'Admin')); - SettingMapper::create()->execute(new Setting(0, SettingsEnum::DEFAULT_LOCALIZATION, '1', '\\d+', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::DEFAULT_LOCALIZATION, '1', pattern: '/\\d+/', module: 'Admin')); - SettingMapper::create()->execute(new Setting(0, SettingsEnum::MAIL_SERVER_ADDR, 'admin@jingga.app', "(?:[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()->execute(new Setting(0, SettingsEnum::MAIL_SERVER_OUT, '', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::MAIL_SERVER_PORT_OUT, '', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::MAIL_SERVER_IN, '', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::MAIL_SERVER_PORT_IN, '', module: 'Admin')); + SettingMapper::create()->execute(new Setting(0, SettingsEnum::MAIL_SERVER_ADDR, '', pattern: "/(?:[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()->execute(new Setting(0, SettingsEnum::MAIL_SERVER_TYPE, SubmitType::MAIL, module: 'Admin')); SettingMapper::create()->execute(new Setting(0, SettingsEnum::MAIL_SERVER_USER, '', module: 'Admin')); SettingMapper::create()->execute(new Setting(0, SettingsEnum::MAIL_SERVER_PASS, '', module: 'Admin')); @@ -107,7 +114,7 @@ final class Installer extends InstallerAbstract (OperatingSystem::getSystem() === SystemType::WIN ? 'php.exe' : 'php' - ) .' cli.php -v' + ) . ' ' . __DIR__ . '/../../../../Cli/cli.php -v' ); $cmdResult = $cmdResult === null || $cmdResult === false ? '' : $cmdResult; diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php index 467732a..ec235e2 100755 --- a/Admin/Routes/Web/Api.php +++ b/Admin/Routes/Web/Api.php @@ -18,6 +18,15 @@ use phpOMS\Account\PermissionType; use phpOMS\Router\RouteVerb; return [ + '^.*/admin/worker(\?.*|$)' => [ + [ + 'dest' => '\Modules\Admin\Controller\ApiController:apiDataChange', + 'verb' => RouteVerb::ANY, + 'permission' => [ + ], + ], + ], + '^.*/login(\?.*|$)' => [ [ 'dest' => '\Modules\Admin\Controller\ApiController:apiLogin', @@ -26,6 +35,14 @@ return [ ], ], ], + '^.*/signup(\?.*|$)' => [ + [ + 'dest' => '\Modules\Admin\Controller\ApiController:apiAccountRegister', + 'verb' => RouteVerb::SET, + 'permission' => [ + ], + ], + ], '^.*/logout(\?.*|$)' => [ [ diff --git a/Admin/Settings/Theme/Backend/settings.tpl.php b/Admin/Settings/Theme/Backend/settings.tpl.php index ffac1d1..373c9e9 100755 --- a/Admin/Settings/Theme/Backend/settings.tpl.php +++ b/Admin/Settings/Theme/Backend/settings.tpl.php @@ -63,7 +63,7 @@ echo $this->getData('nav')->render();
@@ -103,7 +103,7 @@ echo $this->getData('nav')->render(); - +
@@ -112,7 +112,7 @@ echo $this->getData('nav')->render(); - +
@@ -121,7 +121,7 @@ echo $this->getData('nav')->render(); - +
@@ -130,7 +130,7 @@ echo $this->getData('nav')->render(); - +
@@ -139,7 +139,7 @@ echo $this->getData('nav')->render(); - +
@@ -167,7 +167,7 @@ echo $this->getData('nav')->render();
- +
@@ -728,6 +728,30 @@ echo $this->getData('nav')->render(); getHtml('Value'); ?> + getHtml('Unit'); ?> + + + + getHtml('App'); ?> + + + getHtml('Module'); ?>
@@ -794,11 +832,3 @@ echo $this->getData('nav')->render(); - -asdf - -// login status (normal, read_only, disabled) -// default email settings for server (e.g. for forgot password) -// some default pages (e.g. legal pages) -// other settings defined during the installation (e.g. default unit ...) -// maybe combine page Admin/Settings and the module settings into one page. Maybe make them reference each other or maybe completely remove the Admin/Settings page because it is available in the module settings! \ No newline at end of file diff --git a/Controller/ApiController.php b/Controller/ApiController.php index eb491fe..f6afc8e 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -116,7 +116,10 @@ final class ApiController extends Controller { $response->header->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true); - $login = AccountMapper::login((string) ($request->getData('user') ?? ''), (string) ($request->getData('pass') ?? '')); + $login = AccountMapper::login( + (string) ($request->getData('user') ?? ''), + (string) ($request->getData('pass') ?? '') + ); if ($login >= LoginReturnType::OK) { $this->app->sessionManager->set('UID', $login, true); @@ -181,26 +184,34 @@ final class ApiController extends Controller /** @var \Model\Setting[] $emailSettings */ $emailSettings = $this->app->appSettings->get( names: [ - SettingsEnum::MAIL_SERVER_ADDR, + SettingsEnum::MAIL_SERVER_OUT, + SettingsEnum::MAIL_SERVER_PORT_OUT, SettingsEnum::MAIL_SERVER_TYPE, SettingsEnum::MAIL_SERVER_USER, SettingsEnum::MAIL_SERVER_PASS, SettingsEnum::MAIL_SERVER_TLS, ], - module: self::NAME + module: 'Admin' ); $handler = new MailHandler(); - $handler->setMailer($emailSettings[SettingsEnum::MAIL_SERVER_TYPE . '::' . self::NAME]->content ?? SubmitType::MAIL); - $handler->useAutoTLS = (bool) ($emailSettings[SettingsEnum::MAIL_SERVER_TLS . '::' . self::NAME]->content ?? false); + $handler->setMailer($emailSettings[SettingsEnum::MAIL_SERVER_TYPE . ':::Admin']->content ?? SubmitType::MAIL); + $handler->useAutoTLS = (bool) ($emailSettings[SettingsEnum::MAIL_SERVER_TLS . ':::Admin']->content ?? false); - if ((int) ($emailSettings[SettingsEnum::MAIL_SERVER_TYPE . '::' . self::NAME]->content ?? SubmitType::MAIL) === SubmitType::SMTP) { + if (($emailSettings[SettingsEnum::MAIL_SERVER_TYPE . ':::Admin']->content ?? SubmitType::MAIL) === SubmitType::SMTP) { $smtp = new Smtp(); $handler->smtp = $smtp; + $handler->useSMTPAuth = true; } - $handler->username = $emailSettings[SettingsEnum::MAIL_SERVER_USER . '::' . self::NAME]->content ?? ''; - $handler->password = $emailSettings[SettingsEnum::MAIL_SERVER_PASS . '::' . self::NAME]->content ?? ''; + if (!empty($port = $emailSettings[SettingsEnum::MAIL_SERVER_PORT_OUT . ':::Admin']->content)) { + $handler->port = (int) $port; + } + + $handler->host = $emailSettings[SettingsEnum::MAIL_SERVER_OUT . ':::Admin']->content ?? 'localhost'; + $handler->hostname = $emailSettings[SettingsEnum::MAIL_SERVER_OUT . ':::Admin']->content ?? ''; + $handler->username = $emailSettings[SettingsEnum::MAIL_SERVER_USER . ':::Admin']->content ?? ''; + $handler->password = $emailSettings[SettingsEnum::MAIL_SERVER_PASS . ':::Admin']->content ?? ''; return $handler; } @@ -221,7 +232,9 @@ final class ApiController extends Controller public function apiForgot(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void { /** @var \Modules\Admin\Models\Account $account */ - $account = AccountMapper::get()->where('login', (string) $request->getData('login'))->execute(); + $account = !empty($request->getData('login')) + ? AccountMapper::get()->where('login', (string) $request->getData('login'))->execute() + : AccountMapper::get()->where('email', (string) $request->getData('email'))->execute(); /** @var \Model\Setting[] $forgotten */ $forgotten = $this->app->appSettings->get( @@ -254,12 +267,12 @@ final class ApiController extends Controller $token = (string) \random_bytes(64); $handler = $this->setUpServerMailHandler(); - $resetLink = UriFactory::build('{/lang}/{/app}/{/backend}reset?user=' . $account->getId() . '&token=' . $token); + $resetLink = UriFactory::build('{/lang}/{/app}/reset?user=' . $account->getId() . '&token=' . $token); $mail = new Email(); - $mail->setFrom($emailSettings[SettingsEnum::MAIL_SERVER_ADDR]->content, 'Karaka'); + $mail->setFrom($emailSettings[SettingsEnum::MAIL_SERVER_ADDR]->content, 'Jingga'); $mail->addTo($account->getEmail(), \trim($account->name1 . ' ' . $account->name2 . ' ' . $account->name3)); - $mail->subject = 'Karaka: Forgot Password'; + $mail->subject = 'Jingga: Forgot Password'; $mail->body = ''; $mail->msgHTML('Please reset your password at: ' . $resetLink . ''); @@ -368,9 +381,9 @@ final class ApiController extends Controller $loginLink = UriFactory::build('{/lang}/{/app}/{/backend}'); $mail = new Email(); - $mail->setFrom($emailSettings[SettingsEnum::MAIL_SERVER_ADDR]->content, 'Karaka'); + $mail->setFrom($emailSettings[SettingsEnum::MAIL_SERVER_ADDR]->content, 'Jingga'); $mail->addTo($account->getEmail(), \trim($account->name1 . ' ' . $account->name2 . ' ' . $account->name3)); - $mail->subject = 'Karaka: Password reset'; + $mail->subject = 'Jingga: Password reset'; $mail->body = ''; $mail->msgHTML('Your new password: ' . $pass . '' . "\n\n" @@ -530,7 +543,7 @@ final class ApiController extends Controller ] ], false); - $this->updateModel($request->header->account, $old, $new, SettingMapper::class, 'settings',$request->getOrigin()); + $this->updateModel($request->header->account, $old, $new, SettingMapper::class, 'settings', $request->getOrigin()); } $this->fillJsonResponse( @@ -1391,7 +1404,6 @@ final class ApiController extends Controller $this->createModel($request->header->account, $collection, CollectionMapper::class, 'collection', $request->getOrigin()); // find default groups and create them - $defaultGroups = []; $defaultGroupIds = []; if ($request->hasData('app')) { @@ -1402,7 +1414,7 @@ final class ApiController extends Controller module: 'Admin' ); - $defaultGroups = \array_merge($defaultGroups, \json_decode($defaultGroupSettings->content, true)); + $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); } if ($request->hasData('unit')) { @@ -1413,11 +1425,7 @@ final class ApiController extends Controller module: 'Admin' ); - $defaultGroups = \array_merge($defaultGroups, \json_decode($defaultGroupSettings->content, true)); - } - - foreach ($defaultGroups as $group) { - $defaultGroupIds[] = $group->getId(); + $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); } if (!empty($defaultGroupIds)) { @@ -1461,6 +1469,10 @@ final class ApiController extends Controller */ public function apiAccountRegister(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void { + if ($request->header->account === 0) { + $request->header->account = 1; + } + if (!empty($val = $this->validateRegistration($request))) { $response->set('account_registration', new FormValidation($val)); $response->header->status = RequestStatusCode::R_400; @@ -1468,6 +1480,10 @@ final class ApiController extends Controller return; } + $app = AppMapper::get() + ->where('id', (int) $request->getData('app')) + ->execute(); + /** @var \Model\Setting $allowed */ $allowed = $this->app->appSettings->get( names: [SettingsEnum::REGISTRATION_ALLOWED], @@ -1565,33 +1581,28 @@ final class ApiController extends Controller $account = $loginAccount; } - $defaultGroups = []; - $defaultGroupIds = []; - - /** @var \Model\Setting $defaultGroupSettings */ - $defaultGroupSettings = $this->app->appSettings->get( - names: SettingsEnum::APP_DEFAULT_GROUPS, - app: (int) $request->getData('app'), - module: 'Admin' - ); - - $defaultGroups = \array_merge($defaultGroups, \json_decode($defaultGroupSettings->content, true)); - - /** @var \Model\Setting $defaultGroupSettings */ - $defaultGroupSettings = $this->app->appSettings->get( - names: SettingsEnum::UNIT_DEFAULT_GROUPS, - unit: (int) $request->getData('unit'), - module: 'Admin' - ); - - $defaultGroups = \array_merge($defaultGroups, \json_decode($defaultGroupSettings->content, true)); - - foreach ($defaultGroups as $group) { - $defaultGroupIds[] = $group->getId(); - } - // Already registered if ($account !== null) { + $defaultGroupIds = []; + + /** @var \Model\Setting $defaultGroupSettings */ + $defaultGroupSettings = $this->app->appSettings->get( + names: SettingsEnum::APP_DEFAULT_GROUPS, + app: (int) $request->getData('app'), + module: 'Admin' + ); + + $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); + + /** @var \Model\Setting $defaultGroupSettings */ + $defaultGroupSettings = $this->app->appSettings->get( + names: SettingsEnum::UNIT_DEFAULT_GROUPS, + unit: (int) $request->getData('unit'), + module: 'Admin' + ); + + $defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); + /** @var Account $account */ $account = AccountMapper::get() ->with('groups') @@ -1607,6 +1618,7 @@ final class ApiController extends Controller if (empty($defaultGroupIds) && $account->getStatus() === AccountStatus::ACTIVE ) { + // Already set up $this->fillJsonResponse( $request, $response, @@ -1622,6 +1634,7 @@ final class ApiController extends Controller } elseif (empty($defaultGroupIds) && $account->getStatus() === AccountStatus::INACTIVE ) { + // Account not active $this->fillJsonResponse( $request, $response, @@ -1639,6 +1652,7 @@ final class ApiController extends Controller // Create missing account / group relationships $this->createModelRelation($account->getId(), $account->getId(), $defaultGroupIds, AccountMapper::class, 'groups', 'registration', $request->getOrigin()); } else { + // New account $request->setData('status', AccountStatus::INACTIVE); $request->setData('type', AccountType::USER); $request->setData('name1', !$request->hasData('name1') @@ -1668,8 +1682,45 @@ final class ApiController extends Controller } while ($dataChange->getId() === 0 && $tries < 5); } + // Create client + if ($request->hasData('client')) { + $internalRequest = new HttpRequest(); + $internalResponse = new HttpResponse(); + + $internalRequest->header->account = $account->getId(); + $internalRequest->setData('account', $account->getId()); + $internalRequest->setData('number', 100000 + $account->getId()); + $internalRequest->setData('address', $request->getData('address') ?? ''); + $internalRequest->setData('postal', $request->getData('postal') ?? ''); + $internalRequest->setData('city', $request->getData('city') ?? ''); + $internalRequest->setData('country', $request->getData('country') ?? ''); + $internalRequest->setData('state', $request->getData('state') ?? ''); + + $this->app->moduleManager->get('ClientManagement')->apiClientCreate($internalRequest, $internalResponse); + } + // Create confirmation email - // @todo: send email for activation + // @todo: adjust + // load base template for app + // load text content for login + // replace placeholders + // send email + + $handler = $this->setUpServerMailHandler(); + + $emailSettings = $this->app->appSettings->get( + names: SettingsEnum::MAIL_SERVER_ADDR, + module: 'Admin' + ); + + $mail = new Email(); + $mail->setFrom($emailSettings->content); + $mail->addTo((string) $request->getData('email')); + $mail->subject = 'Registration'; + $mail->body = "Hello,\nThank you very much for using our services at Jingga. Please click the following link to confirm your registration:\n\n" . UriFactory::build('{/base}/{/lang}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash()) . "\n\nBest regards,\nJingga"; + $mail->bodyAlt = $mail->body; + + $handler->send($mail); $this->fillJsonResponse( $request, @@ -2130,8 +2181,9 @@ final class ApiController extends Controller $request->header->account, $old, $new, StringUtils::intHash(ModuleMapper::class), 'module-status', - $module, self::NAME, + $module, + '', $request->getOrigin(), ] ); diff --git a/Controller/BackendController.php b/Controller/BackendController.php index fe6bfb8..a38aa96 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -25,6 +25,7 @@ use Modules\Admin\Models\SettingsEnum; use Modules\Auditor\Models\AuditMapper; use Modules\Media\Models\MediaMapper; use phpOMS\Asset\AssetType; +use phpOMS\Autoloader; use phpOMS\Contract\RenderableInterface; use phpOMS\DataStorage\Database\Query\OrderType; use phpOMS\Localization\NullLocalization; @@ -562,13 +563,17 @@ final class BackendController extends Controller $id = (string) ($request->getData('id') ?? ''); + $queryMapper = AuditMapper::getAll() + ->with('createdBy') + ->where('module', $id); + // audit log if ($request->getData('ptype') === 'p') { - $view->setData('auditlogs', AuditMapper::getAll()->where('module', $id)->where('id', (int) $request->getData('audit'), '<')->limit(25)->execute()); + $view->setData('auditlogs',$queryMapper->where('id', (int) $request->getData('audit'), '<')->limit(25)->execute()); } elseif ($request->getData('ptype') === 'n') { - $view->setData('auditlogs', AuditMapper::getAll()->where('module', $id)->where('id', (int) $request->getData('audit'), '>')->limit(25)->execute()); + $view->setData('auditlogs',$queryMapper->where('id', (int) $request->getData('audit'), '>')->limit(25)->execute()); } else { - $view->setData('auditlogs', AuditMapper::getAll()->where('module', $id)->where('id', 0, '>')->limit(25)->execute()); + $view->setData('auditlogs',$queryMapper->where('id', 0, '>')->limit(25)->execute()); } return $view; @@ -696,6 +701,13 @@ final class BackendController extends Controller $view->setData('settings', !\is_array($settings) ? [$settings] : $settings); } + $class = '\\Modules\\' . $request->getData('id') . '\\Models\\SettingsEnum'; + if (!Autoloader::exists($class)) { + $class = null; + } + + $view->setData('settings_class', $class); + if ($request->getData('id') === 'Admin') { $view->setTemplate('/Modules/' . $request->getData('id') . '/Admin/Settings/Theme/Backend/settings'); } elseif (\is_file(__DIR__ . '/../../' . ($request->getData('id') ?? '') . '/Admin/Settings/Theme/Backend/settings.tpl.php')) { @@ -715,7 +727,7 @@ final class BackendController extends Controller ); $view->setData('generalSettings', $generalSettings); - $view->setData('defaultlocalization', LocalizationMapper::get()->where('id', (int) $generalSettings[SettingsEnum::DEFAULT_LOCALIZATION . '::Admin']->content)->execute()); + $view->setData('defaultlocalization', LocalizationMapper::get()->where('id', (int) $generalSettings[SettingsEnum::DEFAULT_LOCALIZATION . ':::Admin']->content)->execute()); return $view; } diff --git a/Models/AccountExternal.php b/Models/AccountExternal.php new file mode 100644 index 0000000..cba3d99 --- /dev/null +++ b/Models/AccountExternal.php @@ -0,0 +1,96 @@ + + * @since 1.0.0 + */ + public const COLUMNS = [ + 'account_external_id' => ['name' => 'account_external_id', 'type' => 'int', 'internal' => 'id'], + 'account_external_status' => ['name' => 'account_external_status', 'type' => 'int', 'internal' => 'status'], + 'account_external_type' => ['name' => 'account_external_type', 'type' => 'int', 'internal' => 'type'], + 'account_external_subtype' => ['name' => 'account_external_subtype', 'type' => 'int', 'internal' => 'subtype',], + 'account_external_key' => ['name' => 'account_external_key', 'type' => 'string', 'internal' => 'key'], + 'account_external_name' => ['name' => 'account_external_name', 'type' => 'string', 'internal' => 'name'], + 'account_external_auth' => ['name' => 'account_external_auth', 'type' => 'string', 'internal' => 'auth', ], + 'account_external_account' => ['name' => 'account_external_account', 'type' => 'int', 'internal' => 'account'], + ]; + + /** + * Model to use by the mapper. + * + * @var class-string + * @since 1.0.0 + */ + public const MODEL = AccountExternal::class; + + /** + * Primary table. + * + * @var string + * @since 1.0.0 + */ + public const TABLE = 'account_external'; + + /** + * Primary field name. + * + * @var string + * @since 1.0.0 + */ + public const PRIMARYFIELD = 'account_external_id'; +} diff --git a/Models/AccountExternalStatus.php b/Models/AccountExternalStatus.php new file mode 100644 index 0000000..0fa2a73 --- /dev/null +++ b/Models/AccountExternalStatus.php @@ -0,0 +1,32 @@ +hash = \random_bytes(64); + $this->hash = \bin2hex(\random_bytes(16)); } /** diff --git a/Models/DataChangeMapper.php b/Models/DataChangeMapper.php index 2b5ea49..299f148 100644 --- a/Models/DataChangeMapper.php +++ b/Models/DataChangeMapper.php @@ -63,5 +63,5 @@ final class DataChangeMapper extends DataMapperFactory * @var string * @since 1.0.0 */ - public const PRIMARYFIELD ='data_change_id'; + public const PRIMARYFIELD = 'data_change_id'; } diff --git a/Models/GroupMapper.php b/Models/GroupMapper.php index a98dc7b..a6c8a39 100755 --- a/Models/GroupMapper.php +++ b/Models/GroupMapper.php @@ -64,7 +64,7 @@ final class GroupMapper extends DataMapperFactory * @var string * @since 1.0.0 */ - public const PRIMARYFIELD ='group_id'; + public const PRIMARYFIELD = 'group_id'; /** * Created at column diff --git a/Models/GroupPermissionMapper.php b/Models/GroupPermissionMapper.php index 7a0f169..867223b 100755 --- a/Models/GroupPermissionMapper.php +++ b/Models/GroupPermissionMapper.php @@ -71,5 +71,5 @@ final class GroupPermissionMapper extends DataMapperFactory * @var string * @since 1.0.0 */ - public const PRIMARYFIELD ='group_permission_id'; + public const PRIMARYFIELD = 'group_permission_id'; } diff --git a/Models/LocalizationMapper.php b/Models/LocalizationMapper.php index 8f6647c..c295fd6 100755 --- a/Models/LocalizationMapper.php +++ b/Models/LocalizationMapper.php @@ -130,7 +130,7 @@ final class LocalizationMapper extends DataMapperFactory * @var string * @since 1.0.0 */ - public const PRIMARYFIELD ='l11n_id'; + public const PRIMARYFIELD = 'l11n_id'; /** * Model to use by the mapper. diff --git a/Models/ModuleMapper.php b/Models/ModuleMapper.php index 0591a2d..e1dd4e1 100755 --- a/Models/ModuleMapper.php +++ b/Models/ModuleMapper.php @@ -55,7 +55,7 @@ final class ModuleMapper extends DataMapperFactory * @var string * @since 1.0.0 */ - public const PRIMARYFIELD ='module_id'; + public const PRIMARYFIELD = 'module_id'; public const AUTOINCREMENT = false; } diff --git a/Models/NullAccountExternal.php b/Models/NullAccountExternal.php new file mode 100755 index 0000000..fd1651c --- /dev/null +++ b/Models/NullAccountExternal.php @@ -0,0 +1,46 @@ +id = $id; + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() : mixed + { + return ['id' => $this->id]; + } +} diff --git a/Models/SettingsEnum.php b/Models/SettingsEnum.php index 121f453..d23e0ac 100755 --- a/Models/SettingsEnum.php +++ b/Models/SettingsEnum.php @@ -46,47 +46,67 @@ abstract class SettingsEnum extends Enum public const UNIT_DEFAULT_GROUPS = '1000000009'; - /* Login settings */ - public const LOGIN_FORGOTTEN_COUNT = '1000000010'; - - public const LOGIN_FORGOTTEN_DATE = '1000000011'; - - public const LOGIN_FORGOTTEN_TOKEN = '1000000012'; - - public const LOGIN_STATUS = '1000000013'; - /* Localization settings */ - public const DEFAULT_LOCALIZATION = '1000000014'; - - /* Mail settings */ - public const MAIL_SERVER_ADDR = '1000000015'; - - public const MAIL_SERVER_TYPE = '1000000016'; - - public const MAIL_SERVER_USER = '1000000017'; - - public const MAIL_SERVER_PASS = '1000000018'; - - public const MAIL_SERVER_CERT = '1000000019'; - - public const MAIL_SERVER_KEY = '1000000020'; - - public const MAIL_SERVER_KEYPASS = '1000000021'; - - public const MAIL_SERVER_TLS = '1000000022'; + public const DEFAULT_LOCALIZATION = '1000000010'; /* Cli settings */ - public const CLI_ACTIVE = '1000000023'; + public const CLI_ACTIVE = '1000000011'; + + /* Login settings */ + public const LOGIN_FORGOTTEN_COUNT = '1000000101'; + + public const LOGIN_FORGOTTEN_DATE = '1000000102'; + + public const LOGIN_FORGOTTEN_TOKEN = '1000000103'; + + public const LOGIN_STATUS = '1000000104'; + + public const LOGIN_MAIL = '....'; + + public const LOGIN_MAIL_REGISTRATION_TEMPLATE = '1000000106'; + + public const LOGIN_MAIL_FORGOT_PASSWORD_TEMPLATE = '1000000107'; + + public const LOGIN_MAIL_FAILED_TEMPLATE = '1000000108'; + + /* Mail server settings */ + public const MAIL_SERVER_OUT = '1000000201'; + + public const MAIL_SERVER_PORT_OUT = '1000000202'; + + public const MAIL_SERVER_IN = '1000000203'; + + public const MAIL_SERVER_PORT_IN = '1000000204'; + + public const MAIL_SERVER_ADDR = '1000000205'; + + public const MAIL_SERVER_TYPE = '1000000206'; + + public const MAIL_SERVER_USER = '1000000207'; + + public const MAIL_SERVER_PASS = '1000000208'; + + public const MAIL_SERVER_CERT = '1000000209'; + + public const MAIL_SERVER_KEY = '1000000200'; + + public const MAIL_SERVER_KEYPASS = '1000000210'; + + public const MAIL_SERVER_TLS = '1000000211'; /* Global default templates */ - public const DEFAULT_LIST_EXPORTS = '1000000024'; + public const DEFAULT_LIST_EXPORTS = '1000000301'; - public const DEFAULT_LETTERS = '1000000025'; + public const DEFAULT_LETTERS = '1000000302'; + + public const DEFAULT_TEMPLATES = '1000000303'; + + public const DEFAULT_ASSETS = '1000000304'; /* App settings */ - public const REGISTRATION_ALLOWED = '1000000029'; + public const REGISTRATION_ALLOWED = '1000000401'; - public const GROUP_GENERATE_AUTOMATICALLY_APP = '1000000030'; + public const GROUP_GENERATE_AUTOMATICALLY_APP = '1000000402'; - public const APP_DEFAULT_GROUPS = '1000000031'; + public const APP_DEFAULT_GROUPS = '1000000403'; } diff --git a/Theme/Backend/Lang/Navigation.en.lang.php b/Theme/Backend/Lang/Navigation.en.lang.php index 0e77ba2..eb85bea 100755 --- a/Theme/Backend/Lang/Navigation.en.lang.php +++ b/Theme/Backend/Lang/Navigation.en.lang.php @@ -29,5 +29,6 @@ return ['Navigation' => [ 'Pages' => 'Pages', 'Permissions' => 'Permissions', 'Routes' => 'Routes', + 'Hooks' => 'Hooks', 'Settings' => 'Settings', ]]; diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index 13d482b..42d5023 100755 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -125,6 +125,8 @@ return ['Admin' => [ 'Reset' => 'Reset', 'Route' => 'Route', 'Routes' => 'Routes', + 'Hook' => 'Hook', + 'Hooks' => 'Hooks', 'Running' => 'Running', 'Sea' => 'Sea', 'Search' => 'Search', @@ -177,6 +179,11 @@ return ['Admin' => [ 'Website' => 'Website', 'Weight' => 'Weight', 'Zip' => 'Zip', + 'Trigger' => 'Trigger', + 'ServerStatus' => 'Server Status', + 'ServerMode-1' => 'Normal', + 'ServerMode-2' => 'Read Only', + 'ServerMode-3' => 'Disabled', 'i:LoginRetries' => 'Amount of allowed retries (-1 = unlimited)', 'i:PasswordChangeInterval' => 'Interval in which passwards need to be changed (-1 = never)', 'i:PasswordHistory' => 'New password has to be different from the last N passwords', diff --git a/Theme/Backend/accounts-single.tpl.php b/Theme/Backend/accounts-single.tpl.php index 6e1e57d..483c999 100755 --- a/Theme/Backend/accounts-single.tpl.php +++ b/Theme/Backend/accounts-single.tpl.php @@ -832,7 +832,7 @@ echo $this->getData('nav')->render(); ?> getId(); ?> printHtml($audit->module); ?> - getType(); ?> + type; ?> printHtml($audit->trigger); ?> printHtml($audit->createdBy->login); ?> printHtml($audit->ref); ?> diff --git a/Theme/Backend/modules-log.tpl.php b/Theme/Backend/modules-log.tpl.php index ecd07ce..f0fe7c3 100755 --- a/Theme/Backend/modules-log.tpl.php +++ b/Theme/Backend/modules-log.tpl.php @@ -58,11 +58,11 @@ echo $this->getData('nav')->render(); getId(); ?> printHtml($audit->module); ?> - getType(); ?> + type; ?> printHtml($audit->trigger); ?> - printHtml($audit->content); ?> + printHtml((string) $audit->content); ?> printHtml($audit->createdBy->login); ?> - printHtml($audit->ref); ?> + printHtml((string) $audit->ref); ?> createdAt->format('Y-m-d H:i'); ?> diff --git a/Theme/Backend/modules-settings.tpl.php b/Theme/Backend/modules-settings.tpl.php index 797249b..8fd014a 100755 --- a/Theme/Backend/modules-settings.tpl.php +++ b/Theme/Backend/modules-settings.tpl.php @@ -58,6 +58,30 @@ else : ?> getHtml('Value'); ?> + getHtml('Unit'); ?> + + + + getHtml('App'); ?> + + + getHtml('Group'); ?>