diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/MitmServerCard.js b/src/app/(dashboard)/dashboard/cli-tools/components/MitmServerCard.js
index 63fa42b8..8766f7b3 100644
--- a/src/app/(dashboard)/dashboard/cli-tools/components/MitmServerCard.js
+++ b/src/app/(dashboard)/dashboard/cli-tools/components/MitmServerCard.js
@@ -176,22 +176,20 @@ export default function MitmServerCard({ apiKeys, cloudEnabled, onStatusChange }
API Key
arrow_forward
- {apiKeys?.length > 0 ? (
-
- ) : (
-
- {cloudEnabled ? "No API keys — create one in Keys page" : "sk_9router (default)"}
-
+
)}
)}
diff --git a/src/mitm/dns/dnsConfig.js b/src/mitm/dns/dnsConfig.js
index 70d00487..39af3364 100644
--- a/src/mitm/dns/dnsConfig.js
+++ b/src/mitm/dns/dnsConfig.js
@@ -214,11 +214,35 @@ async function removeAllDNSEntries(sudoPassword) {
}
}
+/**
+ * Sync removal of ALL tool DNS entries — for use during process shutdown
+ * when async ops aren't safe. Assumes caller already has root/admin rights.
+ */
+function removeAllDNSEntriesSync() {
+ try {
+ if (!fs.existsSync(HOSTS_FILE)) return;
+ const allHosts = Object.values(TOOL_HOSTS).flat();
+ const content = fs.readFileSync(HOSTS_FILE, "utf8");
+ const eol = IS_WIN ? "\r\n" : "\n";
+ const filtered = content.split(/\r?\n/).filter(l => !allHosts.some(h => l.includes(h))).join(eol);
+ if (filtered === content) return;
+ fs.writeFileSync(HOSTS_FILE, filtered, "utf8");
+ if (IS_WIN) {
+ try { execSync("ipconfig /flushdns", { windowsHide: true, stdio: "ignore" }); } catch { /* ignore */ }
+ } else if (IS_MAC) {
+ try { execSync("dscacheutil -flushcache && killall -HUP mDNSResponder", { stdio: "ignore" }); } catch { /* ignore */ }
+ } else {
+ try { execSync("resolvectl flush-caches 2>/dev/null || true", { stdio: "ignore" }); } catch { /* ignore */ }
+ }
+ } catch { /* best effort during shutdown */ }
+}
+
module.exports = {
TOOL_HOSTS,
addDNSEntry,
removeDNSEntry,
removeAllDNSEntries,
+ removeAllDNSEntriesSync,
execWithPassword,
isSudoAvailable,
executeElevatedPowerShell,
diff --git a/src/mitm/server.js b/src/mitm/server.js
index c444dacf..78e3362d 100644
--- a/src/mitm/server.js
+++ b/src/mitm/server.js
@@ -266,7 +266,16 @@ server.on("error", (e) => {
process.exit(1);
});
-const shutdown = () => server.close(() => process.exit(0));
+const { removeAllDNSEntriesSync } = require("./dns/dnsConfig");
+let isShuttingDown = false;
+const shutdown = () => {
+ if (isShuttingDown) return;
+ isShuttingDown = true;
+ // Strip tool hosts from /etc/hosts so other apps aren't broken after exit
+ removeAllDNSEntriesSync();
+ const forceExit = setTimeout(() => process.exit(0), 1500);
+ server.close(() => { clearTimeout(forceExit); process.exit(0); });
+};
process.on("SIGTERM", shutdown);
process.on("SIGINT", shutdown);
if (process.platform === "win32") process.on("SIGBREAK", shutdown);