9router 0.2.95 → 0.2.97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/.next/BUILD_ID +1 -1
- package/app/.next/app-path-routes-manifest.json +36 -36
- package/app/.next/build-manifest.json +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_global-error.html +2 -2
- package/app/.next/server/app/_global-error.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_not-found.html +1 -1
- package/app/.next/server/app/_not-found.rsc +2 -2
- package/app/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/claude-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/codex-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/droid-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/openclaw-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cloud/auth/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cloud/credentials/update/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cloud/model/resolve/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cloud/models/alias/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/combos/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/combos/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/keys/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/keys/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/models/alias/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/[provider]/[action]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/cursor/auto-import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/cursor/import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/auto-import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/social-authorize/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/social-exchange/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/pricing/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/provider-nodes/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/provider-nodes/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/provider-nodes/validate/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/[id]/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/[id]/test/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/client/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/test-batch/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/validate/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/require-login/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/tags/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/load/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/save/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/send/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/translate/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/tunnel/disable/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/tunnel/enable/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/tunnel/status/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/[connectionId]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/chart/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/history/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/providers/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/request-details/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/request-logs/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/stream/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/api/chat/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/chat/completions/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/embeddings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/messages/count_tokens/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/messages/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/responses/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1beta/models/[...path]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1beta/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/callback.html +1 -1
- package/app/.next/server/app/callback.rsc +2 -2
- package/app/.next/server/app/callback.segments/_full.segment.rsc +2 -2
- package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/callback.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/callback.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/cli-tools.html +1 -1
- package/app/.next/server/app/dashboard/cli-tools.rsc +4 -4
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/combos.html +1 -1
- package/app/.next/server/app/dashboard/combos.rsc +4 -4
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/endpoint.html +1 -1
- package/app/.next/server/app/dashboard/endpoint.rsc +4 -4
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/profile.html +1 -1
- package/app/.next/server/app/dashboard/profile.rsc +4 -4
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.html +1 -1
- package/app/.next/server/app/dashboard/providers/new.rsc +4 -4
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers.html +1 -1
- package/app/.next/server/app/dashboard/providers.rsc +4 -4
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.rsc +2 -2
- package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/translator.html +1 -1
- package/app/.next/server/app/dashboard/translator.rsc +4 -4
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/usage.html +1 -1
- package/app/.next/server/app/dashboard/usage.rsc +4 -4
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/dashboard.html +1 -1
- package/app/.next/server/app/dashboard.rsc +4 -4
- package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/index.html +1 -1
- package/app/.next/server/app/index.rsc +2 -2
- package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/landing.html +1 -1
- package/app/.next/server/app/landing.rsc +2 -2
- package/app/.next/server/app/landing.segments/_full.segment.rsc +2 -2
- package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/landing.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/landing.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
- package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/login.html +1 -1
- package/app/.next/server/app/login.rsc +3 -3
- package/app/.next/server/app/login.segments/_full.segment.rsc +3 -3
- package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/login.segments/_index.segment.rsc +2 -2
- package/app/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/app/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app-paths-manifest.json +36 -36
- package/app/.next/server/chunks/6186.js +4 -4
- package/app/.next/server/chunks/8694.js +1 -1
- package/app/.next/server/pages/404.html +1 -1
- package/app/.next/server/pages/500.html +2 -2
- package/app/.next/server/server-reference-manifest.js +1 -1
- package/app/.next/server/server-reference-manifest.json +1 -1
- package/app/.next/static/chunks/{8729-698bbd000dcc5476.js → 8729-564f99e14e0945b1.js} +1 -1
- package/app/package.json +1 -1
- package/app/src/mitm/cert/install.js +39 -6
- package/app/src/mitm/dns/dnsConfig.js +13 -3
- package/app/src/mitm/manager.js +97 -63
- package/app/src/mitm/server.js +7 -0
- package/package.json +1 -1
- /package/app/.next/static/{KJ0EmyBzHTnjNSb2Y-GW4 → xlwqCpfIhGINB7z-eb6uC}/_buildManifest.js +0 -0
- /package/app/.next/static/{KJ0EmyBzHTnjNSb2Y-GW4 → xlwqCpfIhGINB7z-eb6uC}/_ssgManifest.js +0 -0
package/app/src/mitm/manager.js
CHANGED
|
@@ -3,6 +3,7 @@ const path = require("path");
|
|
|
3
3
|
const fs = require("fs");
|
|
4
4
|
const os = require("os");
|
|
5
5
|
const net = require("net");
|
|
6
|
+
const https = require("https");
|
|
6
7
|
const crypto = require("crypto");
|
|
7
8
|
const { addDNSEntry, removeDNSEntry, checkDNSEntry } = require("./dns/dnsConfig");
|
|
8
9
|
|
|
@@ -49,12 +50,14 @@ function getCachedPassword() { return globalThis.__mitmSudoPassword || null; }
|
|
|
49
50
|
function setCachedPassword(pwd) { globalThis.__mitmSudoPassword = pwd; }
|
|
50
51
|
|
|
51
52
|
// Check if a PID is alive
|
|
53
|
+
// EACCES = process exists but no permission (e.g. root process) → still alive
|
|
54
|
+
// ESRCH = process does not exist → dead
|
|
52
55
|
function isProcessAlive(pid) {
|
|
53
56
|
try {
|
|
54
57
|
process.kill(pid, 0);
|
|
55
58
|
return true;
|
|
56
|
-
} catch {
|
|
57
|
-
return
|
|
59
|
+
} catch (err) {
|
|
60
|
+
return err.code === "EACCES";
|
|
58
61
|
}
|
|
59
62
|
}
|
|
60
63
|
|
|
@@ -165,53 +168,36 @@ function checkPort443Free() {
|
|
|
165
168
|
* Get PID and process name currently holding port 443
|
|
166
169
|
* Returns { pid, name } or null if port is free / cannot determine
|
|
167
170
|
*/
|
|
168
|
-
function getPort443Owner() {
|
|
171
|
+
function getPort443Owner(sudoPassword) {
|
|
169
172
|
return new Promise((resolve) => {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
: `lsof -i TCP:${MITM_PORT} -n -P -sTCP:LISTEN`;
|
|
174
|
-
|
|
175
|
-
exec(cmd, (err, stdout) => {
|
|
176
|
-
if (err || !stdout.trim()) return resolve(null);
|
|
177
|
-
|
|
178
|
-
let pid = null;
|
|
179
|
-
|
|
180
|
-
if (IS_WIN) {
|
|
181
|
-
// netstat line: " TCP 0.0.0.0:443 0.0.0.0:0 LISTENING 1234"
|
|
173
|
+
if (IS_WIN) {
|
|
174
|
+
exec(`netstat -ano | findstr ":443 "`, (err, stdout) => {
|
|
175
|
+
if (err || !stdout.trim()) return resolve(null);
|
|
182
176
|
for (const line of stdout.split("\n")) {
|
|
183
177
|
const match = line.match(/LISTENING\s+(\d+)/i);
|
|
184
|
-
if (match) {
|
|
178
|
+
if (match) {
|
|
179
|
+
const pid = parseInt(match[1], 10);
|
|
180
|
+
exec(`tasklist /FI "PID eq ${pid}" /FO CSV /NH`, (e2, out2) => {
|
|
181
|
+
const m = out2?.match(/"([^"]+)"/);
|
|
182
|
+
resolve({ pid, name: m ? m[1] : "unknown" });
|
|
183
|
+
});
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
185
186
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
187
|
+
resolve(null);
|
|
188
|
+
});
|
|
189
|
+
} else {
|
|
190
|
+
// Use ps to find node process running server.js (no sudo needed)
|
|
191
|
+
exec(`ps aux | grep "[s]erver.js"`, (err, stdout) => {
|
|
192
|
+
if (!stdout?.trim()) return resolve(null);
|
|
193
|
+
for (const line of stdout.split("\n")) {
|
|
189
194
|
const parts = line.trim().split(/\s+/);
|
|
190
|
-
|
|
195
|
+
const pid = parseInt(parts[1], 10);
|
|
196
|
+
if (!isNaN(pid)) return resolve({ pid, name: "node" });
|
|
191
197
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
if (!pid || isNaN(pid)) return resolve(null);
|
|
195
|
-
|
|
196
|
-
// Get process name by PID
|
|
197
|
-
const nameCmd = IS_WIN
|
|
198
|
-
? `tasklist /FI "PID eq ${pid}" /FO CSV /NH`
|
|
199
|
-
: `ps -p ${pid} -o comm=`;
|
|
200
|
-
|
|
201
|
-
exec(nameCmd, (e2, out2) => {
|
|
202
|
-
let name = "unknown";
|
|
203
|
-
if (!e2 && out2.trim()) {
|
|
204
|
-
if (IS_WIN) {
|
|
205
|
-
// CSV: "node.exe","1234",...
|
|
206
|
-
const m = out2.match(/"([^"]+)"/);
|
|
207
|
-
if (m) name = m[1];
|
|
208
|
-
} else {
|
|
209
|
-
name = out2.trim();
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
resolve({ pid, name });
|
|
198
|
+
resolve(null);
|
|
213
199
|
});
|
|
214
|
-
}
|
|
200
|
+
}
|
|
215
201
|
});
|
|
216
202
|
}
|
|
217
203
|
|
|
@@ -254,6 +240,37 @@ async function killLeftoverMitm(sudoPassword) {
|
|
|
254
240
|
}
|
|
255
241
|
}
|
|
256
242
|
|
|
243
|
+
/**
|
|
244
|
+
* Poll MITM health endpoint until server is up or timeout.
|
|
245
|
+
* Returns { ok, pid } on success, null on timeout.
|
|
246
|
+
*/
|
|
247
|
+
function pollMitmHealth(timeoutMs) {
|
|
248
|
+
return new Promise((resolve) => {
|
|
249
|
+
const deadline = Date.now() + timeoutMs;
|
|
250
|
+
const check = () => {
|
|
251
|
+
const req = https.request(
|
|
252
|
+
{ hostname: "127.0.0.1", port: 443, path: "/_mitm_health", method: "GET", rejectUnauthorized: false },
|
|
253
|
+
(res) => {
|
|
254
|
+
let body = "";
|
|
255
|
+
res.on("data", (d) => { body += d; });
|
|
256
|
+
res.on("end", () => {
|
|
257
|
+
try {
|
|
258
|
+
const json = JSON.parse(body);
|
|
259
|
+
resolve(json.ok === true ? { ok: true, pid: json.pid || null } : null);
|
|
260
|
+
} catch { resolve(null); }
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
);
|
|
264
|
+
req.on("error", () => {
|
|
265
|
+
if (Date.now() < deadline) setTimeout(check, 500);
|
|
266
|
+
else resolve(null);
|
|
267
|
+
});
|
|
268
|
+
req.end();
|
|
269
|
+
};
|
|
270
|
+
check();
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
|
|
257
274
|
/**
|
|
258
275
|
* Get MITM status
|
|
259
276
|
*/
|
|
@@ -319,19 +336,33 @@ async function startMitm(apiKey, sudoPassword) {
|
|
|
319
336
|
await killLeftoverMitm(sudoPassword);
|
|
320
337
|
|
|
321
338
|
// Check port 443 availability BEFORE modifying system
|
|
339
|
+
// "no-permission" = EACCES: port may be held by a root process, check via lsof/netstat
|
|
322
340
|
const portStatus = await checkPort443Free();
|
|
323
|
-
if (portStatus === "in-use") {
|
|
324
|
-
const owner = await getPort443Owner();
|
|
325
|
-
|
|
326
|
-
|
|
341
|
+
if (portStatus === "in-use" || portStatus === "no-permission") {
|
|
342
|
+
const owner = await getPort443Owner(sudoPassword);
|
|
343
|
+
if (owner && owner.name === "node") {
|
|
344
|
+
// Orphan MITM node process — kill it and continue
|
|
345
|
+
console.log(`[MITM] Killing orphan node process on port 443 (PID ${owner.pid})...`);
|
|
346
|
+
try {
|
|
347
|
+
if (IS_WIN) {
|
|
348
|
+
await new Promise((resolve) => exec(`taskkill /F /PID ${owner.pid}`, resolve));
|
|
349
|
+
} else {
|
|
350
|
+
const { execWithPassword } = require("./dns/dnsConfig");
|
|
351
|
+
await execWithPassword(`kill -9 ${owner.pid}`, sudoPassword);
|
|
352
|
+
}
|
|
353
|
+
await new Promise(r => setTimeout(r, 800));
|
|
354
|
+
} catch {
|
|
355
|
+
// best effort — continue anyway
|
|
356
|
+
}
|
|
357
|
+
} else if (owner) {
|
|
327
358
|
const shortName = owner.name.includes("/")
|
|
328
359
|
? owner.name.split("/").filter(Boolean).pop()
|
|
329
360
|
: owner.name;
|
|
330
|
-
|
|
361
|
+
throw new Error(
|
|
362
|
+
`Port 443 is already in use by "${shortName}" (PID ${owner.pid}). Stop that process first, then retry.`
|
|
363
|
+
);
|
|
331
364
|
}
|
|
332
|
-
|
|
333
|
-
`Port 443 is already in use by ${ownerDesc}. Stop that process first, then retry.`
|
|
334
|
-
);
|
|
365
|
+
// owner === null + no-permission → likely just needs sudo, proceed
|
|
335
366
|
}
|
|
336
367
|
|
|
337
368
|
// 1. Generate SSL certificate if not exists
|
|
@@ -358,12 +389,13 @@ async function startMitm(apiKey, sudoPassword) {
|
|
|
358
389
|
console.log("Starting MITM server...");
|
|
359
390
|
|
|
360
391
|
if (IS_WIN) {
|
|
361
|
-
|
|
362
|
-
const
|
|
392
|
+
// Launch elevated node via PowerShell RunAs (triggers UAC prompt)
|
|
393
|
+
const nodePath = process.execPath.replace(/'/g, "''");
|
|
394
|
+
const serverPath = SERVER_PATH.replace(/'/g, "''");
|
|
363
395
|
serverProcess = spawn("powershell", [
|
|
364
|
-
"-Command",
|
|
365
|
-
|
|
366
|
-
], {
|
|
396
|
+
"-NoProfile", "-Command",
|
|
397
|
+
`$env:ROUTER_API_KEY='${apiKey}'; $env:NODE_ENV='production'; Start-Process '${nodePath}' -ArgumentList '''${serverPath}''' -Verb RunAs -WindowStyle Hidden`
|
|
398
|
+
], { stdio: "ignore", env: process.env });
|
|
367
399
|
} else {
|
|
368
400
|
// sudo -S: read password from stdin, -E: preserve env vars
|
|
369
401
|
// Pass ROUTER_API_KEY inline via env=... wrapper to avoid sudo stripping env
|
|
@@ -399,20 +431,22 @@ async function startMitm(apiKey, sudoPassword) {
|
|
|
399
431
|
try { fs.unlinkSync(PID_FILE); } catch { /* ignore */ }
|
|
400
432
|
});
|
|
401
433
|
|
|
402
|
-
// Wait
|
|
403
|
-
const
|
|
404
|
-
let resolved = false;
|
|
405
|
-
const done = (val) => { if (!resolved) { resolved = true; resolve(val); } };
|
|
406
|
-
const timeout = setTimeout(() => done(true), 8000);
|
|
407
|
-
serverProcess.once("exit", () => { clearTimeout(timeout); done(false); });
|
|
408
|
-
});
|
|
434
|
+
// Wait for server to be ready by polling health endpoint
|
|
435
|
+
const health = await pollMitmHealth(IS_WIN ? 12000 : 8000);
|
|
409
436
|
|
|
410
|
-
if (!
|
|
437
|
+
if (!health) {
|
|
438
|
+
if (IS_WIN) serverProcess = null;
|
|
411
439
|
try { await removeDNSEntry(sudoPassword); } catch { /* best effort */ }
|
|
412
440
|
const reason = startError || "Check sudo password or port 443 access.";
|
|
413
441
|
throw new Error(`MITM server failed to start. ${reason}`);
|
|
414
442
|
}
|
|
415
443
|
|
|
444
|
+
// On Windows, use real PID from health check (launcher exits immediately after UAC)
|
|
445
|
+
if (IS_WIN && health.pid) {
|
|
446
|
+
serverPid = health.pid;
|
|
447
|
+
fs.writeFileSync(PID_FILE, String(serverPid));
|
|
448
|
+
}
|
|
449
|
+
|
|
416
450
|
await saveMitmSettings(true, sudoPassword);
|
|
417
451
|
if (sudoPassword) setCachedPassword(sudoPassword);
|
|
418
452
|
|
package/app/src/mitm/server.js
CHANGED
|
@@ -173,6 +173,13 @@ async function intercept(req, res, bodyBuffer, mappedModel) {
|
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
const server = https.createServer(sslOptions, async (req, res) => {
|
|
176
|
+
// Health check endpoint for startup verification
|
|
177
|
+
if (req.url === "/_mitm_health") {
|
|
178
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
179
|
+
res.end(JSON.stringify({ ok: true, pid: process.pid }));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
176
183
|
const bodyBuffer = await collectBodyRaw(req);
|
|
177
184
|
|
|
178
185
|
// Save request log if enabled
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|