merge passkeys feature
Bernd Wurst authored 1 year ago
|
1) <?php
2) /*
3) This file belongs to the Webinterface of schokokeks.org Hosting
4)
5) Written by schokokeks.org Hosting, namely
6) Bernd Wurst <bernd@schokokeks.org>
7) Hanno Böck <hanno@schokokeks.org>
8)
9) This code is published under a 0BSD license.
10)
11) Nevertheless, in case you use a significant part of this code, we ask (but not require, see the license) that you keep the authors' names in place and return your changes to the public. We would be especially happy if you tell us what you're going to do with this code.
12) */
13)
14) require_once('vendor/autoload.php');
15)
16) function list_systemuser_totp($uid = null)
17) {
18) if (!$uid) {
19) $uid = (int)$_SESSION['userinfo']['uid'];
20) }
21) $result = db_query("SELECT id, description, setuptime FROM system.systemuser_totp WHERE uid=?", [$uid]);
22) $ret = [];
23) while ($line = $result->fetch()) {
24) $ret[] = $line;
25) }
26) return $ret;
27) }
28)
29) function check_systemuser_password($password)
30) {
31) $result = db_query("SELECT passwort AS password FROM system.passwoerter WHERE uid=:uid", [":uid" => $_SESSION['userinfo']['uid']]);
32) if (@$result->rowCount() > 0) {
33) $entry = $result->fetch(PDO::FETCH_OBJ);
34) $db_password = $entry->password;
35) $hash = crypt($password, $db_password);
36) if ($hash == $db_password) {
37) return true;
38) }
39) }
40) return false;
41) }
42)
43)
44) function generate_systemuser_secret()
45) {
46) $ga = new PHPGangsta_GoogleAuthenticator();
47)
48) $secret = $ga->createSecret();
49) DEBUG('GA-Secret: ' . $secret);
50) return $secret;
51) }
52)
53) function check_systemuser_locked($uid)
54) {
55) if (!$uid) {
56) $uid = $_SESSION['userinfo']['uid'];
57) }
58) $result = db_query("SELECT 1 FROM system.systemuser_totp WHERE unlock_timestamp IS NOT NULL and unlock_timestamp > NOW() AND uid=?", [$uid]);
59) return ($result->rowCount() > 0);
60) }
61)
62) function check_systemuser_totp($uid, $code)
63) {
64) $ga = new PHPGangsta_GoogleAuthenticator();
65) $secret = null;
66) $checkResult = false;
67) if (isset($_SESSION['totp_secret'])) {
68) // Während des Setup
69) $secret = $_SESSION['totp_secret'];
70) $checkResult = $ga->verifyCode($secret, $code, 2); // 2 = 2*30sec clock tolerance
71) } else {
72) // Normalbetrieb
73) if (!$uid) {
74) $uid = $_SESSION['userinfo']['uid'];
75) }
76) $result = db_query("SELECT id,secret,failures FROM system.systemuser_totp WHERE uid=? AND (unlock_timestamp IS NULL OR unlock_timestamp<NOW())", [$uid]);
77) while ($tmp = $result->fetch()) {
78) $totp_id = $tmp['id'];
79) $secret = $tmp['secret'];
|
merge passkeys feature
Bernd Wurst authored 1 year ago
|
81) if (check_systemuser_blacklist($uid, $totp_id, $code)) {
82) DEBUG('Replay-Attack');
83) return false;
84) }
85)
86) $checkResult = $ga->verifyCode($secret, $code, 2); // 2 = 2*30sec clock tolerance
87) if ($checkResult) {
88) db_query("UPDATE system.systemuser_totp SET lastused=CURRENT_TIMESTAMP() WHERE id=?", [$totp_id]);
89) blacklist_systemuser_token($uid, $totp_id, $code);
90) DEBUG('OK');
91) } else {
92) DEBUG('TOTP-Code war falsch, checke gegen Restoretoken');
93) if ($code == totp_restoretoken($totp_id)) {
94) // Das Restoretoken wird als gültiges OTP anerkannt (eigentlich nicht okay aber einfacher)
95) return true;
96) }
97) if ($tmp['failures'] > 0 && $tmp['failures'] % 5 == 0) {
98) db_query("UPDATE system.systemuser_totp SET failures = failures+1, unlock_timestamp = NOW() + INTERVAL 5 MINUTE WHERE id=?", [$totp_id]);
99) } else {
100) db_query("UPDATE system.systemuser_totp SET failures = failures+1 WHERE id=?", [$totp_id]);
101) }
102) DEBUG('FAILED');
103) }
104) if ($checkResult) {
105) // Wenn einer stimmt, dann reicht uns das
106) return true;
107) }
108) }
109) }
110) return $checkResult;
111) }
112)
113) function save_totp_config($description)
114) {
115) if (!isset($_SESSION['totp_secret'])) {
116) system_failure("Session kaputt");
117) }
118) $args = [":uid" => $_SESSION['userinfo']['uid'], ":secret" => $_SESSION['totp_secret'], ":restoretoken" => random_string(30), ":description" => $description];
119) db_query("INSERT INTO system.systemuser_totp (description, uid, secret, restoretoken) VALUES (:description, :uid, :secret, :restoretoken)", $args);
120) unset($_SESSION['totp_secret']);
121) return db_insert_id();
122) }
123)
124) function totp_restoretoken($totp_id)
125) {
|