fix: Neue Tabellen ins Backup, toter Transfer-Code raus
Sieben nutzereigene Tabellen aus den Migrationen 0015-0020 standen in keiner Backup-Liste. Am schwersten wiegt inbox_items: Der Eingang haelt fest, welche Zahlungen von aussen schon erfasst wurden. Fehlt er nach dem Wiedereinspielen, erkennt der naechste Kontoauszug sie nicht wieder und bucht sie ein zweites Mal – genau der Fehler, den die Tabelle verhindern soll. Aufgenommen: inbox_items, transfer_links, link_ignored, api_tokens. Bewusst nicht: mail_sources/mail_senders (tragen das verschluesselte IMAP-Passwort; ein Backup ist eine Datei, die man herumreicht) und pending_uploads (fluechtige Rohdateien). Beides steht begruendet im Code. Ein Test laeuft jetzt ueber Base.registry und fordert fuer jedes Modell mit owner_id eine bewusste Entscheidung – sichern oder begruendet ausnehmen. Genau diese Pruefung fehlte, weshalb die sieben unbemerkt durchrutschten. Dazu der tote Code aus dem Transfer-Ausbau: is_counterpart und braucht_ziel waren feste False, _apply_counterpart_amount damit unerreichbar. Die Tests sichern dieselbe Garantie jetzt ueber das tatsaechliche Verhalten. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -35,6 +35,7 @@ from ..branding import VERSION
|
||||
from ..models import (
|
||||
Account,
|
||||
AccountIdentifier,
|
||||
ApiToken,
|
||||
AppSetting,
|
||||
BudgetPeriod,
|
||||
BudgetPeriodLine,
|
||||
@@ -46,9 +47,12 @@ from ..models import (
|
||||
ExchangeRate,
|
||||
ImportBatch,
|
||||
ImportTemplate,
|
||||
InboxItem,
|
||||
LinkIgnored,
|
||||
PlannedIncomeLine,
|
||||
RecoveryCode,
|
||||
Transaction,
|
||||
TransferLink,
|
||||
User,
|
||||
UserSetting,
|
||||
)
|
||||
@@ -113,8 +117,39 @@ USER_TABLES: list[TableSpec] = [
|
||||
{"category_id": "categories"}, label="Schlagwortregeln"),
|
||||
TableSpec("user_settings", UserSetting, "user", has_id=False,
|
||||
label="Persönliche Einstellungen"),
|
||||
# Der Eingang MUSS mitgesichert werden: Er hält fest, welche Zahlungen
|
||||
# bereits von aussen erfasst wurden. Fehlt er nach dem Wiedereinspielen,
|
||||
# erkennt der nächste Kontoauszug sie nicht wieder und bucht sie ein
|
||||
# zweites Mal – genau der Fehler, den diese Tabelle verhindern soll.
|
||||
TableSpec("inbox_items", InboxItem, "owner", {
|
||||
"account_id": "accounts",
|
||||
"category_id": "categories",
|
||||
"transaction_id": "transactions",
|
||||
}, label="Eingang"),
|
||||
TableSpec("transfer_links", TransferLink, "owner",
|
||||
{"from_txn_id": "transactions", "to_txn_id": "transactions"},
|
||||
label="Übertrags-Verknüpfungen"),
|
||||
TableSpec("link_ignored", LinkIgnored, "owner",
|
||||
{"a_txn_id": "transactions", "b_txn_id": "transactions"},
|
||||
label="Abgelehnte Übertrags-Vorschläge"),
|
||||
# Ohne die Geräteschlüssel hört der Kurzbefehl auf dem Telefon nach einem
|
||||
# Wiedereinspielen stillschweigend auf zu funktionieren. Gesichert wird nur
|
||||
# der Hash – der Klartext existiert nirgends.
|
||||
TableSpec("api_tokens", ApiToken, "owner",
|
||||
{"default_account_id": "accounts"}, label="Geräteschlüssel"),
|
||||
]
|
||||
|
||||
# Bewusst NICHT gesichert:
|
||||
#
|
||||
# ``mail_sources``/``mail_senders`` – die Quelle trägt das verschlüsselte
|
||||
# IMAP-Passwort. Ein Backup ist eine Datei, die der Nutzer herumreicht; dort
|
||||
# gehört keine Zugangsdatei hinein, auch keine verschlüsselte. Nach einem
|
||||
# Wiedereinspielen richtet man das Postfach neu ein, das dauert zwei Minuten.
|
||||
#
|
||||
# ``pending_uploads`` – dort liegen rohe Dateien, die noch niemand geprüft hat.
|
||||
# Sie sind flüchtig, blähen ein JSON-Backup um Megabytes auf und lassen sich
|
||||
# jederzeit erneut vom Telefon schicken.
|
||||
|
||||
# Nur im systemweiten Backup, je Benutzer.
|
||||
SYSTEM_USER_TABLES: list[TableSpec] = [
|
||||
TableSpec("recovery_codes", RecoveryCode, "user", label="Wiederherstellungscodes"),
|
||||
|
||||
Reference in New Issue
Block a user