Overview
Comment: | Remettre la connexion 2FA/OTP en état de marche |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | dev |
Files: | files | file ages | folders |
SHA1: |
aabf6f702a4261be4df2f9b5a9339b32 |
User & Date: | bohwaz on 2017-06-08 06:12:28 |
Other Links: | branch diff | manifest | tags |
Context
2017-06-20
| ||
00:44 | Ajout signal édition membre cf [743d7e1483] check-in: 225b85cec2 user: bohwaz tags: dev | |
2017-06-08
| ||
06:12 | Remettre la connexion 2FA/OTP en état de marche check-in: aabf6f702a user: bohwaz tags: dev | |
06:11 | make_release: ne pas stocker le nom / ID de l'utilisateur check-in: b238ec38d0 user: bohwaz tags: dev | |
Changes
Modified src/include/lib/Garradin/Form.php from [fc2bdd0ba9] to [101432b619].
︙ | ︙ | |||
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | 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.'); case 'confirmed': return sprintf('La vérification du champ %s n\'est pas identique au champ lui-même.', $element); case 'date_format': return sprintf('Format de date invalide dans le champ %s.', $element); default: return sprintf('Erreur "%s" dans le champ "%s"', $rule, $element); } } public function __invoke($key) { return \KD2\Form::get($key); } } | > > | 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | 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.'); case 'confirmed': return sprintf('La vérification du champ %s n\'est pas identique au champ lui-même.', $element); case 'date_format': return sprintf('Format de date invalide dans le champ %s.', $element); case 'numeric': return sprintf('Le champ %s doit être un nombre.', $element); 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 [7059fac111] to [9bd410c499].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php namespace Garradin\Membres; use Garradin\Config; use Garradin\DB; use Garradin\Utils; use Garradin\Membres; use \KD2\Security; use \KD2\Security_OTP; use \KD2\QRCode; class Session { | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php namespace Garradin\Membres; use Garradin\Config; use Garradin\DB; use Garradin\Utils; use Garradin\Membres; use Garradin\UserException; use \KD2\Security; use \KD2\Security_OTP; use \KD2\QRCode; class Session { |
︙ | ︙ | |||
218 219 220 221 222 223 224 225 226 227 228 | if (empty($user->secret) || empty($user->id)) { return false; } if (!self::checkOTP($user->secret, $code)) { return false; } $session = new Session($user->id); | > > | | | 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 | if (empty($user->secret) || empty($user->id)) { return false; } if (!self::checkOTP($user->secret, $code)) { var_dump($user->secret, $code); return false; } self::createUserSession($user->id); $session = new Session($user->id); return $session; } static public function checkOTP($secret, $code) { if (!Security_OTP::TOTP($secret, $code)) { // Vérifier encore, mais avec le temps NTP // au cas où l'horloge du serveur n'est pas à l'heure $time = Security_OTP::getTimeFromNTP(\Garradin\NTP_SERVER); if (!Security_OTP::TOTP($secret, $code, $time)) { return false; } } |
︙ | ︙ | |||
581 582 583 584 585 586 587 | $data['passe'] = Membres::hashPassword(trim($data['passe'])); } else { unset($data['passe']); } | | | 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 | $data['passe'] = Membres::hashPassword(trim($data['passe'])); } else { unset($data['passe']); } if (isset($data['clef_pgp']) && trim($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.'); } |
︙ | ︙ |
Modified src/templates/admin/login_otp.tpl from [5a44d9c852] to [6560c7df92].
1 2 | {include file="admin/_head.tpl" title="Connexion — double facteur"} | | < < < < | < < < < | 1 2 3 4 5 6 7 8 9 10 11 | {include file="admin/_head.tpl" title="Connexion — double facteur"} {form_errors} {show_error if=$fail message="Code incorrect. Vérifiez que votre téléphone est à l'heure."} <form method="post" action="{$self_url}"> <fieldset> <legend>Authentification à double facteur</legend> <dl> <dt><label for="f_code">Code TOTP</label></dt> |
︙ | ︙ |
Modified src/templates/admin/mes_infos_securite.tpl from [f4250628dd] to [7981d3d496].
︙ | ︙ | |||
41 42 43 44 45 46 47 | <p class="submit"> {csrf_field key="edit_me_security"} <input type="hidden" name="passe" value="{form_field name="passe"}" /> <input type="hidden" name="passe_confirmed" value="{form_field name="passe_confirmed"}" /> <input type="hidden" name="clef_pgp" value="{form_field name="clef_pgp"}" /> <input type="hidden" name="otp_secret" value="{$otp.secret}" /> | < | 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | <p class="submit"> {csrf_field key="edit_me_security"} <input type="hidden" name="passe" value="{form_field name="passe"}" /> <input type="hidden" name="passe_confirmed" value="{form_field name="passe_confirmed"}" /> <input type="hidden" name="clef_pgp" value="{form_field name="clef_pgp"}" /> <input type="hidden" name="otp_secret" value="{$otp.secret}" /> <input type="submit" name="confirm" value="Confirmer →" /> </p> </form> {else} <form method="post" action="{$self_url}"> |
︙ | ︙ |
Modified src/www/admin/login_otp.php from [a263b860c3] to [5424a00ba0].
1 2 3 4 5 6 7 | <?php namespace Garradin; const LOGIN_PROCESS = true; require_once __DIR__ . '/_inc.php'; | > | | | | > > | < < < < | | | | | < | > | < | | 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 26 27 28 29 30 31 32 33 34 | <?php namespace Garradin; const LOGIN_PROCESS = true; require_once __DIR__ . '/_inc.php'; if (!Membres\Session::isOTPRequired()) { Utils::redirect('/admin/'); } $login = null; if (f('login')) { $form->check('otp', [ 'code' => 'numeric|required', ]); if (!$form->hasErrors() && ($login = Membres\Session::loginOTP(Utils::post('code')))) { Utils::redirect('/admin/'); } } //var_dump($form->hasErrors()); exit; $tpl->assign('fail', $login === false); $tpl->assign('time', time()); $tpl->display('admin/login_otp.tpl'); |
Modified src/www/admin/mes_infos_securite.php from [55c303988e] to [3a6374c0ad].
︙ | ︙ | |||
76 77 78 79 80 81 82 83 84 85 86 87 88 89 | $tpl->assign('confirm', $confirm); if (f('otp') == 'generate') { $otp = $session->getNewOTPSecret(); $tpl->assign('otp', $otp); } else { $tpl->assign('otp', false); } $tpl->assign('pgp_disponible', \KD2\Security::canUseEncryption()); | > > > > | 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | $tpl->assign('confirm', $confirm); if (f('otp') == 'generate') { $otp = $session->getNewOTPSecret(); $tpl->assign('otp', $otp); } elseif (f('otp_secret')) { $tpl->assign('otp', f('otp_secret')); } else { $tpl->assign('otp', false); } $tpl->assign('pgp_disponible', \KD2\Security::canUseEncryption()); |
︙ | ︙ |