Absenderpruefung bei PayPal-Mails entfernen

This commit is contained in:
2026-08-22 00:03:48 +02:00
parent 43d0fc5578
commit a0d8c62082
6 changed files with 78 additions and 52 deletions
+17 -14
View File
@@ -153,14 +153,14 @@ function paypal_match_participant(PDO $pdo, int $tenantId, string $payerName, ?s
}
/**
* Stammt die Mail wirklich von PayPal? Geprueft wird die Domain der
* Absenderadresse - inklusive Landesvarianten (paypal.at, paypal.co.uk) und
* Versand-Subdomains (e.paypal.de), die PayPal tatsaechlich benutzt.
* Sieht der Absender nach PayPal aus? Erkennt Landesvarianten (paypal.at,
* paypal.co.uk) und Versand-Subdomains (e.paypal.de); der Vergleich haengt
* am Ende der Domain, "paypal.de.beispiel.com" ist also kein PayPal.
*
* Der Vergleich haengt bewusst am Ende der Domain: "paypal.de.beispiel.com"
* ist NICHT PayPal, wuerde bei einer simplen Textsuche nach "@paypal.de"
* aber durchrutschen - und damit koennte jemand mit Kenntnis der
* Eingangsadresse Zahlungen erfinden.
* Nur zur Anzeige in der Diagnose (check-imap-support.php): die
* Verarbeitung prueft den Absender bewusst nicht, weil Zahlungsmails auch
* ueber manuelle Weiterleitungen ankommen. Massgeblich ist die
* Empfangsadresse.
*/
function paypal_from_is_paypal(string $fromHeader): bool
{
@@ -381,19 +381,22 @@ function paypal_preview(PDO $pdo, int $tenantId, array $parsed): array
}
/**
* Verarbeitet eine rohe PayPal-Mail vollstaendig: Tenant per Plus-Token,
* Absenderpruefung, Parsing, Abgleich. Fuer den IMAP-Cron und Tests.
* Verarbeitet eine rohe PayPal-Mail vollstaendig: Mandant per Plus-Token der
* Empfangsadresse, Parsing, Abgleich. Fuer den IMAP-Cron und Tests.
*
* Der Absender wird nicht ausgewertet - siehe Kommentar im Rumpf.
*
* @param string $recipient Empfaengeradresse mit Plus-Token
* @param string $fromHeader From-Header der Mail
* @param string $rawBody (dekodierter) Mail-Body
* @return array{status:string, tenant_id?:int}
*/
function paypal_process_raw(PDO $pdo, string $recipient, string $fromHeader, string $rawBody, bool $previewOnly = false): array
function paypal_process_raw(PDO $pdo, string $recipient, string $rawBody, bool $previewOnly = false): array
{
if (!paypal_from_is_paypal($fromHeader)) {
return ['status' => 'not_from_paypal'];
}
// Der Absender wird bewusst nicht geprueft: Zahlungsmails erreichen die
// Kaffeeliste auch ueber manuelle Weiterleitungen, und dann steht dort
// die Adresse des Weiterleitenden statt PayPal. Massgeblich ist allein
// die Empfangsadresse - ihr Token bestimmt den Mandanten und ist damit
// zugleich das Geheimnis, das den Zugang schuetzt.
$token = paypal_inbox_extract_token($recipient);
if ($token === null) {
return ['status' => 'no_token'];