Skip to content
Snippets Groups Projects
Commit fe5f50c7 authored by Florian Azizian's avatar Florian Azizian
Browse files

FEAT #16626 TIME 1 Send email at user creation

parent dc55a799
No related branches found
No related tags found
No related merge requests found
...@@ -79,6 +79,10 @@ ...@@ -79,6 +79,10 @@
"notificationForgotPasswordBody" : "Bonjour,<br/>Vous avez demandé à réinitialiser le mot de passe de votre compte Maarch Parapheur.<br/>Pour modifier votre mot de passe, merci de bien vouloir cliquer sur le lien ci-dessous :<br/>", "notificationForgotPasswordBody" : "Bonjour,<br/>Vous avez demandé à réinitialiser le mot de passe de votre compte Maarch Parapheur.<br/>Pour modifier votre mot de passe, merci de bien vouloir cliquer sur le lien ci-dessous :<br/>",
"notificationForgotPasswordFooter" : "<br/><br/>Si vous n'êtes pas à l'origine de cette demande, merci d'ignorer ce courriel.<br/>Pour toutes questions, merci de contacter l'administrateur technique de la solution.", "notificationForgotPasswordFooter" : "<br/><br/>Si vous n'êtes pas à l'origine de cette demande, merci d'ignorer ce courriel.<br/>Pour toutes questions, merci de contacter l'administrateur technique de la solution.",
"notificationForgotPasswordSubject" : "[Maarch Parapheur] Demande de réinitialisation de mot de passe", "notificationForgotPasswordSubject" : "[Maarch Parapheur] Demande de réinitialisation de mot de passe",
"notificationNewAccountSubject" : "[Maarch Parapheur] Activer votre compte utilisateur",
"notificationNewAccountBody" : "Bienvenue,<br/><br/>Vous disposez maintenant d'un compte dans l'application Maarch Parapheur.<br/><br/>Pour vous connecter et définir votre mot de passe, merci de bien vouloir cliquer sur le lien ci-dessous :<br/><br/>",
"notificationNewAccountId" : "<br/><br/><b>Votre identifiant :</b>",
"notificationNewAccountFooter" : "<br/><br/>Ce message est envoyé automatiquement à la suite d'une action de l'administrateur.<br/>Merci de ne pas y répondre.<br/><br/>Pour toutes questions, merci de contacter l'administrateur technique de la solution.",
"notifications" : "Notifications", "notifications" : "Notifications",
"numberRequired" : "1 chiffre requis", "numberRequired" : "1 chiffre requis",
"onRange" : "le", "onRange" : "le",
......
...@@ -163,6 +163,10 @@ class UserController ...@@ -163,6 +163,10 @@ class UserController
'message' => "{userAdded} : {$body['firstname']} {$body['lastname']}" 'message' => "{userAdded} : {$body['firstname']} {$body['lastname']}"
]); ]);
if (empty($body['isRest'])) {
AuthenticationController::sendAccountActivationNotification(['userId' => $id, 'userEmail' => $body['email']]);
}
return $response->withJson(['id' => $id]); return $response->withJson(['id' => $id]);
} }
...@@ -581,7 +585,7 @@ class UserController ...@@ -581,7 +585,7 @@ class UserController
$GLOBALS['id'] = $user['id']; $GLOBALS['id'] = $user['id'];
$resetToken = AuthenticationController::getResetJWT(); $resetToken = AuthenticationController::getResetJWT(['id' => $GLOBALS['id'], 'expirationTime' => 3600]);
UserModel::update(['set' => ['reset_token' => $resetToken], 'where' => ['id = ?'], 'data' => [$user['id']]]); UserModel::update(['set' => ['reset_token' => $resetToken], 'where' => ['id = ?'], 'data' => [$user['id']]]);
$user['preferences'] = json_decode($user['preferences'], true); $user['preferences'] = json_decode($user['preferences'], true);
......
...@@ -82,6 +82,9 @@ class UserModel ...@@ -82,6 +82,9 @@ class UserModel
ValidatorModel::notEmpty($args, ['login', 'email', 'firstname', 'lastname', 'picture']); ValidatorModel::notEmpty($args, ['login', 'email', 'firstname', 'lastname', 'picture']);
ValidatorModel::stringType($args, ['login', 'email', 'firstname', 'lastname', 'picture', 'mode', 'signatureModes']); ValidatorModel::stringType($args, ['login', 'email', 'firstname', 'lastname', 'picture', 'mode', 'signatureModes']);
if (empty($args['password'])) {
$args['password'] = AuthenticationModel::generatePassword();
}
$nextSequenceId = DatabaseModel::getNextSequenceValue(['sequenceId' => 'users_id_seq']); $nextSequenceId = DatabaseModel::getNextSequenceValue(['sequenceId' => 'users_id_seq']);
DatabaseModel::insert([ DatabaseModel::insert([
...@@ -90,7 +93,7 @@ class UserModel ...@@ -90,7 +93,7 @@ class UserModel
'id' => $nextSequenceId, 'id' => $nextSequenceId,
'login' => $args['login'], 'login' => $args['login'],
'email' => $args['email'], 'email' => $args['email'],
'password' => AuthenticationModel::getPasswordHash('maarch'), 'password' => $args['password'],
'firstname' => $args['firstname'], 'firstname' => $args['firstname'],
'lastname' => $args['lastname'], 'lastname' => $args['lastname'],
'"isRest"' => empty($args['isRest']) ? 'false' : 'true', '"isRest"' => empty($args['isRest']) ? 'false' : 'true',
......
...@@ -15,11 +15,14 @@ ...@@ -15,11 +15,14 @@
namespace SrcCore\controllers; namespace SrcCore\controllers;
use Configuration\models\ConfigurationModel; use Configuration\models\ConfigurationModel;
use Email\controllers\EmailController;
use Firebase\JWT\JWT; use Firebase\JWT\JWT;
use History\controllers\HistoryController; use History\controllers\HistoryController;
use Respect\Validation\Validator; use Respect\Validation\Validator;
use Slim\Http\Request; use Slim\Http\Request;
use Slim\Http\Response; use Slim\Http\Response;
use SrcCore\controllers\LanguageController;
use SrcCore\controllers\UrlController;
use SrcCore\models\AuthenticationModel; use SrcCore\models\AuthenticationModel;
use SrcCore\models\CoreConfigModel; use SrcCore\models\CoreConfigModel;
use SrcCore\models\PasswordModel; use SrcCore\models\PasswordModel;
...@@ -299,12 +302,12 @@ class AuthenticationController ...@@ -299,12 +302,12 @@ class AuthenticationController
return $jwt; return $jwt;
} }
public static function getResetJWT() public static function getResetJWT($args = [])
{ {
$token = [ $token = [
'exp' => time() + 3600, 'exp' => time() + $args['expirationTime'],
'user' => [ 'user' => [
'id' => $GLOBALS['id'] 'id' => $args['id']
], ],
'connection' => ConfigurationModel::getConnection() 'connection' => ConfigurationModel::getConnection()
]; ];
...@@ -314,6 +317,29 @@ class AuthenticationController ...@@ -314,6 +317,29 @@ class AuthenticationController
return $jwt; return $jwt;
} }
public static function sendAccountActivationNotification(array $args)
{
$resetToken = AuthenticationController::getResetJWT(['id' => $args['userId'], 'expirationTime' => 1209600]); // 14 days
UserModel::update(['set' => ['reset_token' => $resetToken], 'where' => ['id = ?'], 'data' => [$args['userId']]]);
$user = UserModel::getById(['select' => ['login'], 'id' => $args['userId']]);
$lang = LanguageController::get(['lang' => 'fr']);
$url = UrlController::getCoreUrl() . 'dist/update-password?token=' . $resetToken;
EmailController::createEmail([
'userId' => $args['userId'],
'data' => [
'sender' => 'Notification',
'recipients' => [$args['userEmail']],
'subject' => $lang['notificationNewAccountSubject'],
'body' => $lang['notificationNewAccountBody'] . $url . $lang['notificationNewAccountId'] . ' ' . $user['login'] . $lang['notificationNewAccountFooter'],
'isHtml' => true
]
]);
return true;
}
public static function isRouteAvailable(array $args) public static function isRouteAvailable(array $args)
{ {
ValidatorModel::notEmpty($args, ['userId', 'currentRoute']); ValidatorModel::notEmpty($args, ['userId', 'currentRoute']);
......
...@@ -68,4 +68,17 @@ class AuthenticationModel ...@@ -68,4 +68,17 @@ class AuthenticationModel
return $password; return $password;
} }
public static function generatePassword()
{
$length = rand(50, 70);
$chars = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghijklmnopqrstuvwxyz!@$%^*_=+,.?';
$count = mb_strlen($chars);
for ($i = 0, $password = ''; $i < $length; $i++) {
$index = rand(0, $count - 1);
$password .= mb_substr($chars, $index, 1);
}
return $password;
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment