Files
deskhub/DeskHub-Webseite/plugin_login.php
T
2026-10-30 21:50:25 +00:00

44 lines
2.0 KiB
PHP

<?php
/**
* plugin_login.php
*
* Gemeinsamer Einstieg für Kunden-Anmeldungen über Plugins (zum Beispiel authentik): GET ?p=<Plugin>&e=<Name>. Das Plugin braucht die
* Berechtigung "auth.customer" und meldet die Adresse mit plugin_register_customer_login() an. Hier steht nur, was für alle gleich ist:
* Weiterleitung, Anmeldung (und, wenn das Plugin es erlaubt, Anlegen des Kundenkontos), Fehler und Begrenzung der Aufrufe.
* Die Rückkehr vom Dienst kann auch über staff/plugin_login.php kommen (gleiche Rückkehr-Adresse für alle).
*/
require_once __DIR__ . '/includes/bootstrap.php';
header('Cache-Control: no-store');
header('Referrer-Policy: no-referrer');
function plugin_customer_login_back(string $message): never
{
flash('error', $message);
redirect('/login.php');
}
if (current_user()) redirect('/home.php');
$slug = (string) ($_GET['p'] ?? '');
$endpoint = (string) ($_GET['e'] ?? '');
$handler = plugin_state()['customer_logins'][$slug][$endpoint] ?? null;
if (!is_callable($handler)) {
http_response_code(404);
echo 'Unbekannte Anmelde-Adresse.';
exit;
}
if (!rate_limit_check('plugin_customer_login', client_ip(), 40, 15)) plugin_customer_login_back('Zu viele Anmeldeversuche. Bitte versuchen Sie es in einigen Minuten erneut.');
$result = plugin_guard($slug, fn() => $handler(['query' => $_GET, 'ip' => client_ip()]), null);
if (!is_array($result)) plugin_customer_login_back('Die Anmeldung ist gerade nicht möglich. Bitte versuchen Sie es später noch einmal oder melden Sie sich mit E-Mail und Passwort an.');
if (!empty($result['redirect'])) {
$url = (string) $result['redirect'];
if (!plugin_login_external_url_ok($url)) plugin_customer_login_back('Die Adresse des Anmeldedienstes ist ungültig.');
header('Location: ' . $url, true, 302);
exit;
}
if (!empty($result['customer']) && is_array($result['customer'])) plugin_customer_login_finish($slug, $result['customer']);
plugin_customer_login_back(mb_substr((string) ($result['error'] ?? 'Die Anmeldung wurde abgelehnt.'), 0, 300));