From d7128000beca24035b74a4c1db2c6030fed831b2 Mon Sep 17 00:00:00 2001 From: BhagwanSingh Date: Wed, 17 Dec 2025 15:21:43 +0530 Subject: [PATCH] VPN Code UPdate --- resources/wireguard/windows/wg0.conf | 7 +- src/electron/api/axiosClient.ts | 2 +- src/electron/api/baseURL.ts | 4 +- src/electron/api/regionCheck.ts | 5 +- src/electron/vpn.ts | 91 ++++++++++++++++--- src/ui/layout/DashboardLayout.tsx | 2 +- src/ui/main.tsx | 15 +++ src/ui/pages/Vpn/VpnGuard.tsx | 21 ++++- ....timestamp-1765963658478-f34f24a548cda.mjs | 19 ++++ 9 files changed, 138 insertions(+), 28 deletions(-) create mode 100644 vite.config.ts.timestamp-1765963658478-f34f24a548cda.mjs diff --git a/resources/wireguard/windows/wg0.conf b/resources/wireguard/windows/wg0.conf index fa2a861..fe4bde9 100644 --- a/resources/wireguard/windows/wg0.conf +++ b/resources/wireguard/windows/wg0.conf @@ -1,10 +1,11 @@ + [Interface] -PrivateKey = CEzCd25ufxbOjvRhMqLfkcdP/OziG5i6OkXCfMZrI1I= -Address = 10.0.0.2/32 +PrivateKey = EA2j6mOQB17w497cZS4B91m/xDzEcGz9lU3jKtc1wU8= +Address = 10.0.0.27/32 DNS = 1.1.1.1 [Peer] PublicKey = jG+7H5thEiNjxY1XqI1R9oyMAMTIegLwE3tZkS1Rj2U= Endpoint = 35.95.209.161:51820 -AllowedIPs = 10.0.0.0/32 +AllowedIPs = 10.0.0.0/24 PersistentKeepalive = 25 diff --git a/src/electron/api/axiosClient.ts b/src/electron/api/axiosClient.ts index bb23df0..3cd6426 100644 --- a/src/electron/api/axiosClient.ts +++ b/src/electron/api/axiosClient.ts @@ -18,7 +18,7 @@ const httpsAgent = new https.Agent({ console.log('Base_URL$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$' ,Base_URL) const api: AxiosInstance = axios.create({ - // baseURL: 'https://quality-friendly-goldfish.ngrok-free.app/api/v1/va', // 🔁 your backend + // baseURL: 'https://portal-sf.docva.com/api/v1/va', // 🔁 your backend baseURL: `${Base_URL}/api/v1/va`, httpsAgent // timeout: 10000, diff --git a/src/electron/api/baseURL.ts b/src/electron/api/baseURL.ts index 67478cd..2a33d5a 100644 --- a/src/electron/api/baseURL.ts +++ b/src/electron/api/baseURL.ts @@ -1,5 +1,5 @@ -// let CURRENT_BASE_URL = "https://quality-friendly-goldfish.ngrok-free.app/api/v1/va"; -let CURRENT_BASE_URL = "https://quality-friendly-goldfish.ngrok-free.app"; +// let CURRENT_BASE_URL = "https://portal-sf.docva.com/api/v1/va"; +let CURRENT_BASE_URL = "https://portal-sf.docva.com"; export const getBaseURL = () => CURRENT_BASE_URL; export const setBaseURL = (url: string) => { diff --git a/src/electron/api/regionCheck.ts b/src/electron/api/regionCheck.ts index b545c8f..5a5912b 100644 --- a/src/electron/api/regionCheck.ts +++ b/src/electron/api/regionCheck.ts @@ -8,13 +8,14 @@ const httpsAgent = new https.Agent({ rejectUnauthorized: false }); export const checkRegion = async () => { const baseURL = await getBaseURL(); - console.log("checkRegion@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" ,baseURL) + console.log("checkRegion@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", baseURL) try { const res = await axios.get(`${baseURL}/health`, { headers: { "ngrok-skip-browser-warning": "true" }, - httpsAgent + httpsAgent, + timeout: 4000 }); console.log(res , "checkRegion") diff --git a/src/electron/vpn.ts b/src/electron/vpn.ts index 19596b9..9efba20 100644 --- a/src/electron/vpn.ts +++ b/src/electron/vpn.ts @@ -3,6 +3,7 @@ import { exec, execFile } from "child_process"; import fs from "fs"; import os from "os"; import path from "path"; +import axios from "axios"; // // ------------------ HELPERS ------------------ @@ -51,20 +52,72 @@ function getWireGuardInstallerPath(): string { // OS-specific wg0.conf -function getConfigPath(): string { +// function getConfigPath(): string { +// const base = isDev() +// ? path.join(process.cwd(), "resources", "wireguard") +// : path.join(process.resourcesPath, "wireguard"); + +// if (process.platform === "win32") { +// return path.join(base, "windows", "wg0.conf"); +// } + +// if (process.platform === "darwin") { +// return path.join(base, "macos", "wg0.conf"); +// } + +// throw new Error("Unsupported OS"); +// } + +export async function getConfigPath(): Promise { + if (process.platform !== "win32") { + throw new Error("Only Windows supported for dynamic WireGuard config"); + } + console.log("Calling http://35.95.209.161/api/v1/vpn/connect") + // 1️⃣ Call API to get dynamic config + let response = null; + try { + response = await axios.post( + "http://35.95.209.161/api/v1/vpn/connect", + {}, + { timeout: 15000 } + ); + } catch (err: any) { + console.error("VPN API error:", { + message: err.message, + code: err.code, + response: err.response?.data, + }); + throw err; + } + console.log("Called http://35.95.209.161/api/v1/vpn/connect", JSON.stringify(response.data)); + + if (!response.data?.success || !response.data.clientConf) { + throw new Error("Invalid VPN config response"); + } + + const clientConf: string = response.data.clientConf; + + // 2️⃣ Decide base directory (same idea as your existing logic) const base = isDev() - ? path.join(process.cwd(), "resources", "wireguard") - : path.join(process.resourcesPath, "wireguard"); + ? path.join(process.cwd(), "resources", "wireguard", "windows") + : path.join(process.resourcesPath, "wireguard", "windows"); - if (process.platform === "win32") { - return path.join(base, "windows", "wg0.conf"); - } + // Ensure directory exists + fs.mkdirSync(base, { recursive: true }); - if (process.platform === "darwin") { - return path.join(base, "macos", "wg0.conf"); - } + // 3️⃣ Create temp / runtime conf file + // IMPORTANT: name must stay stable (WireGuard service name depends on it) + const confPath = path.join(base, "wg0.conf"); - throw new Error("Unsupported OS"); + // 4️⃣ Write config to file + fs.writeFileSync(confPath, clientConf, { + encoding: "utf-8", + mode: 0o600, // secure permissions + }); + + console.log("VPN config written to:", confPath); + // 5️⃣ Return path (same contract as before) + return confPath; } // Detect installed WireGuard.exe on Windows @@ -145,16 +198,24 @@ async function ensureWireGuardInstalled(): Promise { async function connectWindows(): Promise { + + try { + const response = await axios.get('http://35.95.209.161') + console.log("Response from test API:", response.data); + } catch (error) { + console.error("Error connecting to test API:", error); + } + const cli = await ensureWireGuardInstalled(); - const conf = getConfigPath(); + const conf = await getConfigPath(); // Disable GUI popup and silent mode (ignore errors) - await execPromise(`reg add "HKCU\\Software\\WireGuard" /v HideTrayIcon /t REG_DWORD /d 1 /f`).catch(() => {}); - await execPromise(`reg add "HKCU\\Software\\WireGuard" /v SuppressTray /t REG_DWORD /d 1 /f`).catch(() => {}); - await execPromise(`reg delete "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" /v WireGuard /f`).catch(() => {}); + await execPromise(`reg add "HKCU\\Software\\WireGuard" /v HideTrayIcon /t REG_DWORD /d 1 /f`).catch(() => { }); + await execPromise(`reg add "HKCU\\Software\\WireGuard" /v SuppressTray /t REG_DWORD /d 1 /f`).catch(() => { }); + await execPromise(`reg delete "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" /v WireGuard /f`).catch(() => { }); // Start background service - await execPromise(`sc start WireGuardManager`).catch(() => {}); + await execPromise(`sc start WireGuardManager`).catch(() => { }); return new Promise((resolve, reject) => { execFile(cli, ["/installtunnelservice", conf], (err) => { diff --git a/src/ui/layout/DashboardLayout.tsx b/src/ui/layout/DashboardLayout.tsx index 62822b0..378d729 100644 --- a/src/ui/layout/DashboardLayout.tsx +++ b/src/ui/layout/DashboardLayout.tsx @@ -590,7 +590,7 @@ const DashboardLayout = () => { if (!selectedProject?.projectId) return console.log(selectedProject?.projectId, "SelectedProject ID") - socketRef.current = io("https://quality-friendly-goldfish.ngrok-free.app", { + socketRef.current = io("https://portal-sf.docva.com", { transports: ["websocket"], secure: true, rejectUnauthorized: false, diff --git a/src/ui/main.tsx b/src/ui/main.tsx index 5a91adf..4ec36b4 100644 --- a/src/ui/main.tsx +++ b/src/ui/main.tsx @@ -6,6 +6,21 @@ import { Provider } from "react-redux"; import { store } from "./store"; import { ToastProvider } from './helper/ToastContext'; +// renderer only +window.addEventListener("online", (e) => { + console.log("Network online (ignored)"); + e.preventDefault(); +}); + +window.addEventListener("offline", (e) => { + console.log("Network offline (ignored)"); + e.preventDefault(); +}); + +// Extra safety +window.onbeforeunload = () => false; + + ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( diff --git a/src/ui/pages/Vpn/VpnGuard.tsx b/src/ui/pages/Vpn/VpnGuard.tsx index 40823d2..5100825 100644 --- a/src/ui/pages/Vpn/VpnGuard.tsx +++ b/src/ui/pages/Vpn/VpnGuard.tsx @@ -8,7 +8,7 @@ interface Props { const VpnGuard: React.FC = ({ children }) => { const VPN_API = "http://10.0.0.1:3000"; - const DEFAULT_API = "https://quality-friendly-goldfish.ngrok-free.app" + const DEFAULT_API = "https://portal-sf.docva.com" const [checking, setChecking] = useState(true); const [vpnConnected, setVpnConnected] = useState(true); @@ -20,9 +20,12 @@ const VpnGuard: React.FC = ({ children }) => { const res = await window.electron?.checkRegion(); console.log("VpnGuard", res); - setVpnConnected(false); - return - + if (res.status === 200) { + setVpnConnected(true); + } else { + setVpnConnected(false); + return; + } // setVpnConnected(res?.success === true); } catch (error) { console.error("VPN check failed:", error); @@ -58,6 +61,16 @@ const VpnGuard: React.FC = ({ children }) => { } } catch (error) { console.log(error); + + const vpnRes = await window.electron.updateBaseURL(VPN_API); + console.log("vpnRes", vpnRes); + + if (vpnRes) { + // Run VPN check again AFTER URL changes + await checkVPN(); + } else { + console.warn("Base URL updated but health check failed"); + } } finally { setChecking(false); } diff --git a/vite.config.ts.timestamp-1765963658478-f34f24a548cda.mjs b/vite.config.ts.timestamp-1765963658478-f34f24a548cda.mjs new file mode 100644 index 0000000..dcc3c93 --- /dev/null +++ b/vite.config.ts.timestamp-1765963658478-f34f24a548cda.mjs @@ -0,0 +1,19 @@ +// vite.config.ts +import { defineConfig } from "file:///C:/Users/user/OneDrive/Desktop/electron-main/node_modules/vite/dist/node/index.js"; +import react from "file:///C:/Users/user/OneDrive/Desktop/electron-main/node_modules/@vitejs/plugin-react/dist/index.js"; +import tailwindcss from "file:///C:/Users/user/OneDrive/Desktop/electron-main/node_modules/@tailwindcss/vite/dist/index.mjs"; +var vite_config_default = defineConfig({ + plugins: [react(), tailwindcss()], + base: "./", + build: { + outDir: "dist-react" + }, + server: { + port: 5123, + strictPort: true + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFx1c2VyXFxcXE9uZURyaXZlXFxcXERlc2t0b3BcXFxcZWxlY3Ryb24tbWFpblwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcdXNlclxcXFxPbmVEcml2ZVxcXFxEZXNrdG9wXFxcXGVsZWN0cm9uLW1haW5cXFxcdml0ZS5jb25maWcudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0M6L1VzZXJzL3VzZXIvT25lRHJpdmUvRGVza3RvcC9lbGVjdHJvbi1tYWluL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSc7XHJcbmltcG9ydCByZWFjdCBmcm9tICdAdml0ZWpzL3BsdWdpbi1yZWFjdCc7XHJcbmltcG9ydCB0YWlsd2luZGNzcyBmcm9tICdAdGFpbHdpbmRjc3Mvdml0ZSdcclxuXHJcbi8vIGh0dHBzOi8vdml0ZWpzLmRldi9jb25maWcvXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XHJcbiAgcGx1Z2luczogW3JlYWN0KCksdGFpbHdpbmRjc3MoKV0sXHJcbiAgYmFzZTogJy4vJyxcclxuICBidWlsZDoge1xyXG4gICAgb3V0RGlyOiAnZGlzdC1yZWFjdCcsXHJcbiAgfSxcclxuICBzZXJ2ZXI6IHtcclxuICAgIHBvcnQ6IDUxMjMsXHJcbiAgICBzdHJpY3RQb3J0OiB0cnVlLFxyXG4gIH0sXHJcbn0pO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQWtVLFNBQVMsb0JBQW9CO0FBQy9WLE9BQU8sV0FBVztBQUNsQixPQUFPLGlCQUFpQjtBQUd4QixJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUMxQixTQUFTLENBQUMsTUFBTSxHQUFFLFlBQVksQ0FBQztBQUFBLEVBQy9CLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxJQUNMLFFBQVE7QUFBQSxFQUNWO0FBQUEsRUFDQSxRQUFRO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixZQUFZO0FBQUEsRUFDZDtBQUNGLENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg==