1.21.04 sécurisation de la méthode de changement de mot de passe.

This commit is contained in:
Fred Tempez 2025-01-31 18:13:00 +01:00
parent e7e0fef37e
commit cbc7a1ad19
3 changed files with 44 additions and 52 deletions

View File

@ -1,4 +1,4 @@
# ZwiiCampus 1.20.03
# ZwiiCampus 1.21.00
ZwiiCampus (Learning Management System) est logiciel auteur destiné à mettre en ligne des tutoriels. Il dispose de plusieurs modalités d'ouverture et d'accès des contenus. Basé sur la version 13 du CMS Zwii, la structure logicielle est solide, le framework de Zwii est éprouvé.

View File

@ -51,7 +51,7 @@ class common
const ACCESS_TIMER = 1800;
// Numéro de version
const ZWII_VERSION = '1.20.03';
const ZWII_VERSION = '1.21.00';
// URL autoupdate
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/campus-update/raw/branch/master/';

View File

@ -284,7 +284,6 @@ class user extends common
'notification' => sprintf($count > 1 ? $notification . 's' : $notification, $count),
'state' => $success
]);
}
// Liste des groupes et des profils
@ -367,7 +366,6 @@ class user extends common
$this->getData(['user', $userId, 'lastname']),
$this->getData(['user', $userId, 'tags']),
];
}
}
@ -571,16 +569,18 @@ class user extends common
public function forgot()
{
// Soumission du formulaire
if (
$this->isPost()
) {
if ($this->isPost()) {
$userId = $this->getInput('userForgotId', helper::FILTER_ID, true);
$sent = false;
if ($this->getData(['user', $userId])) {
// Enregistre la date de la demande dans le compte utilisateur
$this->setData(['user', $userId, 'forgot', time()]);
// Crée un id unique pour la réinitialisation
$uniqId = md5(json_encode($this->getData(['user', $userId, 'forgot'])));
// Génère une clé unique avec timestamp et partie aléatoire
$timestamp = time(); // Timestamp actuel
$randomPart = bin2hex(random_bytes(8)); // Partie aléatoire (16 caractères hexadécimaux)
$uniqId = $timestamp . '_' . $randomPart; // Combine les deux
// Enregistre la clé unique dans le compte utilisateur
$this->setData(['user', $userId, 'forgot', $uniqId]);
// Envoi le mail
$sent = $this->sendMail(
$this->getData(['user', $userId, 'mail']),
@ -592,7 +592,6 @@ class user extends common
null,
$this->getData(['config', 'smtp', 'from'])
);
}
// Valeurs en sortie
@ -706,7 +705,6 @@ class user extends common
'help' => 'Supprimer'
])
];
}
}
@ -1556,25 +1554,30 @@ class user extends common
if (
// L'utilisateur n'existe pas
$this->getData(['user', $this->getUrl(2)]) === null
// Lien de réinitialisation trop vieux
or $this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time()
// Id unique incorrecte
or $this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2), 'forgot'])))
// Lien de réinitialisation trop vieux (24 heures)
or $this->getData(['user', $this->getUrl(2), 'forgot']) === null
or (int) explode('_', $this->getData(['user', $this->getUrl(2), 'forgot']))[0] + 86400 < time()
// Clé unique incorrecte
or $this->getUrl(3) !== $this->getData(['user', $this->getUrl(2), 'forgot'])
) {
$this->saveLog(
' Erreur de réinitialisation de mot de passe ' . $this->getUrl(2) .
' Compte : ' . $this->getData(['user', $this->getUrl(2)]) .
' Temps : ' . ($this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time()) .
' Clé : ' . ($this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2), 'forgot']))))
' Temps : ' . ($this->getData(['user', $this->getUrl(2), 'forgot']) === null ? 'Clé manquante' : ((int) explode('_', $this->getData(['user', $this->getUrl(2), 'forgot']))[0] + 86400 < time() ? 'Temps dépassé' : 'Temps valide')) .
' Clé : ' . ($this->getUrl(3) !== $this->getData(['user', $this->getUrl(2), 'forgot']) ? 'Clé invalide' : 'Clé valide')
);
// Message d'erreur en cas de problème de réinitialisation de mot de passe
$message = $this->getData(['user', $this->getUrl(2)]) === null
? ' Utilisateur inconnu '
: '';
$message = $this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time()
$message = $this->getData(['user', $this->getUrl(2), 'forgot']) === null
? ' Clé manquante '
: $message;
$message = (int) explode('_', $this->getData(['user', $this->getUrl(2), 'forgot']))[0] + 86400 < time()
? ' Temps dépassé '
: $message;
$message = $this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2)])))
$message = $this->getUrl(3) !== $this->getData(['user', $this->getUrl(2), 'forgot'])
? ' Clé invalide '
: $message;
@ -1583,17 +1586,12 @@ class user extends common
'redirect' => helper::baseurl(),
'notification' => helper::translate('Impossible de réinitialiser le mot de passe de ce compte !') . $message,
'state' => false
//'access' => false
]);
}
// Accès autorisé
else {
// Soumission du formulaire
if (
// Tous les users peuvent réinitialiser
// $this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
if ($this->isPost()) {
// Double vérification pour le mot de passe
if ($this->getInput('userResetNewPassword')) {
// La confirmation ne correspond pas au mot de passe
@ -1764,7 +1762,6 @@ class user extends common
];
}
}
}
// Sauvegarde la base manuellement
$this->saveDB('user');
@ -1806,7 +1803,6 @@ class user extends common
readfile($path . $file);
exit();
}
}
public function tag()
@ -1849,7 +1845,6 @@ class user extends common
'notification' => sprintf($count > 1 ? $notification . 's' : $notification, $count),
'state' => $success
]);
}
@ -1933,7 +1928,6 @@ class user extends common
$this->getData(['user', $userId, 'lastname']),
$this->getData(['user', $userId, 'tags']),
];
}
}
@ -1954,7 +1948,6 @@ class user extends common
'datatables'
]
]);
}
/**
@ -1988,5 +1981,4 @@ class user extends common
closedir($dh);
return $subdirs;
}
}