bdy 1.14.0-dev → 1.14.1-dev

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bdy",
3
3
  "preferGlobal": false,
4
- "version": "1.14.0-dev",
4
+ "version": "1.14.1-dev",
5
5
  "type": "commonjs",
6
6
  "license": "MIT",
7
7
  "scripts": {
@@ -23,7 +23,7 @@ class AgentSocketClient extends events_1.default {
23
23
  lastUpdate;
24
24
  tunnelRequests;
25
25
  fetch(activate = true, action = null, disabled = null, resetFirstHeard = false, tunnels) {
26
- if (!this.socket)
26
+ if (!this.socket || !this.connected)
27
27
  return;
28
28
  this.socket.emit('fetchTunnelAgent', {
29
29
  id: this.id,
@@ -39,7 +39,7 @@ class AgentSocketClient extends events_1.default {
39
39
  });
40
40
  }
41
41
  update(activate, tunnels, force = false) {
42
- if (!this.socket)
42
+ if (!this.socket || !this.connected)
43
43
  return;
44
44
  const now = Date.now();
45
45
  // nie robimy update jak byl mniej niz 5s temu
@@ -57,7 +57,7 @@ class AgentSocketClient extends events_1.default {
57
57
  });
58
58
  }
59
59
  emitRequest(tunnelId, logRequest) {
60
- if (!this.socket)
60
+ if (!this.socket || !this.connected)
61
61
  return;
62
62
  this.socket.emit('tunnelRequest', {
63
63
  id: this.id,
@@ -53,6 +53,7 @@ const log_1 = __importDefault(require("./http/log"));
53
53
  const format_1 = __importDefault(require("../format"));
54
54
  const node_crypto_1 = __importDefault(require("node:crypto"));
55
55
  const cookie = __importStar(require("cookie"));
56
+ const uuid_1 = require("uuid");
56
57
  const jsonwebtoken_1 = require("jsonwebtoken");
57
58
  const undici_1 = require("undici");
58
59
  const texts_1 = require("../texts");
@@ -62,6 +63,204 @@ const cfg_1 = __importDefault(require("./cfg"));
62
63
  const CIPHER_ALG = 'aes-256-cbc';
63
64
  const CIPHER_IV = Buffer.alloc(16).fill(0);
64
65
  const COOKIE_NAME = 'jwt_token';
66
+ const ISSUERS = {
67
+ 'https://stage-oidc.buddyusercontent.com': `-----BEGIN CERTIFICATE-----
68
+ MIIEwDCCAqgCFBDp9Im/iI4hjQTeypaLQbZZZs45MA0GCSqGSIb3DQEBCwUAMBYx
69
+ FDASBgNVBAMMC2J1ZGR5LndvcmtzMCAXDTIzMDIxNjA4MTMyOFoYDzIwNTMwMjA4
70
+ MDgxMzI4WjAhMR8wHQYDVQQDDBYqLmJ1ZGR5dXNlcmNvbnRlbnQuY29tMIICIjAN
71
+ BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvMDTFG4ha//vRxUb/AJpnubUi4Er
72
+ z2TLxCNZBdHPwIqWvygvMHUmTySxMU+a05D/6yHnQiaqnXI0y7nh/ZYmkTqHs985
73
+ 3hr5gN/kLmcujo3YtUIm93ZbPHsmaBSlvBSzS1sI8GFE2pqePTo3e/qSWtV6aQBI
74
+ 0MTEAMKo3JokOft/9cMbdv212eo1Z7vkHvzO0IyAJ15fm4pX/to+2Xap2aG0M78K
75
+ zVgtYdbJAmhstsGBaYxSr15PeDE0OkirevjRXPcGfyjV501tubGk18CH/hUBO3CB
76
+ QOiAH2q1w8Istxus5xibpWYFHoPJiuZ1BryHHV4vnzkDS2RJ3tE+dXHAfIHIN2q0
77
+ AjyDir0KZPOHLxOr17JsZuAfboVgLcZpmFWnm7hfZ6GfRt77ih9IFNi0doMbHmPx
78
+ 9B436oaFTXXQdDdMiFSDel1DyKqe+BBiGyqfg9Dvw6Qk+pS0b6q+e/XZYwG9q8K6
79
+ 6r1A+TribcAp0bl6O5XxFRdllEwbY9vbyoRX/bB0aKzhAkoP3Cuh4oss0ueiSwZC
80
+ 5NUIGSdHMioGjhIGLNj7hv4pZfwr5cxkwPwO43Vv25qVej+AJJwdlRNXS2MSjTQg
81
+ Z/sVVOXsgJHTDyP7ke388rqsgXjdoacoJkTXUdl0652wkRPl9UQ4InVfyNw24MVc
82
+ 9ksePMYUIyW7rI8CAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAa8I0iJ8155ihutvw
83
+ 1HEqhWbQokANxCdJ3zfdu6guTjrG9HxD7kuloB3ZyVVQsLdZlZoFfZnpMKtnFK1v
84
+ deDtEoayPiUI6DHURtxFHWOYM/VWJd41s3nIoilApBdESpNI6RQvb7JIXuXCDndc
85
+ pvuZ6U0zMnWTVFK7MVrbxqRDMO/mCTJUKIqNLmGo+6YYfhWy8y3HHdnC86CFUy+T
86
+ IaMuDEuqd3HvpqljgXM8o5cTCYawnQA2PKA36XiJoc+9A00EuVQw0ILQbw3aYaIX
87
+ /PNiq3CCyt1YIjal+zSNMxNnmNEW7H5+arxbT+I8oWDZUR+KyeZJYRjuZGzqfRGt
88
+ hAzRj7HKN0bU4Y97a7GyWaxzMtbunWnl8U+1TsM/9cfNgjKZxMopZCb1n/TfUDMo
89
+ /67xEjDS2B/LcGOWDUEExLXaxCoLtVwk7co+Z4FXmiMDmoJmrE6lbGcMD1Ys+6Td
90
+ el3K5ll/6obgUFZsUMPP6xV2+nFz+LThueWphs1+7s0eD3xanVijSHXS8HF87yvE
91
+ eiq+rBRq7FE0Eqen6spTWFpjrmdBxY5Ti0z14KKXHGJStrpC5KquegwBIj0w/wNY
92
+ O6+HPN73rzfhtkO+A0tAG7el3XtqI0fOXiD1xot84neFJV6/qxyvnRUamJjKCgK2
93
+ X1wqKx71Z3gigILDphu5m3d0RRU=
94
+ -----END CERTIFICATE-----`,
95
+ 'https://stageeu-oidc.buddyusercontent.com': `-----BEGIN CERTIFICATE-----
96
+ MIIEwDCCAqgCFBDp9Im/iI4hjQTeypaLQbZZZs45MA0GCSqGSIb3DQEBCwUAMBYx
97
+ FDASBgNVBAMMC2J1ZGR5LndvcmtzMCAXDTIzMDIxNjA4MTMyOFoYDzIwNTMwMjA4
98
+ MDgxMzI4WjAhMR8wHQYDVQQDDBYqLmJ1ZGR5dXNlcmNvbnRlbnQuY29tMIICIjAN
99
+ BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvMDTFG4ha//vRxUb/AJpnubUi4Er
100
+ z2TLxCNZBdHPwIqWvygvMHUmTySxMU+a05D/6yHnQiaqnXI0y7nh/ZYmkTqHs985
101
+ 3hr5gN/kLmcujo3YtUIm93ZbPHsmaBSlvBSzS1sI8GFE2pqePTo3e/qSWtV6aQBI
102
+ 0MTEAMKo3JokOft/9cMbdv212eo1Z7vkHvzO0IyAJ15fm4pX/to+2Xap2aG0M78K
103
+ zVgtYdbJAmhstsGBaYxSr15PeDE0OkirevjRXPcGfyjV501tubGk18CH/hUBO3CB
104
+ QOiAH2q1w8Istxus5xibpWYFHoPJiuZ1BryHHV4vnzkDS2RJ3tE+dXHAfIHIN2q0
105
+ AjyDir0KZPOHLxOr17JsZuAfboVgLcZpmFWnm7hfZ6GfRt77ih9IFNi0doMbHmPx
106
+ 9B436oaFTXXQdDdMiFSDel1DyKqe+BBiGyqfg9Dvw6Qk+pS0b6q+e/XZYwG9q8K6
107
+ 6r1A+TribcAp0bl6O5XxFRdllEwbY9vbyoRX/bB0aKzhAkoP3Cuh4oss0ueiSwZC
108
+ 5NUIGSdHMioGjhIGLNj7hv4pZfwr5cxkwPwO43Vv25qVej+AJJwdlRNXS2MSjTQg
109
+ Z/sVVOXsgJHTDyP7ke388rqsgXjdoacoJkTXUdl0652wkRPl9UQ4InVfyNw24MVc
110
+ 9ksePMYUIyW7rI8CAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAa8I0iJ8155ihutvw
111
+ 1HEqhWbQokANxCdJ3zfdu6guTjrG9HxD7kuloB3ZyVVQsLdZlZoFfZnpMKtnFK1v
112
+ deDtEoayPiUI6DHURtxFHWOYM/VWJd41s3nIoilApBdESpNI6RQvb7JIXuXCDndc
113
+ pvuZ6U0zMnWTVFK7MVrbxqRDMO/mCTJUKIqNLmGo+6YYfhWy8y3HHdnC86CFUy+T
114
+ IaMuDEuqd3HvpqljgXM8o5cTCYawnQA2PKA36XiJoc+9A00EuVQw0ILQbw3aYaIX
115
+ /PNiq3CCyt1YIjal+zSNMxNnmNEW7H5+arxbT+I8oWDZUR+KyeZJYRjuZGzqfRGt
116
+ hAzRj7HKN0bU4Y97a7GyWaxzMtbunWnl8U+1TsM/9cfNgjKZxMopZCb1n/TfUDMo
117
+ /67xEjDS2B/LcGOWDUEExLXaxCoLtVwk7co+Z4FXmiMDmoJmrE6lbGcMD1Ys+6Td
118
+ el3K5ll/6obgUFZsUMPP6xV2+nFz+LThueWphs1+7s0eD3xanVijSHXS8HF87yvE
119
+ eiq+rBRq7FE0Eqen6spTWFpjrmdBxY5Ti0z14KKXHGJStrpC5KquegwBIj0w/wNY
120
+ O6+HPN73rzfhtkO+A0tAG7el3XtqI0fOXiD1xot84neFJV6/qxyvnRUamJjKCgK2
121
+ X1wqKx71Z3gigILDphu5m3d0RRU=
122
+ -----END CERTIFICATE-----`,
123
+ 'https://oidc.buddyusercontent.com': `-----BEGIN CERTIFICATE-----
124
+ MIIEwDCCAqgCFCIRhplNpTZLH9WdAbZus4xHHjPXMA0GCSqGSIb3DQEBCwUAMBYx
125
+ FDASBgNVBAMMC2J1ZGR5LndvcmtzMCAXDTIzMDIxNjA4MTM1M1oYDzIwNTMwMjA4
126
+ MDgxMzUzWjAhMR8wHQYDVQQDDBYqLmJ1ZGR5dXNlcmNvbnRlbnQuY29tMIICIjAN
127
+ BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuA5ulo8uVKsxLcgIDn3DtnoMdyJv
128
+ BHHl68b1p+SAb4OEN4SlEdl33jy2LMNwr0SS6Mh7VT9tkCUAxDpmImTdsd59qhqu
129
+ 5oxCnE5slx5/RmV0/RgCZRjy0phmPIImsMAvBsFY6+c+fPZfxJGs+uWtXXRS1IgI
130
+ LO0BXSqIF2UIst+R787vynmI6UFPaD7bKaJkM79RPanjqvma+y8VvJU2isqz3bjS
131
+ T32842iGlwnkwzz4SfOIiVgKT8HhnZsD5YmtTMPYYghgWj1HtMxOTJ/qEuXiLWfg
132
+ TzqPI6Z2usnUb2lJl/EtEHILLyU4hfYr113nO3VIG6iLZahRttbelqujfWbQXS0w
133
+ nAGn0e4RD5OzG+bu/y4yYBoQ2kRGtFpIH4nXOw43PhKo0rALAllrpQi4p26KYqWk
134
+ r27BuOoZWmB2nkVm2v7vnDa6e2CpwXMaLpIFDANeSoK8Tr+RaHCp1JNMI7zYVejN
135
+ C9bOKL35/Q0gsxWW3BdLL/EtTrwZKGlJtovkBQdFkEmiNnK8tc4BLKDmtYFsf8HZ
136
+ I0jYHwVD90DP9lMJG/VFZl2xUBHKq7UjX/CLgRPc1S5QiqeHFh0kWVilcrVauaTT
137
+ nAX2cG41lxGSH/60zxtOAYqKIdEvvQdHVl3S1AHemENl/ngh9kt2oU5+1Csb/+jG
138
+ zrE5dI3ipDCUNHMCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAuZCIfMcexrKHEcQM
139
+ otb6PXrCEOdiVq+vQuVAQCMfC9MyGcufxLY9+QhuPSVhsyZ1ffZufF6oT+HlQY4z
140
+ 5E5CE7kTw1q9Gpu4RHEtlg7ALvpAy+Hfi2sAJy6r6Tqa5hEoi/8qQFgqTn5ooFr2
141
+ SkjK72dx3YkgRsV9P7O9TlteLgwd6POLmrbibvcGB9CiPSL/SmItT2vpASUxow0a
142
+ JiyrbBgPQFaKPocfJJ917Zur1bigdUoCK+S0vq5tOFWrm3HXDIiz5+aB5/cW9/3W
143
+ AXghWYdAStJH9xTIWA7dk8V4SPJjjQWhyG+GxM+oE999K4iPTOpGMjLfG/ZiLKLg
144
+ 1Z3gO3wNP2BrhotrAxVRcynvm6552nzDos9ybiq1VPbiz8qLYThNTu/tlw2JbCXw
145
+ PWaM1jh8B2v5Q4NhRKnl3Zz03RtNHwAUYzZLahe47/ADb5/XC86H46NRLHZB3QIO
146
+ wXYcTFrCskkdoGEZwiiqUchYjvWKb9++WHkPGGBaLhAlaCZNTgGXyt8OYJSRwIfT
147
+ YbGYXuZMGUV3U63WZm3fOpHflQPkC9bzmK9MgFshhUlB0xk1vC1dkC2I5jOGJqa0
148
+ 3yZghw2R+f5zGZd7TusSmm7Kk8i6mCssRG8B3R8p+6a6GQFeWtqQcUV/dcJVs9sx
149
+ ZbFKWzfs9+m8Y04W4PmzZM2ZAN8=
150
+ -----END CERTIFICATE-----`,
151
+ 'https://eu-oidc.buddyusercontent.com': `-----BEGIN CERTIFICATE-----
152
+ MIIEwDCCAqgCFCIRhplNpTZLH9WdAbZus4xHHjPXMA0GCSqGSIb3DQEBCwUAMBYx
153
+ FDASBgNVBAMMC2J1ZGR5LndvcmtzMCAXDTIzMDIxNjA4MTM1M1oYDzIwNTMwMjA4
154
+ MDgxMzUzWjAhMR8wHQYDVQQDDBYqLmJ1ZGR5dXNlcmNvbnRlbnQuY29tMIICIjAN
155
+ BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuA5ulo8uVKsxLcgIDn3DtnoMdyJv
156
+ BHHl68b1p+SAb4OEN4SlEdl33jy2LMNwr0SS6Mh7VT9tkCUAxDpmImTdsd59qhqu
157
+ 5oxCnE5slx5/RmV0/RgCZRjy0phmPIImsMAvBsFY6+c+fPZfxJGs+uWtXXRS1IgI
158
+ LO0BXSqIF2UIst+R787vynmI6UFPaD7bKaJkM79RPanjqvma+y8VvJU2isqz3bjS
159
+ T32842iGlwnkwzz4SfOIiVgKT8HhnZsD5YmtTMPYYghgWj1HtMxOTJ/qEuXiLWfg
160
+ TzqPI6Z2usnUb2lJl/EtEHILLyU4hfYr113nO3VIG6iLZahRttbelqujfWbQXS0w
161
+ nAGn0e4RD5OzG+bu/y4yYBoQ2kRGtFpIH4nXOw43PhKo0rALAllrpQi4p26KYqWk
162
+ r27BuOoZWmB2nkVm2v7vnDa6e2CpwXMaLpIFDANeSoK8Tr+RaHCp1JNMI7zYVejN
163
+ C9bOKL35/Q0gsxWW3BdLL/EtTrwZKGlJtovkBQdFkEmiNnK8tc4BLKDmtYFsf8HZ
164
+ I0jYHwVD90DP9lMJG/VFZl2xUBHKq7UjX/CLgRPc1S5QiqeHFh0kWVilcrVauaTT
165
+ nAX2cG41lxGSH/60zxtOAYqKIdEvvQdHVl3S1AHemENl/ngh9kt2oU5+1Csb/+jG
166
+ zrE5dI3ipDCUNHMCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAuZCIfMcexrKHEcQM
167
+ otb6PXrCEOdiVq+vQuVAQCMfC9MyGcufxLY9+QhuPSVhsyZ1ffZufF6oT+HlQY4z
168
+ 5E5CE7kTw1q9Gpu4RHEtlg7ALvpAy+Hfi2sAJy6r6Tqa5hEoi/8qQFgqTn5ooFr2
169
+ SkjK72dx3YkgRsV9P7O9TlteLgwd6POLmrbibvcGB9CiPSL/SmItT2vpASUxow0a
170
+ JiyrbBgPQFaKPocfJJ917Zur1bigdUoCK+S0vq5tOFWrm3HXDIiz5+aB5/cW9/3W
171
+ AXghWYdAStJH9xTIWA7dk8V4SPJjjQWhyG+GxM+oE999K4iPTOpGMjLfG/ZiLKLg
172
+ 1Z3gO3wNP2BrhotrAxVRcynvm6552nzDos9ybiq1VPbiz8qLYThNTu/tlw2JbCXw
173
+ PWaM1jh8B2v5Q4NhRKnl3Zz03RtNHwAUYzZLahe47/ADb5/XC86H46NRLHZB3QIO
174
+ wXYcTFrCskkdoGEZwiiqUchYjvWKb9++WHkPGGBaLhAlaCZNTgGXyt8OYJSRwIfT
175
+ YbGYXuZMGUV3U63WZm3fOpHflQPkC9bzmK9MgFshhUlB0xk1vC1dkC2I5jOGJqa0
176
+ 3yZghw2R+f5zGZd7TusSmm7Kk8i6mCssRG8B3R8p+6a6GQFeWtqQcUV/dcJVs9sx
177
+ ZbFKWzfs9+m8Y04W4PmzZM2ZAN8=
178
+ -----END CERTIFICATE-----`,
179
+ 'https://master-oidc.buddyusercontent.com': `-----BEGIN CERTIFICATE-----
180
+ MIIEwDCCAqgCFBDp9Im/iI4hjQTeypaLQbZZZs47MA0GCSqGSIb3DQEBCwUAMBYx
181
+ FDASBgNVBAMMC2J1ZGR5LndvcmtzMCAXDTIzMDIxNjA4MTM0NVoYDzIwNTMwMjA4
182
+ MDgxMzQ1WjAhMR8wHQYDVQQDDBYqLmJ1ZGR5dXNlcmNvbnRlbnQuY29tMIICIjAN
183
+ BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyHdEa5QrqJVIAESbgkIMw/pPAJ1R
184
+ kIlin/BQBn43YmcIpw/uFSPol9M5S9WkVMESWhM+wk3V+byiAULOm7FQ5N1AqRMa
185
+ msxmuFenDJQEtEZ/Ca/HQXSOqwUG0TTIE5OZxuJy0SlEIjNPE56cJhp/ojOkvhXn
186
+ mdPtjPI8sslF4CXAHW8qTa/N9L66ro5WMEVba/XGzdySOSN3z8ycr1583ZVXPK7x
187
+ nvo/LrskdbPIjNz8firGp2OBsM0qeINmTUBLFVkWRj4PGgcCGRd1bV4C085obtep
188
+ 0Cg/xZen3TQmoAFFsGVSO/3FP/lNv598HrzyHQKN/d2pl1d06NUl7mM7SLdHCbvi
189
+ 3zVe1Ntr01QJuQGo3Uv9v4D6j1urzN25ghSfjOzjmTJjpGIwHfKJlVy674laq7mT
190
+ KBnkpwmOgvbPSaaYQ8ik72PuLb73IWkxIaQ4Hr0pqUw00CDLO9p1gcz/biktxhxj
191
+ d48SzS0tQXQMTSKZYWWzfh+Q5rCwVKozzyHPHSJuLxetrtxEcnt5OQFqKu3bcCwI
192
+ xoFLpl5BQjBTrvigOO2ElQxGz2+N7W9zu5VLOl0nCw5MQwN9KXyVHVEYYbC3Mmnq
193
+ RSuudH/25SuYMaEkIUoQa7vgJmwPJ4uWVSExO9fnOmA0L0GM+1WbU3BgEp3FUVSw
194
+ x4QPC1swwlhkVkkCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEApZEjwNCxWHxuAMwE
195
+ jvlEouPs+yZsaxxIC44kKuwNacvk5pV4lC4w59pDTlZghgQwGvT7YlU0GfNrZbJi
196
+ 2mREXH2DQt2GPv0roFYJGfT+tranbmmozJXdohSqllcM6Ev2f5I5Y7AkZePX3vAE
197
+ aY0CJzBq9WTnfEjZCOcrkuI4hSccZ53R2DMm3IU2SBfwJlY5HwFLOokwUOgbVMCN
198
+ O5szeNqGgdJjeNGwzCN3u0GwnKNhbvz02FsL+LSe2Mj9K5y5B950DIK6Nuj79nbj
199
+ 48uYcplsLBB7g1977QlTBnUVASy859Uajydla6RREw6ZPESVkZHXXJ7+2ek+vnnt
200
+ 5RHcbfnR+79MaKfUyVrtHmqtr5osvjhPQ9m9cmQG9UzoidKbxbYm6b6HbNRL5v79
201
+ YNO/12X5pH5h5lc5iFc/0S5NQuOq1OT7lzZNcE0H87rvIvThW0U/X4KVqYj7XY90
202
+ z2U1X+SDiq8ldzXtUYIJnl9J4v+I+u9iyJqYHYBBjj3Wn1NTzuE3ZDEBiwguuVUN
203
+ aKEbQvoT3Eh8nNw3v/BVThjTpa+pMWlI6XpMi9rcN8/edLgaCbMaO059KJTwx4hq
204
+ gUkjwZKhdE4s4pAn1BF644kkVdx2FXzdtmTfYWx1Rnsp1T0sxlzgMWltMd8wAuzS
205
+ 5cMq3aQmM1PRT/Q2XYwq7FhiiUg=
206
+ -----END CERTIFICATE-----`,
207
+ 'https://sls-oidc.buddyusercontent.com': `-----BEGIN CERTIFICATE-----
208
+ MIIEwDCCAqgCFBDp9Im/iI4hjQTeypaLQbZZZs45MA0GCSqGSIb3DQEBCwUAMBYx
209
+ FDASBgNVBAMMC2J1ZGR5LndvcmtzMCAXDTIzMDIxNjA4MTMyOFoYDzIwNTMwMjA4
210
+ MDgxMzI4WjAhMR8wHQYDVQQDDBYqLmJ1ZGR5dXNlcmNvbnRlbnQuY29tMIICIjAN
211
+ BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvMDTFG4ha//vRxUb/AJpnubUi4Er
212
+ z2TLxCNZBdHPwIqWvygvMHUmTySxMU+a05D/6yHnQiaqnXI0y7nh/ZYmkTqHs985
213
+ 3hr5gN/kLmcujo3YtUIm93ZbPHsmaBSlvBSzS1sI8GFE2pqePTo3e/qSWtV6aQBI
214
+ 0MTEAMKo3JokOft/9cMbdv212eo1Z7vkHvzO0IyAJ15fm4pX/to+2Xap2aG0M78K
215
+ zVgtYdbJAmhstsGBaYxSr15PeDE0OkirevjRXPcGfyjV501tubGk18CH/hUBO3CB
216
+ QOiAH2q1w8Istxus5xibpWYFHoPJiuZ1BryHHV4vnzkDS2RJ3tE+dXHAfIHIN2q0
217
+ AjyDir0KZPOHLxOr17JsZuAfboVgLcZpmFWnm7hfZ6GfRt77ih9IFNi0doMbHmPx
218
+ 9B436oaFTXXQdDdMiFSDel1DyKqe+BBiGyqfg9Dvw6Qk+pS0b6q+e/XZYwG9q8K6
219
+ 6r1A+TribcAp0bl6O5XxFRdllEwbY9vbyoRX/bB0aKzhAkoP3Cuh4oss0ueiSwZC
220
+ 5NUIGSdHMioGjhIGLNj7hv4pZfwr5cxkwPwO43Vv25qVej+AJJwdlRNXS2MSjTQg
221
+ Z/sVVOXsgJHTDyP7ke388rqsgXjdoacoJkTXUdl0652wkRPl9UQ4InVfyNw24MVc
222
+ 9ksePMYUIyW7rI8CAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAa8I0iJ8155ihutvw
223
+ 1HEqhWbQokANxCdJ3zfdu6guTjrG9HxD7kuloB3ZyVVQsLdZlZoFfZnpMKtnFK1v
224
+ deDtEoayPiUI6DHURtxFHWOYM/VWJd41s3nIoilApBdESpNI6RQvb7JIXuXCDndc
225
+ pvuZ6U0zMnWTVFK7MVrbxqRDMO/mCTJUKIqNLmGo+6YYfhWy8y3HHdnC86CFUy+T
226
+ IaMuDEuqd3HvpqljgXM8o5cTCYawnQA2PKA36XiJoc+9A00EuVQw0ILQbw3aYaIX
227
+ /PNiq3CCyt1YIjal+zSNMxNnmNEW7H5+arxbT+I8oWDZUR+KyeZJYRjuZGzqfRGt
228
+ hAzRj7HKN0bU4Y97a7GyWaxzMtbunWnl8U+1TsM/9cfNgjKZxMopZCb1n/TfUDMo
229
+ /67xEjDS2B/LcGOWDUEExLXaxCoLtVwk7co+Z4FXmiMDmoJmrE6lbGcMD1Ys+6Td
230
+ el3K5ll/6obgUFZsUMPP6xV2+nFz+LThueWphs1+7s0eD3xanVijSHXS8HF87yvE
231
+ eiq+rBRq7FE0Eqen6spTWFpjrmdBxY5Ti0z14KKXHGJStrpC5KquegwBIj0w/wNY
232
+ O6+HPN73rzfhtkO+A0tAG7el3XtqI0fOXiD1xot84neFJV6/qxyvnRUamJjKCgK2
233
+ X1wqKx71Z3gigILDphu5m3d0RRU=
234
+ -----END CERTIFICATE-----`,
235
+ '*': `-----BEGIN CERTIFICATE-----
236
+ MIIEwDCCAqgCFBDp9Im/iI4hjQTeypaLQbZZZs45MA0GCSqGSIb3DQEBCwUAMBYx
237
+ FDASBgNVBAMMC2J1ZGR5LndvcmtzMCAXDTIzMDIxNjA4MTMyOFoYDzIwNTMwMjA4
238
+ MDgxMzI4WjAhMR8wHQYDVQQDDBYqLmJ1ZGR5dXNlcmNvbnRlbnQuY29tMIICIjAN
239
+ BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvMDTFG4ha//vRxUb/AJpnubUi4Er
240
+ z2TLxCNZBdHPwIqWvygvMHUmTySxMU+a05D/6yHnQiaqnXI0y7nh/ZYmkTqHs985
241
+ 3hr5gN/kLmcujo3YtUIm93ZbPHsmaBSlvBSzS1sI8GFE2pqePTo3e/qSWtV6aQBI
242
+ 0MTEAMKo3JokOft/9cMbdv212eo1Z7vkHvzO0IyAJ15fm4pX/to+2Xap2aG0M78K
243
+ zVgtYdbJAmhstsGBaYxSr15PeDE0OkirevjRXPcGfyjV501tubGk18CH/hUBO3CB
244
+ QOiAH2q1w8Istxus5xibpWYFHoPJiuZ1BryHHV4vnzkDS2RJ3tE+dXHAfIHIN2q0
245
+ AjyDir0KZPOHLxOr17JsZuAfboVgLcZpmFWnm7hfZ6GfRt77ih9IFNi0doMbHmPx
246
+ 9B436oaFTXXQdDdMiFSDel1DyKqe+BBiGyqfg9Dvw6Qk+pS0b6q+e/XZYwG9q8K6
247
+ 6r1A+TribcAp0bl6O5XxFRdllEwbY9vbyoRX/bB0aKzhAkoP3Cuh4oss0ueiSwZC
248
+ 5NUIGSdHMioGjhIGLNj7hv4pZfwr5cxkwPwO43Vv25qVej+AJJwdlRNXS2MSjTQg
249
+ Z/sVVOXsgJHTDyP7ke388rqsgXjdoacoJkTXUdl0652wkRPl9UQ4InVfyNw24MVc
250
+ 9ksePMYUIyW7rI8CAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAa8I0iJ8155ihutvw
251
+ 1HEqhWbQokANxCdJ3zfdu6guTjrG9HxD7kuloB3ZyVVQsLdZlZoFfZnpMKtnFK1v
252
+ deDtEoayPiUI6DHURtxFHWOYM/VWJd41s3nIoilApBdESpNI6RQvb7JIXuXCDndc
253
+ pvuZ6U0zMnWTVFK7MVrbxqRDMO/mCTJUKIqNLmGo+6YYfhWy8y3HHdnC86CFUy+T
254
+ IaMuDEuqd3HvpqljgXM8o5cTCYawnQA2PKA36XiJoc+9A00EuVQw0ILQbw3aYaIX
255
+ /PNiq3CCyt1YIjal+zSNMxNnmNEW7H5+arxbT+I8oWDZUR+KyeZJYRjuZGzqfRGt
256
+ hAzRj7HKN0bU4Y97a7GyWaxzMtbunWnl8U+1TsM/9cfNgjKZxMopZCb1n/TfUDMo
257
+ /67xEjDS2B/LcGOWDUEExLXaxCoLtVwk7co+Z4FXmiMDmoJmrE6lbGcMD1Ys+6Td
258
+ el3K5ll/6obgUFZsUMPP6xV2+nFz+LThueWphs1+7s0eD3xanVijSHXS8HF87yvE
259
+ eiq+rBRq7FE0Eqen6spTWFpjrmdBxY5Ti0z14KKXHGJStrpC5KquegwBIj0w/wNY
260
+ O6+HPN73rzfhtkO+A0tAG7el3XtqI0fOXiD1xot84neFJV6/qxyvnRUamJjKCgK2
261
+ X1wqKx71Z3gigILDphu5m3d0RRU=
262
+ -----END CERTIFICATE-----`
263
+ };
65
264
  class Tunnel extends events_1.default {
66
265
  agent;
67
266
  id;
@@ -503,7 +702,7 @@ class Tunnel extends events_1.default {
503
702
  }
504
703
  return this.httpAuthClient[host];
505
704
  }
506
- async _httpExchangeAuthCode(code) {
705
+ async _httpExchangeAuthCode(code, verifier) {
507
706
  const client = this._getHttpAuthClient();
508
707
  try {
509
708
  const r = await client.request({
@@ -513,7 +712,8 @@ class Tunnel extends events_1.default {
513
712
  'content-type': 'application/json',
514
713
  },
515
714
  body: JSON.stringify({
516
- code
715
+ code,
716
+ verifier
517
717
  })
518
718
  });
519
719
  const o = await r.body.json();
@@ -526,32 +726,57 @@ class Tunnel extends events_1.default {
526
726
  }
527
727
  return '';
528
728
  }
529
- _httpParseAuthToken(token) {
530
- const msg = 'Invalid authorization token';
531
- if (!token)
532
- throw new Error(msg);
533
- const data = (0, jsonwebtoken_1.decode)(token);
534
- if (data === null || !data.tunnelId || !data.userId || data.aud !== 'tunnels' || data.sub !== 'tunnel_read')
535
- throw new Error(msg);
536
- return {
537
- tunnelId: data.tunnelId,
538
- userId: data.userId,
539
- token
540
- };
729
+ async _httpParseAuthToken(token) {
730
+ return new Promise((resolve, reject) => {
731
+ const msg = 'Invalid authorization token';
732
+ if (!token) {
733
+ reject(new Error(msg));
734
+ return;
735
+ }
736
+ const data = (0, jsonwebtoken_1.decode)(token);
737
+ if (!data || !data.iss) {
738
+ reject(new Error(msg));
739
+ return;
740
+ }
741
+ let cert;
742
+ if (ISSUERS[data.iss])
743
+ cert = ISSUERS[data.iss];
744
+ else
745
+ cert = ISSUERS['*'];
746
+ (0, jsonwebtoken_1.verify)(token, cert, {
747
+ complete: true,
748
+ issuer: data.iss
749
+ }, (err, data) => {
750
+ if (err || !data) {
751
+ reject(new Error(msg));
752
+ return;
753
+ }
754
+ const payload = data.payload;
755
+ if (!payload.tunnelId || !payload.userId || payload.aud !== 'tunnels' || payload.sub !== 'tunnel_read') {
756
+ reject(new Error(msg));
757
+ return;
758
+ }
759
+ resolve({
760
+ tunnelId: payload.tunnelId,
761
+ userId: payload.userId,
762
+ token
763
+ });
764
+ });
765
+ });
541
766
  }
542
767
  _httpSetAuthCookie(res, token) {
543
768
  res.setHeader('set-cookie', cookie.serialize(COOKIE_NAME, token, {
544
769
  maxAge: 3600,
545
770
  path: '/',
546
- secure: false,
771
+ secure: true,
547
772
  httpOnly: true,
548
773
  sameSite: 'lax'
549
774
  }));
550
775
  }
551
- async _checkHttpAuthToken(code, token, req, res) {
776
+ async _checkHttpAuthToken(code, verifier, token, req, res) {
552
777
  let fromCookie = false;
553
- if (code && !token) {
554
- token = await this._httpExchangeAuthCode(code);
778
+ if (code && verifier && !token) {
779
+ token = await this._httpExchangeAuthCode(code, verifier);
555
780
  }
556
781
  if (!token) {
557
782
  const cookies = cookie.parse(req.headers.cookie || '');
@@ -562,7 +787,7 @@ class Tunnel extends events_1.default {
562
787
  return false;
563
788
  }
564
789
  try {
565
- const data = this._httpParseAuthToken(token);
790
+ const data = await this._httpParseAuthToken(token);
566
791
  if (data.tunnelId !== this.id) {
567
792
  return false;
568
793
  }
@@ -579,10 +804,10 @@ class Tunnel extends events_1.default {
579
804
  return false;
580
805
  }
581
806
  }
582
- _httpEncryptState(str) {
807
+ _httpEncryptState(url, verifier) {
583
808
  try {
584
809
  const cipher = node_crypto_1.default.createCipheriv(CIPHER_ALG, Buffer.from(this.cipherKey), Buffer.from(CIPHER_IV));
585
- let enc = cipher.update(JSON.stringify({ str }), 'utf8', 'hex');
810
+ let enc = cipher.update(JSON.stringify({ url, verifier }), 'utf8', 'hex');
586
811
  enc += cipher.final('hex');
587
812
  return enc;
588
813
  }
@@ -592,47 +817,56 @@ class Tunnel extends events_1.default {
592
817
  return '';
593
818
  }
594
819
  _httpDecryptState(state) {
820
+ let url = null;
821
+ let verifier = null;
595
822
  if (state) {
596
823
  try {
597
824
  const decipher = node_crypto_1.default.createDecipheriv(CIPHER_ALG, Buffer.from(this.cipherKey), Buffer.from(CIPHER_IV));
598
825
  let dec = decipher.update(state, 'hex', 'utf8');
599
826
  dec += decipher.final('utf8');
600
- const url = JSON.parse(dec).str;
601
- if (url) {
602
- new URL(url);
603
- return url;
827
+ const json = JSON.parse(dec);
828
+ if (json) {
829
+ if (json.url)
830
+ url = json.url;
831
+ if (json.verifier)
832
+ verifier = json.verifier;
604
833
  }
605
834
  }
606
835
  catch {
607
836
  // do nothing
608
837
  }
609
838
  }
610
- return '';
839
+ return {
840
+ url,
841
+ verifier
842
+ };
611
843
  }
612
844
  _redirectHttpToBuddyAuth(pathname, search, req, res) {
613
845
  let host = this.agent.host;
614
846
  if (/^https:\/\/\d+\.\d+\.\d+\.\d+$/.test(host)) {
615
847
  host = 'https://app.local.io';
616
848
  }
849
+ const verifier = (0, uuid_1.v4)();
850
+ const challenge = node_crypto_1.default.createHash('sha256').update(verifier).digest('hex');
617
851
  const callback = `https://${this.subdomain}.${(this.region || '').toLowerCase()}-${this.sshId}.${this.domain}`;
618
- let state;
852
+ let redirect;
619
853
  if (req.headers['x-forwarded-host']) {
620
854
  if (req.headers['x-forwarded-proto'] === 'http') {
621
- state = 'http://';
855
+ redirect = 'http://';
622
856
  }
623
857
  else {
624
- state = 'https://';
858
+ redirect = 'https://';
625
859
  }
626
- state += req.headers['x-forwarded-host'];
860
+ redirect += req.headers['x-forwarded-host'];
627
861
  }
628
862
  else {
629
- state = callback;
863
+ redirect = callback;
630
864
  }
631
- state += pathname;
865
+ redirect += pathname;
632
866
  if (search)
633
- state += search;
634
- const enc = this._httpEncryptState(state);
635
- let url = `${host}/tunnel/auth?redirect_url=${encodeURIComponent(callback)}&id=${encodeURIComponent(this.id)}&agentId=${encodeURIComponent(this.agent.id)}&state=${encodeURIComponent(enc)}`;
867
+ redirect += search;
868
+ const enc = this._httpEncryptState(redirect, verifier);
869
+ let url = `${host}/tunnel/auth?redirect_url=${encodeURIComponent(callback)}&id=${encodeURIComponent(this.id)}&agentId=${encodeURIComponent(this.agent.id)}&challenge=${encodeURIComponent(challenge)}&state=${encodeURIComponent(enc)}`;
636
870
  if (/app\.local\.io/.test(host)) {
637
871
  url += '&response_type=token';
638
872
  }
@@ -646,8 +880,8 @@ class Tunnel extends events_1.default {
646
880
  const code = searchParams.get('code') || '';
647
881
  const state = searchParams.get('state') || '';
648
882
  const token = searchParams.get('access_token') || '';
649
- const url = this._httpDecryptState(state);
650
- const authByToken = await this._checkHttpAuthToken(code, token, req, res);
883
+ const { url, verifier } = this._httpDecryptState(state);
884
+ const authByToken = await this._checkHttpAuthToken(code, verifier || '', token, req, res);
651
885
  if (authByToken) {
652
886
  if (url) {
653
887
  this.httpEndFast(req, res, 302, 'Found', {
@@ -657,7 +891,7 @@ class Tunnel extends events_1.default {
657
891
  }
658
892
  return true;
659
893
  }
660
- else if ((code || token) && url) {
894
+ if (url && verifier && (code || token)) {
661
895
  this.httpEndFast(req, res, 404, 'Not found');
662
896
  return false;
663
897
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bdy",
3
3
  "preferGlobal": false,
4
- "version": "1.14.0-dev",
4
+ "version": "1.14.1-dev",
5
5
  "type": "commonjs",
6
6
  "license": "MIT",
7
7
  "scripts": {