From 04476a0baecf031c0d27bcfce81fe8f11eb35ab8 Mon Sep 17 00:00:00 2001 From: Alexander Schmidt Date: Sun, 8 Feb 2026 14:19:17 +0100 Subject: [PATCH] feat: add delete all local data option in settings with keypair destruction --- js/components/pages/page-settings.js | 19 +++++++++++++++++++ js/services/auth.js | 24 ++++++++++++++++++++++++ js/services/crypto.js | 6 ++++++ locales/de.json | 6 +++++- locales/en.json | 6 +++++- locales/es.json | 6 +++++- locales/fr.json | 6 +++++- locales/it.json | 6 +++++- locales/pt.json | 6 +++++- locales/ru.json | 6 +++++- 10 files changed, 84 insertions(+), 7 deletions(-) diff --git a/js/components/pages/page-settings.js b/js/components/pages/page-settings.js index dd569cc..6e42690 100644 --- a/js/components/pages/page-settings.js +++ b/js/components/pages/page-settings.js @@ -85,6 +85,15 @@ class PageSettings extends HTMLElement { } }) + // Delete all local data + this.querySelector('#clear-all-data')?.addEventListener('click', async () => { + if (confirm(t('settings.confirmDeleteAll'))) { + await auth.clearAllData() + window.location.hash = '#/' + window.location.reload() + } + }) + // Toggle UUID visibility this.querySelector('#toggle-uid-btn')?.addEventListener('click', () => { this.uidVisible = !this.uidVisible @@ -292,6 +301,16 @@ class PageSettings extends HTMLElement { ${t('settings.clear')} + +
+
+ +

${t('settings.deleteAllDataHint')}

