davechri 1.0.0

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.

Potentially problematic release.


This version of davechri might be problematic. Click here for more details.

Files changed (113) hide show
  1. package/README.md +277 -0
  2. package/bin/proxyall +5 -0
  3. package/build/app.js +89 -0
  4. package/build/app.js.map +1 -0
  5. package/build/common/Message.js +34 -0
  6. package/build/common/Message.js.map +1 -0
  7. package/build/common/ProxyConfig.js +27 -0
  8. package/build/common/ProxyConfig.js.map +1 -0
  9. package/build/node-http-mitm-proxy/.gitattributes +2 -0
  10. package/build/node-http-mitm-proxy/.travis.yml +10 -0
  11. package/build/node-http-mitm-proxy/README.md +539 -0
  12. package/build/node-http-mitm-proxy/bin/mitm-proxy.js +36 -0
  13. package/build/node-http-mitm-proxy/examples/forwardHttps.js +62 -0
  14. package/build/node-http-mitm-proxy/examples/modifyGoogle.js +44 -0
  15. package/build/node-http-mitm-proxy/examples/onCertificateMissing.js +30 -0
  16. package/build/node-http-mitm-proxy/examples/onCertificateRequired.js +23 -0
  17. package/build/node-http-mitm-proxy/examples/preventRequest.js +20 -0
  18. package/build/node-http-mitm-proxy/examples/processFullResponseBody.js +36 -0
  19. package/build/node-http-mitm-proxy/examples/removeProxyToServerContentLength.js +17 -0
  20. package/build/node-http-mitm-proxy/examples/websocket.js +31 -0
  21. package/build/node-http-mitm-proxy/examples/wildcard.js +17 -0
  22. package/build/node-http-mitm-proxy/index.d.ts +233 -0
  23. package/build/node-http-mitm-proxy/index.js +3 -0
  24. package/build/node-http-mitm-proxy/lib/ca.js +245 -0
  25. package/build/node-http-mitm-proxy/lib/middleware/gunzip.js +19 -0
  26. package/build/node-http-mitm-proxy/lib/middleware/wildcard.js +22 -0
  27. package/build/node-http-mitm-proxy/lib/proxy.js +1137 -0
  28. package/build/node-http-mitm-proxy/package-lock.json +1406 -0
  29. package/build/node-http-mitm-proxy/package.json +45 -0
  30. package/build/node-http-mitm-proxy/test/01_proxy.js +449 -0
  31. package/build/node-http-mitm-proxy/test/www/1024.bin +64 -0
  32. package/build/node-http-mitm-proxy/test/wwwA/1024.bin +64 -0
  33. package/build/node-http-mitm-proxy/test/wwwA/example.com.html +8 -0
  34. package/build/node-http-mitm-proxy/test/wwwA/index.html +0 -0
  35. package/build/node-http-mitm-proxy/test/wwwB/1024.bin +64 -0
  36. package/build/node-http-mitm-proxy/test/wwwB/index.html +0 -0
  37. package/build/private/keys/README.md +2 -0
  38. package/build/private/keys/server.crt +20 -0
  39. package/build/private/keys/server.key +28 -0
  40. package/build/private/keys/ssl.conf +25 -0
  41. package/build/server/src/Global.js +38 -0
  42. package/build/server/src/Global.js.map +1 -0
  43. package/build/server/src/Http2Proxy.js +197 -0
  44. package/build/server/src/Http2Proxy.js.map +1 -0
  45. package/build/server/src/HttpMessage.js +99 -0
  46. package/build/server/src/HttpMessage.js.map +1 -0
  47. package/build/server/src/HttpProxy.js +196 -0
  48. package/build/server/src/HttpProxy.js.map +1 -0
  49. package/build/server/src/HttpsProxy.js +110 -0
  50. package/build/server/src/HttpsProxy.js.map +1 -0
  51. package/build/server/src/LogProxy.js +115 -0
  52. package/build/server/src/LogProxy.js.map +1 -0
  53. package/build/server/src/Paths.js +28 -0
  54. package/build/server/src/Paths.js.map +1 -0
  55. package/build/server/src/Ping.js +21 -0
  56. package/build/server/src/Ping.js.map +1 -0
  57. package/build/server/src/ProxyAllApp.js +70 -0
  58. package/build/server/src/ProxyAllApp.js.map +1 -0
  59. package/build/server/src/Resend.js +89 -0
  60. package/build/server/src/Resend.js.map +1 -0
  61. package/build/server/src/SocketIoManager.js +312 -0
  62. package/build/server/src/SocketIoManager.js.map +1 -0
  63. package/build/server/src/SocketMessage.js +68 -0
  64. package/build/server/src/SocketMessage.js.map +1 -0
  65. package/build/server/src/TcpProxy.js +202 -0
  66. package/build/server/src/TcpProxy.js.map +1 -0
  67. package/build/server/src/formatters/HexFormatter.js +33 -0
  68. package/build/server/src/formatters/HexFormatter.js.map +1 -0
  69. package/build/server/src/formatters/MongoFormatter.js +97 -0
  70. package/build/server/src/formatters/MongoFormatter.js.map +1 -0
  71. package/build/server/src/formatters/MongoOpCode.js +51 -0
  72. package/build/server/src/formatters/MongoOpCode.js.map +1 -0
  73. package/build/server/src/formatters/RedisFormatter.js +25 -0
  74. package/build/server/src/formatters/RedisFormatter.js.map +1 -0
  75. package/build/server/src/formatters/SqlCommand.js +111 -0
  76. package/build/server/src/formatters/SqlCommand.js.map +1 -0
  77. package/build/server/src/formatters/SqlFormatter.js +150 -0
  78. package/build/server/src/formatters/SqlFormatter.js.map +1 -0
  79. package/client/README.md +46 -0
  80. package/client/build/asset-manifest.json +26 -0
  81. package/client/build/favicon.ico +0 -0
  82. package/client/build/index.html +1 -0
  83. package/client/build/manifest.json +8 -0
  84. package/client/build/robots.txt +3 -0
  85. package/client/build/static/css/2.bbde182e.chunk.css +12 -0
  86. package/client/build/static/css/2.bbde182e.chunk.css.map +1 -0
  87. package/client/build/static/css/main.5bf489b2.chunk.css +2 -0
  88. package/client/build/static/css/main.5bf489b2.chunk.css.map +1 -0
  89. package/client/build/static/js/2.ba308ba1.chunk.js +3 -0
  90. package/client/build/static/js/2.ba308ba1.chunk.js.LICENSE.txt +100 -0
  91. package/client/build/static/js/2.ba308ba1.chunk.js.map +1 -0
  92. package/client/build/static/js/3.7073b0d8.chunk.js +2 -0
  93. package/client/build/static/js/3.7073b0d8.chunk.js.map +1 -0
  94. package/client/build/static/js/main.494a7501.chunk.js +2 -0
  95. package/client/build/static/js/main.494a7501.chunk.js.map +1 -0
  96. package/client/build/static/js/runtime-main.00264969.js +2 -0
  97. package/client/build/static/js/runtime-main.00264969.js.map +1 -0
  98. package/client/build/static/media/fa-brands-400.2285773e.woff +0 -0
  99. package/client/build/static/media/fa-brands-400.23f19bb0.eot +0 -0
  100. package/client/build/static/media/fa-brands-400.2f517e09.svg +3717 -0
  101. package/client/build/static/media/fa-brands-400.527940b1.ttf +0 -0
  102. package/client/build/static/media/fa-brands-400.d878b0a6.woff2 +0 -0
  103. package/client/build/static/media/fa-regular-400.4689f52c.svg +801 -0
  104. package/client/build/static/media/fa-regular-400.491974d1.ttf +0 -0
  105. package/client/build/static/media/fa-regular-400.77206a6b.eot +0 -0
  106. package/client/build/static/media/fa-regular-400.7a333762.woff2 +0 -0
  107. package/client/build/static/media/fa-regular-400.bb58e57c.woff +0 -0
  108. package/client/build/static/media/fa-solid-900.1551f4f6.woff2 +0 -0
  109. package/client/build/static/media/fa-solid-900.7a8b4f13.svg +5034 -0
  110. package/client/build/static/media/fa-solid-900.9bbb245e.eot +0 -0
  111. package/client/build/static/media/fa-solid-900.be9ee23c.ttf +0 -0
  112. package/client/build/static/media/fa-solid-900.eeccf4f6.woff +0 -0
  113. package/package.json +80 -0
@@ -0,0 +1,312 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const socket_io_1 = __importDefault(require("socket.io"));
16
+ const TcpProxy_1 = __importDefault(require("./TcpProxy"));
17
+ const LogProxy_1 = __importDefault(require("./LogProxy"));
18
+ const fs_1 = __importDefault(require("fs"));
19
+ const ProxyConfig_1 = __importDefault(require("../../common/ProxyConfig"));
20
+ const net_1 = __importDefault(require("net"));
21
+ const Ping_1 = __importDefault(require("./Ping"));
22
+ const Resend_1 = __importDefault(require("./Resend"));
23
+ const Http2Proxy_1 = __importDefault(require("./Http2Proxy"));
24
+ const Paths_1 = __importDefault(require("./Paths"));
25
+ const USE_HTTP2 = true;
26
+ const CONFIG_JSON = Paths_1.default.configJson();
27
+ const CACHE_SOCKET_ID = 'cache';
28
+ const WINDOW_SIZE = 500; // windows size - maximum outstanding messages
29
+ const MAX_OUT = 2; // two message batches
30
+ class SocketInfo {
31
+ constructor(socket, configs) {
32
+ this.socket = undefined;
33
+ this.configs = [];
34
+ this.seqNum = 0;
35
+ this.remainingWindow = WINDOW_SIZE;
36
+ this.messagesOut = 0;
37
+ this.queuedMessages = [];
38
+ this.socket = socket;
39
+ this.configs = configs;
40
+ }
41
+ }
42
+ ;
43
+ class SocketIoManager {
44
+ constructor() {
45
+ this.socketIoMap = new Map();
46
+ this.resolveQueue = [];
47
+ this.activateConfig(this.getConfig());
48
+ }
49
+ defaultConfig() {
50
+ // proxy all http by default
51
+ return [
52
+ {
53
+ isSecure: false,
54
+ protocol: 'browser:',
55
+ path: '/',
56
+ hostname: '',
57
+ port: 0,
58
+ recording: true,
59
+ hostReachable: true,
60
+ comment: ''
61
+ }
62
+ ];
63
+ }
64
+ getConfig() {
65
+ const configs = fs_1.default.existsSync(CONFIG_JSON)
66
+ ? JSON.parse(fs_1.default.readFileSync(CONFIG_JSON).toString()).configs
67
+ : this.defaultConfig();
68
+ let modified = false;
69
+ for (const config of configs) {
70
+ if (config.protocol === 'proxy:') {
71
+ config.protocol = 'browser:';
72
+ modified = true;
73
+ }
74
+ }
75
+ modified && this.saveConfig(configs);
76
+ return configs;
77
+ }
78
+ updateHostReachable() {
79
+ return new Promise((resolve) => {
80
+ const configs = this.getConfig();
81
+ this.resolveQueue.push(resolve);
82
+ if (this.resolveQueue.length > 1)
83
+ return;
84
+ let count = 0;
85
+ const done = () => {
86
+ if (++count === configs.length) {
87
+ // const queueCount = this.resolveQueue.length
88
+ let func;
89
+ // eslint-disable-next-line no-cond-assign
90
+ while (func = this.resolveQueue.pop()) {
91
+ func(configs);
92
+ }
93
+ }
94
+ };
95
+ configs.forEach(config => {
96
+ if (config.protocol === 'browser:' || config.protocol === 'log:') {
97
+ config.hostReachable = true;
98
+ done();
99
+ }
100
+ else {
101
+ config.hostReachable = false;
102
+ setTimeout(() => __awaiter(this, void 0, void 0, function* () {
103
+ const pingSuccessful = yield Ping_1.default.host(config.hostname);
104
+ if (!pingSuccessful) {
105
+ done();
106
+ }
107
+ else {
108
+ const socket = net_1.default.connect(config.port, config.hostname, () => {
109
+ config.hostReachable = true;
110
+ socket.end();
111
+ done();
112
+ });
113
+ socket.on('error', (_err) => {
114
+ done();
115
+ socket.end();
116
+ });
117
+ }
118
+ }));
119
+ }
120
+ });
121
+ });
122
+ }
123
+ saveConfig(proxyConfigs) {
124
+ // Cache the config, to configure the proxy on the next start up prior
125
+ // to receiving the config from the browser.
126
+ fs_1.default.writeFileSync(CONFIG_JSON, JSON.stringify({ configs: proxyConfigs }, null, 2));
127
+ }
128
+ addHttpServer(httpServer) {
129
+ const server = new socket_io_1.default.Server(httpServer);
130
+ server.on('connection', (socket) => this._socketConnection(socket));
131
+ }
132
+ _socketConnection(socket) {
133
+ const config = this.getConfig();
134
+ socket.emit('proxy config', config); // send config to browser
135
+ socket.on('proxy config', (proxyConfigs) => {
136
+ console.log('ProxyConfigs: proxy config received', socket.conn.id, proxyConfigs);
137
+ this.saveConfig(proxyConfigs);
138
+ // Make sure all matching 'any:' protocol servers are closed.
139
+ for (const proxyConfig of proxyConfigs) {
140
+ if (!ProxyConfig_1.default.isHttpOrHttps(proxyConfig)) {
141
+ this.closeAnyServerWithPort(proxyConfig.port);
142
+ }
143
+ }
144
+ this.activateConfig(proxyConfigs, socket);
145
+ // this.updateHostReachable();
146
+ });
147
+ socket.on('resend', (forwardProxy, method, url, message, body) => {
148
+ Resend_1.default(forwardProxy, method, url, message, body);
149
+ });
150
+ socket.on('disconnect', () => {
151
+ this.closeAnyServersWithSocket(socket.conn.id);
152
+ this.socketIoMap.delete(socket.conn.id);
153
+ });
154
+ socket.on('error', (e) => {
155
+ console.error('error', e);
156
+ });
157
+ }
158
+ activateConfig(proxyConfigs, socket) {
159
+ return __awaiter(this, void 0, void 0, function* () {
160
+ for (const proxyConfig of proxyConfigs) {
161
+ if (proxyConfig.protocol === 'log:') {
162
+ // eslint-disable-next-line no-new
163
+ new LogProxy_1.default(proxyConfig);
164
+ }
165
+ else if (proxyConfig.protocol === 'grpc:' && USE_HTTP2) {
166
+ Http2Proxy_1.default.reverseProxy(proxyConfig);
167
+ }
168
+ else if (!ProxyConfig_1.default.isHttpOrHttps(proxyConfig)) {
169
+ // eslint-disable-next-line no-new
170
+ new TcpProxy_1.default(proxyConfig);
171
+ }
172
+ }
173
+ this.socketIoMap.set(socket ? socket.conn.id : CACHE_SOCKET_ID, new SocketInfo((socket || undefined), proxyConfigs));
174
+ if (socket !== undefined) {
175
+ this.closeAnyServersWithSocket(CACHE_SOCKET_ID);
176
+ this.socketIoMap.delete(CACHE_SOCKET_ID);
177
+ }
178
+ });
179
+ }
180
+ // Close 'any:' protocol servers that are running for the browser owning the socket
181
+ closeAnyServersWithSocket(socketId) {
182
+ this.socketIoMap.forEach((socketInfo, key) => {
183
+ if (socketId && key !== socketId)
184
+ return;
185
+ for (const proxyConfig of socketInfo.configs) {
186
+ if (proxyConfig.protocol === 'log:') {
187
+ LogProxy_1.default.destructor(proxyConfig);
188
+ }
189
+ if (proxyConfig.protocol === 'grpc:') {
190
+ Http2Proxy_1.default.destructor(proxyConfig);
191
+ }
192
+ else if (!ProxyConfig_1.default.isHttpOrHttps(proxyConfig)) {
193
+ TcpProxy_1.default.destructor(proxyConfig);
194
+ }
195
+ }
196
+ });
197
+ }
198
+ // Close 'any:' protocol servers the specified listening port
199
+ closeAnyServerWithPort(port) {
200
+ this.socketIoMap.forEach((socketInfo, _key) => {
201
+ for (const proxyConfig of socketInfo.configs) {
202
+ if (!ProxyConfig_1.default.isHttpOrHttps(proxyConfig) && proxyConfig.port === port) {
203
+ if (proxyConfig.protocol === 'grpc:' && USE_HTTP2) {
204
+ Http2Proxy_1.default.destructor(proxyConfig);
205
+ }
206
+ else {
207
+ TcpProxy_1.default.destructor(proxyConfig);
208
+ }
209
+ }
210
+ }
211
+ });
212
+ }
213
+ isMatch(needle, haystack) {
214
+ if (needle.indexOf('.*') !== -1) {
215
+ const match = haystack.match(needle);
216
+ return match !== null && match.length > 0;
217
+ }
218
+ else {
219
+ return haystack.startsWith(needle);
220
+ }
221
+ }
222
+ /**
223
+ * Find proxy config matching URL
224
+ * @params protocol
225
+ * @params clientHostName
226
+ * @param {*} reqUrl
227
+ * @returns ProxyConfig
228
+ */
229
+ findProxyConfigMatchingURL(protocol, clientHostName, reqUrl) {
230
+ const reqUrlPath = reqUrl.pathname.replace(/\/\//g, '/');
231
+ const isForwardProxy = reqUrl.protocol !== null;
232
+ let matchingProxyConfig;
233
+ // Find matching proxy configuration
234
+ this.socketIoMap.forEach((socketInfo, _key) => {
235
+ for (const proxyConfig of socketInfo.configs) {
236
+ if (proxyConfig.protocol !== protocol && proxyConfig.protocol !== 'browser:')
237
+ continue;
238
+ if ((this.isMatch(proxyConfig.path, reqUrlPath) ||
239
+ this.isMatch(proxyConfig.path, clientHostName + reqUrlPath)) &&
240
+ isForwardProxy === (proxyConfig.protocol === 'browser:')) {
241
+ if (matchingProxyConfig === undefined || proxyConfig.path.length > matchingProxyConfig.path.length) {
242
+ matchingProxyConfig = proxyConfig;
243
+ }
244
+ }
245
+ }
246
+ });
247
+ return matchingProxyConfig;
248
+ }
249
+ /**
250
+ * Emit message to browser.
251
+ * @param {*} message
252
+ * @param {*} proxyConfig
253
+ */
254
+ emitMessageToBrowser(messageType, message, inProxyConfig) {
255
+ message.type = messageType;
256
+ const path = inProxyConfig ? inProxyConfig.path : '';
257
+ let socketId;
258
+ let emitted = false;
259
+ this.socketIoMap.forEach((socketInfo, key) => {
260
+ for (const proxyConfig of socketInfo.configs) {
261
+ if (inProxyConfig === undefined ||
262
+ (proxyConfig.path === path && inProxyConfig.protocol === proxyConfig.protocol)) {
263
+ if (key === socketId)
264
+ continue;
265
+ if (!proxyConfig.recording)
266
+ continue;
267
+ socketId = key;
268
+ message.proxyConfig = proxyConfig;
269
+ if (socketInfo.socket) {
270
+ this.emitMessageWithFlowControl([message], socketInfo, socketId);
271
+ emitted = true;
272
+ }
273
+ if (inProxyConfig === undefined)
274
+ break;
275
+ }
276
+ }
277
+ });
278
+ if (!emitted) {
279
+ // console.error(message.sequenceNumber, 'no browser socket to emit to', message.url)
280
+ }
281
+ }
282
+ emitMessageWithFlowControl(messages, socketInfo, socketId) {
283
+ if (socketInfo.remainingWindow === 0 || socketInfo.messagesOut >= MAX_OUT) {
284
+ socketInfo.queuedMessages = socketInfo.queuedMessages.concat(messages);
285
+ }
286
+ else {
287
+ if (socketInfo.socket) {
288
+ const batchCount = messages.length;
289
+ socketInfo.remainingWindow -= batchCount;
290
+ ++socketInfo.seqNum;
291
+ ++socketInfo.messagesOut;
292
+ socketInfo.socket.emit('reqResJson', messages, socketInfo.queuedMessages.length,
293
+ // callback:
294
+ (_response) => {
295
+ --socketInfo.messagesOut;
296
+ socketInfo.remainingWindow += batchCount;
297
+ // console.log(
298
+ // `out=${socketInfo.messagesOut}`,
299
+ // `win=${socketInfo.remainingWindow}`,
300
+ // `queued=${socketInfo.queuedMessages.length}`,
301
+ // `(${response})`)
302
+ const count = Math.min(socketInfo.remainingWindow, socketInfo.queuedMessages.length);
303
+ if (count > 0) {
304
+ this.emitMessageWithFlowControl(socketInfo.queuedMessages.splice(0, count), socketInfo, socketId);
305
+ }
306
+ });
307
+ }
308
+ }
309
+ }
310
+ }
311
+ exports.default = SocketIoManager;
312
+ //# sourceMappingURL=SocketIoManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SocketIoManager.js","sourceRoot":"","sources":["../../../server/src/SocketIoManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const Global_1 = __importDefault(require("./Global"));
16
+ class SocketMessage {
17
+ static buildRequest(timestamp, sequenceNumber, requestHeaders, method, url, endpoint, requestBody, clientIp, serverHost, path, elapsedTime) {
18
+ return buildRequest(timestamp, sequenceNumber, requestHeaders, method, url, endpoint, requestBody, clientIp, serverHost, path, elapsedTime);
19
+ }
20
+ static appendResponse(message, responseHeaders, responseBody, status, elapsedTime) {
21
+ appendResponse(message, responseHeaders, responseBody, status, elapsedTime);
22
+ }
23
+ }
24
+ exports.default = SocketMessage;
25
+ ;
26
+ function buildRequest(timestamp, sequenceNumber, requestHeaders, method, url, endpoint, requestBody, clientIp, serverHost, path, elapsedTime) {
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ // eslint-disable-next-line no-async-promise-executor
29
+ return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
30
+ if (clientIp) {
31
+ clientIp = yield Global_1.default.resolveIp(clientIp);
32
+ resolve(initMessage());
33
+ }
34
+ else {
35
+ clientIp = 'unknown';
36
+ resolve(initMessage());
37
+ }
38
+ }));
39
+ function initMessage() {
40
+ const message = {
41
+ timestamp,
42
+ sequenceNumber,
43
+ requestHeaders,
44
+ method,
45
+ protocol: 'http:',
46
+ url,
47
+ endpoint,
48
+ requestBody,
49
+ clientIp,
50
+ serverHost,
51
+ path,
52
+ elapsedTime,
53
+ responseHeaders: {},
54
+ responseBody: {},
55
+ status: 0
56
+ };
57
+ return message;
58
+ }
59
+ });
60
+ }
61
+ function appendResponse(message, responseHeaders, responseBody, status, elapsedTime) {
62
+ message.responseHeaders = responseHeaders;
63
+ message.responseBody = responseBody;
64
+ message.status = status;
65
+ message.elapsedTime = elapsedTime;
66
+ return message;
67
+ }
68
+ //# sourceMappingURL=SocketMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SocketMessage.js","sourceRoot":"","sources":["../../../server/src/SocketMessage.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAEA,sDAA6B;AAE7B,MAAqB,aAAa;IACzB,MAAM,CAAC,YAAY,CAAE,SAAiB,EAAE,cAAsB,EAAE,cAAmC,EAAE,MAAc,EAAE,GAAW,EAAE,QAAgB,EAAE,WAAqB,EAAE,QAAgB,EAAE,UAAkB,EAAE,IAAW,EAAE,WAAkB;QAErP,OAAO,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;IAC7I,CAAC;IAEM,MAAM,CAAC,cAAc,CAAE,OAAgB,EAAE,eAAmB,EAAE,YAAsB,EAAE,MAAa,EAAE,WAAkB;QAC5H,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,CAAA;IAC7E,CAAC;CACF;AATD,gCASC;AAAA,CAAC;AAEF,SAAe,YAAY,CAAE,SAAgB,EAAE,cAAqB,EAAE,cAAiB,EAAE,MAAuB,EAAE,GAAoB,EAAE,QAAe,EAAE,WAAqB,EAAE,QAAyB,EAAE,UAAiB,EAAE,IAAW,EAAE,WAAkB;;QAE3P,qDAAqD;QACrD,OAAO,IAAI,OAAO,CAAU,CAAO,OAAO,EAAE,EAAE;YAC5C,IAAI,QAAQ,EAAE;gBACZ,QAAQ,GAAG,MAAM,gBAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;gBAC3C,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;aACvB;iBAAM;gBACL,QAAQ,GAAG,SAAS,CAAA;gBACpB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;aACvB;QACH,CAAC,CAAA,CAAC,CAAA;QAEF,SAAS,WAAW;YAClB,MAAM,OAAO,GAAG;gBACd,SAAS;gBACT,cAAc;gBACd,cAAc;gBACd,MAAM;gBACN,QAAQ,EAAE,OAAO;gBACjB,GAAG;gBACH,QAAQ;gBACR,WAAW;gBACX,QAAQ;gBACR,UAAU;gBACV,IAAI;gBACJ,WAAW;gBACX,eAAe,EAAE,EAAE;gBACnB,YAAY,EAAE,EAAE;gBAChB,MAAM,EAAE,CAAC;aACV,CAAA;YACD,OAAO,OAAkB,CAAA;QAC3B,CAAC;IACH,CAAC;CAAA;AAED,SAAS,cAAc,CAAE,OAAgB,EAAE,eAAmB,EAAE,YAAgB,EAAE,MAAa,EAAE,WAAkB;IACjH,OAAO,CAAC,eAAe,GAAG,eAAe,CAAA;IACzC,OAAO,CAAC,YAAY,GAAG,YAAY,CAAA;IACnC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAA;IACvB,OAAO,CAAC,WAAW,GAAG,WAAW,CAAA;IACjC,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const net_1 = __importDefault(require("net"));
16
+ const tls_1 = __importDefault(require("tls"));
17
+ const fs_1 = __importDefault(require("fs"));
18
+ const Global_1 = __importDefault(require("./Global"));
19
+ const SocketMessage_1 = __importDefault(require("./SocketMessage"));
20
+ const HexFormatter_1 = __importDefault(require("./formatters/HexFormatter"));
21
+ const SqlFormatter_1 = __importDefault(require("./formatters/SqlFormatter"));
22
+ const MongoFormatter_1 = __importDefault(require("./formatters/MongoFormatter"));
23
+ const RedisFormatter_1 = __importDefault(require("./formatters/RedisFormatter"));
24
+ const Message_1 = require("../../common/Message");
25
+ const Paths_1 = __importDefault(require("./Paths"));
26
+ const MAX_URL = 1024;
27
+ class TcpProxy {
28
+ constructor(proxyConfig) {
29
+ this.startProxy(proxyConfig);
30
+ }
31
+ static destructor(proxyConfig) {
32
+ if (proxyConfig._server)
33
+ proxyConfig._server.close();
34
+ }
35
+ /**
36
+ * Star proxy
37
+ * @param proxyConfig
38
+ */
39
+ startProxy(proxyConfig) {
40
+ const sourcePort = proxyConfig.path;
41
+ const targetHost = proxyConfig.hostname;
42
+ const targetPort = proxyConfig.port;
43
+ let server;
44
+ if (proxyConfig.isSecure) {
45
+ const tlsOptions = {
46
+ key: fs_1.default.readFileSync(Paths_1.default.serverKey()),
47
+ cert: fs_1.default.readFileSync(Paths_1.default.serverCrt())
48
+ };
49
+ server = tls_1.default.createServer(tlsOptions, onConnect);
50
+ }
51
+ else {
52
+ server = net_1.default.createServer(onConnect);
53
+ }
54
+ let retries = 0;
55
+ let wait = 1000;
56
+ server.on('error', (err) => {
57
+ if (++retries < 10) {
58
+ setTimeout(() => listen(server), wait *= 2);
59
+ }
60
+ else {
61
+ console.error('TcpProxy server error', err);
62
+ }
63
+ });
64
+ listen(server);
65
+ function listen(server) {
66
+ server.listen(sourcePort, function () {
67
+ console.log('Listening on port ' + sourcePort + ' for target host ' + targetHost + ':' + targetPort);
68
+ });
69
+ proxyConfig._server = server;
70
+ }
71
+ // Create server (source) socket
72
+ function onConnect(sourceSocket) {
73
+ const requests = [];
74
+ // Connect to target host
75
+ let targetSocket;
76
+ if (!proxyConfig.isSecure) {
77
+ targetSocket = net_1.default.connect(targetPort, targetHost, () => {
78
+ // console.log('connected to target');
79
+ });
80
+ }
81
+ else {
82
+ targetSocket = tls_1.default.connect(targetPort, targetHost, {}, () => {
83
+ // console.log('connected to target');
84
+ });
85
+ }
86
+ sourceSocket.on('error', (err) => {
87
+ console.error(`TcpProxy client error ${sourcePort}: ${err}`);
88
+ });
89
+ targetSocket.on('error', (err) => {
90
+ console.error(`TcpProxy server error ${sourcePort}: ${err}`);
91
+ });
92
+ // Handle data from source (client)
93
+ sourceSocket.on('data', (data) => __awaiter(this, void 0, void 0, function* () {
94
+ const request = {
95
+ data,
96
+ startTime: Date.now(),
97
+ sequenceNumber: ++Global_1.default.nextSequenceNumber
98
+ };
99
+ requests.push(request);
100
+ targetSocket.write(data);
101
+ yield processData(request, null);
102
+ }));
103
+ // Handle data from target (e.g., database)
104
+ targetSocket.on('data', (data) => __awaiter(this, void 0, void 0, function* () {
105
+ sourceSocket.write(data);
106
+ if (requests.length > 0) {
107
+ const request = requests.pop();
108
+ yield processData(request, data);
109
+ }
110
+ }));
111
+ // Handle source socket closed
112
+ sourceSocket.on('close', () => {
113
+ targetSocket.end();
114
+ });
115
+ // Handle target socket closed
116
+ targetSocket.on('close', () => {
117
+ sourceSocket.end();
118
+ });
119
+ function processData(request, response) {
120
+ return __awaiter(this, void 0, void 0, function* () {
121
+ // eslint-disable-next-line no-async-promise-executor
122
+ return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
123
+ let requestString = '';
124
+ let responseString = '';
125
+ let url = '';
126
+ let status = 0;
127
+ let noResponseRequired = false;
128
+ switch (proxyConfig.protocol) {
129
+ case 'sql:': {
130
+ const sqlFormatter = new SqlFormatter_1.default(request.data, response);
131
+ requestString = sqlFormatter.getQuery();
132
+ responseString = sqlFormatter.getResults();
133
+ status = sqlFormatter.getErrorCode();
134
+ for (const line of requestString.split('\n')) {
135
+ if (line.indexOf('/*') !== -1)
136
+ continue;
137
+ url += line + ' ';
138
+ if (url.length >= 64)
139
+ break;
140
+ }
141
+ noResponseRequired = sqlFormatter.getCommand() === 'Close';
142
+ break;
143
+ }
144
+ case 'mongo:': {
145
+ const mongoFormatter = new MongoFormatter_1.default(request.data, response);
146
+ requestString = mongoFormatter.getRequest();
147
+ responseString = mongoFormatter.getResponse();
148
+ url = requestString.split('\n')[0];
149
+ break;
150
+ }
151
+ case 'redis:': {
152
+ const redisFormatter = new RedisFormatter_1.default(request.data, response);
153
+ requestString = redisFormatter.getRequest();
154
+ responseString = redisFormatter.getResponse();
155
+ for (const line of requestString.split('\n')) {
156
+ url += line + ' ';
157
+ if (url.length >= 64)
158
+ break;
159
+ }
160
+ break;
161
+ }
162
+ default:
163
+ requestString = HexFormatter_1.default.format(request.data);
164
+ responseString = response
165
+ ? '\n' + HexFormatter_1.default.format(response) + '\n'
166
+ : Message_1.NO_RESPONSE;
167
+ if (requestString.length > MAX_URL) {
168
+ url = requestString.substring(0, MAX_URL);
169
+ }
170
+ else {
171
+ url = requestString;
172
+ }
173
+ break;
174
+ }
175
+ if (requestString.length > 0) {
176
+ const endpoint = '';
177
+ const message = yield SocketMessage_1.default.buildRequest(request.startTime, request.sequenceNumber, {}, // headers
178
+ '', // method
179
+ url, // url
180
+ endpoint, // endpoint
181
+ { proxyall_inner_body: requestString }, // req body
182
+ sourceSocket.remoteAddress, // clientIp
183
+ targetHost + ':' + targetPort, // serverHost
184
+ '', // path
185
+ Date.now() - request.startTime);
186
+ SocketMessage_1.default.appendResponse(message, {}, responseString, status, Date.now() - request.startTime);
187
+ message.protocol = proxyConfig.protocol;
188
+ Global_1.default.socketIoManager.emitMessageToBrowser(response === null
189
+ ? responseString === Message_1.NO_RESPONSE && noResponseRequired === false
190
+ ? Message_1.MessageType.REQUEST
191
+ : Message_1.MessageType.REQUEST_AND_RESPONSE
192
+ : Message_1.MessageType.RESPONSE, message, proxyConfig);
193
+ }
194
+ resolve(0);
195
+ }));
196
+ });
197
+ }
198
+ }
199
+ }
200
+ }
201
+ exports.default = TcpProxy;
202
+ //# sourceMappingURL=TcpProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TcpProxy.js","sourceRoot":"","sources":["../../../server/src/TcpProxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class HexFormatter {
4
+ static format(buffer) {
5
+ const hexStr = buffer.toString('hex');
6
+ let utf8Str = buffer.toString('utf8');
7
+ utf8Str = utf8Str.replace(/[^\x20-\x7E]/g, '.');
8
+ let strWithNewline = '';
9
+ let i = 0;
10
+ let j = 0;
11
+ let displayable = '';
12
+ for (; i + 8 < hexStr.length; i += 8, j += 4) {
13
+ strWithNewline += hexStr.substring(i, i + 8) + ' ';
14
+ displayable += utf8Str.substring(j, j + 4);
15
+ if (i > 0 && (i + 8) % 32 === 0) {
16
+ strWithNewline += ' ' + displayable;
17
+ displayable = '';
18
+ strWithNewline += '\n';
19
+ }
20
+ }
21
+ if (i < hexStr.length) {
22
+ strWithNewline += hexStr.substring(i, hexStr.length);
23
+ if (hexStr.length % 32 !== 0) {
24
+ const pad = 32 - hexStr.length % 32;
25
+ strWithNewline += (' '.repeat(pad + Math.ceil((pad + 1) / 8)));
26
+ }
27
+ strWithNewline += (' ' + displayable + utf8Str.substring(j, utf8Str.length));
28
+ }
29
+ return strWithNewline;
30
+ }
31
+ }
32
+ exports.default = HexFormatter;
33
+ //# sourceMappingURL=HexFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HexFormatter.js","sourceRoot":"","sources":["../../../../server/src/formatters/HexFormatter.ts"],"names":[],"mappings":";;AAAA,MAAqB,YAAY;IAC/B,MAAM,CAAC,MAAM,CAAE,MAAc;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACrC,IAAI,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACrC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAA;QAC/C,IAAI,cAAc,GAAG,EAAE,CAAA;QACvB,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,IAAI,CAAC,GAAG,CAAC,CAAA;QACT,IAAI,WAAW,GAAG,EAAE,CAAA;QACpB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;YAC5C,cAAc,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;YAClD,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YAC1C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;gBAC/B,cAAc,IAAI,IAAI,GAAG,WAAW,CAAA;gBACpC,WAAW,GAAG,EAAE,CAAA;gBAChB,cAAc,IAAI,IAAI,CAAA;aACvB;SACF;QAED,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;YACrB,cAAc,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;YACpD,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,KAAK,CAAC,EAAE;gBAC5B,MAAM,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,EAAE,CAAA;gBACnC,cAAc,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;aAC/D;YACD,cAAc,IAAI,CAAC,IAAI,GAAG,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;SAC9E;QAED,OAAO,cAAc,CAAA;IACvB,CAAC;CACF;AA9BD,+BA8BC"}