44 lines
2.0 KiB
PHP
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));
|