mirror of
https://github.com/Karaka-Management/oms-Admin.git
synced 2026-01-29 04:58:40 +00:00
cs fixes, bug fixes, code coverage
This commit is contained in:
parent
44e18e8507
commit
249199bd1c
|
|
@ -1,7 +0,0 @@
|
|||
[Dolphin]
|
||||
Timestamp=2021,5,23,18,49,35
|
||||
Version=4
|
||||
ViewMode=1
|
||||
|
||||
[Settings]
|
||||
HiddenFilesShown=true
|
||||
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
|
|
@ -44,6 +44,14 @@ return [
|
|||
],
|
||||
],
|
||||
],
|
||||
'^.*/reset(\?.*|$)' => [
|
||||
[
|
||||
'dest' => '\Modules\Admin\Controller\ApiController:apiResetPassword',
|
||||
'verb' => RouteVerb::SET,
|
||||
'permission' => [
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
'^.*/admin/settings(\?.*|$)' => [
|
||||
[
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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: <a href="' . $resetLink . '">' . $resetLink . '</a>');
|
||||
|
||||
$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: <a href="' . $loginLink . '">' . $pass . '</a>'
|
||||
. "\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,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
use phpOMS\Account\AccountStatus;
|
||||
use phpOMS\Uri\UriFactory;
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user