Overview
Comment: | Passage de la taille de mot de passe à 6 caractères minimum |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | dev |
Files: | files | file ages | folders |
SHA1: |
92f97b5ca63f7e9de9dd1f3cdc887b49 |
User & Date: | bohwaz on 2017-05-25 06:16:50 |
Other Links: | branch diff | manifest | tags |
Context
2017-05-26
| ||
06:23 | Afficher l'URL otpauth:// pour permettre de configurer qqchose comme rockbox par exemple check-in: 4c2825a752 user: bohwaz tags: dev | |
2017-05-25
| ||
06:16 | Passage de la taille de mot de passe à 6 caractères minimum check-in: 92f97b5ca6 user: bohwaz tags: dev | |
05:46 | Utilisation de l'objet Form check-in: e0f0708659 user: bohwaz tags: dev | |
Changes
Modified src/include/lib/Garradin/Form.php from [c4752f5492] to [974d7760bb].
1 2 3 4 5 6 7 8 | <?php namespace Garradin; class Form { protected $errors = []; | | | > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?php namespace Garradin; class Form { protected $errors = []; public function check($token_action = '', Array $rules = null) { if (!\KD2\Form::tokenCheck($token_action)) { $this->errors[] = 'Une erreur est survenue, merci de bien vouloir renvoyer le formulaire.'; return false; } if (!is_null($rules) && !$this->validate($rules)) { return false; } return true; } public function validate(Array $rules) |
︙ | ︙ | |||
35 36 37 38 39 40 41 | public function addError($msg) { $this->errors[] = $msg; } public function getErrorMessages() { | > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > | 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | public function addError($msg) { $this->errors[] = $msg; } public function getErrorMessages() { $errors = []; foreach ($this->errors as $error) { if (is_array($error)) { $errors[] = $this->getErrorMessage($error['rule'], $error['name'], $error['params']); } else { $errors[] = $error; } } return $errors; } protected function getErrorMessage($rule, $element, Array $params) { if ($element == '_id') { $element = 'identifiant'; } elseif ($element == 'passe') { $element = 'mot de passe'; } switch ($rule) { case 'required': return sprintf('Le champ %s est vide.', $element); case 'min': return sprintf('Le champ %s doit faire au moins %d caractères.', $element, $params[0]); case 'file': return sprintf('Le fichier envoyé n\'est pas valide.'); default: return sprintf('Erreur "%s" dans le champ "%s"', $rule, $element); } } public function __invoke($key) { return \KD2\Form::get($key); } } |
Modified src/include/lib/Garradin/Membres/Session.php from [6d9c786107] to [482e8fcf9e].
︙ | ︙ | |||
295 296 297 298 299 300 301 | $id = (int)$_SESSION['recover_password']['id']; $message = "Bonjour,\n\nVous avez demandé un nouveau mot de passe pour votre compte.\n\n"; $message.= "Votre adresse email : ".$dest."\n"; $message.= "Votre nouveau mot de passe : ".$password."\n\n"; $message.= "Si vous n'avez pas demandé à recevoir ce message, merci de nous le signaler."; | | | 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 | $id = (int)$_SESSION['recover_password']['id']; $message = "Bonjour,\n\nVous avez demandé un nouveau mot de passe pour votre compte.\n\n"; $message.= "Votre adresse email : ".$dest."\n"; $message.= "Votre nouveau mot de passe : ".$password."\n\n"; $message.= "Si vous n'avez pas demandé à recevoir ce message, merci de nous le signaler."; $password = Membres::hashPassword($password); $db->update('membres', ['passe' => $password], 'id = :id', ['id' => (int)$id]); return Utils::mail($dest, '['.$config->get('nom_asso').'] Nouveau mot de passe', $message); } public function __construct() |
︙ | ︙ | |||
444 445 446 447 448 449 450 | unset($_COOKIE[self::SESSION_COOKIE_NAME]); return true; } public function editUser($data) { | | > > > | 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 | unset($_COOKIE[self::SESSION_COOKIE_NAME]); return true; } public function editUser($data) { (new Membres)->edit($this->id, $data, false); $this->updateSessionData(); return true; } public function getUser($key = null) { if (null === $key) { return $this->user; |
︙ | ︙ | |||
523 524 525 526 527 528 529 | { return null; } return $_SESSION['storage'][$key]; } | < < < < < < < < < < < < < < < < < < < < < | | 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 | { return null; } return $_SESSION['storage'][$key]; } public function sendMessage($dest, $sujet, $message, $copie = false) { $from = $this->getUser(); $from = $from['email']; // Uniquement adresse email pour le moment car faudrait trouver comment // indiquer le nom mais qu'il soit correctement échappé FIXME $config = Config::getInstance(); $message .= "\n\n--\nCe message a été envoyé par un membre de ".$config->get('nom_asso'); |
︙ | ︙ | |||
572 573 574 575 576 577 578 | public function checkPassword($password) { return Membres::checkPassword($password, $this->user->passe); } public function editSecurity(Array $data = []) { | < < < < < < < | | | 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 | public function checkPassword($password) { return Membres::checkPassword($password, $this->user->passe); } public function editSecurity(Array $data = []) { $allowed_fields = ['passe', 'clef_pgp', 'secret_otp']; foreach ($data as $key=>$value) { if (!in_array($key, $allowed_fields)) { throw new \RuntimeException(sprintf('Le champ %s n\'est pas autorisé dans cette méthode.', $key)); } } if (isset($data['passe']) && trim($data['passe']) !== '') { if (strlen($data['passe']) < 5) { throw new UserException('Le mot de passe doit faire au moins 5 caractères.'); } $data['passe'] = Membres::hashPassword(trim($data['passe'])); } else { unset($data['passe']); } if (isset($data['clef_pgp'])) { $data['clef_pgp'] = trim($data['clef_pgp']); if (!$this->getPGPFingerprint($data['clef_pgp'])) { throw new UserException('Clé PGP invalide : impossible d\'extraire l\'empreinte.'); } } DB::getInstance()->simpleUpdate('membres', $data, 'id = '.(int)$this->id); $this->updateSessionData(); return true; } public function getPGPFingerprint($key, $display = false) { |
︙ | ︙ | |||
636 637 638 639 640 641 642 | { $fingerprint = str_split($fingerprint, 4); $fingerprint = implode(' ', $fingerprint); } return $fingerprint; } | | > > > > > | 611 612 613 614 615 616 617 618 619 620 621 622 623 | { $fingerprint = str_split($fingerprint, 4); $fingerprint = implode(' ', $fingerprint); } return $fingerprint; } public function updateSessionData() { $this->user = self::createUserSession($this->id); } } |
Modified src/include/lib/Garradin/Template.php from [71b7137767] to [fb886d7d5c].
︙ | ︙ | |||
33 34 35 36 37 38 39 | $this->register_function('form_errors', [$this, 'formErrors']); $this->register_function('show_error', [$this, 'showError']); $this->register_function('custom_colors', [$this, 'customColors']); } protected function formErrors($params) { | | | < < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < | 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | $this->register_function('form_errors', [$this, 'formErrors']); $this->register_function('show_error', [$this, 'showError']); $this->register_function('custom_colors', [$this, 'customColors']); } protected function formErrors($params) { $form = $this->getTemplateVars('form'); if (!$form->hasErrors()) { return ''; } return '<div class="error"><ul><li>' . implode('</li><li>', $form->getErrorMessages()) . '</li></ul></div>'; } protected function showError($params) { if (!$params['if']) { return ''; |
︙ | ︙ |
Modified src/templates/admin/install.tpl from [fa74b55a08] to [8a190c2c94].
︙ | ︙ | |||
42 43 44 45 46 47 48 | Astuce : un mot de passe de quatre mots choisis au hasard dans le dictionnaire est plus sûr et plus simple à retenir qu'un mot de passe composé de 10 lettres et chiffres. </dd> <dd class="help"> Pas d'idée ? Voici une suggestion choisie au hasard : <input type="text" readonly="readonly" title="Cliquer pour utiliser cette suggestion comme mot de passe" id="pw_suggest" value="{$passphrase}" autocomplete="off" /> </dd> | | | | 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | Astuce : un mot de passe de quatre mots choisis au hasard dans le dictionnaire est plus sûr et plus simple à retenir qu'un mot de passe composé de 10 lettres et chiffres. </dd> <dd class="help"> Pas d'idée ? Voici une suggestion choisie au hasard : <input type="text" readonly="readonly" title="Cliquer pour utiliser cette suggestion comme mot de passe" id="pw_suggest" value="{$passphrase}" autocomplete="off" /> </dd> <dd><input type="password" name="passe_membre" id="f_passe_membre" value="{form_field name=passe_membre}" pattern=".{ldelim}6,{rdelim}" required="required" /></dd> <dt><label for="f_repasse_membre">Encore le mot de passe</label> (vérification) <b title="(Champ obligatoire)">obligatoire</b></dt> <dd><input type="password" name="repasse_membre" id="f_repasse_membre" value="{form_field name=repasse_membre}" pattern=".{ldelim}6,{rdelim}" required="required" /></dd> </dl> </fieldset> <p class="submit"> {csrf_field key="install"} <input type="submit" id="f_submit" name="save" value="Terminer l'installation →" /> </p> |
︙ | ︙ |
Modified src/templates/admin/membres/ajouter.tpl from [f16619648e] to [b89071d52e].
︙ | ︙ | |||
25 26 27 28 29 30 31 | Astuce : un mot de passe de quatre mots choisis au hasard dans le dictionnaire est plus sûr et plus simple à retenir qu'un mot de passe composé de 10 lettres et chiffres. </dd> <dd class="help"> Pas d'idée ? Voici une suggestion choisie au hasard : <input type="text" readonly="readonly" title="Cliquer pour utiliser cette suggestion comme mot de passe" id="pw_suggest" value="{$passphrase}" autocomplete="off" /> </dd> | | | | 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | Astuce : un mot de passe de quatre mots choisis au hasard dans le dictionnaire est plus sûr et plus simple à retenir qu'un mot de passe composé de 10 lettres et chiffres. </dd> <dd class="help"> Pas d'idée ? Voici une suggestion choisie au hasard : <input type="text" readonly="readonly" title="Cliquer pour utiliser cette suggestion comme mot de passe" id="pw_suggest" value="{$passphrase}" autocomplete="off" /> </dd> <dd><input type="password" name="passe" id="f_passe" value="{form_field name=passe}" pattern=".{ldelim}6,{rdelim}" /></dd> <dt><label for="f_repasse">Encore le mot de passe</label> (vérification)</dt> <dd><input type="password" name="repasse" id="f_repasse" value="{form_field name=repasse}" pattern=".{ldelim}6,{rdelim}" /></dd> </dl> </fieldset> {if $user.droits.membres == Garradin\Membres::DROIT_ADMIN} <fieldset> <legend>Général</legend> <dl> |
︙ | ︙ |
Modified src/templates/admin/membres/modifier.tpl from [7878a5d47d] to [01e092296e].
︙ | ︙ | |||
43 44 45 46 47 48 49 | Astuce : un mot de passe de quatre mots choisis au hasard dans le dictionnaire est plus sûr et plus simple à retenir qu'un mot de passe composé de 10 lettres et chiffres. </dd> <dd class="help"> Pas d'idée ? Voici une suggestion choisie au hasard : <input type="text" readonly="readonly" title="Cliquer pour utiliser cette suggestion comme mot de passe" id="pw_suggest" value="{$passphrase}" autocomplete="off" /> </dd> | | | | 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | Astuce : un mot de passe de quatre mots choisis au hasard dans le dictionnaire est plus sûr et plus simple à retenir qu'un mot de passe composé de 10 lettres et chiffres. </dd> <dd class="help"> Pas d'idée ? Voici une suggestion choisie au hasard : <input type="text" readonly="readonly" title="Cliquer pour utiliser cette suggestion comme mot de passe" id="pw_suggest" value="{$passphrase}" autocomplete="off" /> </dd> <dd><input type="password" name="passe" id="f_passe" value="{form_field name=passe}" pattern=".{ldelim}6,{rdelim}" /></dd> <dt><label for="f_repasse">Encore le mot de passe</label> (vérification){if $champs.passe.mandatory} <b title="(Champ obligatoire)">obligatoire</b>{/if}</dt> <dd><input type="password" name="repasse" id="f_repasse" value="{form_field name=repasse}" pattern=".{ldelim}6,{rdelim}" /></dd> </dl> </fieldset> {if $user.droits.membres == Garradin\Membres::DROIT_ADMIN && $user.id != $membre.id} <fieldset> <legend>Général</legend> <dl> |
︙ | ︙ |
Modified src/templates/admin/mes_infos_securite.tpl from [0d4da55bf9] to [8b72db5593].
︙ | ︙ | |||
65 66 67 68 69 70 71 | Astuce : un mot de passe de quatre mots choisis au hasard dans le dictionnaire est plus sûr et plus simple à retenir qu'un mot de passe composé de 10 lettres et chiffres. </dd> <dd class="help"> Pas d'idée ? Voici une suggestion choisie au hasard : <input type="text" readonly="readonly" title="Cliquer pour utiliser cette suggestion comme mot de passe" id="pw_suggest" value="{$passphrase}" autocomplete="off" /> </dd> | | | | 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | Astuce : un mot de passe de quatre mots choisis au hasard dans le dictionnaire est plus sûr et plus simple à retenir qu'un mot de passe composé de 10 lettres et chiffres. </dd> <dd class="help"> Pas d'idée ? Voici une suggestion choisie au hasard : <input type="text" readonly="readonly" title="Cliquer pour utiliser cette suggestion comme mot de passe" id="pw_suggest" value="{$passphrase}" autocomplete="off" /> </dd> <dd><input type="password" name="passe" id="f_passe" value="{form_field name=passe}" pattern=".{ldelim}6,{rdelim}" /></dd> <dt><label for="f_repasse">Encore le mot de passe</label> (vérification)</dt> <dd><input type="password" name="passe_confirmed" id="f_passe_confirmed" value="{form_field name=passe_confirmed}" pattern=".{ldelim}6,{rdelim}" /></dd> </dl> {/if} </fieldset> <fieldset> <legend>Authentification à double facteur (2FA)</legend> <p class="help">Pour renforcer la sécurité de votre connexion en cas de vol de votre mot de passe, vous pouvez activer |
︙ | ︙ |
Modified src/www/admin/_inc.php from [389bbe04f9] to [1060426865].
︙ | ︙ | |||
39 40 41 42 43 44 45 | return isset($_GET[$key]) ? $_GET[$key] : null; } $tpl = Template::getInstance(); $tpl->assign('admin_url', WWW_URL . 'admin/'); $form = new Form; | | | 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | return isset($_GET[$key]) ? $_GET[$key] : null; } $tpl = Template::getInstance(); $tpl->assign('admin_url', WWW_URL . 'admin/'); $form = new Form; $tpl->assign_by_ref('form', $form); $session = Session::get(); $tpl->assign('config', Config::getInstance()->getConfig()); if (!defined('Garradin\LOGIN_PROCESS')) { |
︙ | ︙ |
Modified src/www/admin/mes_infos_securite.php from [1a8ba8f765] to [55c303988e].
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php namespace Garradin; use Garradin\Membres\Session; require_once __DIR__ . '/_inc.php'; $confirm = false; if (f('confirm')) { $form->check('edit_me_security', [ | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php namespace Garradin; use Garradin\Membres\Session; require_once __DIR__ . '/_inc.php'; $confirm = false; if (f('confirm')) { $form->check('edit_me_security', [ 'passe' => 'confirmed|min:6', 'passe_check' => 'required', ]); if (f('passe_check') && !$session->checkPassword(f('passe_check'))) { $form->addError('Le mot de passe fourni ne correspond pas au mot de passe actuel. Merci de bien vouloir renseigner votre mot de passe courant pour confirmer les changements.'); } |
︙ | ︙ | |||
55 56 57 58 59 60 61 | } $confirm = true; } elseif (f('save')) { $form->check('edit_me_security', [ | | | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | } $confirm = true; } elseif (f('save')) { $form->check('edit_me_security', [ 'passe' => 'confirmed|min:6', ]); if (f('clef_pgp') && !$session->getPGPFingerprint(f('clef_pgp'))) { $form->addError('Clé PGP invalide : impossible de récupérer l\'empreinte de la clé.'); } |
︙ | ︙ |