@abtnode/core 1.16.47-beta-20250805-095401-14eb156b → 1.16.47-beta-20250807-110715-19ad6b43

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.
@@ -38918,7 +38918,7 @@ module.exports = require("zlib");
38918
38918
  /***/ ((module) => {
38919
38919
 
38920
38920
  "use strict";
38921
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@abtnode/core","publishConfig":{"access":"public"},"version":"1.16.46","description":"","main":"lib/index.js","files":["lib"],"scripts":{"lint":"eslint tests lib --ignore-pattern \'tests/assets/*\'","lint:fix":"eslint --fix tests lib","test":"node tools/jest.js","coverage":"npm run test -- --coverage"},"keywords":[],"author":"wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)","license":"Apache-2.0","dependencies":{"@abtnode/analytics":"1.16.46","@abtnode/auth":"1.16.46","@abtnode/certificate-manager":"1.16.46","@abtnode/client":"1.16.46","@abtnode/constant":"1.16.46","@abtnode/cron":"1.16.46","@abtnode/db-cache":"1.16.46","@abtnode/docker-utils":"1.16.46","@abtnode/logger":"1.16.46","@abtnode/models":"1.16.46","@abtnode/queue":"1.16.46","@abtnode/rbac":"1.16.46","@abtnode/router-provider":"1.16.46","@abtnode/static-server":"1.16.46","@abtnode/timemachine":"1.16.46","@abtnode/util":"1.16.46","@aigne/aigne-hub":"^0.2.2","@arcblock/did":"1.21.0","@arcblock/did-auth":"1.21.0","@arcblock/did-ext":"1.21.0","@arcblock/did-motif":"^1.1.14","@arcblock/did-util":"1.21.0","@arcblock/event-hub":"1.21.0","@arcblock/jwt":"1.21.0","@arcblock/pm2-events":"^0.0.5","@arcblock/validator":"1.21.0","@arcblock/vc":"1.21.0","@blocklet/constant":"1.16.46","@blocklet/did-space-js":"^1.1.13","@blocklet/env":"1.16.46","@blocklet/error":"^0.2.5","@blocklet/meta":"1.16.46","@blocklet/resolver":"1.16.46","@blocklet/sdk":"1.16.46","@blocklet/store":"1.16.46","@blocklet/theme":"^3.0.37","@fidm/x509":"^1.2.1","@ocap/mcrypto":"1.21.0","@ocap/util":"1.21.0","@ocap/wallet":"1.21.0","@slack/webhook":"^5.0.4","archiver":"^7.0.1","axios":"^1.7.9","axon":"^2.0.3","chalk":"^4.1.2","cross-spawn":"^7.0.3","dayjs":"^1.11.13","deep-diff":"^1.0.2","detect-port":"^1.5.1","envfile":"^7.1.0","escape-string-regexp":"^4.0.0","fast-glob":"^3.3.2","filesize":"^10.1.1","flat":"^5.0.2","fs-extra":"^11.2.0","get-port":"^5.1.1","hasha":"^5.2.2","is-base64":"^1.1.0","is-cidr":"4","is-ip":"3","is-url":"^1.2.4","joi":"17.12.2","joi-extension-semver":"^5.0.0","js-yaml":"^4.1.0","kill-port":"^2.0.1","lodash":"^4.17.21","node-stream-zip":"^1.15.0","p-all":"^3.0.0","p-limit":"^3.1.0","p-map":"^4.0.0","p-retry":"^4.6.2","p-wait-for":"^3.2.0","rate-limiter-flexible":"^5.0.5","read-last-lines":"^1.8.0","semver":"^7.6.3","sequelize":"^6.35.0","shelljs":"^0.8.5","slugify":"^1.6.6","ssri":"^8.0.1","stream-throttle":"^0.1.3","stream-to-promise":"^3.0.0","systeminformation":"^5.23.3","tail":"^2.2.4","tar":"^6.1.11","transliteration":"^2.3.5","ua-parser-js":"^1.0.2","ufo":"^1.5.3","uuid":"^11.1.0","valid-url":"^1.0.9","which":"^2.0.2","xbytes":"^1.8.0"},"devDependencies":{"expand-tilde":"^2.0.2","express":"^4.18.2","jest":"^29.7.0","unzipper":"^0.10.11"},"gitHead":"e5764f753181ed6a7c615cd4fc6682aacf0cb7cd"}');
38921
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@abtnode/core","publishConfig":{"access":"public"},"version":"1.16.46","description":"","main":"lib/index.js","files":["lib"],"scripts":{"lint":"eslint tests lib --ignore-pattern \'tests/assets/*\'","lint:fix":"eslint --fix tests lib","test":"node tools/jest.js","coverage":"npm run test -- --coverage"},"keywords":[],"author":"wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)","license":"Apache-2.0","dependencies":{"@abtnode/analytics":"1.16.46","@abtnode/auth":"1.16.46","@abtnode/certificate-manager":"1.16.46","@abtnode/client":"1.16.46","@abtnode/constant":"1.16.46","@abtnode/cron":"1.16.46","@abtnode/db-cache":"1.16.46","@abtnode/docker-utils":"1.16.46","@abtnode/logger":"1.16.46","@abtnode/models":"1.16.46","@abtnode/queue":"1.16.46","@abtnode/rbac":"1.16.46","@abtnode/router-provider":"1.16.46","@abtnode/static-server":"1.16.46","@abtnode/timemachine":"1.16.46","@abtnode/util":"1.16.46","@aigne/aigne-hub":"^0.4.5","@arcblock/did":"1.21.2","@arcblock/did-connect-js":"1.21.2","@arcblock/did-ext":"1.21.2","@arcblock/did-motif":"^1.1.14","@arcblock/did-util":"1.21.2","@arcblock/event-hub":"1.21.2","@arcblock/jwt":"1.21.2","@arcblock/pm2-events":"^0.0.5","@arcblock/validator":"1.21.2","@arcblock/vc":"1.21.2","@blocklet/constant":"1.16.46","@blocklet/did-space-js":"^1.1.13","@blocklet/env":"1.16.46","@blocklet/error":"^0.2.5","@blocklet/meta":"1.16.46","@blocklet/resolver":"1.16.46","@blocklet/sdk":"1.16.46","@blocklet/store":"1.16.46","@blocklet/theme":"^3.0.42","@fidm/x509":"^1.2.1","@ocap/mcrypto":"1.21.2","@ocap/util":"1.21.2","@ocap/wallet":"1.21.2","@slack/webhook":"^5.0.4","archiver":"^7.0.1","axios":"^1.7.9","axon":"^2.0.3","chalk":"^4.1.2","cross-spawn":"^7.0.3","dayjs":"^1.11.13","deep-diff":"^1.0.2","detect-port":"^1.5.1","envfile":"^7.1.0","escape-string-regexp":"^4.0.0","fast-glob":"^3.3.2","filesize":"^10.1.1","flat":"^5.0.2","fs-extra":"^11.2.0","get-port":"^5.1.1","hasha":"^5.2.2","is-base64":"^1.1.0","is-cidr":"4","is-ip":"3","is-url":"^1.2.4","joi":"17.12.2","joi-extension-semver":"^5.0.0","js-yaml":"^4.1.0","kill-port":"^2.0.1","lodash":"^4.17.21","node-stream-zip":"^1.15.0","p-all":"^3.0.0","p-limit":"^3.1.0","p-map":"^4.0.0","p-retry":"^4.6.2","p-wait-for":"^3.2.0","private-ip":"^2.3.4","rate-limiter-flexible":"^5.0.5","read-last-lines":"^1.8.0","semver":"^7.6.3","sequelize":"^6.35.0","shelljs":"^0.8.5","slugify":"^1.6.6","ssri":"^8.0.1","stream-throttle":"^0.1.3","stream-to-promise":"^3.0.0","systeminformation":"^5.23.3","tail":"^2.2.4","tar":"^6.1.11","transliteration":"^2.3.5","ua-parser-js":"^1.0.2","ufo":"^1.5.3","uuid":"^11.1.0","valid-url":"^1.0.9","which":"^2.0.2","xbytes":"^1.8.0"},"devDependencies":{"expand-tilde":"^2.0.2","express":"^4.18.2","jest":"^29.7.0","unzipper":"^0.10.11"},"gitHead":"e5764f753181ed6a7c615cd4fc6682aacf0cb7cd"}');
38922
38922
 