+
+ +
diff --git a/js/services/auth.js b/js/services/auth.js index 66a6e2c..ad656b9 100644 --- a/js/services/auth.js +++ b/js/services/auth.js @@ -149,6 +149,30 @@ class AuthService { this.notifyListeners() } + /** + * Clears all local data (tokens, keys, caches, preferences) + */ + async clearAllData() { + await this.logout() + cryptoService.destroyKeyPair() + + const keysToRemove = [] + for (let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i) + if (key && key.startsWith('dgray_')) keysToRemove.push(key) + } + keysToRemove.forEach(k => localStorage.removeItem(k)) + + localStorage.removeItem('searchFilters') + localStorage.removeItem('locale') + localStorage.removeItem('theme') + + for (let i = sessionStorage.length - 1; i >= 0; i--) { + const key = sessionStorage.key(i) + if (key && key.startsWith('dgray_')) sessionStorage.removeItem(key) + } + } + /** * Reset preferences to defaults on logout */ diff --git a/js/services/crypto.js b/js/services/crypto.js index a99fe26..82ba6fa 100644 --- a/js/services/crypto.js +++ b/js/services/crypto.js @@ -140,6 +140,12 @@ class CryptoService { this.keyPair = null } + destroyKeyPair() { + this.keyPair = null + localStorage.removeItem(STORAGE_KEY) + localStorage.removeItem(SALT_KEY) + } + getPublicKey() { if (!this.keyPair) return null return this.naclUtil.encodeBase64(this.keyPair.publicKey) diff --git a/locales/de.json b/locales/de.json index 2d076d2..0d3918f 100644 --- a/locales/de.json +++ b/locales/de.json @@ -278,7 +278,11 @@ "searchCleared": "Suchverlauf gelöscht", "about": "Über", "currency": "Währung", - "currencyChanged": "Währung geändert" + "currencyChanged": "Währung geändert", + "deleteAllData": "Alle lokalen Daten löschen", + "deleteAllDataHint": "Entfernt alle gespeicherten Daten aus diesem Browser, einschließlich Verschlüsselungsschlüssel, Favoriten und Einstellungen. Chat-Verläufe können nicht wiederhergestellt werden.", + "deleteAll": "Alles löschen", + "confirmDeleteAll": "Alle lokalen Daten löschen? Verschlüsselungsschlüssel gehen verloren und Chat-Nachrichten können nicht wiederhergestellt werden." }, "notifications": { "title": "Benachrichtigungen", diff --git a/locales/en.json b/locales/en.json index 1a91a88..b773ea9 100644 --- a/locales/en.json +++ b/locales/en.json @@ -278,7 +278,11 @@ "searchCleared": "Search history deleted", "about": "About", "currency": "Currency", - "currencyChanged": "Currency changed" + "currencyChanged": "Currency changed", + "deleteAllData": "Delete all local data", + "deleteAllDataHint": "Removes all saved data from this browser including encryption keys, favorites, and preferences. Chat history cannot be recovered.", + "deleteAll": "Delete all", + "confirmDeleteAll": "Delete all local data? Encryption keys will be lost and chat messages cannot be recovered." }, "notifications": { "title": "Notifications", diff --git a/locales/es.json b/locales/es.json index 861117e..865e756 100644 --- a/locales/es.json +++ b/locales/es.json @@ -278,7 +278,11 @@ "searchCleared": "Historial de búsqueda eliminado", "about": "Acerca de", "currency": "Moneda", - "currencyChanged": "Moneda cambiada" + "currencyChanged": "Moneda cambiada", + "deleteAllData": "Eliminar todos los datos locales", + "deleteAllDataHint": "Elimina todos los datos guardados de este navegador, incluidas las claves de cifrado, favoritos y preferencias. El historial de chat no se puede recuperar.", + "deleteAll": "Eliminar todo", + "confirmDeleteAll": "¿Eliminar todos los datos locales? Las claves de cifrado se perderán y los mensajes no se podrán recuperar." }, "notifications": { "title": "Notificaciones", diff --git a/locales/fr.json b/locales/fr.json index c0bf23b..b99a499 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -278,7 +278,11 @@ "searchCleared": "Historique de recherche supprimé", "about": "À propos", "currency": "Devise", - "currencyChanged": "Devise modifiée" + "currencyChanged": "Devise modifiée", + "deleteAllData": "Supprimer toutes les données locales", + "deleteAllDataHint": "Supprime toutes les données enregistrées de ce navigateur, y compris les clés de chiffrement, les favoris et les préférences. L'historique des conversations ne peut pas être récupéré.", + "deleteAll": "Tout supprimer", + "confirmDeleteAll": "Supprimer toutes les données locales ? Les clés de chiffrement seront perdues et les messages ne pourront pas être récupérés." }, "notifications": { "title": "Notifications", diff --git a/locales/it.json b/locales/it.json index 4bb9006..6ec4b98 100644 --- a/locales/it.json +++ b/locales/it.json @@ -278,7 +278,11 @@ "searchCleared": "Cronologia ricerche eliminata", "about": "Informazioni", "currency": "Valuta", - "currencyChanged": "Valuta cambiata" + "currencyChanged": "Valuta cambiata", + "deleteAllData": "Elimina tutti i dati locali", + "deleteAllDataHint": "Rimuove tutti i dati salvati da questo browser, incluse le chiavi di crittografia, i preferiti e le impostazioni. La cronologia delle chat non può essere recuperata.", + "deleteAll": "Elimina tutto", + "confirmDeleteAll": "Eliminare tutti i dati locali? Le chiavi di crittografia andranno perse e i messaggi non potranno essere recuperati." }, "notifications": { "title": "Notifiche", diff --git a/locales/pt.json b/locales/pt.json index 6110bd0..407a1d0 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -278,7 +278,11 @@ "searchCleared": "Histórico de busca excluído", "about": "Sobre", "currency": "Moeda", - "currencyChanged": "Moeda alterada" + "currencyChanged": "Moeda alterada", + "deleteAllData": "Excluir todos os dados locais", + "deleteAllDataHint": "Remove todos os dados salvos deste navegador, incluindo chaves de criptografia, favoritos e preferências. O histórico de conversas não pode ser recuperado.", + "deleteAll": "Excluir tudo", + "confirmDeleteAll": "Excluir todos os dados locais? As chaves de criptografia serão perdidas e as mensagens não poderão ser recuperadas." }, "notifications": { "title": "Notificações", diff --git a/locales/ru.json b/locales/ru.json index a80810e..2a60ea3 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -278,7 +278,11 @@ "searchCleared": "История поиска удалена", "about": "О приложении", "currency": "Валюта", - "currencyChanged": "Валюта изменена" + "currencyChanged": "Валюта изменена", + "deleteAllData": "Удалить все локальные данные", + "deleteAllDataHint": "Удаляет все сохранённые данные из этого браузера, включая ключи шифрования, избранное и настройки. История чата не может быть восстановлена.", + "deleteAll": "Удалить всё", + "confirmDeleteAll": "Удалить все локальные данные? Ключи шифрования будут утеряны, а сообщения чата невозможно будет восстановить." }, "notifications": { "title": "Уведомления",