From d66c181fe0e6fdf202c951a7e65343cf81829997 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 04:55:42 +0000 Subject: [PATCH] Clear proxy config on logout to prevent auto-start without auth - Add stopAndResetProxy() method to proxyService that stops the running proxy and resets saved config to defaults (clearing auto_start and API key) - Call stopAndResetProxy() in all sign-out paths: AccountMenu, DeleteAccountDialog, GuestPaymentWarningDialog, VerificationModal - This prevents the proxy from auto-starting on next app launch when no user is logged in Co-Authored-By: tony@opensecret.cloud --- frontend/src/components/AccountMenu.tsx | 8 ++++++ .../src/components/DeleteAccountDialog.tsx | 8 ++++++ .../components/GuestPaymentWarningDialog.tsx | 8 ++++++ frontend/src/components/VerificationModal.tsx | 14 +++++++++- frontend/src/services/proxyService.ts | 27 +++++++++++++++++++ 5 files changed, 64 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/AccountMenu.tsx b/frontend/src/components/AccountMenu.tsx index 03ffb22e..3c20b881 100644 --- a/frontend/src/components/AccountMenu.tsx +++ b/frontend/src/components/AccountMenu.tsx @@ -264,6 +264,14 @@ export function AccountMenu() { sessionStorage.removeItem("maple_billing_token"); } + // Stop proxy and reset config so it doesn't auto-start on next launch + try { + const { proxyService } = await import("@/services/proxyService"); + await proxyService.stopAndResetProxy(); + } catch (error) { + console.error("Error clearing proxy config:", error); + } + // Sign out from OpenSecret await os.signOut(); diff --git a/frontend/src/components/DeleteAccountDialog.tsx b/frontend/src/components/DeleteAccountDialog.tsx index 63e966f2..2bf1351c 100644 --- a/frontend/src/components/DeleteAccountDialog.tsx +++ b/frontend/src/components/DeleteAccountDialog.tsx @@ -78,6 +78,14 @@ export function DeleteAccountDialog({ open, onOpenChange }: DeleteAccountDialogP sessionStorage.removeItem("maple_billing_token"); } + // Stop proxy and reset config so it doesn't auto-start on next launch + try { + const { proxyService } = await import("@/services/proxyService"); + await proxyService.stopAndResetProxy(); + } catch (error) { + console.error("Error clearing proxy config:", error); + } + // Sign out await os.signOut(); diff --git a/frontend/src/components/GuestPaymentWarningDialog.tsx b/frontend/src/components/GuestPaymentWarningDialog.tsx index bae3767b..ac65ff63 100644 --- a/frontend/src/components/GuestPaymentWarningDialog.tsx +++ b/frontend/src/components/GuestPaymentWarningDialog.tsx @@ -24,6 +24,14 @@ export function GuestPaymentWarningDialog({ open, onOpenChange }: GuestPaymentWa }; const handleLogout = async () => { + // Stop proxy and reset config so it doesn't auto-start on next launch + try { + const { proxyService } = await import("@/services/proxyService"); + await proxyService.stopAndResetProxy(); + } catch (error) { + console.error("Error clearing proxy config:", error); + } + await os.signOut(); }; diff --git a/frontend/src/components/VerificationModal.tsx b/frontend/src/components/VerificationModal.tsx index 247f8c4a..948811d0 100644 --- a/frontend/src/components/VerificationModal.tsx +++ b/frontend/src/components/VerificationModal.tsx @@ -96,6 +96,18 @@ export function VerificationModal() { } }; + const handleSignOut = async () => { + // Stop proxy and reset config so it doesn't auto-start on next launch + try { + const { proxyService } = await import("@/services/proxyService"); + await proxyService.stopAndResetProxy(); + } catch (error) { + console.error("Error clearing proxy config:", error); + } + + await os.signOut(); + }; + return ( @@ -148,7 +160,7 @@ export function VerificationModal() { )} )} - diff --git a/frontend/src/services/proxyService.ts b/frontend/src/services/proxyService.ts index c5777b9b..538c891f 100644 --- a/frontend/src/services/proxyService.ts +++ b/frontend/src/services/proxyService.ts @@ -86,6 +86,33 @@ class ProxyService { } } + // Stop proxy if running and reset saved config (used on logout) + async stopAndResetProxy(): Promise { + try { + // Check if proxy is running and stop it + const status = await this.getProxyStatus(); + if (status.running) { + await this.stopProxy(); + } + } catch { + // Proxy may not be running, that's fine + } + + try { + // Save default config to clear auto_start and API key + await this.saveProxySettings({ + host: "127.0.0.1", + port: 8080, + api_key: "", + enabled: false, + enable_cors: true, + auto_start: false + }); + } catch (error) { + console.error("Failed to reset proxy config:", error); + } + } + // Helper to check if we're in Tauri desktop environment async isTauriDesktop(): Promise { try {