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: aabf6f702a4261be4df2f9b5a9339b322474b9cd
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
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
		if (empty($user->secret) || empty($user->id))
		{
			return false;
		}

		if (!self::checkOTP($user->secret, $code))
		{

			return false;
		}


		$session = new Session($user->id);
		$session->updateLoginDate();
		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(NTP_SERVER);

			if (!Security_OTP::TOTP($secret, $code, $time))
			{
				return false;
			}
		}








>



>

|









|







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
588
589
590
591
592
593
594
595
			$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.');
			}







|







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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{include file="admin/_head.tpl" title="Connexion — double facteur"}

{if $error}
    <p class="error">
        {if $error == 'OTHER'}
            Une erreur est survenue, merci de réessayer.
        {else}
            Code incorrect. L'heure du serveur est {$time|date_fr:"d/m/Y H:i:s"}. Vérifiez que votre téléphone est à l'heure.
        {/if}
    </p>
{/if}


<form method="post" action="{$self_url}">

    <fieldset>
        <legend>Authentification à double facteur</legend>
        <dl>
            <dt><label for="f_code">Code TOTP</label></dt>


|
<
<
<
<
|
<
<
<
<







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
48
49
50
51
52
53
54
55

    <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="hidden" name="otp" value="generate" />
        <input type="submit" name="confirm" value="Confirmer &rarr;" />
    </p>

    </form>
{else}

    <form method="post" action="{$self_url}">







<







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 &rarr;" />
    </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
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
35
36
<?php

namespace Garradin;

const LOGIN_PROCESS = true;

require_once __DIR__ . '/_inc.php';

if ($membres->isLogged() && !$membres->isOTPRequired())
{
    Utils::redirect('/admin/');
}

$error = false;

if (Utils::post('code'))
{
    if (!Utils::CSRF_check('otp'))


    {
        $error = 'OTHER';
    }
    else
    {
        if ($membres->loginOTP(Utils::post('code')))
        {
            Utils::redirect('/admin/');
        }

        $error = 'LOGIN';
    }

}

$tpl->assign('error', $error);

$tpl->assign('time', time());

$tpl->display('admin/login_otp.tpl');

>






|




|

|

|
>
>
|
<
<
<
<
|
|
|
|
|
<
|
>
|
<
|




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());