cs fixes, bug fixes, code coverage

This commit is contained in:
Dennis Eichhorn 2021-11-16 00:05:43 +01:00
parent 44e18e8507
commit 249199bd1c
8 changed files with 939 additions and 724 deletions

View File

@ -1,7 +0,0 @@
[Dolphin]
Timestamp=2021,5,23,18,49,35
Version=4
ViewMode=1
[Settings]
HiddenFilesShown=true

View File

@ -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
*

View File

@ -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

View File

@ -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

View File

@ -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,
]);
}
/**

View File

@ -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);

View File

@ -12,6 +12,7 @@
*/
declare(strict_types=1);
use phpOMS\Account\AccountStatus;
use phpOMS\Uri\UriFactory;
/**