Proyectos de Subversion Moodle

Rev

Rev 11 | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 11 Rev 1441
Línea 19... Línea 19...
19
defined('MOODLE_INTERNAL') || die();
19
defined('MOODLE_INTERNAL') || die();
Línea 20... Línea 20...
20
 
20
 
21
require_once(__DIR__.'/../extlib/OTPHP/OTPInterface.php');
21
require_once(__DIR__.'/../extlib/OTPHP/OTPInterface.php');
22
require_once(__DIR__.'/../extlib/OTPHP/TOTPInterface.php');
22
require_once(__DIR__.'/../extlib/OTPHP/TOTPInterface.php');
-
 
23
require_once(__DIR__.'/../extlib/OTPHP/ParameterTrait.php');
23
require_once(__DIR__.'/../extlib/OTPHP/ParameterTrait.php');
24
require_once(__DIR__.'/../extlib/OTPHP/InternalClock.php');
24
require_once(__DIR__.'/../extlib/OTPHP/OTP.php');
25
require_once(__DIR__.'/../extlib/OTPHP/OTP.php');
Línea 25... Línea -...
25
require_once(__DIR__.'/../extlib/OTPHP/TOTP.php');
-
 
26
 
-
 
27
require_once(__DIR__.'/../extlib/Assert/Assertion.php');
-
 
28
require_once(__DIR__.'/../extlib/Assert/AssertionFailedException.php');
26
require_once(__DIR__.'/../extlib/OTPHP/TOTP.php');
29
require_once(__DIR__.'/../extlib/Assert/InvalidArgumentException.php');
27
 
30
require_once(__DIR__.'/../extlib/ParagonIE/ConstantTime/EncoderInterface.php');
28
require_once(__DIR__.'/../extlib/ParagonIE/ConstantTime/EncoderInterface.php');
Línea 31... Línea 29...
31
require_once(__DIR__.'/../extlib/ParagonIE/ConstantTime/Binary.php');
29
require_once(__DIR__.'/../extlib/ParagonIE/ConstantTime/Binary.php');
Línea 38... Línea 36...
38
 * @package     factor_totp
36
 * @package     factor_totp
39
 * @author      Peter Burnett <peterburnett@catalyst-au.net>
37
 * @author      Peter Burnett <peterburnett@catalyst-au.net>
40
 * @copyright   Catalyst IT
38
 * @copyright   Catalyst IT
41
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
39
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
42
 */
40
 */
