Servers like Postfix with Dovecot SASL or Exchange can fail PLAIN with 451 4.3.2 but accept LOGIN. MindSift now uses LOGIN directly when it is the only mechanism, and otherwise reconnects and retries with LOGIN after a refused PLAIN (net/smtp closes the connection on a failed AUTH). If both fail with 451, the error names both attempts and points to the server's SASL backend. LOGIN, like PLAIN, is never sent unencrypted to remote hosts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5.8 KiB
Modul: Aufgaben, Kanban & Alarme
Code: TasksView.tsx, TaskDetailModal.tsx, ManageColumnsModal.tsx; Backend: handleUpdateThought, handleReorderTasks, *TaskList*-Handler, startAlarmTicker.
Datenmodell
Eine Aufgabe ist ein thought (database.md) mit kanbanStatus, priority (low/normal/high/urgent), dueDate (nur Datum), notes (Markdown), subtasks ([{id, title, isCompleted}]), tags, taskListId, sortOrder und assignees (Benutzer-IDs). Aufgaben ohne Liste sind persönlich.
Ansichten
- Liste mit Filtern (offen, erledigt, Papierkorb), Gruppierung (z. B. nach Status oder Fälligkeit), Sortierung und Hashtag-Filter.
- Kanban: Spalten pro Liste frei konfigurierbar (Name, Farbe, „Erledigt“-Spalte). Standard: Zu erledigen, In Bearbeitung, Wartet auf andere, Erledigt. Eine Karte in eine „Erledigt“-Spalte zu ziehen setzt
isCompleted. - Drag & Drop sortiert in der Liste und zwischen Spalten; ein Klick öffnet das Detail-Fenster (Titel, Status, Priorität, Fälligkeit mit Schnellwahl, Liste, Hashtags, Unteraufgaben mit Fortschrittsbalken, Notizen).
- Aufgaben lassen sich in eine Notiz umwandeln („Als Notiz vertiefen“). Aufgaben aus Notiz-Checkboxen (
enhanced-task) bleiben verknüpft: Abhaken wirkt in beide Richtungen (SyncDocBlockAndTask), „In Notiz öffnen“ springt zum Block.
Aufgabenlisten und Freigabe
- Jede Liste hat Eigentümer, Titel, Symbol, Farbe und eigene Kanban-Spalten.
- Freigabe an Gruppen oder Benutzer über den Dialog
UnifiedShareModal(Stufe pro Freigabe):- Bearbeiter: darf Aufgaben anlegen, ändern, abhaken, verschieben, löschen sowie Liste umbenennen und Spalten ändern.
- Leser: sieht alles, kann nichts ändern. Der Server antwortet mit
403; die Oberfläche blendet Eingaben aus und zeigt „Nur Lesen“. - Gruppenmitglieder mit mehreren Wegen erhalten die höchste Stufe. Nur der Eigentümer legt Freigaben an oder entfernt sie und kann die Liste löschen.
- Umsetzung:
Store.GetTaskListPermissionliefertowner/editor/viewer/"";ensureTaskListWritableschützt Schreibpfade. - Zuweisen (nur in geteilten Listen, also mit mindestens einer Person außer dem Eigentümer): Im Detail-Fenster unter „Zugewiesen“ lassen sich eine oder mehrere Personen mit Zugriff auf die Liste zuweisen, über die einheitliche Personensuche (ui-patterns.md). Zuweisen dürfen Eigentümer und Bearbeiter. Zeilen und Kanban-Karten zeigen die Zugewiesenen als Profilbild-Stapel.
- Gespeichert in
task_assignees;PATCH /thoughts/{id}mitassigneesersetzt die Liste. Der Server lehnt Personen ohne Zugriff ab (403,storage.ErrAssigneeNoAccess). - Zuweisungen folgen den Rechten:
Store.PruneTaskAssigneesentfernt jede Zuweisung, deren Person die Liste nicht mehr sehen kann. Es läuft nach Entfernen einer Freigabe, Austritt aus oder Entfernen aus einer Gruppe, Löschen einer Gruppe, Löschen der Liste und Verschieben der Aufgabe in eine andere oder keine Liste; beim Löschen eines Kontos werden dessen Zuweisungen direkt gelöscht. Wer über einen zweiten Weg (z. B. direkt und über eine Gruppe) weiter Zugriff hat, bleibt zugewiesen.
- Gespeichert in
- Wer sehen und zuweisen kann, hängt außerdem von der Sichtbarkeit ab: Verliert jemand sie (z. B. Wechsel der Organisation), fallen Freigabe und Zuweisungen weg (sharing-and-permissions.md).
- Bekannte Lücke: FLAW-03 (Umsortieren per ID).
Alarme
Der Ticker läuft jede Minute (architecture.md). Für offene Aufgaben mit due_date <= heute und alarm_sent = 0 sendet er an die Kanäle des Aufgaben-Eigentümers:
| Kanal | Ziel | Konfiguration |
|---|---|---|
alarmEmail (sonst Konto-Adresse) |
SMTP aus Admin-Einstellungen oder Umgebung, siehe unten | |
| Discord | Webhook-URL | Benutzereinstellungen |
| Webhook | beliebige URL (JSON: event, title, notes, dueDate, priority, timestamp) |
Benutzereinstellungen |
Danach wird alarm_sent = 1 gesetzt, sobald mindestens ein Kanal erfolgreich war.
E-Mail-Versand (mail.go) führt den SMTP-Dialog Schritt für Schritt:
- Verbindung (Port 465: TLS von Anfang an),
EHLOmit der Domain der Absenderadresse (nielocalhost, das lehnen strenge Server ab), beiSMTP_TLSPflicht-STARTTLS, Anmeldung,MAIL FROM,RCPT TO, Daten. - Anmeldung:
AUTH PLAIN; bietet der Server nurLOGINan, direktAUTH LOGIN. Lehnt er PLAIN ab und bietet auch LOGIN an, baut MindSift die Verbindung neu auf und versuchtAUTH LOGIN(Go schließt die Verbindung nach einem gescheiterten AUTH). Scheitern beide mit451, nennt die Meldung beide Versuche und verweist auf das SASL-Backend des Mailservers (z. B. Dovecot-Auth), denn dann liegt der Fehler dort. Nie unverschlüsselt an fremde Hosts. SMTP_FROMdarf einen Namen enthalten (MindSift <alarm@domain>): im Umschlag steht nur die Adresse, im Header Name und Adresse.- Die Nachricht hat
DateundMessage-ID, einen nach RFC 2047 kodierten Betreff (Umlaute, Emoji) und einen Quoted-Printable-Text. SMTP_SKIP_VERIFY/ Schalter „Zertifikatsprüfung deaktivieren“ akzeptiert selbstsignierte Zertifikate (Verbindung bleibt verschlüsselt).- Fehler nennen den Schritt, an dem der Server abgelehnt hat (z. B.
SMTP-Schritt RCPT TO fehlgeschlagen: 451 …), im Log alssmtp_step. Test:internal/api/mail_test.gomit einem Fake-Server (STARTTLS, 451).
Einschränkungen (FLAW-12): Fälligkeiten haben keine Uhrzeit, notifyBeforeMinutes wird ignoriert, die Serverzeit gilt, und ein verschobener Termin löst nicht erneut aus. URLs werden nicht geprüft (FLAW-05).