fix: Refactor passphrase handling: remove auto-responded keys tracking and related logic

This commit is contained in:
gorgiaxx
2026-05-07 22:41:14 +08:00
parent 8a44152b36
commit 72847a05af

40
App.tsx
View File

@@ -196,13 +196,6 @@ async function loadDefaultKeyPassphrase(keyPath: string): Promise<string | null>
return (await decryptField(enc)) ?? null;
}
async function removeDefaultKeyPassphrase(keyPath: string): Promise<void> {
const store = localStorageAdapter.read<Record<string, string>>(STORAGE_KEY_DEFAULT_KEY_PASSPHRASES);
if (!store) return;
delete store[keyPath];
localStorageAdapter.write(STORAGE_KEY_DEFAULT_KEY_PASSPHRASES, store);
}
function App({ settings }: { settings: SettingsState }) {
const { t } = useI18n();
@@ -226,8 +219,6 @@ function App({ settings }: { settings: SettingsState }) {
const [keyboardInteractiveQueue, setKeyboardInteractiveQueue] = useState<KeyboardInteractiveRequest[]>([]);
// Passphrase request queue for encrypted SSH keys
const [passphraseQueue, setPassphraseQueue] = useState<PassphraseRequest[]>([]);
// Track keys that were auto-responded in this session (to detect wrong saved passphrases)
const autoRespondedKeysRef = useRef<Set<string>>(new Set());
const {
theme,
@@ -1011,26 +1002,10 @@ function App({ settings }: { settings: SettingsState }) {
const unsubscribe = bridge.onPassphraseRequest(async (request) => {
console.log('[App] Passphrase request received:', request);
// Check if this key was already auto-responded in this session
// If so, the saved passphrase was wrong - remove it and show modal
if (autoRespondedKeysRef.current.has(request.keyPath)) {
console.log('[App] Key was auto-responded before but failed, removing saved passphrase');
autoRespondedKeysRef.current.delete(request.keyPath);
await removeDefaultKeyPassphrase(request.keyPath);
setPassphraseQueue(prev => [...prev, {
requestId: request.requestId,
keyPath: request.keyPath,
keyName: request.keyName,
hostname: request.hostname,
}]);
return;
}
// Try to load saved passphrase
// Try to load saved passphrase and auto-respond
const saved = await loadDefaultKeyPassphrase(request.keyPath);
if (saved) {
console.log('[App] Auto-responding with saved passphrase for:', request.keyPath);
autoRespondedKeysRef.current.add(request.keyPath);
void bridge.respondPassphrase?.(request.requestId, saved, false);
return;
}
@@ -1056,15 +1031,12 @@ function App({ settings }: { settings: SettingsState }) {
void bridge.respondPassphrase(requestId, passphrase, false);
}
const request = passphraseQueue.find((r: PassphraseRequest) => r.requestId === requestId);
// Save passphrase if requested
if (remember) {
const request = passphraseQueue.find(r => r.requestId === requestId);
if (request?.keyPath) {
console.log('[App] Saving passphrase for:', request.keyPath);
void saveDefaultKeyPassphrase(request.keyPath, passphrase);
// Clear from auto-responded tracking since user manually entered it
autoRespondedKeysRef.current.delete(request.keyPath);
}
if (remember && request?.keyPath) {
console.log('[App] Saving passphrase for:', request.keyPath);
void saveDefaultKeyPassphrase(request.keyPath, passphrase);
}
setPassphraseQueue(prev => prev.filter(r => r.requestId !== requestId));