Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions App/Package/Users/Controllers/UsersController.php
Original file line number Diff line number Diff line change
Expand Up @@ -369,13 +369,13 @@ private function forgotPasswordPost(): void
Redirect::redirectPreviousRoute();
}
// We send a verification link for this mail
if (UsersSettingsModel::getSetting('resetPasswordMethod') === '0') {
if (UsersSettingsModel::getInstance()->getSetting('resetPasswordMethod') === '0') {
$this->resetPasswordMethodPasswordSendByMail($encryptedMail);

Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'),
LangManager::translate('users.toaster.password_reset', ['mail' => $mail]));

} elseif (UsersSettingsModel::getSetting('resetPasswordMethod') === '1') {
} elseif (UsersSettingsModel::getInstance()->getSetting('resetPasswordMethod') === '1') {
$this->resetPasswordMethodUniqueLinkSendByMail($encryptedMail);

Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'), LangManager::translate('users.toaster.reset_link_follow_the_link'));
Expand Down
2 changes: 1 addition & 1 deletion App/Package/Users/Controllers/UsersLoginController.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public function checkLogin(string $mail, string $password): LoginStatus

$userLastConnect = $user->getLastConnectionUnformatted();

if ((UsersSettingsModel::getSetting('securityReinforced') === '1') && $this->isUserInactiveFor90Days($userLastConnect) && !$user->get2Fa()->isEnabled() && MailModel::getInstance()->getConfig() !== null && MailModel::getInstance()->getConfig()->isEnable()) {
if ((UsersSettingsModel::getInstance()->getSetting('securityReinforced') === '1') && $this->isUserInactiveFor90Days($userLastConnect) && !$user->get2Fa()->isEnabled() && MailModel::getInstance()->getConfig() !== null && MailModel::getInstance()->getConfig()->isEnable()) {
return LoginStatus::OK_LONG_DATE;
}

Expand Down
26 changes: 17 additions & 9 deletions App/Package/Users/Controllers/UsersSettingsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace CMW\Controller\Users;

use CMW\Entity\Users\Settings\BulkSettingsEntity;
use CMW\Entity\Users\UserSettingsEntity;
use CMW\Manager\Env\EnvManager;
use CMW\Manager\Filter\FilterManager;
Expand All @@ -18,7 +19,6 @@
use CMW\Utils\Redirect;
use CMW\Utils\Utils;
use JetBrains\PhpStorm\NoReturn;
use JsonException;

/**
* Class: @UsersSettingsController
Expand All @@ -30,7 +30,7 @@ class UsersSettingsController extends AbstractController
{
public static function getDefaultImageLink(): string
{
$defaultImg = UsersSettingsModel::getSetting('defaultImage');
$defaultImg = UsersSettingsModel::getInstance()->getSetting('defaultImage');
return EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . 'Public/Uploads/Users/Default/' . $defaultImg;
}

Expand All @@ -55,12 +55,12 @@ private function settings(): void
->view();
}

#[Link('/settings/resetImg', Link::GET, [], '/cmw-admin/users')]
#[NoReturn] #[Link('/settings/resetImg', Link::GET, [], '/cmw-admin/users')]
private function resetDefaultImg(): void
{
UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings');

UsersSettingsModel::updateSetting('defaultImage', 'defaultImage.jpg');
UsersSettingsModel::getInstance()->updateSetting('defaultImage', 'defaultImage.jpg');

Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'),
LangManager::translate('core.toaster.config.success'));
Expand All @@ -78,7 +78,7 @@ private function settingsPost(): void

try {
$newDefaultImage = ImagesManager::convertAndUpload($defaultPicture, 'Users/Default');
UsersSettingsModel::updateSetting('defaultImage', $newDefaultImage);
UsersSettingsModel::getInstance()->updateSetting('defaultImage', $newDefaultImage);
} catch (ImagesException $e) {
Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'),
LangManager::translate('core.errors.upload.image') . ' => ' . $e->getMessage());
Expand All @@ -88,9 +88,17 @@ private function settingsPost(): void

[$resetPasswordMethod, $profilePage, $securityReinforced] = Utils::filterInput('reset_password_method', 'profile_page', 'security_reinforced');

UsersSettingsModel::updateSetting('resetPasswordMethod', $resetPasswordMethod);
UsersSettingsModel::updateSetting('profilePage', $profilePage);
UsersSettingsModel::updateSetting('securityReinforced', $securityReinforced);
$settingsStatus = UsersSettingsModel::getInstance()->bulkUpdateSettings(
new BulkSettingsEntity('resetPasswordMethod', $resetPasswordMethod),
new BulkSettingsEntity('profilePage', $profilePage),
new BulkSettingsEntity('securityReinforced', $securityReinforced)
);

if (!$settingsStatus) {
Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'),
LangManager::translate('core.toaster.config.error'));
Redirect::redirectPreviousRoute();
}

[$listEnforcedToggle] = Utils::filterInput('listEnforcedToggle');

Expand Down Expand Up @@ -118,7 +126,7 @@ private function settingsPost(): void
}
}

UsersSettingsModel::updateSetting('listEnforcedToggle', $listEnforcedToggle);
UsersSettingsModel::getInstance()->updateSetting('listEnforcedToggle', $listEnforcedToggle);

Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'),
LangManager::translate('core.toaster.config.success'));
Expand Down
38 changes: 38 additions & 0 deletions App/Package/Users/Entities/Settings/BulkSettingsEntity.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace CMW\Entity\Users\Settings;

use CMW\Manager\Package\AbstractEntity;

/**
* Class: @BulkSettingsEntity
* @package Users
* @link https://craftmywebsite.fr/docs/fr/technical/creer-un-package/entities
*/
class BulkSettingsEntity extends AbstractEntity
{
private string $name;
private string $value;

public function __construct(string $name, string $value)
{
$this->name = $name;
$this->value = $value;
}

/**
* @return string
*/
public function getName(): string
{
return $this->name;
}

/**
* @return string
*/
public function getValue(): string
{
return $this->value;
}
}
6 changes: 3 additions & 3 deletions App/Package/Users/Entities/UserSettingsEntity.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ class UserSettingsEntity extends AbstractEntity

public function __construct()
{
$this->defaultImage = UsersSettingsModel::getSetting('defaultImage');
$this->profilePageStatus = (int)UsersSettingsModel::getSetting('profilePage');
$this->resetPasswordMethod = (int)UsersSettingsModel::getSetting('resetPasswordMethod');
$this->defaultImage = UsersSettingsModel::getInstance()->getSetting('defaultImage');
$this->profilePageStatus = (int)UsersSettingsModel::getInstance()->getSetting('profilePage');
$this->resetPasswordMethod = (int)UsersSettingsModel::getInstance()->getSetting('resetPasswordMethod');
}

public static function getInstance(): self
Expand Down
2 changes: 1 addition & 1 deletion App/Package/Users/Models/UserPictureModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public function userHasImage(int $userId): bool

public function userHasDefaultImage(int $userId): bool
{
return is_file(EnvManager::getInstance()->getValue('DIR') . 'Public/Uploads/Users/Default/' . UsersSettingsModel::getSetting('defaultImage')) && !$this->userHasImage($userId);
return is_file(EnvManager::getInstance()->getValue('DIR') . 'Public/Uploads/Users/Default/' . UsersSettingsModel::getInstance()->getSetting('defaultImage')) && !$this->userHasImage($userId);
}

/**
Expand Down
78 changes: 66 additions & 12 deletions App/Package/Users/Models/UsersSettingsModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
namespace CMW\Model\Users;

use CMW\Entity\Users\BlacklistedPseudoEntity;
use CMW\Entity\Users\Settings\BulkSettingsEntity;
use CMW\Entity\Users\UserEnforced2FaEntity;
use CMW\Manager\Database\DatabaseManager;
use CMW\Manager\Flash\Alert;
use CMW\Manager\Flash\Flash;
use CMW\Manager\Package\AbstractModel;
use Exception;
use RuntimeException;

/**
* Class: @UsersSettingsModel
Expand All @@ -17,11 +20,11 @@
*/
class UsersSettingsModel extends AbstractModel
{
public static function getSetting(string $settingName): string
public function getSetting(string $settingName): string
{
$db = DatabaseManager::getInstance();
$req = $db->prepare('SELECT users_settings_value FROM cmw_users_settings WHERE users_settings_name = ?');
$req->execute(array($settingName));
$req->execute([$settingName]);
$option = $req->fetch();

return $option['users_settings_value'];
Expand All @@ -39,26 +42,77 @@ public function getSettings(): array
return ($req->execute()) ? $req->fetchAll() : [];
}

public static function updateSetting(string $settingName, string $settingValue): void
public function updateSetting(string $settingName, string $settingValue): void
{
$db = DatabaseManager::getInstance();
$req = $db->prepare('UPDATE cmw_users_settings SET users_settings_value=:settingValue, users_settings_updated=now() WHERE users_settings_name=:settingName');
$req->execute(array('settingName' => $settingName, 'settingValue' => $settingValue));
$req->execute(['settingName' => $settingName, 'settingValue' => $settingValue]);
}

public static function addSetting(string $settingName, string $settingValue): void
/**
* @param BulkSettingsEntity ...$bulkSettings
* @return bool
*/
public function bulkUpdateSettings(BulkSettingsEntity ...$bulkSettings): bool
{
$db = DatabaseManager::getInstance();

$db->beginTransaction();

try {
$stmt = $db->prepare('UPDATE cmw_users_settings SET users_settings_value = :value WHERE users_settings_name = :name');

foreach ($bulkSettings as $bulkSetting) {
$data = ['name' => $bulkSetting->getName(), 'value' => $bulkSetting->getValue()];

if (!$stmt->execute($data)) {
throw new RuntimeException('Failed to execute statement');
}
}

$db->commit();
return true;
} catch (Exception $e) {
$db->rollBack();
return false;
}
}

public function addSetting(string $settingName, string $settingValue): void
{
$db = DatabaseManager::getInstance();
$req = $db->prepare('INSERT INTO cmw_users_settings (users_settings_value, users_settings_updated, users_settings_name)
VALUES (:settingValue, now(), :settingName)');
$req->execute(array('settingName' => $settingName, 'settingValue' => $settingValue));
$req->execute(['settingName' => $settingName, 'settingValue' => $settingValue]);
}

public function bulkAddSettings(BulkSettingsEntity ...$bulkSettings): bool
{
$db = DatabaseManager::getInstance();

$sql = "INSERT INTO cmw_users_settings (users_settings_name, users_settings_value) VALUES ";

$values = [];
$data = [];
foreach ($bulkSettings as $bulkSetting) {
$values[] = "(:name{$bulkSetting->getName()}, :value{$bulkSetting->getValue()})";

$data[] = [
'name' . $bulkSetting->getName() => $bulkSetting->getName(),
'value' . $bulkSetting->getValue() => $bulkSetting->getValue(),
];
}

$sql .= implode(', ', $values);

return $db->prepare($sql)->execute($data);
}

public static function deleteSetting(string $settingName): void
public function deleteSetting(string $settingName): void
{
$db = DatabaseManager::getInstance();
$req = $db->prepare('DELETE FROM cmw_users_settings where users_settings_name = :settingName');
$req->execute(array('settingName' => $settingName));
$req->execute(['settingName' => $settingName]);
}

/**
Expand Down Expand Up @@ -97,7 +151,7 @@ public function removeBlacklistedPseudo(int $id): bool
}

/**
* @return \CMW\Entity\Users\BlacklistedPseudoEntity[]
* @return BlacklistedPseudoEntity[]
*/
public function getBlacklistedPseudos(): array
{
Expand Down Expand Up @@ -126,7 +180,7 @@ public function getBlacklistedPseudos(): array

/**
* @param int $id
* @return \CMW\Entity\Users\BlacklistedPseudoEntity|null
* @return BlacklistedPseudoEntity|null
*/
public function getBlacklistedPseudo(int $id): ?BlacklistedPseudoEntity
{
Expand Down Expand Up @@ -176,7 +230,7 @@ public function isPseudoBlacklisted(string $pseudo): bool
}

/**
* @return \CMW\Entity\Users\UserEnforced2FaEntity[]
* @return UserEnforced2FaEntity[]
*/
public function getEnforcedRoles(): array
{
Expand All @@ -203,7 +257,7 @@ public function getEnforcedRoles(): array
public function updateEnforcedRoles($roleId): bool
{
foreach (RolesModel::getInstance()->getRoles() as $role) {
if ($role->getId() == $roleId) {
if ($role->getId() === $roleId) {
if ($this->addEnforcedRoles($roleId)) {
foreach (UsersModel::getInstance()->getUsers() as $user) {
foreach ($user->getRoles() as $userRole) {
Expand Down
8 changes: 4 additions & 4 deletions App/Package/Users/Views/settings.admin.view.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,10 @@
<div>
<label for="security_reinforced"><?= LangManager::translate('users.long_date.setting.label') ?></label>
<select class="form-select" id="security_reinforced" name="security_reinforced" required>
<option value="0" <?= UsersSettingsModel::getSetting('securityReinforced') === '0' ? 'selected' : '' ?>>
<option value="0" <?= UsersSettingsModel::getInstance()->getSetting('securityReinforced') === '0' ? 'selected' : '' ?>>
<?= LangManager::translate('users.long_date.setting.no') ?>
</option>
<option value="1" <?= UsersSettingsModel::getSetting('securityReinforced') === '1' ? 'selected' : '' ?>>
<option value="1" <?= UsersSettingsModel::getInstance()->getSetting('securityReinforced') === '1' ? 'selected' : '' ?>>
<?= LangManager::translate('users.long_date.setting.yes') ?>
</option>
</select>
Expand All @@ -81,8 +81,8 @@
<label>Double facteur obligatoire</label>
<fieldset class="form-group">
<select class="form-select" id="listEnforcedToggle" name="listEnforcedToggle" required>
<option value="0" <?php if (!UsersSettingsModel::getSetting('listEnforcedToggle')) { echo 'selected'; } ?>>Pas d'obligation</option>
<option value="1" <?php if (UsersSettingsModel::getSetting('listEnforcedToggle')) { echo 'selected'; } ?>>Ayant le rôle :</option>
<option value="0" <?php if (!UsersSettingsModel::getInstance()->getSetting('listEnforcedToggle')) { echo 'selected'; } ?>>Pas d'obligation</option>
<option value="1" <?php if (UsersSettingsModel::getInstance()->getSetting('listEnforcedToggle')) { echo 'selected'; } ?>>Ayant le rôle :</option>
</select>
</fieldset>
<div class="mt-2" id="listEnforcedRoles">
Expand Down
Loading