From 1de19c928e1220c13ccc7838b64b04d5633deb7b Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Tue, 29 Sep 2026 08:46:13 +0200 Subject: [PATCH 1/7] Remove Orbit remote management Remote management (cloudserver connecting to Orbit to fetch its instance credentials, and polling or receiving configuration overlays that it applied and saved in the PENSIEVE bucket) has been dead for a long time: zenko-operator sets REMOTE_MANAGEMENT_DISABLE and renders locationConfig.json itself, Orbit / Zenko 1.x are no longer supported, and S3C never used it. Keeping it around only forces Arsenal to keep exporting the pensieve credential utils and patchLocations. This drops the management init in the server and the management agent, with the Orbit credentials, polling and overlay code they relied on. The zenko-instance-id user metadata goes too, as its value only ever came from an overlay. The push client still used by the metrics server and secure channel proxy now ignores overlay messages, and keeps handling metrics requests and channel data as before. overlayVersion is kept and still reported in /_/report: zenko-operator renders it in config.json and pensieve-api reads it from the report. The management config unit test happened to reset config.locationConstraints between suites, which was masking a leak in objectReplicationMD.js (it replaced the real awsbackend location and then deleted it). That test now restores the original entries. Issue: CLDSRV-1013 --- .github/docker/docker-compose.yaml | 1 - .github/workflows/tests.yaml | 1 - CLAUDE.md | 1 - constants.js | 2 - docs/DOCKER.rst | 11 - lib/Config.js | 30 --- lib/api/apiUtils/object/applyZenkoUserMD.js | 18 -- .../apiUtils/object/createAndStoreObject.js | 4 - lib/api/initiateMultipartUpload.js | 4 - lib/api/objectCopy.js | 4 - lib/management/agentClient.js | 91 ------- lib/management/configuration.js | 250 ------------------ lib/management/credentials.js | 147 ---------- lib/management/index.js | 137 ---------- lib/management/poll.js | 147 ---------- lib/management/push.js | 19 +- lib/server.js | 15 -- managementAgent.js | 170 ------------ package.json | 3 - tests/unit/api/objectReplicationMD.js | 16 +- tests/unit/management/agent.js | 114 -------- tests/unit/management/configuration.js | 232 ---------------- tests/unit/management/poll.js | 30 --- tests/unit/management/resources.json | 9 - 24 files changed, 16 insertions(+), 1440 deletions(-) delete mode 100644 lib/api/apiUtils/object/applyZenkoUserMD.js delete mode 100644 lib/management/agentClient.js delete mode 100644 lib/management/configuration.js delete mode 100644 lib/management/credentials.js delete mode 100644 lib/management/index.js delete mode 100644 lib/management/poll.js delete mode 100644 managementAgent.js delete mode 100644 tests/unit/management/agent.js delete mode 100644 tests/unit/management/configuration.js delete mode 100644 tests/unit/management/poll.js delete mode 100644 tests/unit/management/resources.json diff --git a/.github/docker/docker-compose.yaml b/.github/docker/docker-compose.yaml index 2cff2d68ad..7b3782b81c 100644 --- a/.github/docker/docker-compose.yaml +++ b/.github/docker/docker-compose.yaml @@ -15,7 +15,6 @@ services: - REDIS_HOST=0.0.0.0 - REDIS_PORT=6379 - REPORT_TOKEN=report-token-1 - - REMOTE_MANAGEMENT_DISABLE=1 - HEALTHCHECKS_ALLOWFROM=0.0.0.0/0 - DATA_HOST=0.0.0.0 - METADATA_HOST=0.0.0.0 diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index c90c748b57..57a205233e 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -65,7 +65,6 @@ env: # Configs ENABLE_LOCAL_CACHE: 'true' REPORT_TOKEN: 'report-token-1' - REMOTE_MANAGEMENT_DISABLE: '1' # https://github.com/git-lfs/git-lfs/issues/5749 GIT_CLONE_PROTECTION_ACTIVE: 'false' AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE: '1' diff --git a/CLAUDE.md b/CLAUDE.md index 8c2eca5bfa..a7317adecd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -70,7 +70,6 @@ yarn lint_md # Markdown linting - `mdserver.js` → Metadata server (port 9990) - `dataserver.js` → Data storage server (port 9991) - `pfsserver.js` → Passthrough filesystem server (port 9992) -- `managementAgent.js` → WebSocket management agent (port 8010) ### Core Components diff --git a/constants.js b/constants.js index fc71e8cbad..61f2ba5b58 100644 --- a/constants.js +++ b/constants.js @@ -165,8 +165,6 @@ const constants = { productName: 'APN/1.0 Scality/1.0 Scality CloudServer for Zenko', // location constraint delimiter zenkoSeparator: ':', - // user metadata applied on zenko objects - zenkoIDHeader: 'x-amz-meta-zenko-instance-id', bucketOwnerActions: [ 'bucketDeleteCors', 'bucketDeleteLifecycle', diff --git a/docs/DOCKER.rst b/docs/DOCKER.rst index ff32b5d568..037283c428 100644 --- a/docs/DOCKER.rst +++ b/docs/DOCKER.rst @@ -93,17 +93,6 @@ new.host.com, for example, specify the endpoint with: .. note:: On Unix-like systems (Linux, OS X, etc.) edit /etc/hosts to associate 127.0.0.1 with new.host.com. -REMOTE_MANAGEMENT_DISABLE -~~~~~~~~~~~~~~~~~~~~~~~~~ - -CloudServer is a part of `Zenko `__. When you run CloudServer standalone it will still try to connect to Orbit by default (browser-based graphical user interface for Zenko). - -Setting this variable to true(1) will default to accessKey1 and verySecretKey1 for credentials and disable the automatic Orbit management: - -.. code-block:: shell - - $ docker run -d --name cloudserver -p 8000:8000 -e REMOTE_MANAGEMENT_DISABLE=1 zenko/cloudserver - SCALITY\_ACCESS\_KEY\_ID and SCALITY\_SECRET\_ACCESS\_KEY ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/lib/Config.js b/lib/Config.js index 4ec980e778..4481517473 100644 --- a/lib/Config.js +++ b/lib/Config.js @@ -3,7 +3,6 @@ const { EventEmitter } = require('events'); const fs = require('fs'); const path = require('path'); const url = require('url'); -const crypto = require('crypto'); const { v4: uuidv4 } = require('uuid'); const cronParser = require('cron-parser'); @@ -1738,27 +1737,6 @@ class Config extends EventEmitter { this.outboundProxy.certs = certObj.certs; } - this.managementAgent = {}; - this.managementAgent.port = 8010; - this.managementAgent.host = 'localhost'; - if (config.managementAgent !== undefined) { - if (config.managementAgent.port !== undefined) { - assert( - Number.isInteger(config.managementAgent.port) && config.managementAgent.port > 0, - 'bad config: managementAgent port must be a positive integer', - ); - this.managementAgent.port = config.managementAgent.port; - } - if (config.managementAgent.host !== undefined) { - assert.strictEqual( - typeof config.managementAgent.host, - 'string', - 'bad config: management agent host must be a string', - ); - this.managementAgent.host = config.managementAgent.host; - } - } - // Ephemeral token to protect the reporting endpoint: // try inherited from parent first, then hardcoded in conf file, // then create a fresh one as last resort. @@ -2222,14 +2200,6 @@ class Config extends EventEmitter { return this.locationConstraints[locationConstraint].details.serverSideEncryption === true; } - getPublicInstanceId() { - return this.publicInstanceId; - } - - setPublicInstanceId(instanceId) { - this.publicInstanceId = crypto.createHash('sha256').update(instanceId).digest('hex'); - } - isQuotaEnabled() { return !!this.quotaEnabled; } diff --git a/lib/api/apiUtils/object/applyZenkoUserMD.js b/lib/api/apiUtils/object/applyZenkoUserMD.js deleted file mode 100644 index 7657542da4..0000000000 --- a/lib/api/apiUtils/object/applyZenkoUserMD.js +++ /dev/null @@ -1,18 +0,0 @@ -const { zenkoIDHeader } = require('@scality/arsenal').constants; - -const _config = require('../../../Config').config; - -/** - * applyZenkoUserMD - if request is within a Zenko deployment, apply user - * metadata called "zenko-source" to the object - * @param {Object} metaHeaders - user metadata object - * @return {undefined} - */ -function applyZenkoUserMD(metaHeaders) { - if (process.env.REMOTE_MANAGEMENT_DISABLE === '0' && !metaHeaders[zenkoIDHeader]) { - // eslint-disable-next-line no-param-reassign - metaHeaders[zenkoIDHeader] = _config.getPublicInstanceId(); - } -} - -module.exports = applyZenkoUserMD; diff --git a/lib/api/apiUtils/object/createAndStoreObject.js b/lib/api/apiUtils/object/createAndStoreObject.js index 8baef17940..3d2f86beae 100644 --- a/lib/api/apiUtils/object/createAndStoreObject.js +++ b/lib/api/apiUtils/object/createAndStoreObject.js @@ -12,7 +12,6 @@ const removeAWSChunked = require('./removeAWSChunked'); const getReplicationInfo = require('./getReplicationInfo'); const { config } = require('../../../Config'); const validateWebsiteHeader = require('./websiteServing').validateWebsiteHeader; -const applyZenkoUserMD = require('./applyZenkoUserMD'); const { isColdStorageClass } = require('./storageClass'); const { algorithms, @@ -158,9 +157,6 @@ function createAndStoreObject( }); return process.nextTick(() => callback(metaHeaders)); } - // if the request occurs within a Zenko deployment, we place a user-metadata - // field on the object - applyZenkoUserMD(metaHeaders); log.trace('meta headers', { metaHeaders, method: 'objectPut' }); const objectKeyContext = { diff --git a/lib/api/initiateMultipartUpload.js b/lib/api/initiateMultipartUpload.js index 1550ddef00..930dbf964c 100644 --- a/lib/api/initiateMultipartUpload.js +++ b/lib/api/initiateMultipartUpload.js @@ -15,7 +15,6 @@ const locationConstraintCheck = require('./apiUtils/object/locationConstraintChe const validateWebsiteHeader = require('./apiUtils/object/websiteServing').validateWebsiteHeader; const monitoring = require('../utilities/monitoringHandler'); const { data } = require('../data/wrapper'); -const applyZenkoUserMD = require('./apiUtils/object/applyZenkoUserMD'); const { validateStorageClass } = require('./apiUtils/object/storageClass'); const { validateHeaders, compareObjectLockInformation } = require('./apiUtils/object/objectLockHelpers'); const { getObjectSSEConfiguration } = require('./apiUtils/bucket/bucketEncryption'); @@ -102,9 +101,6 @@ function initiateMultipartUpload(authInfo, request, log, callback) { }); return process.nextTick(() => callback(metaHeaders)); } - // if the request occurs within a Zenko deployment, we place a user-metadata - // field on the object - applyZenkoUserMD(metaHeaders); const storageClass = request.headers['x-amz-storage-class'] || 'STANDARD'; const metadataValParams = { diff --git a/lib/api/objectCopy.js b/lib/api/objectCopy.js index 97cc63637c..9e98421c27 100644 --- a/lib/api/objectCopy.js +++ b/lib/api/objectCopy.js @@ -18,7 +18,6 @@ const { standardMetadataValidateBucketAndObj } = require('../metadata/metadataUt const validateWebsiteHeader = require('./apiUtils/object/websiteServing').validateWebsiteHeader; const { config } = require('../Config'); const monitoring = require('../utilities/monitoringHandler'); -const applyZenkoUserMD = require('./apiUtils/object/applyZenkoUserMD'); const { isColdStorageClass, validateStorageClass } = require('./apiUtils/object/storageClass'); const { getObjectSSEConfiguration } = require('./apiUtils/bucket/bucketEncryption'); const { setExpirationHeaders } = require('./apiUtils/object/expirationHeaders'); @@ -336,9 +335,6 @@ function _prepMetadata( }); return { error: userMetadata }; } - // if the request occurs within a Zenko deployment, we place a user-metadata - // field on the object - applyZenkoUserMD(userMetadata); // If metadataDirective is: // - 'COPY' and source object has a location constraint in its metadata // we use the bucket destination location constraint diff --git a/lib/management/agentClient.js b/lib/management/agentClient.js deleted file mode 100644 index 51d6052aa4..0000000000 --- a/lib/management/agentClient.js +++ /dev/null @@ -1,91 +0,0 @@ -const WebSocket = require('ws'); -const arsenal = require('@scality/arsenal'); - -const logger = require('../utilities/logger'); -const _config = require('../Config').config; -const { patchConfiguration } = require('./configuration'); -const { reshapeExceptionError } = arsenal.errorUtils; - -const managementAgentMessageType = { - /** Message that contains the loaded overlay */ - NEW_OVERLAY: 1, -}; - -const CONNECTION_RETRY_TIMEOUT_MS = 5000; - -function initManagementClient() { - const { host, port } = _config.managementAgent; - - const ws = new WebSocket(`ws://${host}:${port}/watch`); - - ws.on('open', () => { - logger.info('connected with management agent'); - }); - - ws.on('close', (code, reason) => { - logger.info('disconnected from management agent', { reason }); - setTimeout(initManagementClient, CONNECTION_RETRY_TIMEOUT_MS); - }); - - ws.on('error', error => { - logger.error('error on connection with management agent', { error }); - }); - - ws.on('message', data => { - const method = 'initManagementclient::onMessage'; - const log = logger.newRequestLogger(); - let msg; - - if (!data) { - log.error('message without data', { method }); - return; - } - try { - msg = JSON.parse(data); - } catch (err) { - log.error('data is an invalid json', { method, err, data }); - return; - } - - if (msg.payload === undefined) { - log.error('message without payload', { method }); - return; - } - if (typeof msg.messageType !== 'number') { - log.error('messageType is not an integer', { - type: typeof msg.messageType, - method, - }); - return; - } - - switch (msg.messageType) { - case managementAgentMessageType.NEW_OVERLAY: - patchConfiguration(msg.payload, log, err => { - if (err) { - log.error('failed to patch overlay', { - error: reshapeExceptionError(err), - method, - }); - } - }); - return; - default: - log.error('new overlay message with unmanaged message type', { - method, - type: msg.messageType, - }); - return; - } - }); -} - -function isManagementAgentUsed() { - return process.env.MANAGEMENT_USE_AGENT === '1'; -} - -module.exports = { - managementAgentMessageType, - initManagementClient, - isManagementAgentUsed, -}; diff --git a/lib/management/configuration.js b/lib/management/configuration.js deleted file mode 100644 index fe8d20c5f8..0000000000 --- a/lib/management/configuration.js +++ /dev/null @@ -1,250 +0,0 @@ -const arsenal = require('@scality/arsenal'); - -const { buildAuthDataAccount } = require('../auth/in_memory/builder'); -const _config = require('../Config').config; -const metadata = require('../metadata/wrapper'); - -const { getStoredCredentials } = require('./credentials'); - -const latestOverlayVersionKey = 'configuration/overlay-version'; -const managementDatabaseName = 'PENSIEVE'; -const replicatorEndpoint = 'zenko-cloudserver-replicator'; -const { decryptSecret } = arsenal.pensieve.credentialUtils; -const { patchLocations } = arsenal.patches.locationConstraints; -const { reshapeExceptionError } = arsenal.errorUtils; -const { replicationBackends } = require('@scality/arsenal').constants; - -function overlayHasVersion(overlay) { - return overlay && overlay.version !== undefined; -} - -function remoteOverlayIsNewer(cachedOverlay, remoteOverlay) { - return ( - overlayHasVersion(remoteOverlay) && - (!overlayHasVersion(cachedOverlay) || remoteOverlay.version > cachedOverlay.version) - ); -} - -/** - * Updates the live {Config} object with the new overlay configuration. - * - * No-op if this version was already applied to the live {Config}. - * - * @param {object} newConf Overlay configuration to apply - * @param {werelogs~Logger} log Request-scoped logger - * @param {function} cb Function to call with (error, newConf) - * - * @returns {undefined} - */ -function patchConfiguration(newConf, log, cb) { - if (newConf.version === undefined) { - log.debug('no remote configuration created yet'); - return process.nextTick(cb, null, newConf); - } - - if (_config.overlayVersion !== undefined && newConf.version <= _config.overlayVersion) { - log.debug('configuration version already applied', { configurationVersion: newConf.version }); - return process.nextTick(cb, null, newConf); - } - return getStoredCredentials(log, (err, creds) => { - if (err) { - return cb(err); - } - const accounts = []; - if (newConf.users) { - newConf.users.forEach(u => { - if (u.secretKey && u.secretKey.length > 0) { - const secretKey = decryptSecret(creds, u.secretKey); - // accountType will be service-replication or service-clueso - let serviceName; - if (u.accountType && u.accountType.startsWith('service-')) { - serviceName = u.accountType.split('-')[1]; - } - const newAccount = buildAuthDataAccount( - u.accessKey, - secretKey, - u.canonicalId, - serviceName, - u.userName, - ); - accounts.push(newAccount.accounts[0]); - } - }); - } - - const restEndpoints = Object.assign({}, _config.restEndpoints); - if (newConf.endpoints) { - newConf.endpoints.forEach(e => { - restEndpoints[e.hostname] = e.locationName; - }); - } - - if (!restEndpoints[replicatorEndpoint]) { - restEndpoints[replicatorEndpoint] = 'us-east-1'; - } - - const locations = patchLocations(newConf.locations, creds, log); - if (Object.keys(locations).length !== 0) { - try { - _config.setLocationConstraints(locations); - } catch (error) { - const exceptionError = reshapeExceptionError(error); - log.error('could not apply configuration version location constraints', { - error: exceptionError, - method: 'getStoredCredentials', - }); - return cb(exceptionError); - } - try { - const locationsWithReplicationBackend = Object.keys(locations) - // NOTE: In Orbit, we don't need to have Scality location in our - // replication endpoind config, since we do not replicate to - // any Scality Instance yet. - .filter(key => replicationBackends[locations[key].type]) - .reduce((obj, key) => { - /* eslint no-param-reassign:0 */ - obj[key] = locations[key]; - return obj; - }, {}); - _config.setReplicationEndpoints(locationsWithReplicationBackend); - } catch (error) { - const exceptionError = reshapeExceptionError(error); - log.error('could not apply replication endpoints', { - error: exceptionError, - method: 'getStoredCredentials', - }); - return cb(exceptionError); - } - } - - _config.setAuthDataAccounts(accounts); - _config.setRestEndpoints(restEndpoints); - _config.setPublicInstanceId(newConf.instanceId); - - if (newConf.browserAccess) { - if (Boolean(_config.browserAccessEnabled) !== Boolean(newConf.browserAccess.enabled)) { - _config.browserAccessEnabled = Boolean(newConf.browserAccess.enabled); - _config.emit('browser-access-enabled-change'); - } - } - - _config.overlayVersion = newConf.version; - - log.info('applied configuration version', { configurationVersion: _config.overlayVersion }); - - return cb(null, newConf); - }); -} - -/** - * Writes configuration version to the management database - * - * @param {object} cachedOverlay Latest stored configuration version - * for freshness comparison purposes - * @param {object} remoteOverlay New configuration version - * @param {werelogs~Logger} log Request-scoped logger - * @param {function} cb Function to call with (error, remoteOverlay) - * - * @returns {undefined} - */ -function saveConfigurationVersion(cachedOverlay, remoteOverlay, log, cb) { - if (remoteOverlayIsNewer(cachedOverlay, remoteOverlay)) { - const objName = `configuration/overlay/${remoteOverlay.version}`; - metadata.putObjectMD(managementDatabaseName, objName, remoteOverlay, {}, log, error => { - if (error) { - const exceptionError = reshapeExceptionError(error); - log.error('could not save configuration', { - error: exceptionError, - method: 'saveConfigurationVersion', - configurationVersion: remoteOverlay.version, - }); - cb(exceptionError); - return; - } - metadata.putObjectMD( - managementDatabaseName, - latestOverlayVersionKey, - remoteOverlay.version, - {}, - log, - error => { - if (error) { - log.error('could not save configuration version', { - configurationVersion: remoteOverlay.version, - }); - } - cb(error, remoteOverlay); - }, - ); - }); - } else { - log.debug('no remote configuration to cache yet'); - process.nextTick(cb, null, remoteOverlay); - } -} - -/** - * Loads the latest cached configuration overlay from the management - * database, without contacting the Orbit API. - * - * @param {werelogs~Logger} log Request-scoped logger - * @param {function} callback Function called with (error, cachedOverlay) - * - * @returns {undefined} - */ -function loadCachedOverlay(log, callback) { - return metadata.getObjectMD(managementDatabaseName, latestOverlayVersionKey, {}, log, (err, version) => { - if (err) { - if (err.is.NoSuchKey) { - return process.nextTick(callback, null, {}); - } - return callback(err); - } - return metadata.getObjectMD( - managementDatabaseName, - `configuration/overlay/${version}`, - {}, - log, - (err, conf) => { - if (err) { - if (err.is.NoSuchKey) { - return process.nextTick(callback, null, {}); - } - return callback(err); - } - return callback(null, conf); - }, - ); - }); -} - -function applyAndSaveOverlay(overlay, log) { - patchConfiguration(overlay, log, err => { - if (err) { - log.error('could not apply pushed overlay', { - error: reshapeExceptionError(err), - method: 'applyAndSaveOverlay', - }); - return; - } - saveConfigurationVersion(null, overlay, log, err => { - if (err) { - log.error('could not cache overlay version', { - error: reshapeExceptionError(err), - method: 'applyAndSaveOverlay', - }); - return; - } - log.info('overlay push processed'); - }); - }); -} - -module.exports = { - loadCachedOverlay, - managementDatabaseName, - patchConfiguration, - saveConfigurationVersion, - remoteOverlayIsNewer, - applyAndSaveOverlay, -}; diff --git a/lib/management/credentials.js b/lib/management/credentials.js deleted file mode 100644 index 4184a6091e..0000000000 --- a/lib/management/credentials.js +++ /dev/null @@ -1,147 +0,0 @@ -const arsenal = require('@scality/arsenal'); -const forge = require('node-forge'); -const request = require('../utilities/request'); - -const metadata = require('../metadata/wrapper'); - -const managementDatabaseName = 'PENSIEVE'; -const tokenConfigurationKey = 'auth/zenko/remote-management-token'; -const tokenRotationDelay = 3600 * 24 * 7 * 1000; // 7 days -const { reshapeExceptionError } = arsenal.errorUtils; - -/** - * Retrieves Orbit API token from the management database. - * - * The token is used to authenticate stat posting and - * - * @param {werelogs~Logger} log Request-scoped logger to be able to trace - * initialization process - * @param {function} callback Function called with (error, result) - * - * @returns {undefined} - */ -function getStoredCredentials(log, callback) { - metadata.getObjectMD(managementDatabaseName, tokenConfigurationKey, {}, log, callback); -} - -function issueCredentials(managementEndpoint, instanceId, log, callback) { - log.info('registering with API to get token'); - - const keyPair = forge.pki.rsa.generateKeyPair({ bits: 2048, e: 0x10001 }); - const privateKey = forge.pki.privateKeyToPem(keyPair.privateKey); - const publicKey = forge.pki.publicKeyToPem(keyPair.publicKey); - - const postData = { - publicKey, - }; - - request.post( - `${managementEndpoint}/${instanceId}/register`, - { body: postData, json: true }, - (error, response, body) => { - if (error) { - return callback(error); - } - if (response.statusCode !== 201) { - log.error('could not register instance', { - statusCode: response.statusCode, - }); - return callback(arsenal.errors.InternalError); - } - /* eslint-disable no-param-reassign */ - body.privateKey = privateKey; - /* eslint-enable no-param-reassign */ - return callback(null, body); - }, - ); -} - -function confirmInstanceCredentials(managementEndpoint, instanceId, creds, log, callback) { - const postData = { - serial: creds.serial || 0, - publicKey: creds.publicKey, - }; - - const opts = { - headers: { - 'x-instance-authentication-token': creds.token, - }, - body: postData, - }; - - request.post(`${managementEndpoint}/${instanceId}/confirm`, opts, (error, response) => { - if (error) { - return callback(error); - } - if (response.statusCode === 200) { - return callback(null, instanceId, creds.token); - } - return callback(arsenal.errors.InternalError); - }); -} - -/** - * Initializes credentials and PKI in the management database. - * - * In case the management database is new and empty, the instance - * is registered as new against the Orbit API with newly-generated - * RSA key pair. - * - * @param {string} managementEndpoint API endpoint - * @param {string} instanceId UUID of this deployment - * @param {werelogs~Logger} log Request-scoped logger to be able to trace - * initialization process - * @param {function} callback Function called with (error, result) - * - * @returns {undefined} - */ -function initManagementCredentials(managementEndpoint, instanceId, log, callback) { - getStoredCredentials(log, (error, value) => { - if (error) { - if (error.is.NoSuchKey) { - return issueCredentials(managementEndpoint, instanceId, log, (error, value) => { - if (error) { - log.error('could not issue token', { - error: reshapeExceptionError(error), - method: 'initManagementCredentials', - }); - return callback(error); - } - log.debug('saving token'); - return metadata.putObjectMD( - managementDatabaseName, - tokenConfigurationKey, - value, - {}, - log, - error => { - if (error) { - log.error('could not save token', { - error: reshapeExceptionError(error), - method: 'initManagementCredentials', - }); - return callback(error); - } - log.info('saved token locally, confirming instance'); - return confirmInstanceCredentials(managementEndpoint, instanceId, value, log, callback); - }, - ); - }); - } - log.debug('could not get token', { error }); - return callback(error); - } - - log.info('returning existing token'); - if (Date.now() - value.issueDate > tokenRotationDelay) { - log.warn('management API token is too old, should re-issue'); - } - - return callback(null, instanceId, value.token); - }); -} - -module.exports = { - getStoredCredentials, - initManagementCredentials, -}; diff --git a/lib/management/index.js b/lib/management/index.js deleted file mode 100644 index 067495eab2..0000000000 --- a/lib/management/index.js +++ /dev/null @@ -1,137 +0,0 @@ -const arsenal = require('@scality/arsenal'); -const async = require('async'); - -const metadata = require('../metadata/wrapper'); -const logger = require('../utilities/logger'); - -const { loadCachedOverlay, managementDatabaseName, patchConfiguration } = require('./configuration'); -const { initManagementCredentials } = require('./credentials'); -const { startWSManagementClient } = require('./push'); -const { startPollingManagementClient } = require('./poll'); -const { reshapeExceptionError } = arsenal.errorUtils; -const { isManagementAgentUsed } = require('./agentClient'); - -const initRemoteManagementRetryDelay = 10000; - -const managementEndpointRoot = process.env.MANAGEMENT_ENDPOINT || 'https://api.zenko.io'; -const managementEndpoint = `${managementEndpointRoot}/api/v1/instance`; - -const pushEndpointRoot = process.env.PUSH_ENDPOINT || 'https://push.api.zenko.io'; -const pushEndpoint = `${pushEndpointRoot}/api/v1/instance`; - -function initManagementDatabase(log, callback) { - // XXX choose proper owner names - const md = new arsenal.models.BucketInfo( - managementDatabaseName, - 'owner', - 'owner display name', - new Date().toJSON(), - ); - - metadata.createBucket(managementDatabaseName, md, log, error => { - if (error) { - if (error.is.BucketAlreadyExists) { - log.info('created management database'); - return callback(); - } - log.error('could not initialize management database', { - error: reshapeExceptionError(error), - method: 'initManagementDatabase', - }); - return callback(error); - } - log.info('initialized management database'); - return callback(); - }); -} - -function startManagementListeners(instanceId, token) { - const mode = process.env.MANAGEMENT_MODE || 'push'; - if (mode === 'push') { - const url = `${pushEndpoint}/${instanceId}/ws`; - startWSManagementClient(url, token); - } else { - startPollingManagementClient(managementEndpoint, instanceId, token); - } -} - -/** - * Initializes Orbit-based management by: - * - creating the management database in metadata - * - generating a key pair for credentials encryption - * - generating an instance-unique ID - * - getting an authentication token for the API - * - loading and applying the latest cached overlay configuration - * - starting a configuration update and metrics push background task - * - * @param {werelogs~Logger} log Request-scoped logger to be able to trace - * initialization process - * @param {function} callback Function to call once the overlay is loaded - * (overlay) - * - * @returns {undefined} - */ -function initManagement(log, callback) { - if ( - (process.env.REMOTE_MANAGEMENT_DISABLE && process.env.REMOTE_MANAGEMENT_DISABLE !== '0') || - process.env.S3BACKEND === 'mem' - ) { - log.info('remote management disabled'); - return; - } - - /* Temporary check before to fully move to the process management agent. */ - if (isManagementAgentUsed() ^ (typeof callback === 'function')) { - let msg = 'misuse of initManagement function: '; - msg += `MANAGEMENT_USE_AGENT: ${process.env.MANAGEMENT_USE_AGENT}`; - msg += `, callback type: ${typeof callback}`; - throw new Error(msg); - } - - async.waterfall( - [ - // eslint-disable-next-line arrow-body-style - cb => { - return isManagementAgentUsed() ? metadata.setup(cb) : cb(); - }, - cb => initManagementDatabase(log, cb), - cb => metadata.getUUID(log, cb), - (instanceId, cb) => initManagementCredentials(managementEndpoint, instanceId, log, cb), - (instanceId, token, cb) => { - if (!isManagementAgentUsed()) { - cb(null, instanceId, token, {}); - return; - } - loadCachedOverlay(log, (err, overlay) => cb(err, instanceId, token, overlay)); - }, - (instanceId, token, overlay, cb) => { - if (!isManagementAgentUsed()) { - cb(null, instanceId, token, overlay); - return; - } - patchConfiguration(overlay, log, err => cb(err, instanceId, token, overlay)); - }, - ], - (error, instanceId, token, overlay) => { - if (error) { - log.error('could not initialize remote management, retrying later', { - error: reshapeExceptionError(error), - method: 'initManagement', - }); - setTimeout(initManagement, initRemoteManagementRetryDelay, logger.newRequestLogger()); - } else { - log.info(`this deployment's Instance ID is ${instanceId}`); - log.end('management init done'); - startManagementListeners(instanceId, token); - if (callback) { - callback(overlay); - } - } - }, - ); -} - -module.exports = { - initManagement, - initManagementDatabase, -}; diff --git a/lib/management/poll.js b/lib/management/poll.js deleted file mode 100644 index f0df7ea2dd..0000000000 --- a/lib/management/poll.js +++ /dev/null @@ -1,147 +0,0 @@ -const arsenal = require('@scality/arsenal'); -const async = require('async'); -const request = require('../utilities/request'); - -const _config = require('../Config').config; -const logger = require('../utilities/logger'); -const metadata = require('../metadata/wrapper'); -const { loadCachedOverlay, patchConfiguration, saveConfigurationVersion } = require('./configuration'); -const { reshapeExceptionError } = arsenal.errorUtils; - -const pushReportDelay = 30000; -const pullConfigurationOverlayDelay = 60000; - -function loadRemoteOverlay(managementEndpoint, instanceId, remoteToken, cachedOverlay, log, cb) { - log.debug('loading remote overlay'); - const opts = { - headers: { - 'x-instance-authentication-token': remoteToken, - 'x-scal-request-uids': log.getSerializedUids(), - }, - json: true, - }; - request.get(`${managementEndpoint}/${instanceId}/config/overlay`, opts, (error, response, body) => { - if (error) { - return cb(error); - } - if (response.statusCode === 200) { - return cb(null, cachedOverlay, body); - } - if (response.statusCode === 404) { - return cb(null, cachedOverlay, {}); - } - return cb(arsenal.errors.AccessForbidden, cachedOverlay, {}); - }); -} - -// TODO save only after successful patch -function applyConfigurationOverlay(managementEndpoint, instanceId, remoteToken, log) { - async.waterfall( - [ - wcb => loadCachedOverlay(log, wcb), - (cachedOverlay, wcb) => patchConfiguration(cachedOverlay, log, wcb), - (cachedOverlay, wcb) => - loadRemoteOverlay(managementEndpoint, instanceId, remoteToken, cachedOverlay, log, wcb), - (cachedOverlay, remoteOverlay, wcb) => saveConfigurationVersion(cachedOverlay, remoteOverlay, log, wcb), - (remoteOverlay, wcb) => patchConfiguration(remoteOverlay, log, wcb), - ], - error => { - if (error) { - log.error('could not apply managed configuration', { - error: reshapeExceptionError(error), - method: 'applyConfigurationOverlay', - }); - } - setTimeout( - applyConfigurationOverlay, - pullConfigurationOverlayDelay, - managementEndpoint, - instanceId, - remoteToken, - logger.newRequestLogger(), - ); - }, - ); -} - -function postStats(managementEndpoint, instanceId, remoteToken, report, next) { - const toURL = `${managementEndpoint}/${instanceId}/stats`; - const toOptions = { - json: true, - headers: { - 'content-type': 'application/json', - 'x-instance-authentication-token': remoteToken, - }, - body: report, - }; - const toCallback = (err, response, body) => { - if (err) { - logger.info('could not post stats', { error: err }); - } - if (response && response.statusCode !== 201) { - logger.info('could not post stats', { - body, - statusCode: response.statusCode, - }); - } - if (next) { - next(null, instanceId, remoteToken); - } - }; - return request.post(toURL, toOptions, toCallback); -} - -function getStats(next) { - const fromURL = `http://localhost:${_config.port}/_/report`; - const fromOptions = { - headers: { - 'x-scal-report-token': process.env.REPORT_TOKEN, - }, - }; - return request.get(fromURL, fromOptions, next); -} - -function pushStats(managementEndpoint, instanceId, remoteToken, next) { - if (process.env.PUSH_STATS === 'false') { - return; - } - - getStats((err, res, report) => { - if (err) { - logger.info('could not retrieve stats', { error: err }); - return; - } - - logger.debug('report', { report }); - postStats(managementEndpoint, instanceId, remoteToken, report, next); - return; - }); - - setTimeout(pushStats, pushReportDelay, managementEndpoint, instanceId, remoteToken); -} - -/** - * Starts background task that updates configuration and pushes stats. - * - * Periodically polls for configuration updates, and pushes stats at - * a fixed interval. - * - * @param {string} managementEndpoint API endpoint - * @param {string} instanceId UUID of this deployment - * @param {string} remoteToken API authentication token - * - * @returns {undefined} - */ -function startPollingManagementClient(managementEndpoint, instanceId, remoteToken) { - metadata.notifyBucketChange(() => { - pushStats(managementEndpoint, instanceId, remoteToken); - }); - - pushStats(managementEndpoint, instanceId, remoteToken); - applyConfigurationOverlay(managementEndpoint, instanceId, remoteToken, logger.newRequestLogger()); -} - -module.exports = { - startPollingManagementClient, - loadRemoteOverlay, -}; diff --git a/lib/management/push.js b/lib/management/push.js index 6ce847ae11..395b5f8653 100644 --- a/lib/management/push.js +++ b/lib/management/push.js @@ -4,7 +4,6 @@ const net = require('net'); const request = require('../utilities/request'); const { URL: _URL } = require('url'); const WebSocket = require('ws'); -const assert = require('assert'); const http = require('http'); const _config = require('../Config').config; @@ -12,8 +11,6 @@ const logger = require('../utilities/logger'); const metadata = require('../metadata/wrapper'); const { reshapeExceptionError } = arsenal.errorUtils; -const { isManagementAgentUsed } = require('./agentClient'); -const { applyAndSaveOverlay } = require('./configuration'); const { ChannelMessageV0, MessageType } = require('./ChannelMessageV0'); const { CONFIG_OVERLAY_MESSAGE, METRICS_REQUEST_MESSAGE, CHANNEL_CLOSE_MESSAGE, CHANNEL_PAYLOAD_MESSAGE } = MessageType; @@ -24,7 +21,6 @@ const subprotocols = [ChannelMessageV0.protocolName]; const cloudServerHost = process.env.SECURE_CHANNEL_DEFAULT_FORWARD_TO_HOST || 'localhost'; const cloudServerPort = process.env.SECURE_CHANNEL_DEFAULT_FORWARD_TO_PORT || _config.port; -let overlayMessageListener = null; let connected = false; // No wildcard nor cidr/mask match for now @@ -225,13 +221,8 @@ function startWSManagementClient(url, token, cb) { const message = new ChannelMessageV0(data); switch (message.getType()) { case CONFIG_OVERLAY_MESSAGE: - if (!isManagementAgentUsed()) { - applyAndSaveOverlay(JSON.parse(message.getPayload()), log); - } else { - if (overlayMessageListener) { - overlayMessageListener(message.getPayload().toString()); - } - } + // remote configuration management is not supported anymore + log.debug('ignoring configuration overlay from push server'); break; case METRICS_REQUEST_MESSAGE: pushStats(); @@ -251,11 +242,6 @@ function startWSManagementClient(url, token, cb) { }); } -function addOverlayMessageListener(callback) { - assert(typeof callback === 'function'); - overlayMessageListener = callback; -} - function startPushConnectionHealthCheckServer(cb) { const server = http.createServer((req, res) => { if (req.url !== '/_/healthcheck') { @@ -278,5 +264,4 @@ module.exports = { createWSAgent, startWSManagementClient, startPushConnectionHealthCheckServer, - addOverlayMessageListener, }; diff --git a/lib/server.js b/lib/server.js index dc251ab8d1..349b44170f 100644 --- a/lib/server.js +++ b/lib/server.js @@ -20,8 +20,6 @@ const kms = require('./kms/wrapper'); const locationStorageCheck = require('./api/apiUtils/object/locationStorageCheck'); const vault = require('./auth/vault'); const metadata = require('./metadata/wrapper'); -const { initManagement } = require('./management'); -const { initManagementClient, isManagementAgentUsed } = require('./management/agentClient'); const { startCleanupJob } = require('./api/apiUtils/rateLimit/cleanup'); const { startRefillJob, stopRefillJob } = require('./api/apiUtils/rateLimit/refillJob'); @@ -57,7 +55,6 @@ if (_config.localCache) { const STATS_INTERVAL = 5; // 5 seconds const STATS_EXPIRY = 30; // 30 seconds const statsClient = new StatsClient(localCacheClient, STATS_INTERVAL, STATS_EXPIRY); -const enableRemoteManagement = true; class S3Server { /** @@ -407,18 +404,6 @@ class S3Server { QuotaService?.setup(log); } - // TODO this should wait for metadata healthcheck to be ok - // TODO only do this in cluster master - if (enableRemoteManagement) { - if (!isManagementAgentUsed()) { - setTimeout(() => { - initManagement(logger.newRequestLogger()); - }, 5000); - } else { - initManagementClient(); - } - } - logger.info('integrityChecks config', { config: _config.integrityChecks }); if (!_config.integrityChecks.enabled) { logger.warn('x-amz-checksum-* digests are disabled: not computed, not validated, and not stored'); diff --git a/managementAgent.js b/managementAgent.js deleted file mode 100644 index 4413d36c3b..0000000000 --- a/managementAgent.js +++ /dev/null @@ -1,170 +0,0 @@ -const Uuid = require('uuid'); -const WebSocket = require('ws'); - -const logger = require('./lib/utilities/logger'); -const { initManagement } = require('./lib/management'); -const _config = require('./lib/Config').config; -const { managementAgentMessageType } = require('./lib/management/agentClient'); -const { addOverlayMessageListener } = require('./lib/management/push'); -const { saveConfigurationVersion } = require('./lib/management/configuration'); - -// TODO: auth? -// TODO: werelogs with a specific name. - -const CHECK_BROKEN_CONNECTIONS_FREQUENCY_MS = 15000; - -class ManagementAgentServer { - constructor() { - this.port = _config.managementAgent.port || 8010; - this.wss = null; - this.loadedOverlay = null; - - this.stop = this.stop.bind(this); - process.on('SIGINT', this.stop); - process.on('SIGHUP', this.stop); - process.on('SIGQUIT', this.stop); - process.on('SIGTERM', this.stop); - process.on('SIGPIPE', () => {}); - } - - start(_cb) { - const cb = _cb || function noop() {}; - - /* Define REPORT_TOKEN env variable needed by the management - * module. */ - process.env.REPORT_TOKEN = process.env.REPORT_TOKEN || _config.reportToken || Uuid.v4(); - - initManagement(logger.newRequestLogger(), overlay => { - let error = null; - - if (overlay) { - this.loadedOverlay = overlay; - this.startServer(); - } else { - error = new Error('failed to init management'); - } - return cb(error); - }); - } - - stop() { - if (!this.wss) { - process.exit(0); - return; - } - this.wss.close(() => { - logger.info('server shutdown'); - process.exit(0); - }); - } - - startServer() { - this.wss = new WebSocket.Server({ - port: this.port, - clientTracking: true, - path: '/watch', - }); - - this.wss.on('connection', this.onConnection.bind(this)); - this.wss.on('listening', this.onListening.bind(this)); - this.wss.on('error', this.onError.bind(this)); - - setInterval(this.checkBrokenConnections.bind(this), CHECK_BROKEN_CONNECTIONS_FREQUENCY_MS); - - addOverlayMessageListener(this.onNewOverlay.bind(this)); - } - - onConnection(socket, request) { - function hearthbeat() { - this.isAlive = true; - } - logger.info('client connected to watch route', { - ip: request.connection.remoteAddress, - }); - - /* eslint-disable no-param-reassign */ - socket.isAlive = true; - socket.on('pong', hearthbeat.bind(socket)); - - if (socket.readyState !== socket.OPEN) { - logger.error('client socket not in ready state', { - state: socket.readyState, - client: socket._socket._peername, - }); - return; - } - - const msg = { - messageType: managementAgentMessageType.NEW_OVERLAY, - payload: this.loadedOverlay, - }; - socket.send(JSON.stringify(msg), error => { - if (error) { - logger.error('failed to send remoteOverlay to client', { - error, - client: socket._socket._peername, - }); - } - }); - } - - onListening() { - logger.info('websocket server listening', { port: this.port }); - } - - onError(error) { - logger.error('websocket server error', { error }); - } - - _sendNewOverlayToClient(client) { - if (client.readyState !== client.OPEN) { - logger.error('client socket not in ready state', { - state: client.readyState, - client: client._socket._peername, - }); - return; - } - - const msg = { - messageType: managementAgentMessageType.NEW_OVERLAY, - payload: this.loadedOverlay, - }; - client.send(JSON.stringify(msg), error => { - if (error) { - logger.error('failed to send remoteOverlay to management agent client', { - error, - client: client._socket._peername, - }); - } - }); - } - - onNewOverlay(remoteOverlay) { - const remoteOverlayObj = JSON.parse(remoteOverlay); - saveConfigurationVersion(this.loadedOverlay, remoteOverlayObj, logger, err => { - if (err) { - logger.error('failed to save remote overlay', { err }); - return; - } - this.loadedOverlay = remoteOverlayObj; - this.wss.clients.forEach(this._sendNewOverlayToClient.bind(this)); - }); - } - - checkBrokenConnections() { - this.wss.clients.forEach(client => { - if (!client.isAlive) { - logger.info('close broken connection', { - client: client._socket._peername, - }); - client.terminate(); - return; - } - client.isAlive = false; - client.ping(); - }); - } -} - -const server = new ManagementAgentServer(); -server.start(); diff --git a/package.json b/package.json index 9ad6807f59..c968663fe4 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,6 @@ "moment": "^2.30.1", "mongodb": "^6.11.0", "node-fetch": "^2.6.0", - "node-forge": "^1.3.1", "npm-run-all": "^4.1.5", "prom-client": "^15.1.3", "sql-where-parser": "^2.2.1", @@ -97,7 +96,6 @@ "dataserver.js", "mdserver.js", "pfsserver.js", - "managementAgent.js", "bin/**/*.js" ], "mocha": { @@ -150,7 +148,6 @@ "start_metrics_server": "node bin/metrics_server.js", "utapi_replay": "node lib/utapi/utapiReplay.js", "utapi_reindex": "node lib/utapi/utapiReindex.js", - "management_agent": "node managementAgent.js", "test": "NO_PROXY=\"test.scality.com,scality.com\" CI=true S3BACKEND=mem S3QUOTA=scuba mocha --reporter mocha-multi-reporters --reporter-options configFile=$INIT_CWD/tests/reporter-config.json --recursive tests/unit --exit", "test_versionid_base62": "S3_VERSION_ID_ENCODING_TYPE=base62 CI=true S3BACKEND=mem mocha --reporter mocha-multi-reporters --reporter-options configFile=$INIT_CWD/tests/reporter-config.json --recursive tests/unit/api --exit", "test_legacy_location": "CI=true S3QUOTA=scuba S3_LOCATION_FILE=tests/locationConfig/locationConfigLegacy.json S3BACKEND=mem mocha --reporter mocha-multi-reporters --reporter-options configFile=$INIT_CWD/tests/reporter-config.json --recursive tests/unit --exit", diff --git a/tests/unit/api/objectReplicationMD.js b/tests/unit/api/objectReplicationMD.js index 69336e148b..3635f76e61 100644 --- a/tests/unit/api/objectReplicationMD.js +++ b/tests/unit/api/objectReplicationMD.js @@ -762,6 +762,10 @@ describe('Replication object MD with CRR and cloud destinations on the same obje destination: 'arn:aws:s3:::aws-bucket', }; + // awsbackend is a real location in the test config: keep it to restore it + const originalCrrSite = config.locationConstraints[crrSite]; + const originalCloudSite = config.locationConstraints[cloudSite]; + function setupBucket(rules) { cleanup(); createBucket(); @@ -787,8 +791,16 @@ describe('Replication object MD with CRR and cloud destinations on the same obje afterEach(() => { cleanup(); - delete config.locationConstraints[crrSite]; - delete config.locationConstraints[cloudSite]; + [ + [crrSite, originalCrrSite], + [cloudSite, originalCloudSite], + ].forEach(([site, original]) => { + if (original === undefined) { + delete config.locationConstraints[site]; + } else { + config.locationConstraints[site] = original; + } + }); }); it( diff --git a/tests/unit/management/agent.js b/tests/unit/management/agent.js deleted file mode 100644 index 57c7c7c1a4..0000000000 --- a/tests/unit/management/agent.js +++ /dev/null @@ -1,114 +0,0 @@ -const assert = require('assert'); - -const { createWSAgent } = require('../../../lib/management/push'); - -const proxy = 'http://proxy:3128/'; -const logger = { info: () => {} }; - -function testVariableSet(httpProxy, httpsProxy, allProxy, noProxy) { - return () => { - it(`should use ${httpProxy} environment variable`, () => { - let agent = createWSAgent( - 'https://pushserver', - { - [httpProxy]: 'http://proxy:3128', - }, - logger, - ); - assert.equal(agent, null); - - agent = createWSAgent( - 'http://pushserver', - { - [httpProxy]: proxy, - }, - logger, - ); - assert.equal(agent.proxy.href, proxy); - }); - - it(`should use ${httpsProxy} environment variable`, () => { - let agent = createWSAgent( - 'http://pushserver', - { - [httpsProxy]: proxy, - }, - logger, - ); - assert.equal(agent, null); - - agent = createWSAgent( - 'https://pushserver', - { - [httpsProxy]: proxy, - }, - logger, - ); - assert.equal(agent.proxy.href, proxy); - }); - - it(`should use ${allProxy} environment variable`, () => { - let agent = createWSAgent( - 'http://pushserver', - { - [allProxy]: proxy, - }, - logger, - ); - assert.equal(agent.proxy.href, proxy); - - agent = createWSAgent( - 'https://pushserver', - { - [allProxy]: proxy, - }, - logger, - ); - assert.equal(agent.proxy.href, proxy); - }); - - it(`should use ${noProxy} environment variable`, () => { - let agent = createWSAgent( - 'http://pushserver', - { - [noProxy]: 'pushserver', - }, - logger, - ); - assert.equal(agent, null); - - agent = createWSAgent( - 'http://pushserver', - { - [noProxy]: 'pushserver', - [httpProxy]: proxy, - }, - logger, - ); - assert.equal(agent, null); - - agent = createWSAgent( - 'http://pushserver', - { - [noProxy]: 'pushserver2', - [httpProxy]: proxy, - }, - logger, - ); - assert.equal(agent.proxy.href, proxy); - }); - }; -} - -describe('Websocket connection agent', () => { - describe('with no proxy env', () => { - it('should handle empty proxy environment', () => { - const agent = createWSAgent('https://pushserver', {}, logger); - assert.equal(agent, null); - }); - }); - - describe('with lowercase proxy env', testVariableSet('http_proxy', 'https_proxy', 'all_proxy', 'no_proxy')); - - describe('with uppercase proxy env', testVariableSet('HTTP_PROXY', 'HTTPS_PROXY', 'ALL_PROXY', 'NO_PROXY')); -}); diff --git a/tests/unit/management/configuration.js b/tests/unit/management/configuration.js deleted file mode 100644 index a2717fb208..0000000000 --- a/tests/unit/management/configuration.js +++ /dev/null @@ -1,232 +0,0 @@ -const assert = require('assert'); -const crypto = require('crypto'); - -const { DummyRequestLogger } = require('../helpers'); -const log = new DummyRequestLogger(); - -const metadata = require('../../../lib/metadata/wrapper'); -const managementDatabaseName = 'PENSIEVE'; -const tokenConfigurationKey = 'auth/zenko/remote-management-token'; - -const { privateKey, accessKey, decryptedSecretKey, secretKey, canonicalId, userName } = require('./resources.json'); -const shortid = '123456789012'; -const email = 'customaccount1@setbyenv.com'; -const arn = 'arn:aws:iam::123456789012:root'; -const { config } = require('../../../lib/Config'); - -const { remoteOverlayIsNewer, patchConfiguration } = require('../../../lib/management/configuration'); - -const { initManagementDatabase } = require('../../../lib/management/index'); - -function initManagementCredentialsMock(cb) { - return metadata.putObjectMD(managementDatabaseName, tokenConfigurationKey, { privateKey }, {}, log, error => - cb(error), - ); -} - -function getConfig() { - return config; -} - -// Original Config -const overlayVersionOriginal = Object.assign({}, config.overlayVersion); -const authDataOriginal = Object.assign({}, config.authData).accounts; -const locationConstraintsOriginal = Object.assign({}, config.locationConstraints); -const restEndpointsOriginal = Object.assign({}, config.restEndpoints); -const browserAccessEnabledOriginal = config.browserAccessEnabled; -const instanceId = '19683e55-56f7-4a4c-98a7-706c07e4ec30'; -const publicInstanceId = crypto.createHash('sha256').update(instanceId).digest('hex'); - -function resetConfig() { - config.overlayVersion = overlayVersionOriginal; - config.authData = { accounts: authDataOriginal }; - config.locationConstraints = locationConstraintsOriginal; - config.restEndpoints = restEndpointsOriginal; - config.browserAccessEnabled = browserAccessEnabledOriginal; - // reset auth data inside the in-memory vault backend - config.emit('authdata-update'); -} - -function assertConfig(actualConf, expectedConf) { - Object.keys(expectedConf).forEach(key => { - assert.deepStrictEqual(actualConf[key], expectedConf[key]); - }); -} - -describe('patchConfiguration', () => { - before(done => - initManagementDatabase(log, err => { - if (err) { - return done(err); - } - return initManagementCredentialsMock(done); - }), - ); - beforeEach(() => { - resetConfig(); - }); - after(() => { - resetConfig(); - }); - - it('should modify config using the new config', done => { - const newConf = { - version: 1, - instanceId, - users: [ - { - secretKey, - accessKey, - canonicalId, - userName, - }, - ], - endpoints: [ - { - hostname: '1.1.1.1', - locationName: 'us-east-1', - }, - ], - locations: { - 'us-east-1': { - name: 'us-east-1', - objectId: 'us-east-1', - locationType: 'location-file-v1', - legacyAwsBehavior: true, - details: {}, - }, - }, - browserAccess: { - enabled: true, - }, - }; - return patchConfiguration(newConf, log, err => { - assert.ifError(err); - const actualConf = getConfig(); - const expectedConf = { - overlayVersion: 1, - publicInstanceId, - browserAccessEnabled: true, - authData: { - accounts: [ - { - name: userName, - email, - arn, - canonicalID: canonicalId, - shortid, - keys: [ - { - access: accessKey, - secret: decryptedSecretKey, - }, - ], - }, - ], - }, - locationConstraints: { - 'us-east-1': { - type: 'file', - objectId: 'us-east-1', - legacyAwsBehavior: true, - isTransient: false, - sizeLimitGB: null, - details: { supportsVersioning: true }, - name: 'us-east-1', - locationType: 'location-file-v1', - }, - }, - }; - assertConfig(actualConf, expectedConf); - assert.deepStrictEqual(actualConf.restEndpoints['1.1.1.1'], 'us-east-1'); - return done(); - }); - }); - - it('should apply second configuration if version (2) is greater than overlayVersion (1)', done => { - const newConf1 = { - version: 1, - instanceId, - }; - const newConf2 = { - version: 2, - instanceId, - browserAccess: { - enabled: true, - }, - }; - patchConfiguration(newConf1, log, err => { - assert.ifError(err); - return patchConfiguration(newConf2, log, err => { - assert.ifError(err); - const actualConf = getConfig(); - const expectedConf = { - overlayVersion: 2, - browserAccessEnabled: true, - }; - assertConfig(actualConf, expectedConf); - return done(); - }); - }); - }); - - it('should not apply the second configuration if version equals overlayVersion', done => { - const newConf1 = { - version: 1, - instanceId, - }; - const newConf2 = { - version: 1, - instanceId, - browserAccess: { - enabled: true, - }, - }; - patchConfiguration(newConf1, log, err => { - assert.ifError(err); - return patchConfiguration(newConf2, log, err => { - assert.ifError(err); - const actualConf = getConfig(); - const expectedConf = { - overlayVersion: 1, - browserAccessEnabled: undefined, - }; - assertConfig(actualConf, expectedConf); - return done(); - }); - }); - }); -}); - -describe('remoteOverlayIsNewer', () => { - it('should return remoteOverlayIsNewer equals false if remote overlay is less than the cached', () => { - const cachedOverlay = { - version: 2, - }; - const remoteOverlay = { - version: 1, - }; - const isRemoteOverlayNewer = remoteOverlayIsNewer(cachedOverlay, remoteOverlay); - assert.equal(isRemoteOverlayNewer, false); - }); - it('should return remoteOverlayIsNewer equals false if remote overlay and the cached one are equal', () => { - const cachedOverlay = { - version: 1, - }; - const remoteOverlay = { - version: 1, - }; - const isRemoteOverlayNewer = remoteOverlayIsNewer(cachedOverlay, remoteOverlay); - assert.equal(isRemoteOverlayNewer, false); - }); - it('should return remoteOverlayIsNewer equals true if remote overlay version is greater than the cached one ', () => { - const cachedOverlay = { - version: 0, - }; - const remoteOverlay = { - version: 1, - }; - const isRemoteOverlayNewer = remoteOverlayIsNewer(cachedOverlay, remoteOverlay); - assert.equal(isRemoteOverlayNewer, true); - }); -}); diff --git a/tests/unit/management/poll.js b/tests/unit/management/poll.js deleted file mode 100644 index bec9c28f13..0000000000 --- a/tests/unit/management/poll.js +++ /dev/null @@ -1,30 +0,0 @@ -const assert = require('assert'); -const sinon = require('sinon'); - -const request = require('../../../lib/utilities/request'); -const { loadRemoteOverlay } = require('../../../lib/management/poll'); -const { DummyRequestLogger } = require('../helpers'); - -describe('management poll loadRemoteOverlay', () => { - const managementEndpoint = 'https://management.example.com'; - const instanceId = 'instance-id'; - const remoteToken = 'remote-token'; - const log = new DummyRequestLogger(); - - afterEach(() => { - sinon.restore(); - }); - - it('should forward the werelogs request uids under the x-scal-request-uids header', done => { - const getStub = sinon.stub(request, 'get').callsFake((url, opts, cb) => cb(null, { statusCode: 200 }, {})); - - loadRemoteOverlay(managementEndpoint, instanceId, remoteToken, {}, log, err => { - assert.ifError(err); - assert(getStub.calledOnce); - const opts = getStub.firstCall.args[1]; - assert.strictEqual(opts.headers['x-scal-request-uids'], log.getSerializedUids()); - assert.strictEqual(opts.headers['x-scal-request-id'], undefined); - done(); - }); - }); -}); diff --git a/tests/unit/management/resources.json b/tests/unit/management/resources.json deleted file mode 100644 index 962ff806cd..0000000000 --- a/tests/unit/management/resources.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "privateKey": "-----BEGIN RSA PRIVATE KEY-----\r\nMIIEowIBAAKCAQEAj13sSYE40lAX2qpBvfdGfcSVNtBf8i5FH+E8FAhORwwPu+2S\r\n3yBQbgwHq30WWxunGb1NmZL1wkVZ+vf12DtxqFRnMA08LfO4oO6oC4V8XfKeuHyJ\r\n1qlaKRINz6r9yDkTHtwWoBnlAINurlcNKgGD5p7D+G26Chbr/Oo0ZwHula9DxXy6\r\neH8/bJ5/BynyNyyWRPoAO+UkUdY5utkFCUq2dbBIhovMgjjikf5p2oWqnRKXc+JK\r\nBegr6lSHkkhyqNhTmd8+wA+8Cace4sy1ajY1t5V4wfRZea5vwl/HlyyKodvHdxng\r\nJgg6H61JMYPkplY6Gr9OryBKEAgq02zYoYTDfwIDAQABAoIBAAuDYGlavkRteCzw\r\nRU1LIVcSRWVcgIgDXTu9K8T0Ec0008Kkxomyn6LmxmroJbZ1VwsDH8s4eRH73ckA\r\nxrZxt6Pr+0lplq6eBvKtl8MtGhq1VDe+kJczjHEF6SQHOFAu/TEaPZrn2XMcGvRX\r\nO1BnRL9tepFlxm3u/06VRFYNWqqchM+tFyzLu2AuiuKd5+slSX7KZvVgdkY1ErKH\r\ngB75lPyhPb77C/6ptqUisVMSO4JhLhsD0+ekDVY982Sb7KkI+szdWSbtMx9Ek2Wo\r\ntXwJz7I8T7IbODy9aW9G+ydyhMDFmaEYIaDVFKJj5+fluNza3oQ5PtFNVE50GQJA\r\nsisGqfECgYEAwpkwt0KpSamSEH6qknNYPOwxgEuXWoFVzibko7is2tFPvY+YJowb\r\n68MqHIYhf7gHLq2dc5Jg1TTbGqLECjVxp4xLU4c95KBy1J9CPAcuH4xQLDXmeLzP\r\nJ2YgznRocbzAMCDAwafCr3uY9FM7oGDHAi5bE5W11xWx+9MlFExL3JkCgYEAvJp5\r\nf+JGN1W037bQe2QLYUWGszewZsvplnNOeytGQa57w4YdF42lPhMz6Kc/zdzKZpN9\r\njrshiIDhAD5NCno6dwqafBAW9WZl0sn7EnlLhD4Lwm8E9bRHnC9H82yFuqmNrzww\r\nzxBCQogJISwHiVz4EkU48B283ecBn0wT/fAa19cCgYEApKWsnEHgrhy1IxOpCoRh\r\nUhqdv2k1xDPN/8DUjtnAFtwmVcLa/zJopU/Zn4y1ZzSzjwECSTi+iWZRQ/YXXHPf\r\nl92SFjhFW92Niuy8w8FnevXjF6T7PYiy1SkJ9OR1QlZrXc04iiGBDazLu115A7ce\r\nanACS03OLw+CKgl6Q/RR83ECgYBCUngDVoimkMcIHHt3yJiP3ikeAKlRnMdJlsa0\r\nXWVZV4hCG3lDfRXsnEgWuimftNKf+6GdfYSvQdLdiQsCcjT5A4uLsQTByv5nf4uA\r\n1ZKOsFrmRrARzxGXhLDikvj7yP//7USkq+0BBGFhfuAvl7fMhPceyPZPehqB7/jf\r\nxX1LBQKBgAn5GgSXzzS0e06ZlP/VrKxreOHa5Z8wOmqqYQ0QTeczAbNNmuITdwwB\r\nNkbRqpVXRIfuj0BQBegAiix8om1W4it0cwz54IXBwQULxJR1StWxj3jo4QtpMQ+z\r\npVPdB1Ilb9zPV1YvDwRfdS1xsobzznAx56ecsXduZjs9mF61db8Q\r\n-----END RSA PRIVATE KEY-----\r\n", - "publicKey": "-----BEGIN PUBLIC KEY-----\r\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj13sSYE40lAX2qpBvfdG\r\nfcSVNtBf8i5FH+E8FAhORwwPu+2S3yBQbgwHq30WWxunGb1NmZL1wkVZ+vf12Dtx\r\nqFRnMA08LfO4oO6oC4V8XfKeuHyJ1qlaKRINz6r9yDkTHtwWoBnlAINurlcNKgGD\r\n5p7D+G26Chbr/Oo0ZwHula9DxXy6eH8/bJ5/BynyNyyWRPoAO+UkUdY5utkFCUq2\r\ndbBIhovMgjjikf5p2oWqnRKXc+JKBegr6lSHkkhyqNhTmd8+wA+8Cace4sy1ajY1\r\nt5V4wfRZea5vwl/HlyyKodvHdxngJgg6H61JMYPkplY6Gr9OryBKEAgq02zYoYTD\r\nfwIDAQAB\r\n-----END PUBLIC KEY-----\r\n", - "accessKey": "QXP3VDG3SALNBX2QBJ1C", - "secretKey": "K5FyqZo5uFKfw9QBtn95o6vuPuD0zH/1seIrqPKqGnz8AxALNSx6EeRq7G1I6JJpS1XN13EhnwGn2ipsml3Uf2fQ00YgEmImG8wzGVZm8fWotpVO4ilN4JGyQCah81rNX4wZ9xHqDD7qYR5MyIERxR/osoXfctOwY7GGUjRKJfLOguNUlpaovejg6mZfTvYAiDF+PTO1sKUYqHt1IfKQtsK3dov1EFMBB5pWM7sVfncq/CthKN5M+VHx9Y87qdoP3+7AW+RCBbSDOfQgxvqtS7PIAf10mDl8k2kEURLz+RqChu4O4S0UzbEmtja7wa7WYhYKv/tM/QeW7kyNJMmnPg==", - "decryptedSecretKey": "n7PSZ3U6SgerF9PCNhXYsq3S3fRKVGdZTicGV8Ur", - "canonicalId": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be", - "userName": "orbituser" -} From 66b0792a61c7f63c70d6d40eb3628cab2af8f722 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Wed, 7 Oct 2026 15:04:56 +0200 Subject: [PATCH 2/7] Bump arsenal and cloudserverclient arsenal 8.6.0-preview.4 drops the pensieve and patches exports that cloudserver no longer uses. utapi now shares the same arsenal instead of carrying its own preview.1 copy. Issue: CLDSRV-1013 --- package.json | 6 +- yarn.lock | 550 ++++++++++++++++++--------------------------------- 2 files changed, 193 insertions(+), 363 deletions(-) diff --git a/package.json b/package.json index c968663fe4..e3d520644f 100644 --- a/package.json +++ b/package.json @@ -33,9 +33,9 @@ "@opentelemetry/instrumentation-http": "~0.222.0", "@opentelemetry/instrumentation-ioredis": "~0.70.0", "@opentelemetry/instrumentation-mongodb": "~0.75.0", - "@scality/arsenal": "8.6.0-preview.2", + "@scality/arsenal": "8.6.0-preview.4", "@scality/bucketclient": "scality/bucketclient#8.3.0", - "@scality/cloudserverclient": "1.0.12", + "@scality/cloudserverclient": "1.0.13", "@scality/scubaclient": "1.2.0", "@scality/utapi": "github:scality/utapi#8.4.0", "@smithy/node-http-handler": "^3.0.0", @@ -64,7 +64,7 @@ }, "devDependencies": { "@eslint/compat": "^1.2.2", - "@scality/cloudserverclient": "1.0.12", + "@scality/cloudserverclient": "1.0.13", "@scality/eslint-config-scality": "scality/Guidelines#8.3.3", "eslint": "^9.14.0", "eslint-plugin-import": "^2.31.0", diff --git a/yarn.lock b/yarn.lock index 79bb167f3b..5f4003cb38 100644 --- a/yarn.lock +++ b/yarn.lock @@ -80,9 +80,9 @@ tslib "^2.6.2" "@aws-sdk/client-iam@^3.930.0", "@aws-sdk/client-iam@^3.975.0": - version "3.1141.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-iam/-/client-iam-3.1141.0.tgz#765735bf67162eef8bc36c9ef454d4efd4a274c9" - integrity sha512-np1yIEHbIm5AMKG5IlbhrD6Si7KhzY2lN4XOHlIo7gLeKtBhGEnHhKrf1y+x7dKh0ipEq4LIyhhge11AhPAwsw== + version "3.1147.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-iam/-/client-iam-3.1147.0.tgz#88391211dee0dddbb790f3da0c3086a282efaf01" + integrity sha512-YoBBlfqRFWe5KB+zWH5OorHzPjpv49X0NA8rS5lTngU2qwN89U5mEjQqn+fRqYxk3kDLNzw7UzAp4c2+swSYnA== dependencies: "@aws-sdk/core" "^3.978.1" "@aws-sdk/credential-provider-node" "^3.972.84" @@ -94,9 +94,9 @@ tslib "^2.6.2" "@aws-sdk/client-kms@^3.975.0": - version "3.1141.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-kms/-/client-kms-3.1141.0.tgz#164d0de9adfa6f75839db2213787eb20fc09a5c2" - integrity sha512-dfdarFBC2U0j0oyb3PQPdQX0m/jrjNXmxD162OU/Ln+ZGUIAHYseeqo5XqgITKYM+83NnSzv3QpWmuELI7nirQ== + version "3.1147.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-kms/-/client-kms-3.1147.0.tgz#32c1de3fa42598dac7e04f35bcb95ea4c3e683e0" + integrity sha512-DqFDAAPtuxT7cJ4JnFfqzY9PPow/Ut4932O1jPmZ2o3ReFJOwaCqC0zvFdXGI1b9LKzlFNhce0xyWdwfPO4Q8Q== dependencies: "@aws-sdk/core" "^3.978.1" "@aws-sdk/credential-provider-node" "^3.972.84" @@ -108,9 +108,9 @@ tslib "^2.6.2" "@aws-sdk/client-s3@^3.1009.0", "@aws-sdk/client-s3@^3.1013.0", "@aws-sdk/client-s3@^3.975.0": - version "3.1141.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.1141.0.tgz#11209f5f212145525a4219e4edf71700b52e80b4" - integrity sha512-uOVH37xGLenAdJkCPCin/JJG2PgWrFcSsDnQ9+C9Zq8N9Oalo5ol4xmn5fG28iWAlA/b/9boQZgHbMh+UsIhcg== + version "3.1147.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.1147.0.tgz#d80909b9b1aa34b53b356bd68fa5ba27fae4259d" + integrity sha512-uTrcJxnJKPr8bc1z7cMxopYSQyAm2dPfiMK+UiBr51L8MzimDxHbW/d9GR6X/LFbWDpMzfFPLhB4UohDrCSaPQ== dependencies: "@aws-sdk/checksums" "^3.1001.1" "@aws-sdk/core" "^3.978.1" @@ -284,9 +284,9 @@ tslib "^2.6.2" "@aws-sdk/credential-providers@^3.864.0", "@aws-sdk/credential-providers@^3.975.0": - version "3.1141.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.1141.0.tgz#8382346893fafe3c5de178e31ae431c93b75f0ea" - integrity sha512-NgnEx9d4QGxbtNW3qf/LUgKSm4svcexwxJH/ksEgYibqohq25SYULXk0lq7gzk25NRt6LA/B01MW68SGsgHUOg== + version "3.1147.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.1147.0.tgz#fce4e7668dbc7b53e2ecfa00fb1a412b4aab2e24" + integrity sha512-KWsvnLIpbJUf2JUtSOAg7txO2amdENkQp8JhljgNI2vY5/y7FV6tmmM/Q7ySa2c1zqeSE9qgirfyq+btyspTDA== dependencies: "@aws-sdk/core" "^3.978.1" "@aws-sdk/credential-provider-cognito-identity" "^3.972.71" @@ -323,9 +323,9 @@ tslib "^2.5.0" "@aws-sdk/lib-storage@^3.975.0": - version "3.1141.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/lib-storage/-/lib-storage-3.1141.0.tgz#2a24dd1278cea5ea197c5332edb66640bf04f1fe" - integrity sha512-Qkn5bI3ESne9iJX1hX3CVkuyikgNP/3MbO5nql4sd1wcV0S79yJdCBANNJBTgW0bnd/Z2sujsy0JVbuaoMsAhQ== + version "3.1147.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/lib-storage/-/lib-storage-3.1147.0.tgz#2f18be24cefb257860fb678e1bbf166df53da3b2" + integrity sha512-f2eAbdiABtmJOgojJlAI7epzHDC9BO9bij788FDIk1LM1gvN6ibQLPx192f+oCL8A4gc4BH6qnxJZRBb8B3REA== dependencies: "@smithy/core" "^3.35.0" "@smithy/types" "^4.19.0" @@ -575,17 +575,22 @@ tslib "^2.6.2" "@azure/msal-browser@^5.5.0": - version "5.23.0" - resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-5.23.0.tgz#e1ca85dcd727241c97c1306a0a5427ce0bb71801" - integrity sha512-IRCwkRCK47hBXK+7bu67UZWY7HS0Jx1dZgi4C1HVbjlBum8Jy8fb2l87xFr6HxdQJWy951zRUHtwwDITHFAtaA== + version "5.25.0" + resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-5.25.0.tgz#269a4796dc29bfe726c94f13dd608b0aca518032" + integrity sha512-7GyXzDUrdLG5zPDCYJbQdJqbl9a2U9SWUSC4lxr7cXjkBq6diTfWcJsi0UjdGWlqy+EevQg9dSC4g3s3BEp19g== dependencies: - "@azure/msal-common" "16.14.1" + "@azure/msal-common" "16.14.2" "@azure/msal-common@16.14.1": version "16.14.1" resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-16.14.1.tgz#2c987f31da858e544e72b6faa986fecdb3de20f8" integrity sha512-Or6xhPNyi4zHW25158yxBoyxuCqNSPa5YBVqfF1J5Ks4MJWBo/USXdp05DQIPu1Zli00YZu6t0+h6KvHJealxQ== +"@azure/msal-common@16.14.2": + version "16.14.2" + resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-16.14.2.tgz#742eb4603448ba5700d3582423cc5781c96ca971" + integrity sha512-HOBR0Gfo39TMrkxNG8k6cfjRkrRjXZc3JQs3ebMWQc9S4cihuknMYra3sgmzbZB752oQBqBN9+WF7c826p2vIQ== + "@azure/msal-node@^6.0.0": version "6.0.1" resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-6.0.1.tgz#48b9d5a472f16b403bd3a32494227ecfc54cafd4" @@ -1080,16 +1085,16 @@ integrity sha512-ieYQ8WlBPKYzEo81H3q0DFbd8WtFRXXABb4+vRCF0AO3WWtJZFxYvRGdipUXGrd6tlSySmqhcPuO3J6SCodCxg== "@mongodb-js/saslprep@^1.3.0": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.5.4.tgz#3642b46addbc9668b95bb2795c482b457a5f9d00" - integrity sha512-05UC0jQsjKAOuXQ0H9Ud9vUTJpZIg+n/FinpR30tI5I8pY2inTfPOZ5OF/cg3Ce/N9MoD1xhRCeOsJtuTbFYlw== + version "1.6.0" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.6.0.tgz#7d2ef0576437562c4f54b39379a9d9c1b8164db7" + integrity sha512-19jGXfpctLDJUELLUZGJ5BllcLT7rHdF+gTTaN2jzqu0bGkUhpdcYtgK2Vux+g3zuBAa0TM/W666QMIjYhYujw== dependencies: sparse-bitfield "^3.0.3" "@nodable/entities@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@nodable/entities/-/entities-3.0.0.tgz#694703bc864d30eaed55c2e3def00dbd61493670" - integrity sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@nodable/entities/-/entities-3.1.0.tgz#2ab366e0e607fdef8d65c5d84c58d191812bbd4b" + integrity sha512-LsS/DjHr+uDM647Gru/cA8+J3a3HfhttwCKLyuoyN7yXTFCxKBtSgMQBvrW9yNPa2/zDRUNuGPaH5QUFoa4arQ== "@npmcli/agent@^3.0.0": version "3.0.0" @@ -1148,6 +1153,13 @@ dependencies: "@opentelemetry/semantic-conventions" "^1.29.0" +"@opentelemetry/core@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-2.12.0.tgz#b44e9806111f066a2df578e37fc88ef46ccdfe20" + integrity sha512-1HsSAuvT4/my0QrXWsyXFdWjKaPeCHsismKZgEEIb8NK13LP6DrMRlsUbvD/0F9mDWK3xDom9AMv3IscxgOnOQ== + dependencies: + "@opentelemetry/semantic-conventions" "^1.29.0" + "@opentelemetry/core@2.9.0": version "2.9.0" resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-2.9.0.tgz#49de86106f86255b471b2ff035ef1003a851b252" @@ -1371,12 +1383,12 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/redis-common/-/redis-common-0.38.3.tgz#31a0464a48a991c29408614e3725d94db7c11aee" integrity sha512-VCghU1JYs/4gP6Gqf/xro9MEsZ7LrMv2uONVsaESKL38ZOB9BqnI98FfS23wjMnHlpuE+TTaWSoAVNpTwYXzjw== -"@opentelemetry/resources@2.11.0", "@opentelemetry/resources@^2.9.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-2.11.0.tgz#b4e60ba92a4f122dc979f3402aea9713a98eac5b" - integrity sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA== +"@opentelemetry/resources@2.12.0", "@opentelemetry/resources@^2.9.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-2.12.0.tgz#3a0fceb16c44d4d024f25f3f76eb773a7df67847" + integrity sha512-+rSRoOdln6NhXTVcBdHSlZxJDNzwxadeweK2ltZO3tVtfp6aklABc06xclDk6ovRR+EiGgIcSbh/6NgjFhnb3A== dependencies: - "@opentelemetry/core" "2.11.0" + "@opentelemetry/core" "2.12.0" "@opentelemetry/semantic-conventions" "^1.29.0" "@opentelemetry/resources@2.9.0": @@ -1449,13 +1461,13 @@ "@opentelemetry/semantic-conventions" "^1.29.0" "@opentelemetry/sdk-trace-base@^2.9.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.11.0.tgz#3f725401fcfb16e5b2335c103cdc9488829632d1" - integrity sha512-H19x/TX/LZdqiYOjM7fqtSxwlplC5pgelavqbQdHbhdq0q/AI/TGkM2dfGuuynTXmJPeF2HoZVoPDu+TGoW78A== + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.12.0.tgz#9112b4c3f49d3f1e8c4db1d76e7ce4fd60f8d946" + integrity sha512-JOERgZCxRM06FEJ5kEWxlSRChah6MmXDx3KwCruqEv/iEyLkTokCSemf2y1w8oIHtfrr8EVTpzebq/31vn2Cpg== dependencies: - "@opentelemetry/core" "2.11.0" - "@opentelemetry/resources" "2.11.0" - "@opentelemetry/sdk-trace" "2.11.0" + "@opentelemetry/core" "2.12.0" + "@opentelemetry/resources" "2.12.0" + "@opentelemetry/sdk-trace" "2.12.0" "@opentelemetry/semantic-conventions" "^1.29.0" "@opentelemetry/sdk-trace-node@2.9.0": @@ -1467,13 +1479,13 @@ "@opentelemetry/core" "2.9.0" "@opentelemetry/sdk-trace-base" "2.9.0" -"@opentelemetry/sdk-trace@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace/-/sdk-trace-2.11.0.tgz#46bbba9d366755df7d6faded0f7cd25af7f265c2" - integrity sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA== +"@opentelemetry/sdk-trace@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace/-/sdk-trace-2.12.0.tgz#1fb0b9bd64e547df9561f3a229d7a93f245eeccd" + integrity sha512-ImVuRQ6faOsTi1Wna88s2avgrrf/iDgXPigIeynkUhjstMuoQUDOJXgkez2j1mlU4btjXcXBGa+q7qKFYR3GsA== dependencies: - "@opentelemetry/core" "2.11.0" - "@opentelemetry/resources" "2.11.0" + "@opentelemetry/core" "2.12.0" + "@opentelemetry/resources" "2.12.0" "@opentelemetry/semantic-conventions" "^1.29.0" "@opentelemetry/sdk-trace@2.9.0": @@ -1547,10 +1559,10 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@scality/arsenal@8.6.0-preview.2", "@scality/arsenal@^8.6.0-0": - version "8.6.0-preview.2" - resolved "https://registry.yarnpkg.com/@scality/arsenal/-/arsenal-8.6.0-preview.2.tgz#ee13753728ae3425c67cbd1bbd7b3867b48b3685" - integrity sha512-JI4wv54WvXArdE8l887bLfulGkMMcfvCJjTjEMFbACG82ZAmpplslCWONOb8euk4bcWilLXMtn3Vu+C31ha6DA== +"@scality/arsenal@8.6.0-preview.4", "@scality/arsenal@^8.6.0-0": + version "8.6.0-preview.4" + resolved "https://registry.yarnpkg.com/@scality/arsenal/-/arsenal-8.6.0-preview.4.tgz#44e412b1220caa51171b8bb26e815ab1463c77d9" + integrity sha512-PmOSuKhKAefNxFRw3fjHdNwZ6YIgj2+Nnj8sEDLRW4dfchCRnNL0aeML8wlvb/BADcTEwcC7bntwT/vaBsVuNA== dependencies: "@aws-sdk/client-kms" "^3.975.0" "@aws-sdk/client-s3" "^3.975.0" @@ -1573,6 +1585,7 @@ async "~2.6.4" base-x "3.0.11" base62 "^2.0.2" + classic-level "^3.0.0" debug "^4.4.3" fcntl "github:scality/node-fcntl#0.3.1" httpagent scality/httpagent#1.1.1 @@ -1580,10 +1593,7 @@ ioredis "^5.8.1" ipaddr.js "^2.2.0" joi "^18.0.1" - level "~5.0.1" - level-sublevel "~6.6.5" mongodb "^6.20.0" - node-forge "^1.3.1" prom-client "^15.1.3" simple-glob "^0.2.0" socket.io "^4.8.0" @@ -1603,15 +1613,23 @@ httpagent "git+https://github.com/scality/httpagent#1.1.0" werelogs scality/werelogs#8.2.2 -"@scality/cloudserverclient@1.0.12": - version "1.0.12" - resolved "https://registry.yarnpkg.com/@scality/cloudserverclient/-/cloudserverclient-1.0.12.tgz#cbef36fb65b9cb9f7235d6d7dec291a535cd8dd2" - integrity sha512-A85ki+dQSdBt7C9pGxTA2NXRbg74azZ2LV/dBWf2A5soQFYXabDAnKQl/4+hnar8OAbIZ8XFoJjqqQzRZ4mGhg== +"@scality/cloudserverclient@1.0.13": + version "1.0.13" + resolved "https://registry.yarnpkg.com/@scality/cloudserverclient/-/cloudserverclient-1.0.13.tgz#45fecaf81a655df7a37e2adeb7442b63dce855f4" + integrity sha512-hfjiatdUTmUPtOb13AuSjz5ObbyjDPoUZ2WatSUZMt4wTKqbywf5HV88YQMDIB6L9q52E3YcAaIgbdE09vSxwA== dependencies: "@aws-sdk/client-s3" "^3.1009.0" + "@aws-sdk/core" "^3.978.1" + "@aws-sdk/credential-provider-node" "^3.972.84" "@aws-sdk/middleware-expect-continue" "^3.972.8" + "@aws-sdk/types" "^3.974.6" + "@smithy/core" "^3.35.0" + "@smithy/fetch-http-handler" "^5.8.0" + "@smithy/node-http-handler" "^4.12.1" + "@smithy/types" "^4.19.0" JSONStream "^1.3.5" fast-xml-parser "^5.5.7" + tslib "^2.6.2" "@scality/eslint-config-scality@scality/Guidelines#8.3.3": version "8.3.3" @@ -1734,9 +1752,9 @@ tslib "^2.6.2" "@smithy/core@^3.33.2", "@smithy/core@^3.33.3", "@smithy/core@^3.35.0": - version "3.35.0" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.35.0.tgz#52f180a314d735af8ba8970967c4c9499fc21d3e" - integrity sha512-zRMhfkByhT2snNdr1si24vJitU6Cr9ix2MikUfWmkAgp4jrNP0GcKSP5YvwQ+TlI8AZXER5QOGJn3JsVtSD9/A== + version "3.35.1" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.35.1.tgz#9bcc2a52d331027021db17ed699d251ca041797a" + integrity sha512-i4YPS4B6ts7bjn7UwLnGjiZdprOvHvgGobFZsYK3GIY3E5hIqtj0rReU69BcTpGp+fvtraSNXeG1l+jtJvF55w== dependencies: "@smithy/types" "^4.19.0" tslib "^2.6.2" @@ -2098,16 +2116,16 @@ integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=13.7.0": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-26.6.3.tgz#411dccb5fc25687c958fe35b6ca3741d48a8d13c" - integrity sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg== + version "26.6.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-26.6.4.tgz#5aaac1a7337945f7f9a2de4e0d14e7107157e813" + integrity sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg== dependencies: undici-types "~8.9.0" "@types/node@^25.2.0": - version "25.9.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.8.tgz#a460865b194c2c416a8f11841613207848b92583" - integrity sha512-VfMrScDmMhUJQmd5hArdQnFvK0OIeD36uN2Va1FcpYaLB/BgkgM8Ulc50XtYISPMz7APJ30+N0T5EM0jlcdfRw== + version "25.9.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.9.tgz#19f1b689ab7558ed910664b6078113b8abbef1d0" + integrity sha512-b4e2xxj/yMeT2hNlD6x7zNFiQK2Dlmkb9CQ6v3/1G2RezKN4YS2lcEv8lzGm1mhs4f2lM4yNAMI/zUDBZBBt7w== dependencies: undici-types ">=7.24.0 <7.24.7" @@ -2141,9 +2159,9 @@ "@types/webidl-conversions" "*" "@types/ws@*", "@types/ws@^8.5.12": - version "8.18.1" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" - integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== + version "8.18.2" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.2.tgz#25d6321b30ef0fddf6cc7052b4eef9ce4e412b6e" + integrity sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w== dependencies: "@types/node" "*" @@ -2169,6 +2187,18 @@ abbrev@^3.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-3.0.1.tgz#8ac8b3b5024d31464fe2a5feeea9f4536bf44025" integrity sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg== +abstract-level@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-3.1.1.tgz#d61a7ae1a5cff15f315592a4cfa3259489ac2388" + integrity sha512-CW2gKbJFTuX1feMvOrvsVMmijAOgI9kg2Ie9Dq3gOcMt/dVVoVmqNlLcEUCT13NxHFMEajcUcVBIplbyDroDiw== + dependencies: + buffer "^6.0.3" + is-buffer "^2.0.5" + level-supports "^6.2.0" + level-transcoder "^1.0.1" + maybe-combine-errors "^1.0.0" + module-error "^1.0.1" + abstract-leveldown@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" @@ -2180,21 +2210,6 @@ abstract-leveldown@^6.2.1: level-supports "~1.0.0" xtend "~4.0.0" -abstract-leveldown@~0.12.1: - version "0.12.4" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz#29e18e632e60e4e221d5810247852a63d7b2e410" - integrity sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA== - dependencies: - xtend "~3.0.0" - -abstract-leveldown@~6.0.1: - version "6.0.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.0.3.tgz#b4b6159343c74b0c5197b2817854782d8f748c4a" - integrity sha512-jzewKKpZbaYUa6HTThnrl+GrJhzjEAeuc7hTVpZdzg7kupXZFoqQDFwyOwLNbmJKJlmzw8yiipMPkDiuKkT06Q== - dependencies: - level-concat-iterator "~2.0.0" - xtend "~4.0.0" - abstract-leveldown@~6.2.1: version "6.2.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" @@ -2279,9 +2294,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.2.2: - version "6.3.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.3.0.tgz#247c8e7b70a1a43b10ce14c0226fcbf58e8815d5" - integrity sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ== + version "6.4.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.4.0.tgz#69093d6436d30dbb9b04fe7bdcbcfe16c697d8a1" + integrity sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw== ansi-styles@^3.2.1: version "3.2.1" @@ -2571,13 +2586,6 @@ bintrees@1.0.2: resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.2.tgz#49f896d6e858a4a499df85c38fb399b9aff840f8" integrity sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw== -bl@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-0.8.2.tgz#c9b6bca08d1bc2ea00fc8afb4f1a5fd1e1c66e4e" - integrity sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw== - dependencies: - readable-stream "~1.0.26" - body-parser@^1.18.3, body-parser@^1.20.3, body-parser@~1.20.5: version "1.20.8" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.8.tgz#328d51ce46cb19c983f3d9661016df2765283a37" @@ -2704,21 +2712,6 @@ bytes@~3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -bytewise-core@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" - integrity sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA== - dependencies: - typewise-core "^1.2" - -bytewise@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" - integrity sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ== - dependencies: - bytewise-core "^1.2.2" - typewise "^1.0.3" - cacache@^19.0.1: version "19.0.1" resolved "https://registry.yarnpkg.com/cacache/-/cacache-19.0.1.tgz#3370cc28a758434c85c2585008bd5bdcff17d6cd" @@ -2881,9 +2874,19 @@ chownr@^3.0.0: integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== cjs-module-lexer@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-2.2.1.tgz#ab35b03c56ade05fe170c70e67ae89f60666847c" - integrity sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q== + version "2.3.0" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-2.3.0.tgz#4eb71c63d5f70f0b1d8a39a595c134a6692493f2" + integrity sha512-lmNyBzi6iYiqyrExTctfmjd8tInx+dHu9PBomTfH5RXS53c27JMFJgzNv5TyAnm3PgGf+MLy0+Ws41/HlVxdKQ== + +classic-level@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-3.0.0.tgz#2be00defbaf7d204ac33da77988993c6c337ba67" + integrity sha512-yGy8j8LjPbN0Bh3+ygmyYvrmskVita92pD/zCoalfcC9XxZj6iDtZTAnz+ot7GG8p9KLTG+MZ84tSA4AhkgVZQ== + dependencies: + abstract-level "^3.1.0" + module-error "^1.0.1" + napi-macros "^2.2.2" + node-gyp-build "^4.3.0" clean-stack@^2.0.0: version "2.2.0" @@ -3247,13 +3250,6 @@ defer-to-connect@^2.0.0: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -deferred-leveldown@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz#2cef1f111e1c57870d8bbb8af2650e587cd2f5b4" - integrity sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng== - dependencies: - abstract-leveldown "~0.12.1" - deferred-leveldown@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" @@ -3584,9 +3580,9 @@ es-errors@^1.3.0: integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-module-lexer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-3.0.2.tgz#8cc09097dd80a9cbb79437fd405b935cac76cda3" - integrity sha512-BuIB67FngDSyQ/dpQNOZybwdEBDUGJQvOqwWr4ha/ufYiqzuEwPkKO2zLhRAgay28tStRIHUeWmszZAJo3GCOg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-3.0.3.tgz#3c4b64e116d69fe523e332134ef088962d78f288" + integrity sha512-yWGe1O/j+almnV4hOYrmZo8u58JdnmXEMneRQAYkWtqSiT86yoMIEKF4rpqEDj52tbYl3xceBD3DQIBwcsC9Pw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1, es-object-atoms@^1.1.2: version "1.1.2" @@ -3612,7 +3608,7 @@ es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: dependencies: hasown "^2.0.2" -es-to-primitive@^1.3.0: +es-to-primitive@^1.3.0, es-to-primitive@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.4.tgz#0c854291cf0d7b439d6b9e5771ea837ffaf1f991" integrity sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw== @@ -4118,9 +4114,9 @@ fn.name@1.x.x: integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== follow-redirects@^1.16.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" - integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== + version "1.16.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.1.tgz#6e0efa40a727fb369b98dab15883ec34787d675e" + integrity sha512-FNvFGzoMLWmE6Yj9spb/zjd7yiNCHiAW9/Tg9CXrQ8wuu32HtlJOwWO11OJafl5FfY3DxTdQ0vj42zU1kvv5jg== for-each@^0.3.3, for-each@^0.3.5: version "0.3.5" @@ -4509,9 +4505,9 @@ html-escaper@^2.0.0: integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5" - integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.3.0.tgz#09eead3b16c6d85552857cc3fbd888d8353a2aaf" + integrity sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA== http-errors@~2.0.0, http-errors@~2.0.1: version "2.0.1" @@ -4577,6 +4573,7 @@ http2-wrapper@^1.0.0-beta.5.2: "httpagent@github:scality/httpagent#1.1.1", httpagent@scality/httpagent#1.1.1: version "1.1.1" + uid "7c6ef8be1cd89b56651f4a922ea5c92d7673ee2e" resolved "https://codeload.github.com/scality/httpagent/tar.gz/7c6ef8be1cd89b56651f4a922ea5c92d7673ee2e" dependencies: agentkeepalive "^4.6.0" @@ -4652,9 +4649,9 @@ import-fresh@^3.2.1: resolve-from "^4.0.0" import-in-the-middle@^3.0.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-3.5.1.tgz#74fc490851751005dc2f776a87bc8a075904b474" - integrity sha512-mPKuL8bPQzecui2KK6Gb+M8JvJoHnhS1FeYGa22QopBmlevF5F0FE6ued/B5EgHDeIoMTONIpDWWFKUPOG0DBQ== + version "3.5.2" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-3.5.2.tgz#c017ecf4fe1f83da743793ea9321519131cd3135" + integrity sha512-WseIA/4o56+GYO3RmlOPvejYi771OFeJEeK/ejROsr9bdjW+E5NXTOD1Di8TL40Qgg3JJX9aa97Hf8iiSVIKZw== dependencies: cjs-module-lexer "^2.2.0" es-module-lexer "^3.0.2" @@ -4714,9 +4711,9 @@ ioredis@^5.4.1, ioredis@^5.4.2, ioredis@^5.8.1: standard-as-callback "2.1.0" ip-address@^10.1.1: - version "10.7.2" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.7.2.tgz#5b3b2b7d46c6293861b82dfcd49cc203aa8f2c5c" - integrity sha512-7H/2gFSIitxc0hG3nOI1glS8QLo/EHBFFLk8vEUjXY/xu0AdL8jZ9U1IzO2PUm0d2D/ofQcAifb0g6OBkt8U7w== + version "10.7.3" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.7.3.tgz#4cb77d274a4e2484a3ea438cfe98dbe0c502e8c5" + integrity sha512-A1kdq/tSb5QjvKvAMgIoEvDBIgL7qaqVP/jkvSwYYRZ9iEzvPpopxp2wQfu3SuZRHtpHNxMn8Fs0bS+gf5Xmwg== ipaddr.js@1.9.1: version "1.9.1" @@ -4788,6 +4785,11 @@ is-boolean-object@^1.2.1: call-bound "^1.0.3" has-tostringtag "^1.0.2" +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + is-buffer@~1.1.1, is-buffer@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -4798,7 +4800,7 @@ is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.16.1, is-core-module@^2.16.2: +is-core-module@^2.16.1, is-core-module@^2.16.2, is-core-module@^2.17.0: version "2.17.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.17.0.tgz#75c1c76236c9f7e38ddbfff292e127dc13b21027" integrity sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA== @@ -5043,11 +5045,6 @@ is-wsl@^3.1.0: dependencies: is-inside-container "^1.0.0" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -5356,17 +5353,6 @@ level-iterator-stream@~4.0.0: readable-stream "^3.4.0" xtend "^4.0.2" -level-js@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-js/-/level-js-4.0.2.tgz#fa51527fa38b87c4d111b0d0334de47fcda38f21" - integrity sha512-PeGjZsyMG4O89KHiez1zoMJxStnkM+oBIqgACjoo5PJqFiSUUm3GNod/KcbqN5ktyZa8jkG7I1T0P2u6HN9lIg== - dependencies: - abstract-leveldown "~6.0.1" - immediate "~3.2.3" - inherits "^2.0.3" - ltgt "^2.1.2" - typedarray-to-buffer "~3.1.5" - level-mem@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" @@ -5375,7 +5361,7 @@ level-mem@^5.0.1: level-packager "^5.0.3" memdown "^5.0.0" -level-packager@^5.0.0, level-packager@^5.0.3: +level-packager@^5.0.3: version "5.1.1" resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== @@ -5383,26 +5369,10 @@ level-packager@^5.0.0, level-packager@^5.0.3: encoding-down "^6.3.0" levelup "^4.3.2" -level-post@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0" - integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew== - dependencies: - ltgt "^2.1.2" - -level-sublevel@~6.6.5: - version "6.6.5" - resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.5.tgz#acddfa2be033b9e503544e2c647f3c03d5a23fbd" - integrity sha512-SBSR60x+dghhwGUxPKS+BvV1xNqnwsEUBKmnFepPaHJ6VkBXyPK9SImGc3K2BkwBfpxlt7GKkBNlCnrdufsejA== - dependencies: - bytewise "~1.1.0" - levelup "~0.19.0" - ltgt "~2.1.1" - pull-defer "^0.2.2" - pull-level "^2.0.3" - pull-stream "^3.6.8" - typewiselite "~1.0.0" - xtend "~4.0.0" +level-supports@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-6.2.0.tgz#e78b228973a24acdc5199c5f51e244e70f26c611" + integrity sha512-QNxVXP0IRnBmMsJIh+sb2kwNCYcKciQZJEt+L1hPCHrKNELllXhvrlClVHXBYZVT+a7aTSM6StgNXdAldoab3w== level-supports@~1.0.0: version "1.0.1" @@ -5411,24 +5381,13 @@ level-supports@~1.0.0: dependencies: xtend "^4.0.2" -level@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level/-/level-5.0.1.tgz#8528cc1ee37ac413270129a1eab938c610be3ccb" - integrity sha512-wcak5OQeA4rURGacqS62R/xNHjCYnJSQDBOlm4KNUGJVE9bWv2B04TclqReYejN+oD65PzD4FsqeWoI5wNC5Lg== - dependencies: - level-js "^4.0.0" - level-packager "^5.0.0" - leveldown "^5.0.0" - opencollective-postinstall "^2.0.0" - -leveldown@^5.0.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98" - integrity sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ== +level-transcoder@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== dependencies: - abstract-leveldown "~6.2.1" - napi-macros "~2.0.0" - node-gyp-build "~4.1.0" + buffer "^6.0.3" + module-error "^1.0.1" levelup@^4.3.2: version "4.4.0" @@ -5441,19 +5400,6 @@ levelup@^4.3.2: level-supports "~1.0.0" xtend "~4.0.0" -levelup@~0.19.0: - version "0.19.1" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-0.19.1.tgz#f3a6a7205272c4b5f35e412ff004a03a0aedf50b" - integrity sha512-FljDvNf24vbG8fiO1iF0XbLym1lrR80wmn+x6NOFxhJ9arbPWXkzfhJpS8a2w5ft8MaD95c0+RvEHa0QHegAUA== - dependencies: - bl "~0.8.1" - deferred-leveldown "~0.2.0" - errno "~0.1.1" - prr "~0.0.0" - readable-stream "~1.0.26" - semver "~5.1.0" - xtend "~3.0.0" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -5601,16 +5547,6 @@ long@^5.0.0, long@^5.3.2: resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== -looper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" - integrity sha512-6DzMHJcjbQX/UPHc1rRCBfKlLwDkvuGZ715cIR36wSdYqWXFT35uLXq5P/2orl3tz+t+VOVPxw4yPinQlUDGDQ== - -looper@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" - integrity sha512-LJ9wplN/uSn72oJRsXTx+snxPet5c8XiZmOKCm906NVYu+ag6SB6vUcnJcWxgnl2NfbIyeobAn7Bwv6xRj2XJg== - lowercase-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" @@ -5628,16 +5564,11 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -ltgt@^2.1.2, ltgt@~2.2.0: +ltgt@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== -ltgt@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" - integrity sha512-5VjHC5GsENtIi5rbJd+feEpDKhfr7j0odoUR2Uh978g+2p93nd5o34cTjQWohXsPsCZeqoDnIqEf88mPCe0Pfw== - luxon@^3.2.1: version "3.7.2" resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.7.2.tgz#d697e48f478553cca187a0f8436aff468e3ba0ba" @@ -5693,6 +5624,11 @@ math-intrinsics@^1.1.0: resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== +maybe-combine-errors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/maybe-combine-errors/-/maybe-combine-errors-1.0.0.tgz#e9592832e61fc47643a92cff3c1f33e27211e5be" + integrity sha512-eefp6IduNPT6fVdwPp+1NgD0PML1NU5P6j1Mj5nz1nidX8/sWY7119WL8vTAHgqfsY74TzW0w1XPgdYEKkGZ5A== + md5@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" @@ -6200,6 +6136,11 @@ module-details-from-path@^1.0.3, module-details-from-path@^1.0.4: resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.4.tgz#b662fdcd93f6c83d3f25289da0ce81c8d9685b94" integrity sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w== +module-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + moment@^2.30.1: version "2.31.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.31.0.tgz#6e19184e8005a9dfc61c9351263d4d6ea2ace7aa" @@ -6237,10 +6178,10 @@ nan@^2.14.0, nan@^2.18.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.29.0.tgz#95bace50f153289240573c08401acc63a30659d4" integrity sha512-GlGk3HIvitbvs+LT3g6XUP1kpirKNvmDFwF/bmo6XNWSb/eYEs/O4bfgIEIXCZ+lIOTS5xNwDvSGMw6FJdAhtA== -napi-macros@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" - integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== +napi-macros@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== natural-compare@^1.4.0: version "1.4.0" @@ -6310,21 +6251,11 @@ node-fetch@^2.6.0: dependencies: whatwg-url "^5.0.0" -node-forge@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.4.0.tgz#1c7b7d8bdc2d078739f58287d589d903a11b2fc2" - integrity sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ== - node-gyp-build@^4.3.0: version "4.8.4" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== -node-gyp-build@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb" - integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ== - node-gyp@^11.1.0: version "11.5.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-11.5.0.tgz#82661b5f40647a7361efe918e3cea76d297fcc56" @@ -6599,11 +6530,6 @@ open@^10.1.0: is-inside-container "^1.0.0" wsl-utils "^0.1.0" -opencollective-postinstall@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" - integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== - optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -6930,11 +6856,6 @@ proxy-from-env@^2.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" - integrity sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ== - prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -6952,54 +6873,6 @@ pstree.remy@^1.1.8: resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -pull-cat@^1.1.9: - version "1.1.11" - resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" - integrity sha512-i3w+xZ3DCtTVz8S62hBOuNLRHqVDsHMNZmgrZsjPnsxXUgbWtXEee84lo1XswE7W2a3WHyqsNuDJTjVLAQR8xg== - -pull-defer@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113" - integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA== - -pull-level@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac" - integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg== - dependencies: - level-post "^1.0.7" - pull-cat "^1.1.9" - pull-live "^1.0.1" - pull-pushable "^2.0.0" - pull-stream "^3.4.0" - pull-window "^2.1.4" - stream-to-pull-stream "^1.7.1" - -pull-live@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" - integrity sha512-tkNz1QT5gId8aPhV5+dmwoIiA1nmfDOzJDlOOUpU5DNusj6neNd3EePybJ5+sITr2FwyCs/FVpx74YMCfc8YeA== - dependencies: - pull-cat "^1.1.9" - pull-stream "^3.4.0" - -pull-pushable@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" - integrity sha512-M7dp95enQ2kaHvfCt2+DJfyzgCSpWVR2h2kWYnVsW6ZpxQBx5wOu0QWOvQPVoPnBLUZYitYP2y7HyHkLQNeGXg== - -pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8: - version "3.7.0" - resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.7.0.tgz#85de0e44ff38a4d2ad08cc43fc458e1922f9bf0b" - integrity sha512-Eco+/R004UaCK2qEDE8vGklcTG2OeZSVm1kTUQNrykEjDwcFXDZhygFDsW49DbXyJMEhHeRL3z5cRVqPAhXlIw== - -pull-window@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" - integrity sha512-cbDzN76BMlcGG46OImrgpkMf/VkCnupj8JhsrpBw3aWBM9ye345aYnqitmZCgauBkc0HbbRRn9hCnsa3k2FNUg== - dependencies: - looper "^2.0.0" - pump@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.4.tgz#1f313430527fa8b905622ebd22fe1444e757ab3c" @@ -7094,16 +6967,6 @@ readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.2: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@~1.0.26: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readdirp@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" @@ -7226,12 +7089,12 @@ resolve-pkg-maps@^1.0.0: integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== resolve@^1.10.0: - version "1.22.12" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f" - integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== + version "1.22.13" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.13.tgz#d542f97758d768f36091251a6b07540b4343f7b5" + integrity sha512-Dj/cW9zBV2aRj6XzCxuGIs3ESZKv02jixne3q6jFZYZ3/Tg09gHHviSMDL4kObh9pqSahdRHEnDoaP2gn8YLhA== dependencies: es-errors "^1.3.0" - is-core-module "^2.16.1" + is-core-module "^2.17.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -7349,11 +7212,6 @@ semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== -semver@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19" - integrity sha512-bNx9Zdbi1OUN62PbKeG4IgGG8YILX/nkHJ0NQEBwg5FmX8qTJfqhYd3reqkm0DxHCC8nkazb6UjNiBSHCBWVtA== - send@~0.19.0, send@~0.19.1: version "0.19.2" resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" @@ -7456,9 +7314,9 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.6.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.10.0.tgz#482033e192e4f5c07151521ffa03400ec71b1b0f" - integrity sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA== + version "1.12.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.12.0.tgz#e98fdfd2e921d8a58ae2820f4fc0f75c39f09675" + integrity sha512-PcByqNyT/38F2kDNi006HAMRJaULuBzq/FOsw3qdZvX/GA9W/jamDaRskgHjubHiftXK5sIFxLNkvrXUwcof6Q== side-channel-list@^1.0.1: version "1.0.1" @@ -7745,14 +7603,6 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== -stream-to-pull-stream@^1.7.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece" - integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg== - dependencies: - looper "^3.0.0" - pull-stream "^3.2.3" - "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -7830,11 +7680,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -8014,13 +7859,15 @@ tr46@~0.0.3: integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== traverse@~0.6.6: - version "0.6.11" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.11.tgz#e8daa071b101ae66767fffa6f177aa6f7110068e" - integrity sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w== + version "0.6.14" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.14.tgz#664c14548c5b1e1b39ba70d5313d09e2da7a177f" + integrity sha512-CYRAVGfnSSe+4Wlof62oUH6y9fGwo0NNS84hMq76MTZtwXQU7Oqna9SgWfrCGj5JPUtHQudnIEt1BP7PInPkPQ== dependencies: + define-data-property "^1.1.4" + es-to-primitive "^1.3.4" gopd "^1.2.0" - typedarray.prototype.slice "^1.0.5" - which-typed-array "^1.1.18" + typedarray.prototype.slice "^1.0.6" + which-typed-array "^1.1.24" triple-beam@^1.3.0: version "1.4.1" @@ -8139,7 +7986,7 @@ typed-array-byte-length@^1.0.3: has-proto "^1.2.0" is-typed-array "^1.1.14" -typed-array-byte-offset@^1.0.4: +typed-array-byte-offset@^1.0.4, typed-array-byte-offset@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.5.tgz#c076d6a0db563933154b3c442204b614bf0d7b15" integrity sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ== @@ -8163,43 +8010,26 @@ typed-array-length@^1.0.7: possible-typed-array-names "^1.1.0" reflect.getprototypeof "^1.0.10" -typedarray-to-buffer@^3.1.5, typedarray-to-buffer@~3.1.5: +typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" -typedarray.prototype.slice@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz#a40f896968573b33cbb466a61622d3ee615a0728" - integrity sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg== +typedarray.prototype.slice@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.6.tgz#c8a99a54201aa7573b3ac747441bee4a9f7f5e00" + integrity sha512-r+7YvGfM5TkTiDQ5EqWi/Z4L4KP3jUI+YCmTtWg1tmTHUw6xladLJqzR2heMaHBIM0TTFLZmn/EkIaEHYs/bIA== dependencies: - call-bind "^1.0.8" + call-bind "^1.0.9" define-properties "^1.2.1" - es-abstract "^1.23.9" + es-abstract "^1.24.2" es-errors "^1.3.0" get-proto "^1.0.1" math-intrinsics "^1.1.0" typed-array-buffer "^1.0.3" - typed-array-byte-offset "^1.0.4" - -typewise-core@^1.2, typewise-core@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" - integrity sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg== - -typewise@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" - integrity sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ== - dependencies: - typewise-core "^1.2.0" - -typewiselite@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e" - integrity sha512-J9alhjVHupW3Wfz6qFRGgQw0N3gr8hOkw6zm7FZ6UR1Cse/oD9/JVok7DNE9TT9IbciDHX2Ex9+ksE6cRmtymw== + typed-array-byte-offset "^1.0.5" unbox-primitive@^1.1.0: version "1.1.0" @@ -8430,7 +8260,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.16, which-typed-array@^1.1.18, which-typed-array@^1.1.19: +which-typed-array@^1.1.16, which-typed-array@^1.1.19, which-typed-array@^1.1.24: version "1.1.24" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.24.tgz#211f5877c29e6213d50e8f2dce4ac9ca2d0008cf" integrity sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ== @@ -8551,7 +8381,12 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@*, ws@^8.18.0, ws@~8.21.0: +ws@*: + version "8.22.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.22.0.tgz#40f16e1d7588ac0575041be5c49b8eb261c28e73" + integrity sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg== + +ws@^8.18.0, ws@~8.21.0: version "8.21.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.3.tgz#660b4faddb6a3e575c86e078126919961f4de4fc" integrity sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw== @@ -8596,11 +8431,6 @@ xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.0: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - integrity sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg== - y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" From 30abca422840e43944ca7895e7e0a11be79480df Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Wed, 7 Oct 2026 16:08:14 +0200 Subject: [PATCH 3/7] Refresh yarn.lock Re-resolve dependencies within their existing ranges. Issue: CLDSRV-1013 --- yarn.lock | 138 +++++++++++++++++++++++++++--------------------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5f4003cb38..ed44055d3c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -125,9 +125,9 @@ tslib "^2.6.2" "@aws-sdk/client-sts@^3.930.0": - version "3.1141.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.1141.0.tgz#2468aa2169e46d9d6eb5788feeb51c58e33f8827" - integrity sha512-HwpL6eD2Zckc99ftZtewwBqOU2LvMG3ORv5t6zV/deS8zarGLNSQ2AHiV/UVC5m5iVW7SJpVv5Qyt0F0/NlaWg== + version "3.1147.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.1147.0.tgz#47cd0f8d469dbf5423ffeb060df85b1ddae20c02" + integrity sha512-o44v8eslmnAPYmTmZcIjq8KDJJnGdLwenhX18CDgqiKF44EVUvevzvWPnVHV6rEGmRWrjh63y5uJS9xmZuiDGw== dependencies: "@aws-sdk/core" "^3.978.1" "@aws-sdk/credential-provider-node" "^3.972.84" @@ -154,9 +154,9 @@ tslib "^2.6.2" "@aws-sdk/crc64-nvme-crt@^3.989.0": - version "3.1141.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/crc64-nvme-crt/-/crc64-nvme-crt-3.1141.0.tgz#4df67067560c853be5a23c6bed286c60c0f25138" - integrity sha512-MtuOSOIW5GG5CDxnPnG9dDc2c9qcLUJOdC59+6FTo799RlDZuxE3hatgDwZFH8mVzN/+C6F/eUL2dLhqU05aog== + version "3.1147.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/crc64-nvme-crt/-/crc64-nvme-crt-3.1147.0.tgz#dcc3f8da5b70d5f7dad08cec933c329d7a3c444e" + integrity sha512-HdfIdNMdmDH6xzZte+DQucTnCp3buqTy6xdrWi+COdni20GEmS0wAHKCl5TuPJpJaGuFiGSY7IT/WK8eA/gH4Q== dependencies: "@aws-sdk/checksums" "^3.1001.1" "@aws-sdk/crt-loader" "^3.972.76" @@ -377,9 +377,9 @@ tslib "^2.5.0" "@aws-sdk/s3-request-presigner@^3.901.0": - version "3.1141.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.1141.0.tgz#fcd1bb8685a50f5c7a2b35d69efb2251c61aef5c" - integrity sha512-HHHcP3gvLqeY9GPptpxLvA6VwDu+MWKCoaGGm0UtSUBh1hC7xJ9nNHoybgFfstC4lrj+k8oD6a1rWbGBWKYdag== + version "3.1147.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.1147.0.tgz#fb53c7f054a2a03ecb69d39179e5d07059708a77" + integrity sha512-9za8GOn8IRFz+foPbLfjFFfqDV87mLBhNbUg+8YgqaSIuvzx+o6bWgOAETqPev5wul6DAImTQSCgt8mBsKtGUg== dependencies: "@aws-sdk/core" "^3.978.1" "@aws-sdk/signature-v4-multi-region" "^3.996.47" @@ -730,14 +730,14 @@ integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== "@babel/helpers@^7.29.7": - version "7.29.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.7.tgz#45abfde7548997e34376c3e69feb475cffb4a607" - integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== + version "7.29.10" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.10.tgz#d662b4a2d66cc6cf02bc50e8aced023fbc8649e9" + integrity sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg== dependencies: "@babel/template" "^7.29.7" - "@babel/types" "^7.29.7" + "@babel/types" "^7.29.8" -"@babel/parser@^7.29.7", "@babel/parser@^7.29.8": +"@babel/parser@^7.29.7", "@babel/parser@^7.29.8", "@babel/parser@^7.29.9": version "7.29.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.9.tgz#e7ee0a24f752c5296c6455855ccb72662e67ea96" integrity sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA== @@ -754,14 +754,14 @@ "@babel/types" "^7.29.7" "@babel/traverse@^7.29.7": - version "7.29.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.8.tgz#4111014cdc71a0f95d9471907590baa0b8a6b28a" - integrity sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg== + version "7.29.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.10.tgz#08ab387639b4a67304511259c7da6cf23a82e91c" + integrity sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ== dependencies: "@babel/code-frame" "^7.29.7" "@babel/generator" "^7.29.8" "@babel/helper-globals" "^7.29.7" - "@babel/parser" "^7.29.8" + "@babel/parser" "^7.29.9" "@babel/template" "^7.29.7" "@babel/types" "^7.29.8" debug "^4.3.1" @@ -1091,7 +1091,7 @@ dependencies: sparse-bitfield "^3.0.3" -"@nodable/entities@^3.0.0": +"@nodable/entities@^3.0.1": version "3.1.0" resolved "https://registry.yarnpkg.com/@nodable/entities/-/entities-3.1.0.tgz#2ab366e0e607fdef8d65c5d84c58d191812bbd4b" integrity sha512-LsS/DjHr+uDM647Gru/cA8+J3a3HfhttwCKLyuoyN7yXTFCxKBtSgMQBvrW9yNPa2/zDRUNuGPaH5QUFoa4arQ== @@ -2247,9 +2247,9 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.15.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.18.0.tgz#4faf01b2d6d326bfeed97aea1f52220b5f4c1940" - integrity sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ== + version "8.19.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.19.0.tgz#6b26fd97ce1cc9dc50bdf7ad305e9f1384d4f28a" + integrity sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw== agent-base@6: version "6.0.2" @@ -2557,10 +2557,10 @@ base64-js@^1.0.2, base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -baseline-browser-mapping@^2.11.25: - version "2.11.26" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.26.tgz#01bf6774efb3fbb9de20afc6b923ab85c7d230a6" - integrity sha512-GLQdD3y6UF8iVuMJl5fHgE4jdn/ua7n+toKfLgNlg3BqQtOZjpy68T8Tup8/wGWZCDlm7KMg7tPb4MPn7oN0TQ== +baseline-browser-mapping@^2.11.26: + version "2.11.27" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.27.tgz#9bb9242d87ab1cdc9e35607148791e20e4398b20" + integrity sha512-ElY12DaROGuan+lMmZ8Cvo/ZUbXPe7Enc/9VU/b1T3Kp4dwytRcNdR8DoSJN5SNJT/CuvcCA0DHDVmMOCePdRQ== bcrypt-pbkdf@^1.0.0: version "1.0.2" @@ -2644,13 +2644,13 @@ browser-stdout@^1.3.1: integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserslist@^4.24.0: - version "4.29.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.29.1.tgz#f723071987a4f094177d94e01f6dc6e7493b972c" - integrity sha512-AUdjuRyCNGUYtqpqfTmWyM4fXay8yIQhmLnvYe/THMGfT9B/34X7xQd3ifKxwyNPPpowVBjLb+64BN9Rn1mizw== + version "4.29.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.29.3.tgz#9c8dafe96ab1c8e40e21c1274bdfa05aaee46476" + integrity sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA== dependencies: - baseline-browser-mapping "^2.11.25" - caniuse-lite "^1.0.30001810" - electron-to-chromium "^1.5.438" + baseline-browser-mapping "^2.11.26" + caniuse-lite "^1.0.30001813" + electron-to-chromium "^1.5.439" node-releases "^2.0.57" update-browserslist-db "^1.3.3" @@ -2799,10 +2799,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001810: - version "1.0.30001812" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001812.tgz#55b32ed819d120b384149a4f9fd59d179ce008f9" - integrity sha512-qN+QNNBr93TCmFrmte0bBCjSDMuRvt78VlHT99qIGPszm4QsqCX8lnyWUFkHi8B7ZBAPq8SH+UqyXNy/odMdng== +caniuse-lite@^1.0.30001813: + version "1.0.30001815" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001815.tgz#7cf8faa82c998b06873a113e9d3d9544f2022ac0" + integrity sha512-uDybUEyfgbyJJ93J1vikTylBX31AkdVYeVPeffMQpf8XN7hSfr0oZOn4VFOIMNvtU5+rHvC5Udg2TgtJKHm23Q== caseless@~0.12.0: version "0.12.0" @@ -3387,10 +3387,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.5.438: - version "1.5.439" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.439.tgz#d14ad21f157ee83b77d1e46fc031776eec9013c9" - integrity sha512-qu6QIPXhsb+CRcAiTMNjR4A1y/7tCYKkKjr5CZXRVih6qkDf79peZ2BpEU3qoDBNCRrcy3Mra3X9nG5oruuA7Q== +electron-to-chromium@^1.5.439: + version "1.5.449" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.449.tgz#94cc7307abf5ec39d1afa619e53072c26a8ef8d1" + integrity sha512-dKeYk/3SFQz+nXi5whp3OuJzeWABEG4zCtkWJ9+Vby1E1iFM2y0gElRtQvNXRPJTsj8WAF4HMP7hvP790QtJ9g== emoji-regex@^8.0.0: version "8.0.0" @@ -3468,9 +3468,9 @@ engine.io@~6.6.0: ws "~8.21.0" enhanced-resolve@^5.17.1: - version "5.25.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz#9d919bfa898b116e58f20e95127c047693158771" - integrity sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w== + version "5.26.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.26.0.tgz#9dfb47d050ed6c87f2c6d43b4d7e30f8c0a91ed7" + integrity sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw== dependencies: graceful-fs "^4.2.4" tapable "^2.3.3" @@ -3966,9 +3966,9 @@ extsprintf@^1.2.0: integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== fast-copy@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-4.1.1.tgz#e39f2d403aa77a7e10628e3d8d4d8ed4b2ac5256" - integrity sha512-A4QTJmuiztpGtr6AMeJts9R4hbj2ZBUwtOaKrG6rw2y7t6+IaJKjz5M3XDs8BUznxDH43FVc6A0y/gWlMl4UtA== + version "4.1.2" + resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-4.1.2.tgz#9119c178a5f2aa568074cf21cd6823068fbfea15" + integrity sha512-DUHggaYcouhy5I1LacDJ+JDSqGlumVJP2EAi5Nwt1pWPeLpSvIjkrY+x4fsoI1/+GlTyq+DM9zdgWCFSfqNODA== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" @@ -3999,11 +3999,11 @@ fast-xml-builder@^1.2.0: xml-naming "^0.3.0" fast-xml-parser@^5.5.6, fast-xml-parser@^5.5.7, fast-xml-parser@^5.5.9: - version "5.11.1" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.11.1.tgz#0ee672fcce1710c38185b8290d77e98806ff0bfb" - integrity sha512-TBw6K/fxoQGGjCmZDw9w/ZwP3uDcnTM4YH/g+PFRWr8sbe5idXtxNN6vITh4+1ruCZaho6uBFurElsA7F0zzgw== + version "5.11.2" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.11.2.tgz#0d4987adf4e7934af11d82a73b2841eca9928a42" + integrity sha512-R9iDuNrQYeQut46cn2r2wHKn4HYzVDvDm5J1wW+koZewykv0yuO2HChTYeZtrULyHIDM9cj9TUXloCsueCQUog== dependencies: - "@nodable/entities" "^3.0.0" + "@nodable/entities" "^3.0.1" fast-xml-builder "^1.2.0" is-unsafe "^2.0.0" path-expression-matcher "^1.6.2" @@ -4561,6 +4561,7 @@ http2-wrapper@^1.0.0-beta.5.2: "httpagent@git+https://github.com/scality/httpagent#1.1.1": version "1.1.1" + uid "7c6ef8be1cd89b56651f4a922ea5c92d7673ee2e" resolved "git+https://github.com/scality/httpagent#7c6ef8be1cd89b56651f4a922ea5c92d7673ee2e" dependencies: agentkeepalive "^4.6.0" @@ -4573,7 +4574,6 @@ http2-wrapper@^1.0.0-beta.5.2: "httpagent@github:scality/httpagent#1.1.1", httpagent@scality/httpagent#1.1.1: version "1.1.1" - uid "7c6ef8be1cd89b56651f4a922ea5c92d7673ee2e" resolved "https://codeload.github.com/scality/httpagent/tar.gz/7c6ef8be1cd89b56651f4a922ea5c92d7673ee2e" dependencies: agentkeepalive "^4.6.0" @@ -6494,7 +6494,7 @@ object.values@^1.2.1: define-properties "^1.2.1" es-object-atoms "^1.0.0" -on-exit-leak-free@^2.1.0: +on-exit-leak-free@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== @@ -6748,9 +6748,9 @@ pino-abstract-transport@^3.0.0: split2 "^4.0.0" pino-pretty@^13.1.3: - version "13.1.3" - resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-13.1.3.tgz#2274cccda925dd355c104079a5029f6598d0381b" - integrity sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg== + version "13.2.0" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-13.2.0.tgz#3598d57af318518398ba2a8c6903452a8b7575ce" + integrity sha512-jjghD1ML+Di/WxjJDz6j6Y4FT7hIXOlb8h27AyJ+ohtAXJXH4PS/xkv7si+RCCIW59HMgZsMKTDgzdr0RhuRrg== dependencies: colorette "^2.0.7" dateformat "^4.6.3" @@ -6759,12 +6759,12 @@ pino-pretty@^13.1.3: help-me "^5.0.0" joycon "^3.1.1" minimist "^1.2.6" - on-exit-leak-free "^2.1.0" + on-exit-leak-free "^2.1.2" pino-abstract-transport "^3.0.0" - pump "^3.0.0" - secure-json-parse "^4.0.0" - sonic-boom "^4.0.1" - strip-json-comments "^5.0.2" + pump "^3.0.3" + secure-json-parse "^4.1.0" + sonic-boom "^5.0.0" + strip-json-comments "^5.0.3" pkg-dir@^4.1.0: version "4.2.0" @@ -6873,7 +6873,7 @@ pstree.remy@^1.1.8: resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -pump@^3.0.0: +pump@^3.0.0, pump@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.4.tgz#1f313430527fa8b905622ebd22fe1444e757ab3c" integrity sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA== @@ -7192,7 +7192,7 @@ sax@>=0.6.0, sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.1.tgz#4c23cf608c0b693ab54b4b5888e92cfe977b9843" integrity sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q== -secure-json-parse@^4.0.0: +secure-json-parse@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-4.1.0.tgz#4f1ab41c67a13497ea1b9131bb4183a22865477c" integrity sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA== @@ -7457,10 +7457,10 @@ socks@^2.8.3: ip-address "^10.1.1" smart-buffer "^4.2.0" -sonic-boom@^4.0.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.2.1.tgz#28598250df4899c0ac572d7e2f0460690ba6a030" - integrity sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q== +sonic-boom@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-5.0.2.tgz#a2ce0c7c70e71f5ef1d5511f67063b0bbaf41705" + integrity sha512-/JEruzo6yhNVhsLblTRchgTQHIt7SsdJP0YyrfWaNKjIOQDfrdZv9gwYraYCAsmKV39/LAdV31FLL5NCDpoL/A== dependencies: atomic-sleep "^1.0.0" @@ -7723,7 +7723,7 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strip-json-comments@^5.0.2: +strip-json-comments@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.3.tgz#b7304249dd402ee67fd518ada993ab3593458bcf" integrity sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw== @@ -8381,12 +8381,12 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@*: +ws@*, ws@^8.18.0: version "8.22.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.22.0.tgz#40f16e1d7588ac0575041be5c49b8eb261c28e73" integrity sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg== -ws@^8.18.0, ws@~8.21.0: +ws@~8.21.0: version "8.21.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.3.tgz#660b4faddb6a3e575c86e078126919961f4de4fc" integrity sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw== From 1c559dd3441cb4c95c6e60ecd8add479f21f7541 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Wed, 7 Oct 2026 16:16:00 +0200 Subject: [PATCH 4/7] Force patched form-data under request request is only pulled in by utapi (via oas-tools) and still asks for form-data ~2.3.2, which has a critical advisory. utapi already forces form-data ^2.5.6 under request, but yarn ignores resolutions from dependencies, so mirror it here: https://github.com/scality/utapi/blob/8.4.0/package.json#L61-L64 Issue: CLDSRV-1013 --- package.json | 3 ++- yarn.lock | 28 +++++++++++++++------------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index e3d520644f..c263c86924 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,8 @@ "resolutions": { "jsonwebtoken": "^9.0.0", "fast-xml-parser": "^5.5.6", - "express": "^4.22.3" + "express": "^4.22.3", + "**/request/form-data": "^2.5.6" }, "countAsyncSourcePaths": [ "lib/**/*.js", diff --git a/yarn.lock b/yarn.lock index ed44055d3c..1c704ce156 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2989,7 +2989,7 @@ colorette@^2.0.7: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -4146,6 +4146,18 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== +form-data@^2.5.6, form-data@~2.3.2: + version "2.5.6" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.6.tgz#ef39b3d99e2fc9f25420c0db7962fe36cafcd244" + integrity sha512-Ogz/E85h9tlfJzpI6TuFpGcHZFhLrb9Gw8wq9v40CxSCPnv7ahKr6Xgtkn0KYCDQJ8DNn5VoMO8EXr9V5PadyA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.4" + mime-types "^2.1.35" + safe-buffer "^5.2.1" + form-data@^4.0.5, form-data@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.6.tgz#28e864e1b786dbebb68db1f452f9635278665827" @@ -4157,15 +4169,6 @@ form-data@^4.0.5, form-data@^4.0.6: hasown "^2.0.4" mime-types "^2.1.35" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - forwarded-parse@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/forwarded-parse/-/forwarded-parse-2.1.2.tgz#08511eddaaa2ddfd56ba11138eee7df117a09325" @@ -4561,7 +4564,6 @@ http2-wrapper@^1.0.0-beta.5.2: "httpagent@git+https://github.com/scality/httpagent#1.1.1": version "1.1.1" - uid "7c6ef8be1cd89b56651f4a922ea5c92d7673ee2e" resolved "git+https://github.com/scality/httpagent#7c6ef8be1cd89b56651f4a922ea5c92d7673ee2e" dependencies: agentkeepalive "^4.6.0" @@ -5974,7 +5976,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.35, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.35, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -7145,7 +7147,7 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== From 747b7e70f18f964e98f071c547ab743e1f3d63c0 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Wed, 7 Oct 2026 16:26:05 +0200 Subject: [PATCH 5/7] Remove the Orbit secure channel tunnel The push client could also tunnel raw S3 traffic from the push server to cloudserver over the websocket: this is how the Orbit browser reached S3 inside a deployment, through bin/secure_channel_proxy.js. Nothing else uses it, and zenko-operator stops deploying the proxy (ZKOP-617), so drop the script, the channel payload/close handling and the browserAccessEnabled toggle that was only set from an overlay. The push client is now only used by the metrics server, and only answers metrics requests. Issue: CLDSRV-1013 --- bin/secure_channel_proxy.js | 39 ----------- lib/management/ChannelMessageV0.js | 32 --------- lib/management/push.js | 70 +------------------ package.json | 1 - tests/unit/management/testChannelMessageV0.js | 28 +------- 5 files changed, 4 insertions(+), 166 deletions(-) delete mode 100755 bin/secure_channel_proxy.js diff --git a/bin/secure_channel_proxy.js b/bin/secure_channel_proxy.js deleted file mode 100755 index 8b235f7fe0..0000000000 --- a/bin/secure_channel_proxy.js +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env node -'use strict'; - -const { startWSManagementClient, startPushConnectionHealthCheckServer } = require('../lib/management/push'); - -const logger = require('../lib/utilities/logger'); - -const { PUSH_ENDPOINT: pushEndpoint, INSTANCE_ID: instanceId, MANAGEMENT_TOKEN: managementToken } = process.env; - -if (!pushEndpoint) { - logger.error('missing push endpoint env var'); - process.exit(1); -} - -if (!instanceId) { - logger.error('missing instance id env var'); - process.exit(1); -} - -if (!managementToken) { - logger.error('missing management token env var'); - process.exit(1); -} - -startPushConnectionHealthCheckServer(err => { - if (err) { - logger.error('could not start healthcheck server', { error: err }); - process.exit(1); - } - const url = `${pushEndpoint}/${instanceId}/ws?proxy=1`; - startWSManagementClient(url, managementToken, err => { - if (err) { - logger.error('connection failed, exiting', { error: err }); - process.exit(1); - } - logger.info('no more connection, exiting'); - process.exit(0); - }); -}); diff --git a/lib/management/ChannelMessageV0.js b/lib/management/ChannelMessageV0.js index deed2b3b05..51ece7fdc8 100644 --- a/lib/management/ChannelMessageV0.js +++ b/lib/management/ChannelMessageV0.js @@ -67,38 +67,6 @@ class ChannelMessageV0 { return this.payload; } - /** - * Creates a wire representation of a channel close message - * - * @param {number} channelId Channel number - * - * @returns {Buffer} wire representation - */ - static encodeChannelCloseMessage(channelId) { - const buf = Buffer.alloc(headerSize); - buf.writeUInt8(MessageType.CHANNEL_CLOSE_MESSAGE, 0); - buf.writeUInt8(channelId, 1); - buf.writeUInt8(TargetType.TARGET_ANY, 2); - return buf; - } - - /** - * Creates a wire representation of a channel data message - * - * @param {number} channelId Channel number - * @param {Buffer} data Payload - * - * @returns {Buffer} wire representation - */ - static encodeChannelDataMessage(channelId, data) { - const buf = Buffer.alloc(data.length + headerSize); - buf.writeUInt8(MessageType.CHANNEL_PAYLOAD_MESSAGE, 0); - buf.writeUInt8(channelId, 1); - buf.writeUInt8(TargetType.TARGET_ANY, 2); - data.copy(buf, headerSize); - return buf; - } - /** * Creates a wire representation of a metrics message * diff --git a/lib/management/push.js b/lib/management/push.js index 395b5f8653..2eb1f7339f 100644 --- a/lib/management/push.js +++ b/lib/management/push.js @@ -1,6 +1,5 @@ const arsenal = require('@scality/arsenal'); const { HttpsProxyAgent } = require('https-proxy-agent'); -const net = require('net'); const request = require('../utilities/request'); const { URL: _URL } = require('url'); const WebSocket = require('ws'); @@ -13,7 +12,7 @@ const metadata = require('../metadata/wrapper'); const { reshapeExceptionError } = arsenal.errorUtils; const { ChannelMessageV0, MessageType } = require('./ChannelMessageV0'); -const { CONFIG_OVERLAY_MESSAGE, METRICS_REQUEST_MESSAGE, CHANNEL_CLOSE_MESSAGE, CHANNEL_PAYLOAD_MESSAGE } = MessageType; +const { CONFIG_OVERLAY_MESSAGE, METRICS_REQUEST_MESSAGE } = MessageType; const PING_INTERVAL_MS = 10000; const subprotocols = [ChannelMessageV0.protocolName]; @@ -58,10 +57,9 @@ function createWSAgent(pushEndpoint, env, log) { } /** - * Starts background task that updates configuration and pushes stats. + * Starts background task that pushes stats. * - * Receives pushed Websocket messages on configuration updates, and - * sends stat messages in response to API sollicitations. + * Sends stat messages in response to API sollicitations. * * @param {string} url API endpoint * @param {string} token API authentication token @@ -77,7 +75,6 @@ function startWSManagementClient(url, token, cb) { } } - const socketsByChannelId = []; const headers = { 'x-instance-authentication-token': token, }; @@ -121,56 +118,6 @@ function startWSManagementClient(url, token, cb) { }); } - function closeChannel(channelId) { - const socket = socketsByChannelId[channelId]; - if (socket) { - socket.destroy(); - delete socketsByChannelId[channelId]; - } - } - - function receiveChannelData(channelId, payload) { - let socket = socketsByChannelId[channelId]; - if (!socket) { - socket = net.createConnection(cloudServerPort, cloudServerHost); - - socket.on('data', data => { - ws.send(ChannelMessageV0.encodeChannelDataMessage(channelId, data), err => - _logError(err, 'failed to send channel data message', 'receiveChannelData'), - ); - }); - - socket.on('connect', () => {}); - - socket.on('drain', () => {}); - - socket.on('error', error => { - logger.error('failed to connect to S3', { - code: error.code, - host: error.address, - port: error.port, - }); - }); - - socket.on('end', () => { - socket.destroy(); - socketsByChannelId[channelId] = null; - ws.send(ChannelMessageV0.encodeChannelCloseMessage(channelId), err => - _logError(err, 'failed to send channel close message', 'receiveChannelData'), - ); - }); - - socketsByChannelId[channelId] = socket; - } - socket.write(payload); - } - - function browserAccessChangeHandler() { - if (!_config.browserAccessEnabled) { - socketsByChannelId.forEach(s => s.close()); - } - } - ws.on('open', () => { connected = true; logger.info('connected to push server'); @@ -178,7 +125,6 @@ function startWSManagementClient(url, token, cb) { metadata.notifyBucketChange(() => { pushStats({ noCache: true }); }); - _config.on('browser-access-enabled-change', browserAccessChangeHandler); initiatePing(); }); @@ -188,7 +134,6 @@ function startWSManagementClient(url, token, cb) { ws.on('close', () => { logger.info('disconnected from push server, reconnecting in 10s'); metadata.notifyBucketChange(null); - _config.removeListener('browser-access-enabled-change', browserAccessChangeHandler); setTimeout(startWSManagementClient, 10000, url, token); connected = false; @@ -227,15 +172,6 @@ function startWSManagementClient(url, token, cb) { case METRICS_REQUEST_MESSAGE: pushStats(); break; - case CHANNEL_CLOSE_MESSAGE: - closeChannel(message.getChannelNumber()); - break; - case CHANNEL_PAYLOAD_MESSAGE: - // browserAccessEnabled defaults to true unless explicitly false - if (_config.browserAccessEnabled !== false) { - receiveChannelData(message.getChannelNumber(), message.getPayload()); - } - break; default: logger.error('unknown message type from push server', { messageType: message.getType() }); } diff --git a/package.json b/package.json index c263c86924..eab8e7e152 100644 --- a/package.json +++ b/package.json @@ -145,7 +145,6 @@ "start_s3server": "node index.js", "start_dmd": "npm-run-all --parallel start_mdserver start_dataserver", "start_utapi": "node lib/utapi/utapi.js", - "start_secure_channel_proxy": "node bin/secure_channel_proxy.js", "start_metrics_server": "node bin/metrics_server.js", "utapi_replay": "node lib/utapi/utapiReplay.js", "utapi_reindex": "node lib/utapi/utapiReindex.js", diff --git a/tests/unit/management/testChannelMessageV0.js b/tests/unit/management/testChannelMessageV0.js index f43d6f7687..9d976c765a 100644 --- a/tests/unit/management/testChannelMessageV0.js +++ b/tests/unit/management/testChannelMessageV0.js @@ -2,13 +2,7 @@ const assert = require('assert'); const { ChannelMessageV0, MessageType, TargetType } = require('../../../lib/management/ChannelMessageV0'); -const { - CONFIG_OVERLAY_MESSAGE, - METRICS_REQUEST_MESSAGE, - METRICS_REPORT_MESSAGE, - CHANNEL_CLOSE_MESSAGE, - CHANNEL_PAYLOAD_MESSAGE, -} = MessageType; +const { CONFIG_OVERLAY_MESSAGE, METRICS_REQUEST_MESSAGE, METRICS_REPORT_MESSAGE } = MessageType; const { TARGET_ANY } = TargetType; @@ -23,26 +17,6 @@ describe('ChannelMessageV0', () => { assert.strictEqual(m.getTarget(), TARGET_ANY); assert.strictEqual(m.getPayload().toString(), '{"a":1}'); }); - - it('should roundtrip channel data', () => { - const data = Buffer.from('dummydata'); - const b = ChannelMessageV0.encodeChannelDataMessage(50, data); - const m = new ChannelMessageV0(b); - - assert.strictEqual(CHANNEL_PAYLOAD_MESSAGE, m.getType()); - assert.strictEqual(50, m.getChannelNumber()); - assert.strictEqual(m.getTarget(), TARGET_ANY); - assert.strictEqual(m.getPayload().toString(), 'dummydata'); - }); - - it('should roundtrip channel close', () => { - const b = ChannelMessageV0.encodeChannelCloseMessage(3); - const m = new ChannelMessageV0(b); - - assert.strictEqual(CHANNEL_CLOSE_MESSAGE, m.getType()); - assert.strictEqual(3, m.getChannelNumber()); - assert.strictEqual(m.getTarget(), TARGET_ANY); - }); }); describe('decoder', () => { From cbd36b338d38b234adf9d3de2e43852a785797c5 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Wed, 7 Oct 2026 23:28:06 +0200 Subject: [PATCH 6/7] Bump arsenal 8.6.0-preview.5 fix and scubaclient arsenal 8.6.0-preview.4 broke the file metadata backend: batch operations without a type are rejected since the classic-level migration, so the S3 server fails to start. scubaclient 1.2.1 moves to axios 1.20, which fixes quite a few more CVEs. Issue: CLDSRV-1013 --- package.json | 4 ++-- yarn.lock | 33 ++++++++++++--------------------- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index eab8e7e152..8f8e581b8f 100644 --- a/package.json +++ b/package.json @@ -33,10 +33,10 @@ "@opentelemetry/instrumentation-http": "~0.222.0", "@opentelemetry/instrumentation-ioredis": "~0.70.0", "@opentelemetry/instrumentation-mongodb": "~0.75.0", - "@scality/arsenal": "8.6.0-preview.4", + "@scality/arsenal": "8.6.0-preview.5", "@scality/bucketclient": "scality/bucketclient#8.3.0", "@scality/cloudserverclient": "1.0.13", - "@scality/scubaclient": "1.2.0", + "@scality/scubaclient": "1.2.1", "@scality/utapi": "github:scality/utapi#8.4.0", "@smithy/node-http-handler": "^3.0.0", "async": "2.6.4", diff --git a/yarn.lock b/yarn.lock index 1c704ce156..77421698c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1559,10 +1559,10 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@scality/arsenal@8.6.0-preview.4", "@scality/arsenal@^8.6.0-0": - version "8.6.0-preview.4" - resolved "https://registry.yarnpkg.com/@scality/arsenal/-/arsenal-8.6.0-preview.4.tgz#44e412b1220caa51171b8bb26e815ab1463c77d9" - integrity sha512-PmOSuKhKAefNxFRw3fjHdNwZ6YIgj2+Nnj8sEDLRW4dfchCRnNL0aeML8wlvb/BADcTEwcC7bntwT/vaBsVuNA== +"@scality/arsenal@8.6.0-preview.5", "@scality/arsenal@^8.6.0-0": + version "8.6.0-preview.5" + resolved "https://registry.yarnpkg.com/@scality/arsenal/-/arsenal-8.6.0-preview.5.tgz#936e699b5ca494f23ccc2399113a6ee071f0006a" + integrity sha512-YfqqI8D5dvUcYVBRcC39kBA5Ikz3L8wNq9yedBdrg5/skoICGTRuHZwKECeYRagl3XN7fZReoCeY4gSsXWfbKw== dependencies: "@aws-sdk/client-kms" "^3.975.0" "@aws-sdk/client-s3" "^3.975.0" @@ -1646,14 +1646,14 @@ httpagent "github:scality/httpagent#1.1.0" werelogs "github:scality/werelogs#8.2.2" -"@scality/scubaclient@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@scality/scubaclient/-/scubaclient-1.2.0.tgz#d3bd0342d35a9b1049d3037d642fc2ab7a771f1c" - integrity sha512-8pGePyYJkl6A/8K/qeNJMBnGb2d6yA+E813rZbEBHjLRpySyR/KmThMpV2Gj917N8WC8dJ4sxn9D4yjq62gL+Q== +"@scality/scubaclient@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scality/scubaclient/-/scubaclient-1.2.1.tgz#f593c817fcc534db65453ab1d2261ebd7f2b4f83" + integrity sha512-rbo7+D7Upw9x4TyCY9WamF4f8QqQNgivOotVW79kvykxzZlKVYZaprrZgKUS0ut4hvBC03XP9HI0JegAuV25mg== dependencies: "@aws-crypto/sha256-js" "^5.2.0" "@smithy/signature-v4" "^5.3.7" - axios "~1.18.1" + axios "~1.20.0" "@scality/utapi@github:scality/utapi#8.4.0": version "8.4.0" @@ -2505,7 +2505,7 @@ aws4@^1.13.2, aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef" integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== -axios@^1.12.2: +axios@^1.12.2, axios@~1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/axios/-/axios-1.20.0.tgz#515513445aa60e71d04b6521ca6210829ccb4786" integrity sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg== @@ -2515,16 +2515,6 @@ axios@^1.12.2: https-proxy-agent "^5.0.1" proxy-from-env "^2.1.0" -axios@~1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.18.1.tgz#d63f9863bcd8938815c86f9e2abd380189d96dfe" - integrity sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g== - dependencies: - follow-redirects "^1.16.0" - form-data "^4.0.5" - https-proxy-agent "^5.0.1" - proxy-from-env "^2.1.0" - backo@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/backo/-/backo-1.1.0.tgz#a36c4468923f2d265c9e8a709ea56ecdaff807e6" @@ -4158,7 +4148,7 @@ form-data@^2.5.6, form-data@~2.3.2: mime-types "^2.1.35" safe-buffer "^5.2.1" -form-data@^4.0.5, form-data@^4.0.6: +form-data@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.6.tgz#28e864e1b786dbebb68db1f452f9635278665827" integrity sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ== @@ -4576,6 +4566,7 @@ http2-wrapper@^1.0.0-beta.5.2: "httpagent@github:scality/httpagent#1.1.1", httpagent@scality/httpagent#1.1.1: version "1.1.1" + uid "7c6ef8be1cd89b56651f4a922ea5c92d7673ee2e" resolved "https://codeload.github.com/scality/httpagent/tar.gz/7c6ef8be1cd89b56651f4a922ea5c92d7673ee2e" dependencies: agentkeepalive "^4.6.0" From f4110a3079c084fc95246f6b984ca95bb6da799e Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Wed, 7 Oct 2026 15:45:30 +0200 Subject: [PATCH 7/7] Release 9.5.0-preview.5 Issue: CDSRV-1013 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8f8e581b8f..d552f4359b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@scality/cloudserver", - "version": "9.5.0-preview.4", + "version": "9.5.0-preview.5", "description": "Zenko CloudServer, an open-source Node.js implementation of a server handling the Amazon S3 protocol", "main": "index.js", "engines": {