38923
38923
  /***/ }),
38924
38924
 
@@ -1,4 +1,6 @@
1
1
  const { BaseState } = require('@abtnode/models');
2
+ const { isAllowedURL } = require('@abtnode/util/lib/ssrf-protector');
3
+ const { CustomError } = require('@blocklet/error');
2
4
  const logger = require('@abtnode/logger')('@abtnode/core:states:base');
3
5
 
4
6
  const { isCLI } = require('../util');
@@ -20,6 +22,37 @@ class ExtendedBase extends BaseState {
20
22
  update(condition, updates, options) {
21
23
  return super.update(condition, updates, { returnUpdatedDocs: true, ...options });
22
24
  }
25
+
26
+ /**
27
+ * 验证输入的URL是否合法,如果非法禁止保存
28
+ */
29
+ async validateURL(urls = [], label = '') {
30
+ if (urls.length === 0) {
31
+ return true;
32
+ }
33
+ const validateResults = await Promise.all(
34
+ urls.map(async (url) => {
35
+ try {
36
+ const allowed = await isAllowedURL(url);
37
+ return { url, allowed };
38
+ } catch (error) {
39
+ logger.warn('URL validation failed', { url, error });
40
+ return { url, allowed: false };
41
+ }
42
+ })
43
+ );
44
+
45
+ const allowed = validateResults.every((item) => item.allowed);
46
+ if (!allowed) {
47
+ const invalidUrls = validateResults
48
+ .filter((result) => !result.allowed)
49
+ .map((result) => result.url)
50
+ .filter(Boolean);
51
+
52
+ throw new CustomError(400, `Invalid ${label || 'URLs'}: ${invalidUrls.join(', ')}`);
53
+ }
54
+ return true;
55
+ }
23
56
  }
