From e4516f3d193e335ca5ca50d1a483898cb7500bb1 Mon Sep 17 00:00:00 2001 From: LC mac Date: Fri, 30 Jan 2026 00:35:00 +0800 Subject: [PATCH] chore: bump version to 1.4.0 --- src/App.tsx | 54 +++++++++++++++++++++-------------------------------- 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 2d8295b..549e7d6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,7 +6,6 @@ import { CheckCircle2, Lock, AlertCircle, Unlock, - Eye, EyeOff, FileKey, Info, @@ -17,7 +16,6 @@ import { QrDisplay } from './components/QrDisplay'; import QRScanner from './components/QRScanner'; import { validateBip39Mnemonic } from './lib/bip39'; import { buildPlaintext, encryptToSeedPgp, decryptSeedPgp } from './lib/seedpgp'; -import type { SeedPgpPlaintext } from './lib/types'; import * as openpgp from 'openpgp'; import { StorageIndicator } from './components/StorageIndicator'; import { SecurityWarnings } from './components/SecurityWarnings'; @@ -40,10 +38,9 @@ import { getSessionKey, encryptJsonToBlob, destroySessionKey, EncryptedBlob } fr const [qrPayload, setQrPayload] = useState(''); const [recipientFpr, setRecipientFpr] = useState(''); const [restoreInput, setRestoreInput] = useState(''); - const [restoredData, setRestoredData] = useState(null); + const [decryptedRestoredMnemonic, setDecryptedRestoredMnemonic] = useState(null); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); - const [showMnemonic, setShowMnemonic] = useState(false); const [copied, setCopied] = useState(false); const [showQRScanner, setShowQRScanner] = useState(false); const [isReadOnly, setIsReadOnly] = useState(false); @@ -60,7 +57,7 @@ import { getSessionKey, encryptJsonToBlob, destroySessionKey, EncryptedBlob } fr setPrivateKeyPassphrase(''); setQrPayload(''); setRestoreInput(''); - setRestoredData(null); + setDecryptedRestoredMnemonic(null); setError(''); } }, [isReadOnly]); @@ -138,7 +135,7 @@ import { getSessionKey, encryptJsonToBlob, destroySessionKey, EncryptedBlob } fr const handleRestore = async () => { setLoading(true); setError(''); - setRestoredData(null); + setDecryptedRestoredMnemonic(null); try { const result = await decryptSeedPgp({ @@ -148,8 +145,17 @@ import { getSessionKey, encryptJsonToBlob, destroySessionKey, EncryptedBlob } fr messagePassword: restoreMessagePassword || undefined, }); + // Encrypt the restored mnemonic with the session key + await getSessionKey(); + const blob = await encryptJsonToBlob({ mnemonic: result.w, timestamp: Date.now() }); + setEncryptedMnemonicCache(blob); + + // Temporarily display the mnemonic and then clear it + setDecryptedRestoredMnemonic(result.w); + setTimeout(() => { + setDecryptedRestoredMnemonic(null); + }, 10000); // Auto-clear after 10 seconds - setRestoredData(result); } catch (e) { setError(e instanceof Error ? e.message : 'Decryption failed'); } finally { @@ -169,9 +175,8 @@ import { getSessionKey, encryptJsonToBlob, destroySessionKey, EncryptedBlob } fr setQrPayload(''); setRecipientFpr(''); setRestoreInput(''); - setRestoredData(null); + setDecryptedRestoredMnemonic(null); setError(''); - setShowMnemonic(false); setCopied(false); setShowQRScanner(false); }; @@ -217,7 +222,7 @@ import { getSessionKey, encryptJsonToBlob, destroySessionKey, EncryptedBlob } fr setActiveTab('backup'); setError(''); setQrPayload(''); - setRestoredData(null); + setDecryptedRestoredMnemonic(null); }} className={`px-5 py-2 rounded-md text-sm font-semibold transition-all ${activeTab === 'backup' ? 'bg-white text-slate-900 shadow-lg' @@ -231,7 +236,7 @@ import { getSessionKey, encryptJsonToBlob, destroySessionKey, EncryptedBlob } fr setActiveTab('restore'); setError(''); setQrPayload(''); - setRestoredData(null); + setDecryptedRestoredMnemonic(null); }} className={`px-5 py-2 rounded-md text-sm font-semibold transition-all ${activeTab === 'restore' ? 'bg-white text-slate-900 shadow-lg' @@ -463,7 +468,7 @@ import { getSessionKey, encryptJsonToBlob, destroySessionKey, EncryptedBlob } fr )} {/* Restored Mnemonic */} - {restoredData && activeTab === 'restore' && ( + {decryptedRestoredMnemonic && activeTab === 'restore' && (
@@ -471,35 +476,18 @@ import { getSessionKey, encryptJsonToBlob, destroySessionKey, EncryptedBlob } fr Mnemonic Recovered
-
+

- {restoredData.w} + {decryptedRestoredMnemonic}

- - {restoredData.pp === 1 && ( -
-

- BIP39 Passphrase Required (25th Word) -

-
- )} - - {restoredData.fpr && restoredData.fpr.length > 0 && ( -
-

- Encrypted for keys: {restoredData.fpr.join(', ')} -

-
- )}
)}