dbFields = ['ssoLabel'=>'Pocket ID', 'issuer'=>'', 'clientId'=>'', 'clientSecret'=>'']; } public function form() { $html = '

Chaque utilisateur gère ses facteurs dans Sécurité de mon compte.

'; foreach (['ssoLabel'=>'Nom du SSO (Se connecter avec …)', 'issuer'=>'URL HTTPS de Pocket ID / issuer OIDC', 'clientId'=>'Client ID', 'clientSecret'=>'Client secret'] as $key=>$label) { $html .= '
'; } return $html.'

Secret vide : conserver le secret existant. URI de retour OIDC : '.htmlspecialchars(DOMAIN_ADMIN.'login?bs=oidc').'. Aucun compte n’est associé automatiquement par e-mail : chaque utilisateur lie son identité depuis son espace personnel.

'; } public function post() { if (empty($_POST['clientSecret'])) { unset($_POST['clientSecret']); } $issuer = trim($_POST['issuer'] ?? ''); if ($issuer !== '' && (parse_url($issuer, PHP_URL_SCHEME) !== 'https' || parse_url($issuer, PHP_URL_USER) || parse_url($issuer, PHP_URL_QUERY) || parse_url($issuer, PHP_URL_FRAGMENT))) { return false; } return parent::post(); } /** Runs while plugins are built, BEFORE Bludit's AJAX dispatch and native login. */ public function prepare() { global $url; if ($url->whereAmI() !== 'admin') { return; } try { require_once __DIR__.'/vendor/autoload.php'; require_once __DIR__.'/src/Store.php'; require_once __DIR__.'/src/Totp.php'; require_once __DIR__.'/src/App.php'; (new \BluditSecure\App($this))->run(); } catch (\Throwable $e) { error_log('bludit-secure: '.get_class($e).' '.$e->getMessage()); http_response_code(503); header('Cache-Control: no-store'); exit('Bludit Secure indisponible. Consulter les journaux du serveur.'); } } public function adminSidebar() { return 'Sécurité de mon compte'; } }