omniroute 2.3.13 → 2.3.15
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 +53 -53
- package/app/.next/build-manifest.json +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/a2a/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/agents/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/api-manager/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/audit-log/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/auto-combo/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/auto-combo/page_client-reference-manifest.js +1 -1
- 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/costs/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/health/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/limits/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/mcp/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/onboarding/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/playground/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/settings/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/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/.well-known/agent.json/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/400/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/401/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/403/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/408/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/429/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/500/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/502/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/503/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/a2a/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/a2a/status/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/a2a/tasks/[id]/cancel/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/a2a/tasks/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/a2a/tasks/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/acp/agents/route_client-reference-manifest.js +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/auth/status/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cache/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cache/stats/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_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/backups/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/cline-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/codex-profiles/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/guide-settings/[toolId]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/kilo-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/openclaw/auto-order/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/cli-tools/runtime/[toolId]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/status/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/auto/route.js +1 -1
- package/app/.next/server/app/api/combos/auto/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/combos/metrics/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/combos/test/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/compliance/audit-log/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/db-backups/export/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/db-backups/exportAll/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/db-backups/import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/db-backups/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/evals/[suiteId]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/evals/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/fallback/chains/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/logs/console/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/mcp/audit/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/mcp/audit/stats/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/mcp/sse/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/mcp/stream/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/mcp/tools/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/availability/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/models/catalog/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/models/openrouter-catalog/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/models/route.js +1 -1
- package/app/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/monitoring/health/route.js +1 -1
- package/app/.next/server/app/api/monitoring/health/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/[provider]/[action]/route.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.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.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.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.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/policies/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/pricing/defaults/route.js +1 -1
- package/app/.next/server/app/api/pricing/defaults/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/pricing/models/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-metrics/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/provider-models/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.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/rate-limit/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/rate-limits/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/resilience/reset/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/resilience/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/background-degradation/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/combo-defaults/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/ip-filter/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/model-aliases/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/proxy/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/proxy/test/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/settings/system-prompt/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/thinking-budget/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/storage/health/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/sync/cloud/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/sync/initialize/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/telemetry/summary/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/token-health/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/detect/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/history/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/usage/[connectionId]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/analytics/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/budget/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/call-logs/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/call-logs/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/logs/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/proxy-logs/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/quota/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/v1/api/chat/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/audio/speech/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/audio/transcriptions/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/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/images/generations/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/moderations/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/music/generations/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/providers/[provider]/chat/completions/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/providers/[provider]/embeddings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/providers/[provider]/images/generations/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/rerank/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/v1/videos/generations/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/docs/page.js +1 -1
- package/app/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/forgot-password/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/maintenance/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/privacy/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/status/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/terms/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app-paths-manifest.json +53 -53
- package/app/.next/server/chunks/1248.js +1 -1
- package/app/.next/server/chunks/1526.js +1 -1
- package/app/.next/server/chunks/1584.js +1 -1
- package/app/.next/server/chunks/1623.js +1 -1
- package/app/.next/server/chunks/1880.js +1 -1
- package/app/.next/server/chunks/1909.js +1 -1
- package/app/.next/server/chunks/1960.js +1 -1
- package/app/.next/server/chunks/1990.js +1 -1
- package/app/.next/server/chunks/2214.js +1 -1
- package/app/.next/server/chunks/2372.js +1 -1
- package/app/.next/server/chunks/2594.js +1 -1
- package/app/.next/server/chunks/3371.js +1 -1
- package/app/.next/server/chunks/3699.js +1 -1
- package/app/.next/server/chunks/3911.js +1 -1
- package/app/.next/server/chunks/4935.js +1 -1
- package/app/.next/server/chunks/496.js +1 -1
- package/app/.next/server/chunks/5047.js +1 -1
- package/app/.next/server/chunks/5094.js +1 -1
- package/app/.next/server/chunks/5097.js +1 -1
- package/app/.next/server/chunks/5521.js +1 -1
- package/app/.next/server/chunks/5945.js +1 -1
- package/app/.next/server/chunks/6118.js +1 -1
- package/app/.next/server/chunks/6930.js +1 -1
- package/app/.next/server/chunks/7011.js +1 -1
- package/app/.next/server/chunks/708.js +1 -1
- package/app/.next/server/chunks/7650.js +1 -1
- package/app/.next/server/chunks/8158.js +1 -1
- package/app/.next/server/chunks/8220.js +1 -1
- package/app/.next/server/chunks/8464.js +1 -1
- package/app/.next/server/chunks/8706.js +1 -1
- package/app/.next/server/chunks/8976.js +1 -1
- package/app/.next/server/chunks/9119.js +1 -1
- package/app/.next/server/chunks/9342.js +1 -1
- package/app/.next/server/chunks/944.js +1 -1
- package/app/.next/server/chunks/9631.js +1 -1
- package/app/.next/server/chunks/9837.js +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/{5846-56c40f2351d4d1dc.js → 5846-7237f07660b67a4b.js} +1 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/auto-combo/page-799e2f96e9af3fd9.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/settings/pricing/page-aab023f14c6ff966.js +1 -0
- package/app/package.json +1 -1
- package/app/src/mitm/cert/generate.js +73 -0
- package/app/src/mitm/cert/install.js +137 -0
- package/app/src/mitm/dns/dnsConfig.js +118 -0
- package/app/src/mitm/manager.js +229 -0
- package/app/src/mitm/server.js +265 -0
- package/package.json +1 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/auto-combo/page-851063ded34ab7a6.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/settings/pricing/page-d23e0e2c39ee0e0f.js +0 -1
- /package/app/.next/static/{BVNxmHsI7LQYBdU_fXC34 → DJl2bxmaQkEJjPXC10cm7}/_buildManifest.js +0 -0
- /package/app/.next/static/{BVNxmHsI7LQYBdU_fXC34 → DJl2bxmaQkEJjPXC10cm7}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.checkCertInstalled = checkCertInstalled;
|
|
7
|
+
exports.installCert = installCert;
|
|
8
|
+
exports.uninstallCert = uninstallCert;
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
11
|
+
const child_process_1 = require("child_process");
|
|
12
|
+
const dnsConfig_1 = require("../dns/dnsConfig");
|
|
13
|
+
const IS_WIN = process.platform === "win32";
|
|
14
|
+
// Get SHA1 fingerprint from cert file using Node.js crypto
|
|
15
|
+
function getCertFingerprint(certPath) {
|
|
16
|
+
const pem = fs_1.default.readFileSync(certPath, "utf-8");
|
|
17
|
+
const der = Buffer.from(pem.replace(/-----[^-]+-----/g, "").replace(/\s/g, ""), "base64");
|
|
18
|
+
return crypto_1.default.createHash("sha1").update(der).digest("hex").toUpperCase().match(/.{2}/g).join(":");
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if certificate is already installed in system store
|
|
22
|
+
*/
|
|
23
|
+
async function checkCertInstalled(certPath) {
|
|
24
|
+
if (IS_WIN) {
|
|
25
|
+
return checkCertInstalledWindows(certPath);
|
|
26
|
+
}
|
|
27
|
+
return checkCertInstalledMac(certPath);
|
|
28
|
+
}
|
|
29
|
+
function checkCertInstalledMac(certPath) {
|
|
30
|
+
return new Promise((resolve) => {
|
|
31
|
+
try {
|
|
32
|
+
const fingerprint = getCertFingerprint(certPath);
|
|
33
|
+
(0, child_process_1.exec)(`security find-certificate -a -Z /Library/Keychains/System.keychain | grep -i "${fingerprint}"`, (error) => {
|
|
34
|
+
resolve(!error);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
resolve(false);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function checkCertInstalledWindows(certPath) {
|
|
43
|
+
return new Promise((resolve) => {
|
|
44
|
+
// Check Root store for our cert by subject name
|
|
45
|
+
(0, child_process_1.exec)("certutil -store Root daily-cloudcode-pa.googleapis.com", (error) => {
|
|
46
|
+
resolve(!error);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Install SSL certificate to system trust store
|
|
52
|
+
*/
|
|
53
|
+
async function installCert(sudoPassword, certPath) {
|
|
54
|
+
if (!fs_1.default.existsSync(certPath)) {
|
|
55
|
+
throw new Error(`Certificate file not found: ${certPath}`);
|
|
56
|
+
}
|
|
57
|
+
const isInstalled = await checkCertInstalled(certPath);
|
|
58
|
+
if (isInstalled) {
|
|
59
|
+
console.log("✅ Certificate already installed");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (IS_WIN) {
|
|
63
|
+
await installCertWindows(certPath);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
await installCertMac(sudoPassword, certPath);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function installCertMac(sudoPassword, certPath) {
|
|
70
|
+
const command = `sudo -S security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "${certPath}"`;
|
|
71
|
+
try {
|
|
72
|
+
await (0, dnsConfig_1.execWithPassword)(command, sudoPassword);
|
|
73
|
+
console.log(`✅ Installed certificate to system keychain: ${certPath}`);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
const msg = error.message?.includes("canceled")
|
|
77
|
+
? "User canceled authorization"
|
|
78
|
+
: "Certificate install failed";
|
|
79
|
+
throw new Error(msg);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function installCertWindows(certPath) {
|
|
83
|
+
// Use PowerShell elevated to add cert to Root store
|
|
84
|
+
const psCommand = `Start-Process certutil -ArgumentList '-addstore','Root','${certPath.replace(/'/g, "''")}' -Verb RunAs -Wait`;
|
|
85
|
+
return new Promise((resolve, reject) => {
|
|
86
|
+
(0, child_process_1.exec)(`powershell -Command "${psCommand}"`, (error) => {
|
|
87
|
+
if (error) {
|
|
88
|
+
reject(new Error(`Failed to install certificate: ${error.message}`));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
console.log(`✅ Installed certificate to Windows Root store`);
|
|
92
|
+
resolve(void 0);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Uninstall SSL certificate from system store
|
|
99
|
+
*/
|
|
100
|
+
async function uninstallCert(sudoPassword, certPath) {
|
|
101
|
+
const isInstalled = await checkCertInstalled(certPath);
|
|
102
|
+
if (!isInstalled) {
|
|
103
|
+
console.log("Certificate not found in system store");
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (IS_WIN) {
|
|
107
|
+
await uninstallCertWindows();
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
await uninstallCertMac(sudoPassword, certPath);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async function uninstallCertMac(sudoPassword, certPath) {
|
|
114
|
+
const fingerprint = getCertFingerprint(certPath).replace(/:/g, "");
|
|
115
|
+
const command = `sudo -S security delete-certificate -Z "${fingerprint}" /Library/Keychains/System.keychain`;
|
|
116
|
+
try {
|
|
117
|
+
await (0, dnsConfig_1.execWithPassword)(command, sudoPassword);
|
|
118
|
+
console.log("✅ Uninstalled certificate from system keychain");
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
throw new Error("Failed to uninstall certificate");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function uninstallCertWindows() {
|
|
125
|
+
const psCommand = `Start-Process certutil -ArgumentList '-delstore','Root','daily-cloudcode-pa.googleapis.com' -Verb RunAs -Wait`;
|
|
126
|
+
return new Promise((resolve, reject) => {
|
|
127
|
+
(0, child_process_1.exec)(`powershell -Command "${psCommand}"`, (error) => {
|
|
128
|
+
if (error) {
|
|
129
|
+
reject(new Error(`Failed to uninstall certificate: ${error.message}`));
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
console.log("✅ Uninstalled certificate from Windows Root store");
|
|
133
|
+
resolve(void 0);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.execWithPassword = execWithPassword;
|
|
7
|
+
exports.checkDNSEntry = checkDNSEntry;
|
|
8
|
+
exports.addDNSEntry = addDNSEntry;
|
|
9
|
+
exports.removeDNSEntry = removeDNSEntry;
|
|
10
|
+
const child_process_1 = require("child_process");
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const TARGET_HOST = "daily-cloudcode-pa.googleapis.com";
|
|
14
|
+
const IS_WIN = process.platform === "win32";
|
|
15
|
+
const HOSTS_FILE = IS_WIN
|
|
16
|
+
? path_1.default.join(process.env.SystemRoot || "C:\\Windows", "System32", "drivers", "etc", "hosts")
|
|
17
|
+
: "/etc/hosts";
|
|
18
|
+
/**
|
|
19
|
+
* Execute command with sudo password via stdin (macOS/Linux only)
|
|
20
|
+
*/
|
|
21
|
+
function execWithPassword(command, password) {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
const child = (0, child_process_1.exec)(command, (error, stdout, stderr) => {
|
|
24
|
+
if (error) {
|
|
25
|
+
reject(new Error(`Command failed: ${error.message}\n${stderr}`));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
resolve(stdout);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
child.stdin.write(`${password}\n`);
|
|
32
|
+
child.stdin.end();
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Execute elevated command on Windows via PowerShell RunAs
|
|
37
|
+
*/
|
|
38
|
+
function execElevatedWindows(command) {
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
const psCommand = `Start-Process cmd -ArgumentList '/c','${command.replace(/'/g, "''")}' -Verb RunAs -Wait`;
|
|
41
|
+
(0, child_process_1.exec)(`powershell -Command "${psCommand}"`, (error, stdout, stderr) => {
|
|
42
|
+
if (error) {
|
|
43
|
+
reject(new Error(`Elevated command failed: ${error.message}\n${stderr}`));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
resolve(stdout);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if DNS entry already exists
|
|
53
|
+
*/
|
|
54
|
+
function checkDNSEntry() {
|
|
55
|
+
try {
|
|
56
|
+
const hostsContent = fs_1.default.readFileSync(HOSTS_FILE, "utf8");
|
|
57
|
+
return hostsContent.includes(TARGET_HOST);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Add DNS entry to hosts file
|
|
65
|
+
*/
|
|
66
|
+
async function addDNSEntry(sudoPassword) {
|
|
67
|
+
if (checkDNSEntry()) {
|
|
68
|
+
console.log(`DNS entry for ${TARGET_HOST} already exists`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const entry = `127.0.0.1 ${TARGET_HOST}`;
|
|
72
|
+
try {
|
|
73
|
+
if (IS_WIN) {
|
|
74
|
+
// Windows: use elevated echo >> hosts
|
|
75
|
+
await execElevatedWindows(`echo ${entry} >> "${HOSTS_FILE}"`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const command = `echo "${entry}" | sudo -S tee -a ${HOSTS_FILE} > /dev/null`;
|
|
79
|
+
await execWithPassword(command, sudoPassword);
|
|
80
|
+
}
|
|
81
|
+
console.log(`✅ Added DNS entry: ${entry}`);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
throw new Error(`Failed to add DNS entry: ${error.message}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Remove DNS entry from hosts file
|
|
89
|
+
*/
|
|
90
|
+
async function removeDNSEntry(sudoPassword) {
|
|
91
|
+
if (!checkDNSEntry()) {
|
|
92
|
+
console.log(`DNS entry for ${TARGET_HOST} does not exist`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
if (IS_WIN) {
|
|
97
|
+
// Windows: read, filter, write back via elevated PowerShell
|
|
98
|
+
const psScript = `(Get-Content '${HOSTS_FILE}') | Where-Object { $_ -notmatch '${TARGET_HOST}' } | Set-Content '${HOSTS_FILE}'`;
|
|
99
|
+
const psCommand = `Start-Process powershell -ArgumentList '-Command','${psScript.replace(/'/g, "''")}' -Verb RunAs -Wait`;
|
|
100
|
+
await new Promise((resolve, reject) => {
|
|
101
|
+
(0, child_process_1.exec)(`powershell -Command "${psCommand}"`, (error) => {
|
|
102
|
+
if (error)
|
|
103
|
+
reject(new Error(`Failed to remove DNS entry: ${error.message}`));
|
|
104
|
+
else
|
|
105
|
+
resolve(void 0);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const command = `sudo -S sed -i '' '/${TARGET_HOST}/d' ${HOSTS_FILE}`;
|
|
111
|
+
await execWithPassword(command, sudoPassword);
|
|
112
|
+
}
|
|
113
|
+
console.log(`✅ Removed DNS entry for ${TARGET_HOST}`);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
throw new Error(`Failed to remove DNS entry: ${error.message}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getCachedPassword = getCachedPassword;
|
|
7
|
+
exports.setCachedPassword = setCachedPassword;
|
|
8
|
+
exports.clearCachedPassword = clearCachedPassword;
|
|
9
|
+
exports.getMitmStatus = getMitmStatus;
|
|
10
|
+
exports.startMitm = startMitm;
|
|
11
|
+
exports.stopMitm = stopMitm;
|
|
12
|
+
const child_process_1 = require("child_process");
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const fs_1 = __importDefault(require("fs"));
|
|
15
|
+
const dataPaths_1 = require("@/lib/dataPaths");
|
|
16
|
+
const dnsConfig_1 = require("./dns/dnsConfig");
|
|
17
|
+
const generate_1 = require("./cert/generate");
|
|
18
|
+
const install_1 = require("./cert/install");
|
|
19
|
+
// Store server process
|
|
20
|
+
let serverProcess = null;
|
|
21
|
+
let serverPid = null;
|
|
22
|
+
// Module-scoped password cache (not exposed on globalThis).
|
|
23
|
+
// Cleared automatically when the MITM proxy is stopped.
|
|
24
|
+
let _cachedPassword = null;
|
|
25
|
+
function getCachedPassword() {
|
|
26
|
+
return _cachedPassword;
|
|
27
|
+
}
|
|
28
|
+
function setCachedPassword(pwd) {
|
|
29
|
+
_cachedPassword = pwd || null;
|
|
30
|
+
}
|
|
31
|
+
function clearCachedPassword() {
|
|
32
|
+
_cachedPassword = null;
|
|
33
|
+
}
|
|
34
|
+
// server.js is in same directory as this file
|
|
35
|
+
const PID_FILE = path_1.default.join((0, dataPaths_1.resolveDataDir)(), "mitm", ".mitm.pid");
|
|
36
|
+
// Check if a PID is alive
|
|
37
|
+
function isProcessAlive(pid) {
|
|
38
|
+
try {
|
|
39
|
+
process.kill(pid, 0);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get MITM status
|
|
48
|
+
*/
|
|
49
|
+
async function getMitmStatus() {
|
|
50
|
+
// Check in-memory process first, then fallback to PID file
|
|
51
|
+
let running = serverProcess !== null && !serverProcess.killed;
|
|
52
|
+
let pid = serverPid;
|
|
53
|
+
if (!running) {
|
|
54
|
+
try {
|
|
55
|
+
if (fs_1.default.existsSync(PID_FILE)) {
|
|
56
|
+
const savedPid = parseInt(fs_1.default.readFileSync(PID_FILE, "utf-8").trim(), 10);
|
|
57
|
+
if (savedPid && isProcessAlive(savedPid)) {
|
|
58
|
+
running = true;
|
|
59
|
+
pid = savedPid;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// Stale PID file, clean up
|
|
63
|
+
fs_1.default.unlinkSync(PID_FILE);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Ignore
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Check DNS configuration
|
|
72
|
+
let dnsConfigured = false;
|
|
73
|
+
try {
|
|
74
|
+
const hostsContent = fs_1.default.readFileSync("/etc/hosts", "utf-8");
|
|
75
|
+
dnsConfigured = hostsContent.includes("daily-cloudcode-pa.googleapis.com");
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Ignore
|
|
79
|
+
}
|
|
80
|
+
// Check cert
|
|
81
|
+
const certDir = path_1.default.join((0, dataPaths_1.resolveDataDir)(), "mitm");
|
|
82
|
+
const certExists = fs_1.default.existsSync(path_1.default.join(certDir, "server.crt"));
|
|
83
|
+
return { running, pid, dnsConfigured, certExists };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Start MITM proxy
|
|
87
|
+
* @param {string} apiKey - OmniRoute API key
|
|
88
|
+
* @param {string} sudoPassword - Sudo password for DNS/cert operations
|
|
89
|
+
*/
|
|
90
|
+
async function startMitm(apiKey, sudoPassword) {
|
|
91
|
+
// Check if already running
|
|
92
|
+
if (serverProcess && !serverProcess.killed) {
|
|
93
|
+
throw new Error("MITM proxy is already running");
|
|
94
|
+
}
|
|
95
|
+
// 1. Generate SSL certificate if not exists
|
|
96
|
+
const certPath = path_1.default.join((0, dataPaths_1.resolveDataDir)(), "mitm", "server.crt");
|
|
97
|
+
if (!fs_1.default.existsSync(certPath)) {
|
|
98
|
+
console.log("Generating SSL certificate...");
|
|
99
|
+
await (0, generate_1.generateCert)();
|
|
100
|
+
}
|
|
101
|
+
// 2. Install certificate to system keychain
|
|
102
|
+
await (0, install_1.installCert)(sudoPassword, certPath);
|
|
103
|
+
// 3. Add DNS entry
|
|
104
|
+
console.log("Adding DNS entry...");
|
|
105
|
+
await (0, dnsConfig_1.addDNSEntry)(sudoPassword);
|
|
106
|
+
// 4. Start MITM server
|
|
107
|
+
console.log("Starting MITM server...");
|
|
108
|
+
const serverPath = path_1.default.join(process.cwd(), "src/mitm/server.js");
|
|
109
|
+
serverProcess = (0, child_process_1.spawn)("node", [serverPath], {
|
|
110
|
+
env: {
|
|
111
|
+
...process.env,
|
|
112
|
+
ROUTER_API_KEY: apiKey,
|
|
113
|
+
NODE_ENV: "production",
|
|
114
|
+
},
|
|
115
|
+
detached: false,
|
|
116
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
117
|
+
});
|
|
118
|
+
serverPid = serverProcess.pid;
|
|
119
|
+
// Save PID to file
|
|
120
|
+
fs_1.default.writeFileSync(PID_FILE, String(serverPid));
|
|
121
|
+
// Log server output
|
|
122
|
+
serverProcess.stdout.on("data", (data) => {
|
|
123
|
+
console.log(`[MITM Server] ${data.toString().trim()}`);
|
|
124
|
+
});
|
|
125
|
+
serverProcess.stderr.on("data", (data) => {
|
|
126
|
+
console.error(`[MITM Server Error] ${data.toString().trim()}`);
|
|
127
|
+
});
|
|
128
|
+
serverProcess.on("exit", (code) => {
|
|
129
|
+
console.log(`MITM server exited with code ${code}`);
|
|
130
|
+
serverProcess = null;
|
|
131
|
+
serverPid = null;
|
|
132
|
+
// Remove PID file
|
|
133
|
+
try {
|
|
134
|
+
fs_1.default.unlinkSync(PID_FILE);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
// Ignore
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
// Wait and verify server actually started
|
|
141
|
+
const started = await new Promise((resolve) => {
|
|
142
|
+
let resolved = false;
|
|
143
|
+
const timeout = setTimeout(() => {
|
|
144
|
+
if (!resolved) {
|
|
145
|
+
resolved = true;
|
|
146
|
+
resolve(true);
|
|
147
|
+
}
|
|
148
|
+
}, 2000);
|
|
149
|
+
serverProcess.on("exit", (code) => {
|
|
150
|
+
clearTimeout(timeout);
|
|
151
|
+
if (!resolved) {
|
|
152
|
+
resolved = true;
|
|
153
|
+
resolve(false);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
// Check stderr for error messages
|
|
157
|
+
serverProcess.stderr.on("data", (data) => {
|
|
158
|
+
const msg = data.toString().trim();
|
|
159
|
+
if (msg.includes("Port") && msg.includes("already in use")) {
|
|
160
|
+
clearTimeout(timeout);
|
|
161
|
+
if (!resolved) {
|
|
162
|
+
resolved = true;
|
|
163
|
+
resolve(false);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
if (!started) {
|
|
169
|
+
throw new Error("MITM server failed to start (port 443 may be in use)");
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
running: true,
|
|
173
|
+
pid: serverPid,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Stop MITM proxy
|
|
178
|
+
* @param {string} sudoPassword - Sudo password for DNS cleanup
|
|
179
|
+
*/
|
|
180
|
+
async function stopMitm(sudoPassword) {
|
|
181
|
+
// 1. Kill server process (in-memory or from PID file)
|
|
182
|
+
const proc = serverProcess;
|
|
183
|
+
if (proc && !proc.killed) {
|
|
184
|
+
console.log("Stopping MITM server...");
|
|
185
|
+
proc.kill("SIGTERM");
|
|
186
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
187
|
+
if (!proc.killed) {
|
|
188
|
+
proc.kill("SIGKILL");
|
|
189
|
+
}
|
|
190
|
+
serverProcess = null;
|
|
191
|
+
serverPid = null;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// Fallback: kill by PID file
|
|
195
|
+
try {
|
|
196
|
+
if (fs_1.default.existsSync(PID_FILE)) {
|
|
197
|
+
const savedPid = parseInt(fs_1.default.readFileSync(PID_FILE, "utf-8").trim(), 10);
|
|
198
|
+
if (savedPid && isProcessAlive(savedPid)) {
|
|
199
|
+
console.log(`Killing MITM server (PID: ${savedPid})...`);
|
|
200
|
+
process.kill(savedPid, "SIGTERM");
|
|
201
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
202
|
+
if (isProcessAlive(savedPid)) {
|
|
203
|
+
process.kill(savedPid, "SIGKILL");
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// Ignore
|
|
210
|
+
}
|
|
211
|
+
serverProcess = null;
|
|
212
|
+
serverPid = null;
|
|
213
|
+
}
|
|
214
|
+
// 2. Remove DNS entry
|
|
215
|
+
console.log("Removing DNS entry...");
|
|
216
|
+
await (0, dnsConfig_1.removeDNSEntry)(sudoPassword);
|
|
217
|
+
// 3. Clean up
|
|
218
|
+
clearCachedPassword(); // Clear password from memory when proxy stops
|
|
219
|
+
try {
|
|
220
|
+
fs_1.default.unlinkSync(PID_FILE);
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
// Ignore
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
running: false,
|
|
227
|
+
pid: null,
|
|
228
|
+
};
|
|
229
|
+
}
|