feat(messages): E2EE real-time messaging UI + system welcome
A Messages tab in the notification center (hidden for demo): set up secure messaging with a passphrase (key generated + wrapped in-browser via WebCrypto, stored non-extractable per device), unlock on other devices, then chat with end-to-end encrypted, live-delivered messages. The server-authored Siftlode welcome is readable before any key setup. - lib/e2ee.ts: ECDH P-256 + HKDF + AES-GCM, PBKDF2-wrapped key, IndexedDB. - lib/messagesSocket.ts: WebSocket client with backoff reconnect. - Messages.tsx: key gate, conversation list with decrypted previews, directory, thread with client-side decrypt + encrypt-on-send. Unread feeds the nav badge. EN/HU/DE strings.
This commit is contained in:
parent
002a79949b
commit
2f0ca68e8a
13 changed files with 943 additions and 6 deletions
|
|
@ -2,6 +2,7 @@
|
|||
"navLabel": "Benachrichtigungen",
|
||||
"title": "Benachrichtigungen",
|
||||
"subtitle": "Neuigkeiten aus deiner Bibliothek und vom System.",
|
||||
"tabInbox": "Benachrichtigungen",
|
||||
"empty": "Alles erledigt.",
|
||||
"markAllRead": "Alle als gelesen markieren",
|
||||
"clearAll": "Alle löschen",
|
||||
|
|
|
|||
29
frontend/src/i18n/locales/de/messages.json
Normal file
29
frontend/src/i18n/locales/de/messages.json
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"tab": "Nachrichten",
|
||||
"conversations": "Unterhaltungen",
|
||||
"new": "Neue Nachricht",
|
||||
"newTitle": "Neue Nachricht",
|
||||
"empty": "Noch keine Unterhaltungen. Starte eine über die Schaltfläche „Neue Nachricht“.",
|
||||
"searchPeople": "Personen suchen…",
|
||||
"noPeople": "Noch niemand zum Schreiben.",
|
||||
"threadEmpty": "Noch keine Nachrichten — sag Hallo.",
|
||||
"writePlaceholder": "Nachricht schreiben…",
|
||||
"send": "Senden",
|
||||
"encrypted": "Verschlüsselte Nachricht",
|
||||
"encryptedHint": "Ende-zu-Ende-verschlüsselt",
|
||||
"cantDecrypt": "Kann nicht entschlüsselt werden",
|
||||
"systemReadOnly": "Dies ist eine automatische Nachricht.",
|
||||
"setupTitle": "Sichere Nachrichten einrichten",
|
||||
"setupBody": "Nachrichten sind Ende-zu-Ende-verschlüsselt. Wähle ein Passwort zum Schutz deines Schlüssels — er verlässt nie dein Gerät, sodass niemand (nicht einmal ein Admin) deine Unterhaltungen lesen kann.",
|
||||
"setupWarn": "Wenn du dieses Passwort vergisst, kann dein Nachrichtenverlauf nicht wiederhergestellt werden.",
|
||||
"setUp": "Einrichten",
|
||||
"unlockTitle": "Nachrichten entsperren",
|
||||
"unlockBody": "Gib dein Nachrichten-Passwort ein, um deine Unterhaltungen auf diesem Gerät zu entsperren.",
|
||||
"unlock": "Entsperren",
|
||||
"passphrase": "Passwort",
|
||||
"passphraseConfirm": "Passwort bestätigen",
|
||||
"passTooShort": "Mindestens 6 Zeichen verwenden.",
|
||||
"passMismatch": "Die Passwörter stimmen nicht überein.",
|
||||
"wrongPass": "Falsches Passwort.",
|
||||
"setupFailed": "Sichere Nachrichten konnten nicht eingerichtet werden. Bitte erneut versuchen."
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
"navLabel": "Notifications",
|
||||
"title": "Notifications",
|
||||
"subtitle": "Updates from your library and the system.",
|
||||
"tabInbox": "Notifications",
|
||||
"empty": "You're all caught up.",
|
||||
"markAllRead": "Mark all read",
|
||||
"clearAll": "Clear all",
|
||||
|
|
|
|||
29
frontend/src/i18n/locales/en/messages.json
Normal file
29
frontend/src/i18n/locales/en/messages.json
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"tab": "Messages",
|
||||
"conversations": "Conversations",
|
||||
"new": "New message",
|
||||
"newTitle": "New message",
|
||||
"empty": "No conversations yet. Start one with the New message button.",
|
||||
"searchPeople": "Search people…",
|
||||
"noPeople": "No one to message yet.",
|
||||
"threadEmpty": "No messages yet — say hello.",
|
||||
"writePlaceholder": "Write a message…",
|
||||
"send": "Send",
|
||||
"encrypted": "Encrypted message",
|
||||
"encryptedHint": "End-to-end encrypted",
|
||||
"cantDecrypt": "Can't decrypt",
|
||||
"systemReadOnly": "This is an automated message.",
|
||||
"setupTitle": "Set up secure messaging",
|
||||
"setupBody": "Messages are end-to-end encrypted. Choose a passphrase to protect your key — it never leaves your device, so no one (not even an admin) can read your conversations.",
|
||||
"setupWarn": "If you forget this passphrase, your message history can't be recovered.",
|
||||
"setUp": "Set up",
|
||||
"unlockTitle": "Unlock messaging",
|
||||
"unlockBody": "Enter your message passphrase to unlock your conversations on this device.",
|
||||
"unlock": "Unlock",
|
||||
"passphrase": "Passphrase",
|
||||
"passphraseConfirm": "Confirm passphrase",
|
||||
"passTooShort": "Use at least 6 characters.",
|
||||
"passMismatch": "The passphrases don't match.",
|
||||
"wrongPass": "Wrong passphrase.",
|
||||
"setupFailed": "Couldn't set up secure messaging. Please try again."
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
"navLabel": "Értesítések",
|
||||
"title": "Értesítések",
|
||||
"subtitle": "Frissítések a könyvtáradból és a rendszertől.",
|
||||
"tabInbox": "Értesítések",
|
||||
"empty": "Nincs új értesítés.",
|
||||
"markAllRead": "Összes olvasott",
|
||||
"clearAll": "Összes törlése",
|
||||
|
|
|
|||
29
frontend/src/i18n/locales/hu/messages.json
Normal file
29
frontend/src/i18n/locales/hu/messages.json
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"tab": "Üzenetek",
|
||||
"conversations": "Beszélgetések",
|
||||
"new": "Új üzenet",
|
||||
"newTitle": "Új üzenet",
|
||||
"empty": "Még nincs beszélgetés. Indíts egyet az Új üzenet gombbal.",
|
||||
"searchPeople": "Emberek keresése…",
|
||||
"noPeople": "Még nincs kinek üzenni.",
|
||||
"threadEmpty": "Még nincs üzenet — köszönj be.",
|
||||
"writePlaceholder": "Írj egy üzenetet…",
|
||||
"send": "Küldés",
|
||||
"encrypted": "Titkosított üzenet",
|
||||
"encryptedHint": "Végpontig titkosítva",
|
||||
"cantDecrypt": "Nem fejthető vissza",
|
||||
"systemReadOnly": "Ez egy automatikus üzenet.",
|
||||
"setupTitle": "Biztonságos üzenetküldés beállítása",
|
||||
"setupBody": "Az üzenetek végpontig titkosítottak. Válassz egy jelszót a kulcsod védelméhez — sosem hagyja el az eszközödet, így senki (még az admin sem) olvashatja a beszélgetéseidet.",
|
||||
"setupWarn": "Ha elfelejted ezt a jelszót, az üzenet-előzményeid nem állíthatók helyre.",
|
||||
"setUp": "Beállítás",
|
||||
"unlockTitle": "Üzenetküldés feloldása",
|
||||
"unlockBody": "Add meg az üzenet-jelszavadat a beszélgetéseid feloldásához ezen az eszközön.",
|
||||
"unlock": "Feloldás",
|
||||
"passphrase": "Jelszó",
|
||||
"passphraseConfirm": "Jelszó megerősítése",
|
||||
"passTooShort": "Legalább 6 karakter legyen.",
|
||||
"passMismatch": "A jelszavak nem egyeznek.",
|
||||
"wrongPass": "Hibás jelszó.",
|
||||
"setupFailed": "A biztonságos üzenetküldés beállítása nem sikerült. Próbáld újra."
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue