fix: Automatischer Abruf lief gegen die Abfragegrenze der Banken
"Weniger als 15 Minuten lassen die Banken nicht zu" stand als Hinweis im Formular. Das war erfunden. PSD2 verpflichtet die Banken zu VIER unbeaufsichtigten Abfragen je Konto und Tag – haeufiger duerfen sie ablehnen, und N26 tut es: "Too many requests", und der Abruf scheitert, bis das Zeitfenster weiterrueckt. Bei zehn angebundenen Konten und einem Takt von 15 Minuten waren es tausende Anfragen am Tag. Der Takt betraegt jetzt mindestens sechs Stunden, also genau die zugesicherten vier je Tag. Bestehende, zu knappe Einstellungen werden beim Faelligkeitspruefen mitgebremst – sonst liefe eine gespeicherte 15 weiter dagegen. Von Hand abrufen bleibt unbegrenzt: Dabei sitzt der Nutzer davor, und fuer diesen Fall gilt die Grenze nicht. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -45,6 +45,12 @@ log = logging.getLogger(__name__)
|
||||
ZUSTIMMUNG_TAGE = 180
|
||||
# Wie weit jeder weitere Abruf hinter den letzten zurueckgreift.
|
||||
RUECKGRIFF_TAGE = 7
|
||||
# Kuerzester Takt fuer den automatischen Abruf. PSD2 verpflichtet die Banken zu
|
||||
# VIER unbeaufsichtigten Abfragen je Konto und Tag – haeufiger duerfen sie
|
||||
# ablehnen, und N26 tut das ("Too many requests"). Sechs Stunden sind genau
|
||||
# diese vier. Von Hand abrufen darf man weiterhin so oft man will: Dabei sitzt
|
||||
# der Nutzer davor, und dafuer gilt die Grenze nicht.
|
||||
MIN_TAKT_MINUTEN = 360
|
||||
# Ab wann gewarnt wird, dass neu autorisiert werden muss. Läuft die Zustimmung
|
||||
# ab, hört der Abruf sonst stumm auf – dieselbe Falle wie „0 neu" ohne Grund.
|
||||
WARNUNG_TAGE = 14
|
||||
@@ -777,10 +783,13 @@ def faellig(verbindung: BankConnection, jetzt: datetime) -> bool:
|
||||
"""
|
||||
if not verbindung.poll_minutes:
|
||||
return False
|
||||
# Auch aeltere, zu knapp eingestellte Werte werden hier gebremst – sonst
|
||||
# liefe eine bestehende Einstellung von 15 Minuten weiter gegen die Grenze.
|
||||
takt = max(verbindung.poll_minutes, MIN_TAKT_MINUTEN)
|
||||
zuletzt = _mit_zeitzone(verbindung.last_sync_at)
|
||||
if zuletzt is None:
|
||||
return True
|
||||
return zuletzt + timedelta(minutes=verbindung.poll_minutes) <= jetzt
|
||||
return zuletzt + timedelta(minutes=takt) <= jetzt
|
||||
|
||||
|
||||
def abruf_mit_fehlerbehandlung(db: Session, user: User,
|
||||
|
||||
Reference in New Issue
Block a user