From 52c662a14dfdf4cbc3cb3cae6ec5e1b030ea79f7 Mon Sep 17 00:00:00 2001
From: "florian.azizian" <florian.azizian@maarch.org>
Date: Thu, 14 Nov 2019 16:34:23 +0100
Subject: [PATCH] FEAT #12162 TIME 1:45 send email after account creation

---
 core/class/class_security.php                 |  5 +++++
 rest/index.php                                |  2 +-
 src/app/user/controllers/UserController.php   | 21 ++++++++++++++++++-
 .../controllers/AuthenticationController.php  | 14 ++++++++++---
 src/core/lang/lang-en.php                     |  4 ++++
 src/core/lang/lang-fr.php                     |  6 +++++-
 src/core/lang/lang-nl.php                     |  8 +++++++
 7 files changed, 54 insertions(+), 6 deletions(-)

diff --git a/core/class/class_security.php b/core/class/class_security.php
index 2fdcbbf8f8c..6e998737e78 100755
--- a/core/class/class_security.php
+++ b/core/class/class_security.php
@@ -131,6 +131,11 @@ class security extends Database
 
         if (isset($user)) {
             if ($user->__get('status') != 'SPD') {
+                \User\models\UserModel::update([
+                    'set'   => ['reset_token' => null],
+                    'where' => ['user_id = ?'],
+                    'data'  => [$s_login]
+                ]);
                 $ugc = new usergroups_controler();
                 $sec_controler = new SecurityControler();
                 $serv_controler = new ServiceControler();
diff --git a/rest/index.php b/rest/index.php
index 8a29f8f62b9..23ece3109ec 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -30,7 +30,7 @@ $app = new \Slim\App(['settings' => ['displayErrorDetails' => true, 'determineRo
 
 //Authentication
 $app->add(function (\Slim\Http\Request $request, \Slim\Http\Response $response, callable $next) {
-    $routesWithoutAuthentication = ['GET/jnlp/{jnlpUniqueId}'];
+    $routesWithoutAuthentication = ['GET/jnlp/{jnlpUniqueId}', 'POST/password', 'PUT/password'];
     $route = $request->getAttribute('route');
     $currentMethod = empty($route) ? '' : $route->getMethods()[0];
     $currentRoute = empty($route) ? '' : $route->getPattern();
diff --git a/src/app/user/controllers/UserController.php b/src/app/user/controllers/UserController.php
index 60e1e874b06..50b104d5372 100755
--- a/src/app/user/controllers/UserController.php
+++ b/src/app/user/controllers/UserController.php
@@ -203,6 +203,25 @@ class UserController
             }
         }
 
+        $loggingMethod = \SrcCore\models\CoreConfigModel::getLoggingMethod();
+        if (!in_array($loggingMethod['id'], ['sso', 'cas', 'ldap', 'ozwillo', 'shibboleth'])) {
+            $resetToken = AuthenticationController::getResetJWT(['id' => $newUser['id'], 'expirationTime' => 1209600]); // 14 days
+            UserModel::update(['set' => ['reset_token' => $resetToken], 'where' => ['id = ?'], 'data' => [$newUser['id']]]);
+
+            $url = UrlController::getCoreUrl() . '#/update-password?token=' . $resetToken . '&creation=true';
+            EmailController::createEmail([
+                'userId'    => $newUser['id'],
+                'data'      => [
+                    'sender'        => ['email' => 'Notification'],
+                    'recipients'    => [$newUser['mail']],
+                    'subject'       => _NOTIFICATIONS_USER_CREATION_SUBJECT,
+                    'body'          => _NOTIFICATIONS_USER_CREATION_BODY . $url . _NOTIFICATIONS_USER_CREATION_FOOTER,
+                    'isHtml'        => true,
+                    'status'        => 'WAITING'
+                ]
+            ]);
+        }
+
         HistoryController::add([
             'tableName'    => 'users',
             'recordId'     => $GLOBALS['userId'],
@@ -1541,7 +1560,7 @@ class UserController
 
         $GLOBALS['id'] = $user['id'];
 
-        $resetToken = AuthenticationController::getResetJWT();
+        $resetToken = AuthenticationController::getResetJWT(['id' => $user['id'], 'expirationTime' => 3600]); // 1 hour
         UserModel::update(['set' => ['reset_token' => $resetToken], 'where' => ['id = ?'], 'data' => [$user['id']]]);
 
         $url = UrlController::getCoreUrl() . '#/update-password?token=' . $resetToken;
diff --git a/src/core/controllers/AuthenticationController.php b/src/core/controllers/AuthenticationController.php
index e5d82328528..80d4c9ddf20 100755
--- a/src/core/controllers/AuthenticationController.php
+++ b/src/core/controllers/AuthenticationController.php
@@ -46,6 +46,14 @@ class AuthenticationController
             }
         }
 
+        if (!empty($userId)) {
+            UserModel::update([
+                'set'   => ['reset_token' => null],
+                'where' => ['user_id = ?'],
+                'data'  => [$userId]
+            ]);
+        }
+
         return $userId;
     }
 
@@ -120,12 +128,12 @@ class AuthenticationController
         return _BAD_LOGIN_OR_PSW;
     }
 
-    public static function getResetJWT()
+    public static function getResetJWT($args = [])
     {
         $token = [
-            'exp'   => time() + 3600,
+            'exp'   => time() + $args['expirationTime'],
             'user'  => [
-                'id' => $GLOBALS['id']
+                'id' => $args['id']
             ]
         ];
 
diff --git a/src/core/lang/lang-en.php b/src/core/lang/lang-en.php
index 4f08be851a6..06ebd8309a3 100755
--- a/src/core/lang/lang-en.php
+++ b/src/core/lang/lang-en.php
@@ -414,3 +414,7 @@ define("_NOTIFICATIONS_FORGOT_PASSWORD_BODY", "Hello,<br/>You requested to reset
 define("_NOTIFICATIONS_FORGOT_PASSWORD_FOOTER", "<br/><br/>If you did not perform this request, you can safely ignore this email.<br/>Please contact your administrator if you have any questions.");
 define("_PASSWORD_REINIT_SENT", "Password reset sent");
 define("_PASSWORD_REINIT", "Password rest");
+
+define("_NOTIFICATIONS_USER_CREATION_SUBJECT", "[Maarch Courrier] Account creation");
+define("_NOTIFICATIONS_USER_CREATION_BODY", "Hello,<br/>an administrator created your account in Maarch Courrier software.<br/>To log in and set your password, please click on the link below :<br/>");
+define("_NOTIFICATIONS_USER_CREATION_FOOTER", "<br/>Pour toutes questions, merci de contacter l'administrateur technique de la solution.");
diff --git a/src/core/lang/lang-fr.php b/src/core/lang/lang-fr.php
index b834bfa76b3..8377b9f7e43 100755
--- a/src/core/lang/lang-fr.php
+++ b/src/core/lang/lang-fr.php
@@ -409,7 +409,11 @@ define("_INDEXINGMODEL_SUPPRESSION", "Modèle d'enregistrement supprimé");
 define("_PRIORITY_DELAY_ALREADY_SET", "Ce délai de traitement est déjà défini pour une autre priorité");
 
 define("_NOTIFICATIONS_FORGOT_PASSWORD_SUBJECT", "[Maarch Courrier] Demande de réinitialisation de mot de passe");
-define("_NOTIFICATIONS_FORGOT_PASSWORD_BODY", "Bonjour,<br/>Vous avez demandé à retrouver le mot de passe d'accès à votre compte Maarch Courrier.<br/>Pour modifier votre mot de passe, merci de bien vouloir cliquer sur le lien ci-dessous :<br/>");
+define("_NOTIFICATIONS_FORGOT_PASSWORD_BODY", "Bonjour,<br/>Vous avez demandé à retrouver le mot de passe d'accès à votre compte Maarch Courrier.<br/>Pour modifier votre mot de passe, merci de bien vouloir cliquer sur le lien ci-dessous :<br/><br/>");
 define("_NOTIFICATIONS_FORGOT_PASSWORD_FOOTER", "<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.");
 define("_PASSWORD_REINIT_SENT", "Réinitialisation du mot de passe envoyé");
 define("_PASSWORD_REINIT", "Mot de passe réinitialisé");
+
+define("_NOTIFICATIONS_USER_CREATION_SUBJECT", "[Maarch Courrier] Création de votre compte");
+define("_NOTIFICATIONS_USER_CREATION_BODY", "Bonjour,<br/>Un administrateur a créé votre compte dans l'application Maarch Courrier.<br/>Pour vous connecter et définir votre mot de passe, merci de bien vouloir cliquer sur le lien ci-dessous :<br/><br/>");
+define("_NOTIFICATIONS_USER_CREATION_FOOTER", "<br/><br/>Ce message est envoyé automatiquement. Merci de ne pas y répondre.<br/>Pour toutes questions, merci de contacter l'administrateur technique de la solution.");
diff --git a/src/core/lang/lang-nl.php b/src/core/lang/lang-nl.php
index ed4e724c4ef..747efabf63d 100755
--- a/src/core/lang/lang-nl.php
+++ b/src/core/lang/lang-nl.php
@@ -419,3 +419,11 @@ define("_NOTIFICATIONS_FORGOT_PASSWORD_BODY", "Hello,<br/>You requested to reset
 define("_NOTIFICATIONS_FORGOT_PASSWORD_FOOTER", "<br/><br/>If you did not perform this request, you can safely ignore this email.<br/>Please contact your administrator if you have any questions._TO_TRANSLATE");
 define("_PASSWORD_REINIT_SENT", "Password reset sent_TO_TRANSLATE");
 define("_PASSWORD_REINIT", "Password rest_TO_TRANSLATE");
+
+define("_NOTIFICATIONS_USER_CREATION_SUBJECT", "[Maarch Courrier] Création de compte_TO_TRANSLATE");
+define("_NOTIFICATIONS_USER_CREATION_BODY", "Bonjour,<br/>un administrateur a créé votre compte dans l'application Maarch Courrier.<br/>Pour vous connecter et définir votre mot de passe, cliquer sur le lien ci-dessous :<br/>_TO_TRANSLATE");
+define("_NOTIFICATIONS_USER_CREATION_FOOTER", "<br/>Pour toutes questions, merci de contacter l'administrateur technique de la solution._TO_TRANSLATE");
+
+define("_NOTIFICATIONS_USER_CREATION_SUBJECT", "[Maarch Courrier] Account creation_TO_TRANSLATE");
+define("_NOTIFICATIONS_USER_CREATION_BODY", "Hello,<br/>an administrator created your account in Maarch Courrier software.<br/>To log in and set your password, please click on the link below :<br/>_TO_TRANSLATE");
+define("_NOTIFICATIONS_USER_CREATION_FOOTER", "<br/>Pour toutes questions, merci de contacter l'administrateur technique de la solution._TO_TRANSLATE");
-- 
GitLab