43
class factor_test extends \advanced_testcase {
41
final class factor_test extends \advanced_testcase {
Línea 44... Línea 42...
44
 
42
 
45
    /**
43
    /**
46
     * Test code validation of the TOTP factor
44
     * Test code validation of the TOTP factor
47
     */
45
     */
48
    public function test_validate_code(): void {
46
    public function test_validate_code(): void {
Línea -... Línea 47...
-
 
47
        global $DB;
-
 
48
 
49
        global $DB;
49
        $clock = $this->mock_clock_with_frozen(10000000);
50
 
50
 
51
        $this->resetAfterTest(true);
51
        $this->resetAfterTest(true);
52
        $user = $this->getDataGenerator()->create_user();
52
        $user = $this->getDataGenerator()->create_user();
53
        $this->setUser($user);
53
        $this->setUser($user);
54
        // Setup test staples.
54
        // Setup test staples.
Línea 55... Línea 55...
55
        $totp = \OTPHP\TOTP::create('fakekey');
55
        $totp = \OTPHP\TOTP::create('fakekey', clock: $clock);
56
        $window = 10;
56
        $window = 29;
57
 
57
 
58
        set_config('enabled', 1, 'factor_totp');
58
        set_config('enabled', 1, 'factor_totp');
59
        $totpfactor = \tool_mfa\plugininfo\factor::get_factor('totp');
59
        $totpfactor = \tool_mfa\plugininfo\factor::get_factor('totp');
60
        $totpdata = [
60
        $totpdata = [
61
            'secret' => 'fakekey',
61
            'secret' => 'fakekey',
Línea 62... Línea 62...
62
            'devicename' => 'fakedevice',
62
            'devicename' => 'fakedevice',
63
        ];
63
        ];
64
        $factorinstance = $totpfactor->setup_user_factor((object) $totpdata);
64
        $factorinstance = $totpfactor->setup_user_factor((object) $totpdata);
65
 
65
 
66
        // First check that a valid code is actually valid.
66
        // First check that a valid code is actually valid.
67
        $code = $totp->at(time());
67
        $code = $totp->at($clock->time());
Línea 68... Línea 68...
68
        // Manually set timeverified of factor.
68
        // Manually set timeverified of factor.
69
        $DB->set_field('tool_mfa', 'lastverified', time() - WEEKSECS, ['id' => $factorinstance->id]);
-
 
70
        $result = $totpfactor->validate_code($code, $window, $totp, $factorinstance);
-
 
71
        $this->assertEquals($totpfactor::TOTP_VALID, $result);
-
 
72
 
-
 
73
        // Now update timeverified to 2 mins ago, and check codes within window are blocked.
-
 
74
        $code = $totp->at(time() - (2 * MINSECS));
-
 
75
        $DB->set_field('tool_mfa', 'lastverified', time() - (2 * MINSECS), ['id' => $factorinstance->id]);
69
        $DB->set_field('tool_mfa', 'lastverified', $clock->time() - WEEKSECS, ['id' => $factorinstance->id]);
76
        $result = $totpfactor->validate_code($code, $window, $totp, $factorinstance);
70
        $result = $totpfactor->validate_code($code, $window, $totp, $factorinstance);
77
        $this->assertEquals($totpfactor::TOTP_USED, $result);
71
        $this->assertEquals($totpfactor::TOTP_VALID, $result);
78
 
72
 
Línea 79... Línea 73...
79
        // Now update timeverified to 2 mins ago, and check codes within window are blocked.
73
        // Now update timeverified to 20 seconds ago, and check codes within window is blocked.
80
        $code = $totp->at(time());
74
        $code = $totp->at($clock->time() - (20));
81
        $DB->set_field('tool_mfa', 'lastverified', time() - (2 * MINSECS), ['id' => $factorinstance->id]);
75
        $DB->set_field('tool_mfa', 'lastverified', $clock->time() - (20), ['id' => $factorinstance->id]);
82
        $result = $totpfactor->validate_code($code, $window, $totp, $factorinstance);
76
        $result = $totpfactor->validate_code($code, $window, $totp, $factorinstance);
83
        $this->assertEquals($totpfactor::TOTP_USED, $result);
77
        $this->assertEquals($totpfactor::TOTP_USED, $result);
Línea 84... Línea 78...
84
 
78
 
85
        // Now update timeverified to 2 mins ago, and check codes within window are blocked.
79
        // Now update timeverified to 20 seconds ago, and check code from current increment within window is blocked.
86
        $code = $totp->at(time() - (4 * MINSECS));
80
        $code = $totp->at($clock->time());
87
        $DB->set_field('tool_mfa', 'lastverified', time() - (2 * MINSECS), ['id' => $factorinstance->id]);
81
        $DB->set_field('tool_mfa', 'lastverified', $clock->time() - (20), ['id' => $factorinstance->id]);
88
        $result = $totpfactor->validate_code($code, $window, $totp, $factorinstance);
82
        $result = $totpfactor->validate_code($code, $window, $totp, $factorinstance);
89
        $this->assertEquals($totpfactor::TOTP_USED, $result);
83
        $this->assertEquals($totpfactor::TOTP_USED, $result);
Línea 90... Línea 84...
90
 
84
 
91
        // Now check future codes.
85
        // Now check future codes.
92
        $window = 1;
86
        $window = 1;
93
        $code = $totp->at(time() + (2 * MINSECS));
87
        $code = $totp->at($clock->time() + (2 * MINSECS));
Línea 94... Línea 88...
94
        $DB->set_field('tool_mfa', 'lastverified', time() - WEEKSECS, ['id' => $factorinstance->id]);
88
        $DB->set_field('tool_mfa', 'lastverified', $clock->time() - WEEKSECS, ['id' => $factorinstance->id]);
95
        $result = $totpfactor->validate_code($code, $window, $totp, $factorinstance);
89
        $result = $totpfactor->validate_code($code, $window, $totp, $factorinstance);
96
        $this->assertEquals($totpfactor::TOTP_FUTURE, $result);
90
        $this->assertEquals($totpfactor::TOTP_FUTURE, $result);
97
 
91
 
98
        // Codes in far future are invalid.
92
        // Codes in far future are invalid.
Línea 99... Línea 93...
99
        $code = $totp->at(time() + (20 * MINSECS));
93
        $code = $totp->at($clock->time() + (20 * MINSECS));
100
        $result = $totpfactor->validate_code($code, $window, $totp, $factorinstance);
94
        $result = $totpfactor->validate_code($code, $window, $totp, $factorinstance);
101
        $this->assertEquals($totpfactor::TOTP_INVALID, $result);
95
        $this->assertEquals($totpfactor::TOTP_INVALID, $result);
102
 
96
 
Línea 103... Línea 97...
103
        // Do the same for past codes.
97
        // Do the same for past codes.
104
        $window = 1;
98
        $window = 1;