opentunnel-cli 1.0.23 → 1.0.25

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.
Files changed (50) hide show
  1. package/README.md +39 -2
  2. package/dist/cli/index.js +678 -84
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/client/CloudflareTunnelClient.d.ts +110 -0
  5. package/dist/client/CloudflareTunnelClient.d.ts.map +1 -0
  6. package/dist/client/CloudflareTunnelClient.js +531 -0
  7. package/dist/client/CloudflareTunnelClient.js.map +1 -0
  8. package/dist/client/NgrokClient.d.ts +18 -1
  9. package/dist/client/NgrokClient.d.ts.map +1 -1
  10. package/dist/client/NgrokClient.js +130 -4
  11. package/dist/client/NgrokClient.js.map +1 -1
  12. package/dist/client/TunnelClient.d.ts +0 -1
  13. package/dist/client/TunnelClient.d.ts.map +1 -1
  14. package/dist/client/TunnelClient.js +2 -96
  15. package/dist/client/TunnelClient.js.map +1 -1
  16. package/dist/client/index.d.ts +1 -0
  17. package/dist/client/index.d.ts.map +1 -1
  18. package/dist/client/index.js +3 -1
  19. package/dist/client/index.js.map +1 -1
  20. package/dist/index.d.ts +1 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +3 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/lib/index.d.ts +2 -0
  25. package/dist/lib/index.d.ts.map +1 -0
  26. package/dist/lib/index.js +18 -0
  27. package/dist/lib/index.js.map +1 -0
  28. package/dist/lib/pages/index.d.ts +2 -0
  29. package/dist/lib/pages/index.d.ts.map +1 -0
  30. package/dist/lib/pages/index.js +6 -0
  31. package/dist/lib/pages/index.js.map +1 -0
  32. package/dist/lib/pages/not-running.d.ts +10 -0
  33. package/dist/lib/pages/not-running.d.ts.map +1 -0
  34. package/dist/lib/pages/not-running.js +117 -0
  35. package/dist/lib/pages/not-running.js.map +1 -0
  36. package/dist/server/TunnelServer.d.ts +1 -3
  37. package/dist/server/TunnelServer.d.ts.map +1 -1
  38. package/dist/server/TunnelServer.js +7 -58
  39. package/dist/server/TunnelServer.js.map +1 -1
  40. package/dist/shared/credentials.d.ts +101 -0
  41. package/dist/shared/credentials.d.ts.map +1 -0
  42. package/dist/shared/credentials.js +302 -0
  43. package/dist/shared/credentials.js.map +1 -0
  44. package/dist/shared/ip-filter.d.ts +75 -0
  45. package/dist/shared/ip-filter.d.ts.map +1 -0
  46. package/dist/shared/ip-filter.js +203 -0
  47. package/dist/shared/ip-filter.js.map +1 -0
  48. package/dist/shared/types.d.ts +34 -0
  49. package/dist/shared/types.d.ts.map +1 -1
  50. package/package.json +6 -3
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CredentialsManager = void 0;
37
+ exports.resolveNgrokToken = resolveNgrokToken;
38
+ exports.resolveCloudflareCredentials = resolveCloudflareCredentials;
39
+ exports.getCredentialsManager = getCredentialsManager;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const os = __importStar(require("os"));
43
+ // Credentials file location
44
+ const OPENTUNNEL_DIR = path.join(os.homedir(), ".opentunnel");
45
+ const CREDENTIALS_FILE = path.join(OPENTUNNEL_DIR, "credentials.json");
46
+ /**
47
+ * Credentials Manager
48
+ *
49
+ * Handles secure storage and retrieval of provider credentials.
50
+ * Credential resolution priority: CLI > ENV > YAML > credentials.json
51
+ */
52
+ class CredentialsManager {
53
+ constructor() {
54
+ this.credentials = {};
55
+ this.load();
56
+ }
57
+ /**
58
+ * Get the credentials directory path
59
+ */
60
+ static getCredentialsDir() {
61
+ return OPENTUNNEL_DIR;
62
+ }
63
+ /**
64
+ * Get the credentials file path
65
+ */
66
+ static getCredentialsFile() {
67
+ return CREDENTIALS_FILE;
68
+ }
69
+ /**
70
+ * Ensure the credentials directory exists with secure permissions
71
+ */
72
+ ensureDir() {
73
+ if (!fs.existsSync(OPENTUNNEL_DIR)) {
74
+ fs.mkdirSync(OPENTUNNEL_DIR, { recursive: true, mode: 0o700 });
75
+ }
76
+ }
77
+ /**
78
+ * Load credentials from file
79
+ */
80
+ load() {
81
+ try {
82
+ if (fs.existsSync(CREDENTIALS_FILE)) {
83
+ const content = fs.readFileSync(CREDENTIALS_FILE, "utf-8");
84
+ this.credentials = JSON.parse(content);
85
+ }
86
+ }
87
+ catch {
88
+ this.credentials = {};
89
+ }
90
+ return this.credentials;
91
+ }
92
+ /**
93
+ * Save credentials to file with secure permissions (0600)
94
+ */
95
+ save() {
96
+ this.ensureDir();
97
+ fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(this.credentials, null, 2), {
98
+ mode: 0o600,
99
+ });
100
+ }
101
+ /**
102
+ * Get all credentials
103
+ */
104
+ getAll() {
105
+ return this.credentials;
106
+ }
107
+ /**
108
+ * Get ngrok credentials
109
+ */
110
+ getNgrok() {
111
+ return this.credentials.ngrok;
112
+ }
113
+ /**
114
+ * Set ngrok credentials
115
+ */
116
+ setNgrok(creds) {
117
+ this.credentials.ngrok = creds;
118
+ this.save();
119
+ }
120
+ /**
121
+ * Remove ngrok credentials
122
+ */
123
+ removeNgrok() {
124
+ if (this.credentials.ngrok) {
125
+ delete this.credentials.ngrok;
126
+ this.save();
127
+ return true;
128
+ }
129
+ return false;
130
+ }
131
+ /**
132
+ * Get Cloudflare credentials
133
+ */
134
+ getCloudflare() {
135
+ return this.credentials.cloudflare;
136
+ }
137
+ /**
138
+ * Set Cloudflare credentials
139
+ */
140
+ setCloudflare(creds) {
141
+ this.credentials.cloudflare = {
142
+ ...this.credentials.cloudflare,
143
+ ...creds,
144
+ };
145
+ this.save();
146
+ }
147
+ /**
148
+ * Remove Cloudflare credentials
149
+ */
150
+ removeCloudflare() {
151
+ if (this.credentials.cloudflare) {
152
+ delete this.credentials.cloudflare;
153
+ this.save();
154
+ return true;
155
+ }
156
+ return false;
157
+ }
158
+ /**
159
+ * Remove all credentials for a provider
160
+ */
161
+ removeProvider(provider) {
162
+ if (provider === "ngrok") {
163
+ return this.removeNgrok();
164
+ }
165
+ else if (provider === "cloudflare") {
166
+ return this.removeCloudflare();
167
+ }
168
+ return false;
169
+ }
170
+ /**
171
+ * Set a specific credential value using dot notation
172
+ * e.g., "ngrok.token", "cloudflare.accountId"
173
+ */
174
+ set(key, value) {
175
+ const [provider, field] = key.split(".");
176
+ if (provider === "ngrok") {
177
+ if (!this.credentials.ngrok) {
178
+ this.credentials.ngrok = { token: "" };
179
+ }
180
+ if (field === "token") {
181
+ this.credentials.ngrok.token = value;
182
+ }
183
+ }
184
+ else if (provider === "cloudflare") {
185
+ if (!this.credentials.cloudflare) {
186
+ this.credentials.cloudflare = {};
187
+ }
188
+ if (field === "accountId") {
189
+ this.credentials.cloudflare.accountId = value;
190
+ }
191
+ else if (field === "tunnelToken") {
192
+ this.credentials.cloudflare.tunnelToken = value;
193
+ }
194
+ else if (field === "certPath") {
195
+ this.credentials.cloudflare.certPath = value;
196
+ }
197
+ }
198
+ this.save();
199
+ }
200
+ /**
201
+ * Get a specific credential value using dot notation
202
+ * e.g., "ngrok.token", "cloudflare.accountId"
203
+ */
204
+ get(key) {
205
+ const [provider, field] = key.split(".");
206
+ if (provider === "ngrok" && this.credentials.ngrok) {
207
+ if (field === "token") {
208
+ return this.credentials.ngrok.token;
209
+ }
210
+ }
211
+ else if (provider === "cloudflare" && this.credentials.cloudflare) {
212
+ if (field === "accountId") {
213
+ return this.credentials.cloudflare.accountId;
214
+ }
215
+ else if (field === "tunnelToken") {
216
+ return this.credentials.cloudflare.tunnelToken;
217
+ }
218
+ else if (field === "certPath") {
219
+ return this.credentials.cloudflare.certPath;
220
+ }
221
+ }
222
+ return undefined;
223
+ }
224
+ /**
225
+ * List all stored credential keys (not values for security)
226
+ */
227
+ listKeys() {
228
+ const keys = [];
229
+ if (this.credentials.ngrok) {
230
+ if (this.credentials.ngrok.token)
231
+ keys.push("ngrok.token");
232
+ }
233
+ if (this.credentials.cloudflare) {
234
+ if (this.credentials.cloudflare.accountId)
235
+ keys.push("cloudflare.accountId");
236
+ if (this.credentials.cloudflare.tunnelToken)
237
+ keys.push("cloudflare.tunnelToken");
238
+ if (this.credentials.cloudflare.certPath)
239
+ keys.push("cloudflare.certPath");
240
+ }
241
+ return keys;
242
+ }
243
+ /**
244
+ * Clear all credentials
245
+ */
246
+ clear() {
247
+ this.credentials = {};
248
+ this.save();
249
+ }
250
+ }
251
+ exports.CredentialsManager = CredentialsManager;
252
+ /**
253
+ * Resolve ngrok token with priority: CLI > ENV > YAML > credentials.json
254
+ */
255
+ function resolveNgrokToken(options) {
256
+ // 1. CLI flag (highest priority)
257
+ if (options.cliToken) {
258
+ return options.cliToken;
259
+ }
260
+ // 2. Environment variable
261
+ const envToken = process.env.NGROK_TOKEN || process.env.NGROK_AUTHTOKEN;
262
+ if (envToken) {
263
+ return envToken;
264
+ }
265
+ // 3. YAML config
266
+ if (options.yamlToken) {
267
+ return options.yamlToken;
268
+ }
269
+ // 4. Stored credentials (lowest priority)
270
+ const manager = new CredentialsManager();
271
+ return manager.getNgrok()?.token;
272
+ }
273
+ /**
274
+ * Resolve Cloudflare credentials with priority: CLI > ENV > YAML > credentials.json
275
+ */
276
+ function resolveCloudflareCredentials(options) {
277
+ const manager = new CredentialsManager();
278
+ const stored = manager.getCloudflare() || {};
279
+ return {
280
+ accountId: options.cliAccountId
281
+ || process.env.CLOUDFLARE_ACCOUNT_ID
282
+ || options.yamlAccountId
283
+ || stored.accountId,
284
+ tunnelToken: options.cliTunnelToken
285
+ || process.env.CLOUDFLARE_TUNNEL_TOKEN
286
+ || options.yamlTunnelToken
287
+ || stored.tunnelToken,
288
+ certPath: options.cliCertPath
289
+ || process.env.CLOUDFLARE_CERT_PATH
290
+ || options.yamlCertPath
291
+ || stored.certPath,
292
+ };
293
+ }
294
+ // Singleton instance for convenience
295
+ let _instance = null;
296
+ function getCredentialsManager() {
297
+ if (!_instance) {
298
+ _instance = new CredentialsManager();
299
+ }
300
+ return _instance;
301
+ }
302
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/shared/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { IncomingMessage } from "http";
2
+ import { IpAccessConfig } from "./types";
3
+ /**
4
+ * Result of an IP access check
5
+ */
6
+ export interface IpCheckResult {
7
+ allowed: boolean;
8
+ reason?: string;
9
+ }
10
+ /**
11
+ * Shared IP filtering class for cross-provider security
12
+ *
13
+ * Supports:
14
+ * - Allowlist mode: Only IPs in the list are allowed
15
+ * - Denylist mode: IPs in the list are denied, others allowed
16
+ * - CIDR notation (e.g., 192.168.0.0/16)
17
+ * - IPv6-mapped IPv4 normalization
18
+ * - X-Forwarded-For / CF-Connecting-IP header extraction
19
+ */
20
+ export declare class IpFilter {
21
+ private config;
22
+ constructor(config?: IpAccessConfig);
23
+ /**
24
+ * Update the filter configuration
25
+ */
26
+ setConfig(config: IpAccessConfig): void;
27
+ /**
28
+ * Get the current configuration
29
+ */
30
+ getConfig(): IpAccessConfig;
31
+ /**
32
+ * Check if an IP matches a CIDR range or single IP
33
+ */
34
+ ipMatchesCidr(ip: string, cidr: string): boolean;
35
+ /**
36
+ * Check if an IP is in a list (supports CIDR notation)
37
+ */
38
+ ipInList(ip: string, list: string[]): boolean;
39
+ /**
40
+ * Check if an IP is allowed based on the access config
41
+ */
42
+ isAllowed(ip: string): IpCheckResult;
43
+ /**
44
+ * Normalize an IP address (removes IPv6-mapped IPv4 prefix)
45
+ */
46
+ static normalizeIp(ip: string): string;
47
+ /**
48
+ * Extract client IP from various headers and socket
49
+ *
50
+ * Priority:
51
+ * 1. CF-Connecting-IP (Cloudflare)
52
+ * 2. X-Real-IP (nginx, common proxies)
53
+ * 3. X-Forwarded-For (first IP, standard proxy header)
54
+ * 4. Socket remoteAddress (direct connection)
55
+ */
56
+ static extractClientIp(req: IncomingMessage): string;
57
+ /**
58
+ * Extract client IP from headers object (for use without IncomingMessage)
59
+ */
60
+ static extractClientIpFromHeaders(headers: Record<string, string | string[] | undefined>, socketAddress?: string): string;
61
+ /**
62
+ * Merge two IP access configs, with the second one taking priority for non-undefined values
63
+ * Useful for per-tunnel config overriding global config
64
+ */
65
+ static mergeConfigs(base?: IpAccessConfig, override?: IpAccessConfig): IpAccessConfig | undefined;
66
+ }
67
+ /**
68
+ * Create a filter middleware function for HTTP servers
69
+ *
70
+ * @param config IP access configuration
71
+ * @param onDenied Optional callback when access is denied
72
+ * @returns Middleware function that returns true if allowed, false if denied
73
+ */
74
+ export declare function createIpFilterMiddleware(config?: IpAccessConfig, onDenied?: (ip: string, reason: string) => void): (req: IncomingMessage) => IpCheckResult;
75
+ //# sourceMappingURL=ip-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip-filter.d.ts","sourceRoot":"","sources":["../../src/shared/ip-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,qBAAa,QAAQ;IACjB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,CAAC,EAAE,cAAc;IAInC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAIvC;;OAEG;IACH,SAAS,IAAI,cAAc;IAI3B;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IA6BhD;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO;IAI7C;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa;IA4BpC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAItC;;;;;;;;OAQG;IACH,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM;IAkCpD;;OAEG;IACH,MAAM,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM;IAiCzH;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,cAAc,GAAG,SAAS;CAmBpG;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACpC,MAAM,CAAC,EAAE,cAAc,EACvB,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAChD,CAAC,GAAG,EAAE,eAAe,KAAK,aAAa,CAazC"}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IpFilter = void 0;
4
+ exports.createIpFilterMiddleware = createIpFilterMiddleware;
5
+ /**
6
+ * Shared IP filtering class for cross-provider security
7
+ *
8
+ * Supports:
9
+ * - Allowlist mode: Only IPs in the list are allowed
10
+ * - Denylist mode: IPs in the list are denied, others allowed
11
+ * - CIDR notation (e.g., 192.168.0.0/16)
12
+ * - IPv6-mapped IPv4 normalization
13
+ * - X-Forwarded-For / CF-Connecting-IP header extraction
14
+ */
15
+ class IpFilter {
16
+ constructor(config) {
17
+ this.config = config || { mode: "all" };
18
+ }
19
+ /**
20
+ * Update the filter configuration
21
+ */
22
+ setConfig(config) {
23
+ this.config = config;
24
+ }
25
+ /**
26
+ * Get the current configuration
27
+ */
28
+ getConfig() {
29
+ return this.config;
30
+ }
31
+ /**
32
+ * Check if an IP matches a CIDR range or single IP
33
+ */
34
+ ipMatchesCidr(ip, cidr) {
35
+ // Normalize IPv6-mapped IPv4 addresses
36
+ const normalizedIp = IpFilter.normalizeIp(ip);
37
+ const normalizedCidr = IpFilter.normalizeIp(cidr);
38
+ // If it's a single IP (no /), do direct comparison
39
+ if (!normalizedCidr.includes("/")) {
40
+ return normalizedIp === normalizedCidr;
41
+ }
42
+ const [range, bits] = normalizedCidr.split("/");
43
+ const mask = parseInt(bits, 10);
44
+ // Convert IP addresses to numbers for comparison
45
+ const ipParts = normalizedIp.split(".").map(Number);
46
+ const rangeParts = range.split(".").map(Number);
47
+ if (ipParts.length !== 4 || rangeParts.length !== 4) {
48
+ // Not valid IPv4, try simple string match
49
+ return normalizedIp === range;
50
+ }
51
+ const ipNum = (ipParts[0] << 24) | (ipParts[1] << 16) | (ipParts[2] << 8) | ipParts[3];
52
+ const rangeNum = (rangeParts[0] << 24) | (rangeParts[1] << 16) | (rangeParts[2] << 8) | rangeParts[3];
53
+ const maskNum = ~((1 << (32 - mask)) - 1);
54
+ return (ipNum & maskNum) === (rangeNum & maskNum);
55
+ }
56
+ /**
57
+ * Check if an IP is in a list (supports CIDR notation)
58
+ */
59
+ ipInList(ip, list) {
60
+ return list.some(entry => this.ipMatchesCidr(ip, entry));
61
+ }
62
+ /**
63
+ * Check if an IP is allowed based on the access config
64
+ */
65
+ isAllowed(ip) {
66
+ // Default: allow all
67
+ if (!this.config || this.config.mode === "all") {
68
+ return { allowed: true };
69
+ }
70
+ // Normalize IP
71
+ const normalizedIp = IpFilter.normalizeIp(ip);
72
+ if (this.config.mode === "allowlist") {
73
+ // Only allow IPs in the allowList
74
+ if (this.config.allowList && this.ipInList(normalizedIp, this.config.allowList)) {
75
+ return { allowed: true };
76
+ }
77
+ return { allowed: false, reason: `IP ${normalizedIp} not in allowlist` };
78
+ }
79
+ if (this.config.mode === "denylist") {
80
+ // Deny IPs in the denyList, allow others
81
+ if (this.config.denyList && this.ipInList(normalizedIp, this.config.denyList)) {
82
+ return { allowed: false, reason: `IP ${normalizedIp} is in denylist` };
83
+ }
84
+ return { allowed: true };
85
+ }
86
+ return { allowed: true };
87
+ }
88
+ /**
89
+ * Normalize an IP address (removes IPv6-mapped IPv4 prefix)
90
+ */
91
+ static normalizeIp(ip) {
92
+ return ip.replace(/^::ffff:/, "");
93
+ }
94
+ /**
95
+ * Extract client IP from various headers and socket
96
+ *
97
+ * Priority:
98
+ * 1. CF-Connecting-IP (Cloudflare)
99
+ * 2. X-Real-IP (nginx, common proxies)
100
+ * 3. X-Forwarded-For (first IP, standard proxy header)
101
+ * 4. Socket remoteAddress (direct connection)
102
+ */
103
+ static extractClientIp(req) {
104
+ // Cloudflare specific header
105
+ const cfConnectingIp = req.headers["cf-connecting-ip"];
106
+ if (cfConnectingIp) {
107
+ const ip = Array.isArray(cfConnectingIp) ? cfConnectingIp[0] : cfConnectingIp;
108
+ return IpFilter.normalizeIp(ip.trim());
109
+ }
110
+ // X-Real-IP header (nginx, etc.)
111
+ const xRealIp = req.headers["x-real-ip"];
112
+ if (xRealIp) {
113
+ const ip = Array.isArray(xRealIp) ? xRealIp[0] : xRealIp;
114
+ return IpFilter.normalizeIp(ip.trim());
115
+ }
116
+ // X-Forwarded-For header (first IP is the client)
117
+ const xForwardedFor = req.headers["x-forwarded-for"];
118
+ if (xForwardedFor) {
119
+ const forwardedIps = Array.isArray(xForwardedFor)
120
+ ? xForwardedFor[0]
121
+ : xForwardedFor;
122
+ const firstIp = forwardedIps.split(",")[0].trim();
123
+ return IpFilter.normalizeIp(firstIp);
124
+ }
125
+ // Direct socket connection
126
+ const socketAddress = req.socket.remoteAddress;
127
+ if (socketAddress) {
128
+ return IpFilter.normalizeIp(socketAddress);
129
+ }
130
+ return "unknown";
131
+ }
132
+ /**
133
+ * Extract client IP from headers object (for use without IncomingMessage)
134
+ */
135
+ static extractClientIpFromHeaders(headers, socketAddress) {
136
+ // Cloudflare specific header
137
+ const cfConnectingIp = headers["cf-connecting-ip"];
138
+ if (cfConnectingIp) {
139
+ const ip = Array.isArray(cfConnectingIp) ? cfConnectingIp[0] : cfConnectingIp;
140
+ return IpFilter.normalizeIp(ip.trim());
141
+ }
142
+ // X-Real-IP header
143
+ const xRealIp = headers["x-real-ip"];
144
+ if (xRealIp) {
145
+ const ip = Array.isArray(xRealIp) ? xRealIp[0] : xRealIp;
146
+ return IpFilter.normalizeIp(ip.trim());
147
+ }
148
+ // X-Forwarded-For header
149
+ const xForwardedFor = headers["x-forwarded-for"];
150
+ if (xForwardedFor) {
151
+ const forwardedIps = Array.isArray(xForwardedFor)
152
+ ? xForwardedFor[0]
153
+ : xForwardedFor;
154
+ const firstIp = forwardedIps.split(",")[0].trim();
155
+ return IpFilter.normalizeIp(firstIp);
156
+ }
157
+ // Socket address fallback
158
+ if (socketAddress) {
159
+ return IpFilter.normalizeIp(socketAddress);
160
+ }
161
+ return "unknown";
162
+ }
163
+ /**
164
+ * Merge two IP access configs, with the second one taking priority for non-undefined values
165
+ * Useful for per-tunnel config overriding global config
166
+ */
167
+ static mergeConfigs(base, override) {
168
+ if (!base && !override) {
169
+ return undefined;
170
+ }
171
+ if (!base) {
172
+ return override;
173
+ }
174
+ if (!override) {
175
+ return base;
176
+ }
177
+ return {
178
+ mode: override.mode || base.mode,
179
+ allowList: override.allowList || base.allowList,
180
+ denyList: override.denyList || base.denyList,
181
+ };
182
+ }
183
+ }
184
+ exports.IpFilter = IpFilter;
185
+ /**
186
+ * Create a filter middleware function for HTTP servers
187
+ *
188
+ * @param config IP access configuration
189
+ * @param onDenied Optional callback when access is denied
190
+ * @returns Middleware function that returns true if allowed, false if denied
191
+ */
192
+ function createIpFilterMiddleware(config, onDenied) {
193
+ const filter = new IpFilter(config);
194
+ return (req) => {
195
+ const clientIp = IpFilter.extractClientIp(req);
196
+ const result = filter.isAllowed(clientIp);
197
+ if (!result.allowed && onDenied) {
198
+ onDenied(clientIp, result.reason || "Access denied");
199
+ }
200
+ return result;
201
+ };
202
+ }
203
+ //# sourceMappingURL=ip-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip-filter.js","sourceRoot":"","sources":["../../src/shared/ip-filter.ts"],"names":[],"mappings":"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"}
@@ -169,4 +169,38 @@ export interface DnsProvider {
169
169
  updateRecord(subdomain: string, ip: string): Promise<boolean>;
170
170
  deleteRecord(subdomain: string): Promise<boolean>;
171
171
  }
172
+ /**
173
+ * Cloudflare credentials for tunnel management
174
+ */
175
+ export interface CloudflareCredentials {
176
+ accountId?: string;
177
+ tunnelToken?: string;
178
+ certPath?: string;
179
+ }
180
+ /**
181
+ * ngrok credentials
182
+ */
183
+ export interface NgrokCredentials {
184
+ token: string;
185
+ }
186
+ /**
187
+ * Global credentials storage structure
188
+ */
189
+ export interface GlobalCredentials {
190
+ ngrok?: NgrokCredentials;
191
+ cloudflare?: CloudflareCredentials;
192
+ }
193
+ /**
194
+ * Cloudflare named tunnel info (from cloudflared tunnel list)
195
+ */
196
+ export interface CloudflareTunnelInfo {
197
+ id: string;
198
+ name: string;
199
+ createdAt: Date;
200
+ connections?: {
201
+ connIndex: number;
202
+ isRunning: boolean;
203
+ originIp: string;
204
+ }[];
205
+ }
172
206
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}