Suscribe WIP

This commit is contained in:
Fred Tempez 2023-11-17 17:53:55 +01:00
parent c21baf80ef
commit a4d4f9cce4
3 changed files with 139 additions and 169 deletions

View File

@ -21,11 +21,15 @@ class suscribe extends common
const UPDATE = '0.0'; const UPDATE = '0.0';
const DATADIRECTORY = ''; // Contenu localisé inclus par défaut (page.json et module.json) const DATADIRECTORY = ''; // Contenu localisé inclus par défaut (page.json et module.json)
const STATUS_AWAITING = 0; // En attente de validation du mail par le client const STATUS_EMAIL_AWAITING = 0;
const STATUS_VALIDATED = 1; // Mail validé const STATUS_EMAIL_VALID = 1;
const STATUS_ACCOUNT_AWAITING = 2;
const STATUS_ACCOUNT_VALID = 3;
public static $statusGroups = [ public static $statusGroups = [
self::STATUS_AWAITING => 'Email en attente de validation', self::STATUS_EMAIL_AWAITING => 'Email non confirmé',
self::STATUS_VALIDATED => 'Email validé', self::STATUS_EMAIL_VALID => 'Email confimé',
self::STATUS_ACCOUNT_AWAITING => 'Email validé, en attente de validation',
self::STATUS_ACCOUNT_VALID => 'Email validé, compte validation',
]; ];
public static $actions = [ public static $actions = [
@ -54,18 +58,14 @@ class suscribe extends common
*/ */
public function user() public function user()
{ {
$userIdsFirstnames = helper::arraycollumn($this->getData(['user']), 'firstname'); $userIdsFirstnames = helper::arraycollumn($this->getData(['module', $this->getUrl(0), 'user']), 'firstname');
ksort($userIdsFirstnames); ksort($userIdsFirstnames);
foreach ($userIdsFirstnames as $userId => $userFirstname) { foreach ($userIdsFirstnames as $userId => $userFirstname) {
if (
$this->getData(['user', $userId, 'group']) === self::STATUS_AWAITING ||
$this->getData(['user', $userId, 'group']) === self::STATUS_VALIDATED
) {
self::$users[] = [ self::$users[] = [
$userId, $userId,
$userFirstname . ' ' . $this->getData(['user', $userId, 'lastname']), $userFirstname . ' ' . $this->getData(['module', $this->getUrl(0), 'user', $userId, 'lastname']),
self::$statusGroups[$this->getData(['user', $userId, 'group'])], self::$statusGroups[$this->getData(['module', $this->getUrl(0), 'user', $userId, 'status'])],
helper::dateUTF8(date('Y-m-d G:i'), $this->getData(['user', $userId, 'timer'])), helper::dateUTF8(date('Y-m-d G:i'), $this->getData(['module', $this->getUrl(0), 'user', $userId, 'timer'])),
template::button('registrationUserEdit' . $userId, [ template::button('registrationUserEdit' . $userId, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $userId, 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $userId,
'value' => template::ico('pencil') 'value' => template::ico('pencil')
@ -77,10 +77,9 @@ class suscribe extends common
]) ])
]; ];
} }
}
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Demandes d\'inscription', 'title' => 'Demandes d\'inscriptions',
'view' => 'user' 'view' => 'user'
]); ]);
} }
@ -102,12 +101,12 @@ class suscribe extends common
// Accès refusé // Accès refusé
if ( if (
// L'utilisateur n'existe pas // L'utilisateur n'existe pas
$this->getData(['user', $this->getUrl(2)]) === null $this->getData(['module', $this->getUrl(0), 'user']) === null
// Droit d'édition // Droit d'édition
and ( and (
// Impossible de s'auto-éditer // Impossible de s'auto-éditer
( (
$this->getUser('id') === $this->getUrl(2) $this->getUser('id') === 'user'
and $this->getUrl('group') <= self::GROUP_VISITOR and $this->getUrl('group') <= self::GROUP_VISITOR
) )
// Impossible d'éditer un autre utilisateur // Impossible d'éditer un autre utilisateur
@ -128,26 +127,27 @@ class suscribe extends common
) { ) {
// Modification du groupe // Modification du groupe
$this->setData([ $this->setData([
'module',
$this->getUrl(0),
'user', 'user',
$this->getUrl(2),
[ [
'firstname' => $this->getData(['user', $this->getUrl(2), 'firstname']), 'firstname' => $this->getData(['module', $this->getUrl(0), 'user', 'firstname']),
'forgot' => 0, 'forgot' => 0,
'group' => $this->getInput('registrationUserEditGroup', helper::FILTER_INT), 'group' => $this->getInput('registrationUserEditGroup', helper::FILTER_INT),
'lastname' => $this->getData(['user', $this->getUrl(2), 'lastname']), 'lastname' => $this->getData(['module', $this->getUrl(0), 'user', 'lastname']),
'mail' => $this->getData(['user', $this->getUrl(2), 'mail']), 'mail' => $this->getData(['module', $this->getUrl(0), 'user', 'mail']),
'password' => $this->getData(['user', $this->getUrl(2), 'password']), 'password' => $this->getData(['module', $this->getUrl(0), 'user', 'password']),
'connectFail' => $this->getData(['user', $this->getUrl(2), 'connectFail']), 'connectFail' => $this->getData(['module', $this->getUrl(0), 'user', 'connectFail']),
'connectTimeout' => $this->getData(['user', $this->getUrl(2), 'connectTimeout']), 'connectTimeout' => $this->getData(['module', $this->getUrl(0), 'user', 'connectTimeout']),
'accessUrl' => $this->getData(['user', $this->getUrl(2), 'accessUrl']), 'accessUrl' => $this->getData(['module', $this->getUrl(0), 'user', 'accessUrl']),
'accessTimer' => $this->getData(['user', $this->getUrl(2), 'accessTimer']), 'accessTimer' => $this->getData(['module', $this->getUrl(0), 'user', 'accessTimer']),
'accessCsrf' => $this->getData(['user', $this->getUrl(2), 'accessCsrf']) 'accessCsrf' => $this->getData(['module', $this->getUrl(0), 'user', 'accessCsrf'])
] ]
]); ]);
// Notifier le user uniquement si le groupe est membre au moins membre // Notifier le user uniquement si le groupe est membre au moins membre
if ($this->getInput('registrationUserEditGroup') >= 1) { if ($this->getInput('registrationUserEditGroup') >= 1) {
$this->sendMail( $this->sendMail(
$this->getData(['user', $this->getUrl(2), 'mail']), $this->getData(['module', $this->getUrl(0), 'user', 'mail']),
'Approbation de l\'inscription', 'Approbation de l\'inscription',
'<p>' . $this->getdata(['module', $this->getUrl(0), 'config', 'mailValidateContent']) . '</p>', '<p>' . $this->getdata(['module', $this->getUrl(0), 'config', 'mailValidateContent']) . '</p>',
null, null,
@ -163,7 +163,7 @@ class suscribe extends common
} }
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => $this->getData(['user', $this->getUrl(2), 'firstname']) . ' ' . $this->getData(['user', $this->getUrl(2), 'lastname']), 'title' => $this->getData(['module', $this->getUrl(0), 'user', 'firstname']) . ' ' . $this->getData(['user', $this->getUrl(0), 'lastname']),
'view' => 'edit' 'view' => 'edit'
]); ]);
} }
@ -178,35 +178,18 @@ class suscribe extends common
// Accès refusé // Accès refusé
if ( if (
// L'utilisateur n'existe pas // L'utilisateur n'existe pas
$this->getData(['user', $this->getUrl(2)]) === null $this->getData(['module', $this->getUrl(0), 'user', $this->getUrl(2)]) === null
// Groupe insuffisant // Groupe insuffisant
and ($this->getUrl('group') < self::GROUP_EDITOR) && $this->getUser('permission', __CLASS__, __FUNCTION__) !== true
) { ) {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'access' => false 'access' => false
]); ]);
} }
// Jeton incorrect
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
}
// Bloque la suppression de son propre compte
elseif ($this->getUser('id') === $this->getUrl(2)) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/user',
'notification' => 'Impossible de supprimer votre propre compte'
]);
}
// Suppression // Suppression
else { else {
$this->deleteData(['user', $this->getUrl(2)]); $this->deleteData(['module', $this->getUrl(0), 'user', $this->getUrl(2)]);
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/user', 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/user',
@ -222,6 +205,11 @@ class suscribe extends common
*/ */
public function index() public function index()
{ {
/**
* Traitement du formulaire
* Stocke les données du formulaire dans le module
* Envoie le mail de vérification de l'email
*/
// Soumission du formulaire // Soumission du formulaire
if ($this->isPost()) { if ($this->isPost()) {
// Drapeau de contrôle des données saisies. // Drapeau de contrôle des données saisies.
@ -260,7 +248,8 @@ class suscribe extends common
} }
// Si tout est ok // Si tout est ok
if ($check === true) { if ($check === true) {
// Enregistrement temporaire du compte // Enregistrement du compte dans les donénes du module
$auth = uniqid('', true);
$this->setData([ $this->setData([
'module', 'module',
$this->getUrl(0), $this->getUrl(0),
@ -273,26 +262,24 @@ class suscribe extends common
'password' => $this->getInput('registrationAddPassword', helper::FILTER_PASSWORD, true), 'password' => $this->getInput('registrationAddPassword', helper::FILTER_PASSWORD, true),
// pas de groupe afin de le différencier dans la liste des users // pas de groupe afin de le différencier dans la liste des users
'timer' => time(), 'timer' => time(),
'auth' => $_SESSION['csrf'], 'auth' => $auth,
'status' => self::STATUS_AWAITING 'status' => self::STATUS_EMAIL_AWAITING
] ]
]); ]);
// Mail d'avertissement aux administrateurs // Mail d'avertissement aux administrateurs
// Utilisateurs dans le groupe admin // Utilisateurs dans le groupe admin
$to = []; $to = [];
foreach ($this->getData(['user']) as $userId => $user) { foreach ($this->getData(['user']) as $key => $user) {
if ($user['group'] == self::GROUP_ADMIN) { if ($user['group'] == self::GROUP_ADMIN) {
$to[] = $user['mail']; $to[] = $user['mail'];
} }
} }
// Envoi du mail // Envoi du mail à l'administrateur
if ($to) { if ($to) {
$messageAdmin = $this->getdata(['module', $this->getUrl(0), 'config', 'state']) ? 'Une demande d\'inscription attend l`approbation d\'un administrateur.' : 'Un nouveau membre s\'est inscrit.';
// Envoi le mail
$this->sendMail( $this->sendMail(
$to, $to,
'Auto-inscription sur le site ' . $this->getData(['config', 'title']), 'Auto-inscription sur le site ' . $this->getData(['config', 'title']),
'<p>' . $messageAdmin . '</p>' . '<p>Un nouveau membre s\'est inscrit, son email est en attentde validation</p>' .
'<p><strong>Identifiant du compte :</strong> ' . $userId . ' (' . $userFirstname . ' ' . $userLastname . ')<br>' . '<p><strong>Identifiant du compte :</strong> ' . $userId . ' (' . $userFirstname . ' ' . $userLastname . ')<br>' .
'<strong>Email :</strong> ' . $userMail . '</p>' . '<strong>Email :</strong> ' . $userMail . '</p>' .
'<a href="' . helper::baseUrl() . 'user/login/' . strip_tags(str_replace('/', '_', $this->getUrl(0) . '/user')) . '">Validation de l\'inscription</a>', '<a href="' . helper::baseUrl() . 'user/login/' . strip_tags(str_replace('/', '_', $this->getUrl(0) . '/user')) . '">Validation de l\'inscription</a>',
@ -303,7 +290,7 @@ class suscribe extends common
// Mail de confirmation à l'utilisateur // Mail de confirmation à l'utilisateur
// forger le lien de vérification // forger le lien de vérification
$validateLink = helper::baseUrl(true) . $this->getUrl() . '/validate/' . $userId . '/' . $_SESSION['csrf']; $validateLink = helper::baseUrl(true) . $this->getUrl() . '/validate/' . $userId . '/' . $auth;
// Envoi // Envoi
$sentMailtoUser = false; $sentMailtoUser = false;
if ($check === true) { if ($check === true) {
@ -311,7 +298,9 @@ class suscribe extends common
$userMail, $userMail,
'Confirmation de votre inscription', 'Confirmation de votre inscription',
'<p>' . $this->getdata(['module', $this->getUrl(0), 'config', 'mailRegisterContent']) . '</p>' . '<p>' . $this->getdata(['module', $this->getUrl(0), 'config', 'mailRegisterContent']) . '</p>' .
'<a href="' . $validateLink . '">Activer votre compte<a/>', '<p><a href="' . $validateLink . '">Activer votre compte<a/>' . '</p>' .
'<p>ou copiez collez le lien suivant dans un navigateur : ' . $validateLink . '</p>'
,
null, null,
$this->getData(['config', 'smtp', 'from']) $this->getData(['config', 'smtp', 'from'])
); );
@ -342,19 +331,29 @@ class suscribe extends common
// Vérifie la session + l'id + le timer // Vérifie la session + l'id + le timer
$check = true; $check = true;
$notification = 'Bienvenue sur le site' . $this->getData(['config', 'title']); $notification = 'Bienvenue sur le site' . $this->getData(['config', 'title']);
$csrf = $this->getUrl(3);
$userId = $this->getUrl(2); $userId = $this->getUrl(2);
// Validité $auth = $this->getUrl(3);
// la validité du lien est dépassé
if (time() - $this->getData(['module', $this->getUrl(0), 'user', $userId, 'timer']) <= (60 * $this->getdata(['module', $this->getUrl(0), 'config', 'pageTimeOut']))) { if (time() - $this->getData(['module', $this->getUrl(0), 'user', $userId, 'timer']) <= (60 * $this->getdata(['module', $this->getUrl(0), 'config', 'pageTimeOut']))) {
$check = false; $check = false;
$notification = 'Le lien n\'est plus valide'; $notification = 'La validité est dépassée';
} }
if (($csrf !== $_SESSION['csrf'])) { // La clé est incorrecte ou le compet a déjà été validé
if (
$check &&
($auth !== $this->getData(['module', $this->getUrl(0), 'user', $userId, 'auth'])
|| $this->getData(['module', $this->getUrl(0), 'user', $userId, 'auth']) !== self::STATUS_ACCOUNT_VALID)
) {
$check = false; $check = false;
$notification = 'Identifiant ou mot de passe inconnu'; $notification = 'Identifiant ou mot de passe inconnu';
} }
if ($check) { if ($check) {
if (
// Pas d'approbation par un administrateur
$this->getData(['module', $this->getUrl(0), 'config', 'approval']) === false
) {
// Créer le compte
$this->setData([ $this->setData([
'user', 'user',
$userId, $userId,
@ -371,6 +370,14 @@ class suscribe extends common
'language' => self::$siteContent, 'language' => self::$siteContent,
] ]
]); ]);
// Modifier le statut dans le module
$this->setData(['module', $this->getUrl(0), 'user', $userId, 'auth', self::STATUS_ACCOUNT_VALID]);
$notification = 'Votre inscription est confirmée';
} else {
// Approbation nécessaire
$this->setData(['module', $this->getUrl(0), 'user', $userId, 'status', self::STATUS_ACCOUNT_AWAITING]);
$notification = 'L\'inscription doit être approuvée par un administrateur';
}
} }
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -399,7 +406,7 @@ class suscribe extends common
'timeOut' => $this->getInput('registrationConfigTimeOut', helper::FILTER_INT), 'timeOut' => $this->getInput('registrationConfigTimeOut', helper::FILTER_INT),
'pageSuccess' => $this->getInput('registrationConfigSuccess'), 'pageSuccess' => $this->getInput('registrationConfigSuccess'),
'pageError' => $this->getInput('registrationConfigError'), 'pageError' => $this->getInput('registrationConfigError'),
'state' => $this->getInput('registrationConfigState', helper::FILTER_BOOLEAN), 'approval' => $this->getInput('registrationConfigState', helper::FILTER_BOOLEAN),
'mailRegisterContent' => $this->getInput('registrationconfigMailRegisterContent', null, true), 'mailRegisterContent' => $this->getInput('registrationconfigMailRegisterContent', null, true),
'mailValidateContent' => $this->getInput('registrationconfigMailValidateContent', null, true), 'mailValidateContent' => $this->getInput('registrationconfigMailValidateContent', null, true),
] ]

View File

@ -29,7 +29,7 @@
<div class="col6"> <div class="col6">
<?php echo template::select('registrationConfigTimeOut', $module::$timeLimit , [ <?php echo template::select('registrationConfigTimeOut', $module::$timeLimit , [
'label' => 'Validité du lien', 'label' => 'Validité du lien',
'selected' => $this->getData(['module','registration',$this->getUrl(0),'config','timeOut']) 'selected' => $this->getData(['module',$this->getUrl(0),'config','timeOut'])
]); ?> ]); ?>
</div> </div>
</div> </div>
@ -37,13 +37,13 @@
<div class="col6"> <div class="col6">
<?php echo template::select('registrationConfigSuccess', helper::arraycollumn($this->getData(['page']), 'title', 'SORT_ASC'), [ <?php echo template::select('registrationConfigSuccess', helper::arraycollumn($this->getData(['page']), 'title', 'SORT_ASC'), [
'label' => 'Redirection après confirmation', 'label' => 'Redirection après confirmation',
'selected' => $this->getData(['module','registration',$this->getUrl(0),'config','pageSuccess']) 'selected' => $this->getData(['module',$this->getUrl(0),'config','pageSuccess'])
]); ?> ]); ?>
</div> </div>
<div class="col6"> <div class="col6">
<?php echo template::select('registrationConfigError', helper::arraycollumn($this->getData(['page']), 'title', 'SORT_ASC'), [ <?php echo template::select('registrationConfigError', helper::arraycollumn($this->getData(['page']), 'title', 'SORT_ASC'), [
'label' => 'Redirection après erreur', 'label' => 'Redirection après erreur',
'selected' => $this->getData(['module','registration',$this->getUrl(0),'config','pageError']) 'selected' => $this->getData(['module',$this->getUrl(0),'config','pageError'])
]); ?> ]); ?>
</div> </div>
</div> </div>
@ -52,7 +52,7 @@
<?php $messageDefault = '<p>Confirmez votre inscription en cliquant sur ce lien dans les ... minutes.</p>'; ?> <?php $messageDefault = '<p>Confirmez votre inscription en cliquant sur ce lien dans les ... minutes.</p>'; ?>
<?php echo template::textarea('registrationconfigMailRegisterContent', [ <?php echo template::textarea('registrationconfigMailRegisterContent', [
'label' => 'Corps du mail de confirmation', 'label' => 'Corps du mail de confirmation',
'value' => !empty($this->getData(['module','registration',$this->getUrl(0),'config','mailRegisterContent'])) ? $this->getData(['module','registration',$this->getUrl(0),'config','mailRegisterContent']) : $messageDefault, 'value' => !empty($this->getData(['module',$this->getUrl(0),'config','mailRegisterContent'])) ? $this->getData(['module',$this->getUrl(0),'config','mailRegisterContent']) : $messageDefault,
'class' => 'editorWysiwyg', 'class' => 'editorWysiwyg',
'help' => 'Précisez la durée de validité. Le lien sera inséré après ces explications.' 'help' => 'Précisez la durée de validité. Le lien sera inséré après ces explications.'
]); ?> ]); ?>
@ -61,7 +61,7 @@
<div class="row"> <div class="row">
<div class="col6 verticalAlignMiddle"> <div class="col6 verticalAlignMiddle">
<?php echo template::checkbox('registrationConfigState', true, 'Approbation préalable', [ <?php echo template::checkbox('registrationConfigState', true, 'Approbation préalable', [
'checked' => $this->getData(['module','registration',$this->getUrl(0),'config','state']), 'checked' => $this->getData(['module',$this->getUrl(0),'config','approval']),
'help' => 'Les comptes sont inactifs tant que les inscriptions ne sont pas approuvées par un administrateur.', 'help' => 'Les comptes sont inactifs tant que les inscriptions ne sont pas approuvées par un administrateur.',
'check' => true 'check' => true
]); ?> ]); ?>
@ -72,7 +72,7 @@
<?php $messageDefault = '<p>Votre inscription a été approuvée par un administrateur.</p>'; ?> <?php $messageDefault = '<p>Votre inscription a été approuvée par un administrateur.</p>'; ?>
<?php echo template::textarea('registrationconfigMailValidateContent', [ <?php echo template::textarea('registrationconfigMailValidateContent', [
'label' => 'Corps du mail d\'approbation', 'label' => 'Corps du mail d\'approbation',
'value' =>!empty($this->getData(['module','registration',$this->getUrl(0),'config','mailValidateContent'])) ? $this->getData(['module','registration',$this->getUrl(0),'config','mailValidateContent']) : $messageDefault, 'value' =>!empty($this->getData(['module',$this->getUrl(0),'config','mailValidateContent'])) ? $this->getData(['module',$this->getUrl(0),'config','mailValidateContent']) : $messageDefault,
'class' => 'editorWysiwyg' 'class' => 'editorWysiwyg'
]); ?> ]); ?>
</div> </div>

View File

@ -1,70 +1,33 @@
<?php echo template::formOpen('registrationAddForm'); ?> <?php echo template::formOpen('registrationAddForm'); ?>
<div class="row"> <div class='inputContainer'>
<div class="col8 offset2">
<div class='block'>
<h4>Identité</h4>
<div class="row">
<div class="col6">
<?php echo template::text('registrationAddFirstname', [ <?php echo template::text('registrationAddFirstname', [
'autocomplete' => 'off', 'autocomplete' => 'off',
'label' => 'Prénom' 'label' => 'Prénom'
]); ?> ]); ?>
</div>
<div class="col6">
<?php echo template::text('registrationAddLastname', [ <?php echo template::text('registrationAddLastname', [
'autocomplete' => 'off', 'autocomplete' => 'off',
'label' => 'Nom' 'label' => 'Nom'
]); ?> ]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::mail('registrationAddMail', [ <?php echo template::mail('registrationAddMail', [
'autocomplete' => 'off', 'autocomplete' => 'off',
'label' => 'Adresse électronique' 'label' => 'Adresse électronique'
]); ?> ]); ?>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::hidden('registrationAddGroup', [
'value' => self::GROUP_MEMBER
]); ?>
</div>
</div>
<div class='block'>
<h4>Données de connexion</h4>
<div class="row">
<div class="col12">
<?php echo template::text('registrationAddId', [ <?php echo template::text('registrationAddId', [
'autocomplete' => 'off', 'autocomplete' => 'off',
'label' => 'Identifiant de connexion' 'label' => 'Identifiant de connexion'
]); ?> ]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::password('registrationAddPassword', [ <?php echo template::password('registrationAddPassword', [
'autocomplete' => 'off', 'autocomplete' => 'off',
'label' => 'Mot de passe' 'label' => 'Mot de passe'
]); ?> ]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::password('registrationAddConfirmPassword', [ <?php echo template::password('registrationAddConfirmPassword', [
'autocomplete' => 'off', 'autocomplete' => 'off',
'label' => 'Confirmation du mot de passe' 'label' => 'Confirmation du mot de passe'
]); ]);
?> ?>
</div> </div>
</div>
</div>
</div>
<div class="row"> <div class="row">
<div class="col2 offset8"> <div class="col2 offset10">
<?php echo template::submit('registrationAddSubmit', [ <?php echo template::submit('registrationAddSubmit', [
'value' => 'Envoyer', 'value' => 'Envoyer',
'class' => 'green' 'class' => 'green'