24
57
 
25
58
  module.exports = ExtendedBase;
@@ -121,6 +121,10 @@ class User extends ExtendBase {
121
121
  Object.assign(pending, await this._extractInviteInfo({ did, ...pending }));
122
122
  }
123
123
 
124
+ // 验证 webhooks 中 URL 是否合法
125
+ const webhooks = get(pending, 'extra.webhooks', []);
126
+ await this.validateURL(webhooks.map((x) => x.url));
127
+
124
128
  await super.update({ did }, { $set: pending });
125
129
  await Promise.all(
126
130
  (get(cloneData, 'passports') || [])
@@ -1,4 +1,6 @@
1
1
  const Joi = require('joi');
2
+ const { CustomError } = require('@blocklet/error');
3
+
2
4
  const BaseState = require('./base');
3
5
 
4
6
  const webhookEndpointSchema = Joi.object({
@@ -41,6 +43,9 @@ const updateWebhookEndpointSchema = Joi.object({
41
43
  */
42
44
  class WebhookEndpointState extends BaseState {
43
45
  async create(input) {
46
+ // 校验非法的URL
47
+ await this.validateURL([input.url], 'webhook endpoint URL');
48
+
44
49
  await webhookEndpointSchema.validateAsync(input, { stripUnknown: true });
45
50
 
46
51
  const webhook = await this.insert(input);
@@ -55,7 +60,7 @@ class WebhookEndpointState extends BaseState {
55
60
  async updateWebhook(id, updates) {
56
61
  const doc = await this.findOne({ where: { id } });
57
62
  if (!doc) {
58
- throw new Error('webhook endpoint not found');
63
+ throw new CustomError(400, 'webhook endpoint not found');
59
64
  }
60
65
 
61
66
  await updateWebhookEndpointSchema.validateAsync(updates, { stripUnknown: true });
@@ -67,7 +72,7 @@ class WebhookEndpointState extends BaseState {
67
72
  async deleteWebhook(id) {
68
73
  const doc = await this.findOne({ where: { id } });
69
74
  if (!doc) {
70
- throw new Error('webhook endpoint not found');
75
+ throw new CustomError(400, 'webhook endpoint not found');
71
76
  }
72
77
 
73
78
  await this.remove({ id });
@@ -9,6 +9,10 @@ const { validateWebhook } = require('../validators/webhook');
9
9
  class WebhookState extends BaseState {
10
10
  async create(info, { mock } = {}) {
11
11
  const { type, params } = info;
12
+
13
+ const urls = params.map((item) => item.value);
14
+ await this.validateURL(urls, 'webhook URLs');
15
+
12
16
  const filterParams = params.map((item) => {
13
17
  const data = {
14
18
  name: item.name,
@@ -49,7 +49,7 @@ const verifyAigneHub = async (config, blocklet) => {
49
49
  const { did, name } = blocklet.meta || {};
50
50
 
51
51
  const modelConfig = {
52
- accessKey: decryptValue(config.key, did),
52
+ apiKey: decryptValue(config.key, did),
53
53
  model: !config.model || config.model === 'auto' ? undefined : config.model,
54
54
  url: baseUrl,
55
55
  };
@@ -21,7 +21,7 @@ const diff = require('deep-diff');
21
21
  const createArchive = require('archiver');
22
22
  const isUrl = require('is-url');
23
23
  const semver = require('semver');
24
- const { chainInfo: chainInfoSchema } = require('@arcblock/did-auth/lib/schema');
24
+ const { chainInfo: chainInfoSchema } = require('@arcblock/did-connect-js/lib/schema');
25
25
 
26
26
  const urlPathFriendly = require('@blocklet/meta/lib/url-path-friendly').default;
27
27
  const { fromSecretKey, fromPublicKey } = require('@ocap/wallet');
@@ -737,6 +737,7 @@ const startBlockletProcess = async (
737
737
 
738
738
  if (b.mode === BLOCKLET_MODES.DEVELOPMENT) {
739
739
  options.env.NODE_ENV = e2eMode ? 'e2e' : 'development';
740
+ options.env.IS_E2E = e2eMode ? '1' : undefined;
740
741
  options.env.BROWSER = 'none';
741
742
  options.env.PORT = options.env[BLOCKLET_DEFAULT_PORT_NAME];
742
743
 
package/lib/util/env.js CHANGED
@@ -1,6 +1,7 @@
1
1
  const serverJobBackoffSeconds = process.env.ABT_NODE_JOB_BACKOFF_SECONDS
2
2
  ? +process.env.ABT_NODE_JOB_BACKOFF_SECONDS
3
3
  : 600;
4
+ const isE2E = process.env.NODE_ENV === 'e2e' || ['1', 'true'].includes(process.env.IS_E2E);
4
5
 
5
6
  const shouldJobBackoff = () => {
6
7
  if (process.env.ABT_NODE_JOB_BACKOFF_SECONDS === '0') {
@@ -13,4 +14,5 @@ const shouldJobBackoff = () => {
13
14
  module.exports = {
14
15
  serverJobBackoffSeconds,
15
16
  shouldJobBackoff,
17
+ isE2E,
16
18
  };
@@ -1,6 +1,7 @@
1
1
  const logger = require('@abtnode/logger')('@abtnode/core:util:reset');
2
2
 
3
3
  const states = require('../states');
4
+ const { isE2E } = require('./env');
4
5
 
5
6
  const noop = () => true;
6
7
 
@@ -121,7 +122,7 @@ module.exports = async ({
121
122
  teamManager,
122
123
  certManager,
123
124
  }) => {
124
- if (process.env.NODE_ENV !== 'e2e') {
125
+ if (!isE2E) {
125
126
  throw new Error('Reset node only exists for test purpose');
126
127
  }
127
128
 
@@ -3,6 +3,7 @@ const { evaluateURLs } = require('@abtnode/util/lib/url-evaluation');
3
3
  const checkURLAccessible = require('@abtnode/util/lib/url-evaluation/check-accessible-node');
4
4
  const { EVENTS } = require('@abtnode/constant');
5
5
  const isEmpty = require('lodash/isEmpty');
6
+ const { isAllowedReferer } = require('@abtnode/util/lib/ssrf-protector');
6
7
 
7
8
  const { joinURL } = require('ufo');
8
9
  const isUrl = require('is-url');
@@ -235,13 +236,21 @@ module.exports = ({ events, dataDirs, instance, teamManager }) => {
235
236
  }
236
237
  };
237
238
 
238
- const sendTestMessage = async (msg) => {
239
+ const sendTestMessage = async (msg, context) => {
239
240
  const { webhookId, message } = msg;
240
241
  try {
242
+ if (context?.referer) {
243
+ const { host = '' } = context || {};
244
+ if (!isAllowedReferer(context.referer, host)) {
245
+ throw new Error('Invalid request');
246
+ }
247
+ }
241
248
  const webhook = webhookId ? await webhookState.findOne(webhookId) : msg.webhook;
249
+
242
250
  await sentTextMessage(webhook, message);
243
251
  } catch (error) {
244
252
  logger.error('webhook sender error', { error, msg });
253
+ throw new Error(error.message);
245
254
  }
246
255
  };
247
256
 
@@ -1,6 +1,7 @@
1
1
  const Joi = require('joi');
2
2
  const axios = require('@abtnode/util/lib/axios');
3
3
  const logger = require('@abtnode/logger')('@abtnode/core:sender:api');
4
+ const { isAllowedURL } = require('@abtnode/util/lib/ssrf-protector');
4
5
  const BaseSender = require('../base');
5
6
 
6
7
  class APISender extends BaseSender {
@@ -9,6 +10,9 @@ class APISender extends BaseSender {
9
10
  const { status, name, title, description } = message;
10
11
 
11
12
  try {
13
+ if (!(await isAllowedURL(url))) {
14
+ throw new Error('Invalid URL');
15
+ }
12
16
  await axios.post(
13
17
  url,
14
18
  {
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.47-beta-20250805-095401-14eb156b",
6
+ "version": "1.16.47-beta-20250807-110715-19ad6b43",
7
7
  "description": "",
8
8
  "main": "lib/index.js",
9
9
  "files": [
@@ -19,46 +19,46 @@
19
19
  "author": "wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)",
20
20
  "license": "Apache-2.0",
21
21
  "dependencies": {
22
- "@abtnode/analytics": "1.16.47-beta-20250805-095401-14eb156b",
23
- "@abtnode/auth": "1.16.47-beta-20250805-095401-14eb156b",
24
- "@abtnode/certificate-manager": "1.16.47-beta-20250805-095401-14eb156b",
25
- "@abtnode/client": "1.16.47-beta-20250805-095401-14eb156b",
26
- "@abtnode/constant": "1.16.47-beta-20250805-095401-14eb156b",
27
- "@abtnode/cron": "1.16.47-beta-20250805-095401-14eb156b",
28
- "@abtnode/db-cache": "1.16.47-beta-20250805-095401-14eb156b",
29
- "@abtnode/docker-utils": "1.16.47-beta-20250805-095401-14eb156b",
30
- "@abtnode/logger": "1.16.47-beta-20250805-095401-14eb156b",
31
- "@abtnode/models": "1.16.47-beta-20250805-095401-14eb156b",
32
- "@abtnode/queue": "1.16.47-beta-20250805-095401-14eb156b",
33
- "@abtnode/rbac": "1.16.47-beta-20250805-095401-14eb156b",
34
- "@abtnode/router-provider": "1.16.47-beta-20250805-095401-14eb156b",
35
- "@abtnode/static-server": "1.16.47-beta-20250805-095401-14eb156b",
36
- "@abtnode/timemachine": "1.16.47-beta-20250805-095401-14eb156b",
37
- "@abtnode/util": "1.16.47-beta-20250805-095401-14eb156b",
38
- "@aigne/aigne-hub": "^0.2.2",
39
- "@arcblock/did": "1.21.0",
40
- "@arcblock/did-auth": "1.21.0",
41
- "@arcblock/did-ext": "1.21.0",
22
+ "@abtnode/analytics": "1.16.47-beta-20250807-110715-19ad6b43",
23
+ "@abtnode/auth": "1.16.47-beta-20250807-110715-19ad6b43",
24
+ "@abtnode/certificate-manager": "1.16.47-beta-20250807-110715-19ad6b43",
25
+ "@abtnode/client": "1.16.47-beta-20250807-110715-19ad6b43",
26
+ "@abtnode/constant": "1.16.47-beta-20250807-110715-19ad6b43",
27
+ "@abtnode/cron": "1.16.47-beta-20250807-110715-19ad6b43",
28
+ "@abtnode/db-cache": "1.16.47-beta-20250807-110715-19ad6b43",
29
+ "@abtnode/docker-utils": "1.16.47-beta-20250807-110715-19ad6b43",
30
+ "@abtnode/logger": "1.16.47-beta-20250807-110715-19ad6b43",
31
+ "@abtnode/models": "1.16.47-beta-20250807-110715-19ad6b43",
32
+ "@abtnode/queue": "1.16.47-beta-20250807-110715-19ad6b43",
33
+ "@abtnode/rbac": "1.16.47-beta-20250807-110715-19ad6b43",
34
+ "@abtnode/router-provider": "1.16.47-beta-20250807-110715-19ad6b43",
35
+ "@abtnode/static-server": "1.16.47-beta-20250807-110715-19ad6b43",
36
+ "@abtnode/timemachine": "1.16.47-beta-20250807-110715-19ad6b43",
37
+ "@abtnode/util": "1.16.47-beta-20250807-110715-19ad6b43",
38
+ "@aigne/aigne-hub": "^0.4.5",
39
+ "@arcblock/did": "1.21.2",
40
+ "@arcblock/did-connect-js": "1.21.2",
41
+ "@arcblock/did-ext": "1.21.2",
42
42
  "@arcblock/did-motif": "^1.1.14",
43
- "@arcblock/did-util": "1.21.0",
44
- "@arcblock/event-hub": "1.21.0",
45
- "@arcblock/jwt": "1.21.0",
43
+ "@arcblock/did-util": "1.21.2",
44
+ "@arcblock/event-hub": "1.21.2",
45
+ "@arcblock/jwt": "1.21.2",
46
46
  "@arcblock/pm2-events": "^0.0.5",
47
- "@arcblock/validator": "1.21.0",
48
- "@arcblock/vc": "1.21.0",
49
- "@blocklet/constant": "1.16.47-beta-20250805-095401-14eb156b",
47
+ "@arcblock/validator": "1.21.2",
48
+ "@arcblock/vc": "1.21.2",
49
+ "@blocklet/constant": "1.16.47-beta-20250807-110715-19ad6b43",
50
50
  "@blocklet/did-space-js": "^1.1.13",
51
- "@blocklet/env": "1.16.47-beta-20250805-095401-14eb156b",
51
+ "@blocklet/env": "1.16.47-beta-20250807-110715-19ad6b43",
52
52
  "@blocklet/error": "^0.2.5",
53
- "@blocklet/meta": "1.16.47-beta-20250805-095401-14eb156b",
54
- "@blocklet/resolver": "1.16.47-beta-20250805-095401-14eb156b",
55
- "@blocklet/sdk": "1.16.47-beta-20250805-095401-14eb156b",
56
- "@blocklet/store": "1.16.47-beta-20250805-095401-14eb156b",
57
- "@blocklet/theme": "^3.0.37",
53
+ "@blocklet/meta": "1.16.47-beta-20250807-110715-19ad6b43",
54
+ "@blocklet/resolver": "1.16.47-beta-20250807-110715-19ad6b43",
55
+ "@blocklet/sdk": "1.16.47-beta-20250807-110715-19ad6b43",
56
+ "@blocklet/store": "1.16.47-beta-20250807-110715-19ad6b43",
57
+ "@blocklet/theme": "^3.0.42",
58
58
  "@fidm/x509": "^1.2.1",
59
- "@ocap/mcrypto": "1.21.0",
60
- "@ocap/util": "1.21.0",
61
- "@ocap/wallet": "1.21.0",
59
+ "@ocap/mcrypto": "1.21.2",
60
+ "@ocap/util": "1.21.2",
61
+ "@ocap/wallet": "1.21.2",
62
62
  "@slack/webhook": "^5.0.4",
63
63
  "archiver": "^7.0.1",
64
64
  "axios": "^1.7.9",
@@ -91,6 +91,7 @@
91
91
  "p-map": "^4.0.0",
92
92
  "p-retry": "^4.6.2",
93
93
  "p-wait-for": "^3.2.0",
94
+ "private-ip": "^2.3.4",
94
95
  "rate-limiter-flexible": "^5.0.5",
95
96
  "read-last-lines": "^1.8.0",
96
97
  "semver": "^7.6.3",
@@ -117,5 +118,5 @@
117
118
  "jest": "^29.7.0",
118
119
  "unzipper": "^0.10.11"
119
120
  },
120
- "gitHead": "db2c143c5986281db1ae735aac70cbeb8c817773"
121
+ "gitHead": "639aa367b25d6885e38cba99f73d753b2831393d"
121
122
  }