Calendarr direkt vom Server

Bisher las Onyx nur den Schnappschuss aus dem gemeinsamen Ordner. Der ist so
aktuell wie der letzte Start der Calendarr-App — wer sie eine Woche nicht
öffnet, sieht wochenalte Termine, und Onyx kann nichts dafür und nichts
dagegen. Der Live-Weg stand im Plan als „bewusst weggelassen, später ohne
Umbau nachrüstbar". Das stimmte: das Quellenprotokoll hat gehalten.

Ein einziger Aufruf genügt. /api/caldav/events fasst CalDAV-Konten, lokale
Kalender, Geburtstage, iCal-Abos und Google bereits zusammen — nachgebaut wird
nichts.

Angemeldet wird mit Adresse, Benutzername und Passwort statt mit einem Token,
und der Grund steht im Backend:

  auth.py:17   ACCESS_TOKEN_EXPIRE_MINUTES = 60 * 24 * 7   # 7 days

Ein eingetragenes Token wäre nach einer Woche tot. Onyx holt sich seines
deshalb selbst und erneuert es, bevor es abläuft — die Gültigkeit liest es aus
dem Token, statt sieben Tage anzunehmen; die stehen heute so im Server und
morgen vielleicht nicht mehr. Kommt trotzdem ein 401, wird einmal neu
angemeldet und der Abruf wiederholt.

Adresse und Benutzername stehen in den Einstellungen, das Passwort im
Schlüsselbund — `defaults read` ist keine Stelle, an der ein Passwort
mitgelesen werden soll. Geprüft wird beim Verbinden, nicht erst beim nächsten
Laden: ein Tippfehler, den man am Folgetag bemerkt, ist ein vermeidbarer.

Der Schnappschuss bleibt das Netz darunter. Ohne Zugangsdaten ändert sich
nichts, und ohne Netzwerk hält er, was Calendarr zuletzt geschrieben hat.
Nachgesehen wird am Server alle fünf Minuten statt alle zwei: ein Dateizugriff
kostet nichts, eine Anfrage über das Netz schon.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-08-14 13:34:57 +02:00
parent 3c36092712
commit e2b86c0216
6 changed files with 888 additions and 3 deletions

View File

@@ -1636,6 +1636,102 @@
}
}
},
"options.calendar.server.address": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Serveradresse"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Server address"
}
}
}
},
"options.calendar.server.connect": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Verbinden"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Connect"
}
}
}
},
"options.calendar.server.disconnect": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Trennen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Disconnect"
}
}
}
},
"options.calendar.server.hint": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Ohne Verbindung liest Onyx den Schnappschuss, den die Calendarr-App schreibt — der ist nur so aktuell wie ihr letzter Start."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Without a connection Onyx reads the snapshot the Calendarr app writes — only as current as its last launch."
}
}
}
},
"options.calendar.server.password": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Passwort"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Password"
}
}
}
},
"options.calendar.server.username": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Benutzername"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Username"
}
}
}
},
"options.calendar.source": {
"localizations": {
"de": {