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].
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
..
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
namespace Garradin; class Form { protected $errors = []; public function check($token_action = '') { if (!\KD2\Form::tokenCheck($token_action)) { $this->errors[] = 'Erreur CSRF'; return false; } return true; } public function validate(Array $rules) ................................................................................ public function addError($msg) { $this->errors[] = $msg; } public function getErrorMessages() { return; } public function __invoke($key) { return \KD2\Form::get($key); } } |
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
..
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
|
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) ................................................................................ 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 302 303 304 305 306 307 308 309 ... 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 ... 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 ... 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 ... 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 ... 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 ... 636 637 638 639 640 641 642 643 |
$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 = $this->_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() ................................................................................ unset($_COOKIE[self::SESSION_COOKIE_NAME]); return true; } public function editUser($data) { return (new Membres)->edit($this->id, $data, false); } public function getUser($key = null) { if (null === $key) { return $this->user; ................................................................................ { return null; } return $_SESSION['storage'][$key]; } public function updateSessionData($membre = null, $droits = null) { if (is_null($membre)) { $membre = $this->get($_SESSION['logged_user']['id']); } elseif (is_int($membre)) { $membre = $this->get($membre); } if (is_null($droits)) { $droits = $this->getDroits($membre['id_categorie']); } $membre['droits'] = $droits; $_SESSION['logged_user'] = $membre; return true; } public function sendMessage($dest, $sujet, $message, $copie = false) { $from = $this->getLoggedUser(); $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'); ................................................................................ public function checkPassword($password) { return Membres::checkPassword($password, $this->user->passe); } public function editSecurity(Array $data = []) { $user = $this->getLoggedUser(); if (!$user) { throw new \LogicException('Utilisateur non connecté.'); } $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'] = $this->_hashPassword($data['passe']); } else { unset($data['passe']); } if (isset($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)$user['id']); $this->updateSessionData(); return true; } public function getPGPFingerprint($key, $display = false) { ................................................................................ { $fingerprint = str_split($fingerprint, 4); $fingerprint = implode(' ', $fingerprint); } return $fingerprint; } } |
| | > > > < < < < < < < < < < < < < < < < < < < < < | < < < < < < < | | | > > > > > |
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 ... 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 ... 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 ... 554 555 556 557 558 559 560 561 562 563 564 565 566 567 ... 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 ... 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 ... 611 612 613 614 615 616 617 618 619 620 621 622 623 |
$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() ................................................................................ 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; ................................................................................ { 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'); ................................................................................ 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'])) ................................................................................ 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) { ................................................................................ { $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 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 |
$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) { $errors = $this->getTemplateVars('form_errors'); if (!$errors || count($errors) == 0) { return ''; } $out = []; foreach ($errors as $error) { if (is_array($error)) { $out[] = $this->getFormErrorMessage($error['rule'], $error['name']); } else { $out[] = $error; } } return '<div class="error"><ul><li>' . implode('</li><li>', $out) . '</li></ul></div>'; } protected function getFormErrorMessage($rule, $element) { 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 'csrf': return 'Une erreur est survenue, merci de bien vouloir renvoyer le formulaire.'; default: return sprintf('Erreur "%s" dans le champ "%s"', $rule, $element); } } protected function showError($params) { if (!$params['if']) { return ''; |
| | < < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < |
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 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}5,{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}5,{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> |
| | |
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 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}5,{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}5,{rdelim}" /></dd> </dl> </fieldset> {if $user.droits.membres == Garradin\Membres::DROIT_ADMIN} <fieldset> <legend>Général</legend> <dl> |
| | |
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 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}5,{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}5,{rdelim}" /></dd> </dl> </fieldset> {if $user.droits.membres == Garradin\Membres::DROIT_ADMIN && $user.id != $membre.id} <fieldset> <legend>Général</legend> <dl> |
| | |
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 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}5,{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}5,{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 |
| | |
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 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_errors', $form->getErrors()); $session = Session::get(); $tpl->assign('config', Config::getInstance()->getConfig()); if (!defined('Garradin\LOGIN_PROCESS')) { |
| |
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].
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
..
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
require_once __DIR__ . '/_inc.php';
$confirm = false;
if (f('confirm'))
{
$form->check('edit_me_security', [
'passe' => 'confirmed',
'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.');
}
................................................................................
}
$confirm = true;
}
elseif (f('save'))
{
$form->check('edit_me_security', [
'passe' => 'confirmed',
]);
if (f('clef_pgp') && !$session->getPGPFingerprint(f('clef_pgp')))
{
$form->addError('Clé PGP invalide : impossible de récupérer l\'empreinte de la clé.');
}
|
|
|
|
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
..
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
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.'); } ................................................................................ } $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é.'); } |