getMessage(), $e->status, $e->errorCode, $e->extra); } catch (Throwable $e) { error_log('DBN tools login error: ' . $e->getMessage()); dbnToolsError('Caveau authentication is not available.', 503, 'auth_unavailable'); } if (!$user || !password_verify($password, (string)$user['password_hash'])) { dbnToolsError('Email or password was not accepted.', 401, 'invalid_credentials'); } $packageAccess = dbnToolsCanUsePackage((int)$client['id'], dbnToolsRequiredPackageSlug(), $db); if (empty($packageAccess['ok'])) { dbnToolsError( (string)$packageAccess['message'], (int)$packageAccess['status'], (string)$packageAccess['code'] ); } session_regenerate_id(true); $_SESSION['dbn_tools_authenticated'] = true; $_SESSION['dbn_tools_authenticated_at'] = time(); $_SESSION['dbn_tools_anon_id'] = $_SESSION['dbn_tools_anon_id'] ?? bin2hex(random_bytes(16)); $_SESSION['dbn_tools_client_id'] = (int)$client['id']; $_SESSION['dbn_tools_client_slug'] = (string)$client['slug']; $_SESSION['dbn_tools_user_id'] = (int)$user['id']; $_SESSION['dbn_tools_user_email'] = (string)$user['email']; $_SESSION['dbn_tools_user_role'] = (string)$user['role']; $_SESSION['dbn_tools_package_slug'] = dbnToolsRequiredPackageSlug(); dbnToolsRespond([ 'ok' => true, 'authenticated' => true, 'session' => dbnToolsAnonymousSessionId(), 'user' => [ 'email' => (string)$user['email'], 'role' => (string)$user['role'], ], ]);