Merge branch 'main' into db-umbau

This commit is contained in:
2026-09-17 10:09:54 +02:00
4 changed files with 43 additions and 9 deletions
+29 -3
View File
@@ -105,6 +105,24 @@ try {
// request for create arguments
// ------------------------------------
// Passkeys anlegen darf nur ein angemeldeter Superadmin, der vorher in
// sites/userkeys.php eine gültige Einmal-Freigabe (addKey) eingelöst hat.
// Die Freigabe liegt in der Session und legt fest, für welchen Benutzer
// der Schlüssel gilt - die id aus der URL zählt nicht.
$passkeyFreigabe = null;
if (isset($_SESSION["passkey_freigabe"]) && $_SESSION["passkey_freigabe"]["bis"] >= time()
&& ($_SESSION["login"] ?? "") == "valid"
&& ((int)substr($_SESSION["rights"] ?? "", RIGHTS_SUPERADMIN, 1) & RIGHTS_CHANGE)) {
$passkeyFreigabe = $_SESSION["passkey_freigabe"];
}
if (($fn === 'getCreateArgs' || $fn === 'processCreate') && $passkeyFreigabe === null) {
throw new Exception('Keine Berechtigung, Passkeys anzulegen.');
}
if ($fn === 'queryFidoMetaDataService'
&& !(($_SESSION["login"] ?? "") == "valid" && ((int)substr($_SESSION["rights"] ?? "", RIGHTS_SUPERADMIN, 1) & RIGHTS_CHANGE))) {
throw new Exception('Keine Berechtigung.');
}
if ($fn === 'getCreateArgs') {
$createArgs = $WebAuthn->getCreateArgs(\hex2bin($userId), $userName, $userDisplayName, 60*4, $requireResidentKey, $userVerification, $crossPlatformAttachment);
@@ -179,10 +197,12 @@ try {
if (!isset($_SESSION['registrations']) || !array_key_exists('registrations', $_SESSION) || !is_array($_SESSION['registrations'])) {
$_SESSION['registrations'] = [];
}*/
if(!mysqli_query($dbconn,"INSERT INTO passkeys SET credentialId = '".base64_encode($data->credentialId)."', credentialPublicKey = '".base64_encode($data->credentialPublicKey)."', signatureCounter = '".base64_encode($data->signatureCounter)."', name = '".mysqli_real_escape_string($mysql,filter_input(INPUT_GET, 'name'))."', userId = '".mysqli_real_escape_string($mysql,filter_input(INPUT_GET, 'id'))."';")){
if(!mysqli_query($dbconn,"INSERT INTO passkeys SET credentialId = '".base64_encode($data->credentialId)."', credentialPublicKey = '".base64_encode($data->credentialPublicKey)."', signatureCounter = '".base64_encode($data->signatureCounter)."', name = '".mysqli_real_escape_string($mysql,filter_input(INPUT_GET, 'name'))."', userId = '".(int)$passkeyFreigabe["user"]."';")){
$msg = "Error:<br>".mysqli_error($dbconn)."<br />";
}
else{
// Freigabe gilt für genau einen Schlüssel
unset($_SESSION["passkey_freigabe"]);
if ($data->rootValid === false) {
$msg = 'registration ok, but certificate does not match any of the selected root ca. NO PROBLEM FOR THIS APP';
}
@@ -251,10 +271,16 @@ try {
$authKey = strval(random_int(0,99999999));
$result = mysqli_query($dbconn,"UPDATE passkeys SET authKey=".$authKey.", lastAuth=NOW() WHERE credentialId = '".base64_encode($id)."';");
$qry= mysqli_query($dbconn, "SELECT * FROM user WHERE id = '".mysqli_real_escape_string($dbconn,$userId)."'");
if(mysqli_num_rows($qry) == 1)
// Gesperrte Benutzer bleiben gesperrt, auch mit gültigem Passkey
$qry= mysqli_query($dbconn, "SELECT * FROM user WHERE id = '".mysqli_real_escape_string($dbconn,$userId)."' AND blocked = 0");
if(!$qry || mysqli_num_rows($qry) != 1)
{
throw new Exception('Benutzer nicht gefunden oder gesperrt.');
}
else
{
$udata = mysqli_fetch_assoc($qry);
session_regenerate_id(true);
$_SESSION["login"] = "valid";
$_SESSION["logedout"] = $udata["logedout"];
$_SESSION["user"] = $udata["id"];