From d0ae11ef265a765de2fb6f775daf66d0e971de11 Mon Sep 17 00:00:00 2001 From: Taylor McKinnon Date: Tue, 1 Apr 2025 14:21:27 -0700 Subject: [PATCH 1/8] impr(CLDSRV-621): Set bucketOwnerId on newly created objects (cherry picked from commit 26009ea6cadd8aa5616e6a2fe84a522afb5c87bb) --- lib/api/apiUtils/object/createAndStoreObject.js | 4 ++++ lib/api/completeMultipartUpload.js | 3 +++ lib/api/objectCopy.js | 5 +++++ lib/services.js | 6 +++++- 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/api/apiUtils/object/createAndStoreObject.js b/lib/api/apiUtils/object/createAndStoreObject.js index 42a5d5711d..ea367b0cbc 100644 --- a/lib/api/apiUtils/object/createAndStoreObject.js +++ b/lib/api/apiUtils/object/createAndStoreObject.js @@ -201,6 +201,10 @@ function createAndStoreObject(bucketName, bucketMD, objectKey, objMD, authInfo, metadataStoreParams.oldReplayId = objMD.uploadId; } + if (authInfo.getCanonicalID() !== bucketMD.getOwner()) { + metadataStoreParams.bucketOwnerId = bucketMD.getOwner(); + } + /* eslint-disable camelcase */ const dontSkipBackend = externalBackends; /* eslint-enable camelcase */ diff --git a/lib/api/completeMultipartUpload.js b/lib/api/completeMultipartUpload.js index df15438c09..ec8081396f 100644 --- a/lib/api/completeMultipartUpload.js +++ b/lib/api/completeMultipartUpload.js @@ -328,6 +328,9 @@ function completeMultipartUpload(authInfo, request, log, callback) { }; setSSEHeaders(responseHeaders, serverSideEncryption, kmsKey); } + if (authInfo.getCanonicalID() !== destBucket.getOwner()) { + metaStoreParams.bucketOwnerId = destBucket.getOwner(); + } return versioningPreprocessing(bucketName, destBucket, objectKey, objMD, log, (err, options) => { if (err) { diff --git a/lib/api/objectCopy.js b/lib/api/objectCopy.js index 70b40267c6..0336604c83 100644 --- a/lib/api/objectCopy.js +++ b/lib/api/objectCopy.js @@ -186,6 +186,11 @@ function _prepMetadata(request, sourceObjMD, headers, sourceIsDestination, if (!storeMetadataParams.contentType) { storeMetadataParams.contentType = sourceObjMD['content-type']; } + + if (authInfo.getCanonicalID() !== destBucketMD.getOwner()) { + storeMetadataParams.bucketOwnerId = destBucketMD.getOwner(); + } + return { storeMetadataParams, sourceLocationConstraintName, backendInfoDest: backendInfoObjDest.backendInfo }; } diff --git a/lib/services.js b/lib/services.js index 3ff8c16877..441361ae12 100644 --- a/lib/services.js +++ b/lib/services.js @@ -107,7 +107,7 @@ const services = { lastModifiedDate, versioning, versionId, uploadId, tagging, taggingCopy, replicationInfo, defaultRetention, dataStoreName, retentionMode, retentionDate, legalHold, - originOp, oldReplayId, deleteNullKey, overheadField } = params; + originOp, oldReplayId, deleteNullKey, overheadField, bucketOwnerId } = params; log.trace('storing object in metadata'); assert.strictEqual(typeof bucketName, 'string'); const md = new ObjectMD(); @@ -241,6 +241,10 @@ const services = { md.setLegalHold(legalHold); } + if (bucketOwnerId) { + md.setBucketOwnerId(bucketOwnerId); + } + log.trace('object metadata', { omVal: md.getValue() }); // If this is not the completion of a multipart upload or // the creation of a delete marker, parse the headers to From d26bb7ed5f5fd164e86b4a8b040a6b5b9e1ad842 Mon Sep 17 00:00:00 2001 From: Taylor McKinnon Date: Tue, 1 Apr 2025 14:21:50 -0700 Subject: [PATCH 2/8] impr(CLDSRV-621): Add bucketOwnerId to requested overhead fields (cherry picked from commit bcae7b562e6719818dc20e1ee1e6e0b42b688703) --- constants.js | 1 + 1 file changed, 1 insertion(+) diff --git a/constants.js b/constants.js index 6b44743554..ca53a29d1d 100644 --- a/constants.js +++ b/constants.js @@ -198,6 +198,7 @@ const constants = { 'versionId', 'isNull', 'isDeleteMarker', + 'bucketOwnerId', ], unsupportedSignatureChecksums: new Set([ 'STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER', From 3ea120e5d7c5ada3b1bdb5e279e1c6a8a53af665 Mon Sep 17 00:00:00 2001 From: Taylor McKinnon Date: Tue, 1 Apr 2025 14:22:20 -0700 Subject: [PATCH 3/8] impr(CLDSRV-621): Set owner-id in CopyPart to match PutPart (cherry picked from commit fe77871a16c9854b385d25e8f46c982cc0681efc) --- lib/api/objectPutCopyPart.js | 1 + lib/services.js | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/api/objectPutCopyPart.js b/lib/api/objectPutCopyPart.js index 289da60d8d..e18ba1870c 100644 --- a/lib/api/objectPutCopyPart.js +++ b/lib/api/objectPutCopyPart.js @@ -329,6 +329,7 @@ function objectPutCopyPart(authInfo, request, sourceBucket, splitter: constants.splitter, lastModified, overheadField: constants.overheadField, + ownerId: destBucketMD.getOwner(), }; return services.metadataStorePart(mpuBucketName, locations, metaStoreParams, log, err => { diff --git a/lib/services.js b/lib/services.js index 441361ae12..906f903554 100644 --- a/lib/services.js +++ b/lib/services.js @@ -734,7 +734,7 @@ const services = { metadataStorePart(mpuBucketName, partLocations, metaStoreParams, log, cb) { assert.strictEqual(typeof mpuBucketName, 'string'); - const { partNumber, contentMD5, size, uploadId, lastModified, splitter, overheadField } + const { partNumber, contentMD5, size, uploadId, lastModified, splitter, overheadField, ownerId } = metaStoreParams; const dateModified = typeof lastModified === 'string' ? lastModified : new Date().toJSON(); @@ -749,6 +749,7 @@ const services = { 'last-modified': dateModified, 'content-md5': contentMD5, 'content-length': size, + 'owner-id': ownerId, }; const params = {}; From 861a69b58a6bfb73c5c04386d21e7240fc78e6d6 Mon Sep 17 00:00:00 2001 From: Taylor McKinnon Date: Tue, 1 Apr 2025 14:23:16 -0700 Subject: [PATCH 4/8] impr(CLDSRV-621): Add tests for bucketOwnerId (cherry picked from commit 3893ec2ce60a5ff9a04d0a0f676f96bfd987c5ac) --- tests/unit/DummyRequest.js | 5 ++ tests/unit/api/multipartUpload.js | 96 +++++++++++++++++++++++++++++++ tests/unit/api/objectCopy.js | 96 ++++++++++++++++++++++++++++++- tests/unit/api/objectCopyPart.js | 17 ++++++ tests/unit/api/objectPut.js | 81 ++++++++++++++++++++++++++ 5 files changed, 294 insertions(+), 1 deletion(-) diff --git a/tests/unit/DummyRequest.js b/tests/unit/DummyRequest.js index 28b21337eb..6189fb8eb0 100644 --- a/tests/unit/DummyRequest.js +++ b/tests/unit/DummyRequest.js @@ -26,6 +26,11 @@ class DummyRequest extends http.IncomingMessage { } this.push(null); } + + _destroy(err, cb) { + // this is a no-op + cb(); + } } module.exports = DummyRequest; diff --git a/tests/unit/api/multipartUpload.js b/tests/unit/api/multipartUpload.js index cf0eace659..a096832233 100644 --- a/tests/unit/api/multipartUpload.js +++ b/tests/unit/api/multipartUpload.js @@ -37,6 +37,7 @@ const log = new DummyRequestLogger(); const splitter = constants.splitter; const canonicalID = 'accessKey1'; const authInfo = makeAuthInfo(canonicalID); +const authInfoOtherAcc = makeAuthInfo('accessKey2'); const namespace = 'default'; const bucketName = 'bucketname'; const lockedBucket = 'objectlockenabledbucket'; @@ -2309,9 +2310,14 @@ describe('complete mpu with bucket policy', () => { beforeEach(done => { cleanup(); + sinon.spy(metadataswitch, 'putObjectMD'); bucketPut(authInfo, bucketPutRequest, log, done); }); + afterEach(() => { + sinon.restore(); + }); + it('should complete with a deny on unrelated object as non root', done => { const bucketPutPolicyRequest = getPolicyRequest({ Version: '2012-10-17', @@ -2378,4 +2384,94 @@ describe('complete mpu with bucket policy', () => { done(); }); }); + + it('should set bucketOwnerId if requester is not destination bucket owner', done => { + const partBody = Buffer.from('I am a part\n', 'utf8'); + const bucketPutPolicyRequest = getPolicyRequest({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Principal: { AWS: `arn:aws:iam::${authInfoOtherAcc.shortid}:root` }, + Action: ['s3:*'], + Resource: `arn:aws:s3:::${bucketName}/*`, + }, + ], + }); + async.waterfall([ + next => bucketPutPolicy(authInfo, bucketPutPolicyRequest, log, next), + (corsHeaders, next) => initiateMultipartUpload(authInfoOtherAcc, + initiateRequest, log, next), + (result, corsHeaders, next) => parseString(result, next), + ], + (err, json) => { + // Need to build request in here since do not have uploadId + // until here + assert.ifError(err); + const testUploadId = + json.InitiateMultipartUploadResult.UploadId[0]; + const md5Hash = crypto.createHash('md5').update(partBody); + const calculatedHash = md5Hash.digest('hex'); + const partRequest = new DummyRequest({ + bucketName, + namespace, + objectKey, + headers: { host: `${bucketName}.s3.amazonaws.com` }, + url: `/${objectKey}?partNumber=1&uploadId=${testUploadId}`, + query: { + partNumber: '1', + uploadId: testUploadId, + }, + // Note that the body of the post set in the request here does + // not really matter in this test. + // The put is not going through the route so the md5 is being + // calculated above and manually being set in the request below. + // What is being tested is that the calculatedHash being sent + // to the API for the part is stored and then used to + // calculate the final ETag upon completion + // of the multipart upload. + calculatedHash, + socket: { + remoteAddress: '1.1.1.1', + }, + }, partBody); + objectPutPart(authInfoOtherAcc, partRequest, undefined, log, err => { + assert.ifError(err); + const completeBody = '' + + '' + + '1' + + `"${calculatedHash}"` + + '' + + ''; + const completeRequest = { + bucketName, + namespace, + objectKey, + parsedHost: 's3.amazonaws.com', + url: `/${objectKey}?uploadId=${testUploadId}`, + headers: { host: `${bucketName}.s3.amazonaws.com` }, + query: { uploadId: testUploadId }, + post: completeBody, + actionImplicitDenies: false, + socket: { + remoteAddress: '1.1.1.1', + }, + }; + completeMultipartUpload(authInfoOtherAcc, + completeRequest, log, err => { + assert.ifError(err); + sinon.assert.calledWith( + metadataswitch.putObjectMD.lastCall, + bucketName, + objectKey, + sinon.match({ bucketOwnerId: authInfo.canonicalId }), + sinon.match.any, + sinon.match.any, + sinon.match.any + ); + done(); + }); + }); + }); + }); }); diff --git a/tests/unit/api/objectCopy.js b/tests/unit/api/objectCopy.js index 8f19d80caf..880e0f9c97 100644 --- a/tests/unit/api/objectCopy.js +++ b/tests/unit/api/objectCopy.js @@ -4,6 +4,7 @@ const sinon = require('sinon'); const { bucketPut } = require('../../../lib/api/bucketPut'); const bucketPutVersioning = require('../../../lib/api/bucketPutVersioning'); +const bucketPutPolicy = require('../../../lib/api/bucketPutPolicy'); const objectPut = require('../../../lib/api/objectPut'); const objectCopy = require('../../../lib/api/objectCopy'); const { ds } = require('arsenal').storage.data.inMemory.datastore; @@ -40,6 +41,7 @@ function _createObjectCopyRequest(destBucketName) { objectKey, headers: {}, url: `/${destBucketName}/${objectKey}`, + socket: {}, }; return new DummyRequest(params); } @@ -63,6 +65,7 @@ describe('objectCopy with versioning', () => { before(done => { cleanup(); + sinon.spy(metadata, 'putObjectMD'); async.series([ callback => bucketPut(authInfo, putDestBucketRequest, log, callback), @@ -91,7 +94,10 @@ describe('objectCopy with versioning', () => { }); }); - after(() => cleanup()); + after(() => { + metadata.putObjectMD.restore(); + cleanup(); + }); it('should delete null version when creating new null version, ' + 'even when null version is not the latest version', done => { @@ -108,6 +114,94 @@ describe('objectCopy with versioning', () => { }); }); }); + + it('should not set bucketOwnerId if requesting account owns dest bucket', done => { + const testObjectCopyRequest = _createObjectCopyRequest(destBucketName); + objectCopy(authInfo, testObjectCopyRequest, sourceBucketName, objectKey, + undefined, log, err => { + assert.ifError(err); + sinon.assert.calledWith( + metadata.putObjectMD.lastCall, + destBucketName, + objectKey, + sinon.match({ _data: { bucketOwnerId: sinon.match.typeOf('undefined') } }), + sinon.match.any, + sinon.match.any, + sinon.match.any + ); + done(); + }); + }); + + // TODO: S3C-9965 + // Skipped because the policy is not checked correctly + // When source bucket policy is checked destination arn is used + it.skip('should set bucketOwnerId if requesting account differs from dest bucket owner', done => { + const authInfo2 = makeAuthInfo('accessKey2'); + const testObjectCopyRequest = _createObjectCopyRequest(destBucketName); + const testPutSrcPolicyRequest = new DummyRequest({ + bucketName: sourceBucketName, + namespace, + headers: { host: `${sourceBucketName}.s3.amazonaws.com` }, + url: '/', + socket: {}, + post: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Sid: 'AllowCrossAccountRead', + Effect: 'Allow', + Principal: { AWS: `arn:aws:iam::${authInfo2.shortid}:root` }, + Action: ['s3:GetObject'], + Resource: [ + `arn:aws:s3:::${sourceBucketName}/*`, + ], + }, + ], + }), + }); + const testPutDestPolicyRequest = new DummyRequest({ + bucketName: destBucketName, + namespace, + headers: { host: `${destBucketName}.s3.amazonaws.com` }, + url: '/', + socket: {}, + post: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Sid: 'AllowCrossAccountWrite', + Effect: 'Allow', + Principal: { AWS: `arn:aws:iam::${authInfo2.shortid}:root` }, + Action: ['s3:PutObject'], + Resource: [ + `arn:aws:s3:::${destBucketName}/*`, + ], + }, + ], + }), + }); + bucketPutPolicy(authInfo, testPutSrcPolicyRequest, log, err => { + assert.ifError(err); + bucketPutPolicy(authInfo, testPutDestPolicyRequest, log, err => { + assert.ifError(err); + objectCopy(authInfo2, testObjectCopyRequest, sourceBucketName, objectKey, + undefined, log, err => { + sinon.assert.calledWith( + metadata.putObjectMD.lastCall, + destBucketName, + objectKey, + sinon.match({ _data: { bucketOwnerId: authInfo.canonicalID } }), + sinon.match.any, + sinon.match.any, + sinon.match.any + ); + assert.ifError(err); + done(); + }); + }); + }); + }); }); describe('non-versioned objectCopy', () => { diff --git a/tests/unit/api/objectCopyPart.js b/tests/unit/api/objectCopyPart.js index 88df569abc..46c95a0452 100644 --- a/tests/unit/api/objectCopyPart.js +++ b/tests/unit/api/objectCopyPart.js @@ -137,4 +137,21 @@ describe('objectCopyPart', () => { done(); }); }); + + it('should set owner-id to the canonicalId of the dest bucket owner', done => { + const testObjectCopyRequest = _createObjectCopyPartRequest(destBucketName, uploadId); + objectPutCopyPart(authInfo, testObjectCopyRequest, sourceBucketName, objectKey, undefined, log, err => { + assert.ifError(err); + sinon.assert.calledWith( + metadataswitch.putObjectMD.lastCall, + sinon.match.string, // MPU shadow bucket + `${uploadId}..|..00001`, + sinon.match({ 'owner-id': authInfo.canonicalID }), + sinon.match.any, + sinon.match.any, + sinon.match.any + ); + done(); + }); + }); }); diff --git a/tests/unit/api/objectPut.js b/tests/unit/api/objectPut.js index 11ec8a33f9..511fdd36f1 100644 --- a/tests/unit/api/objectPut.js +++ b/tests/unit/api/objectPut.js @@ -8,6 +8,7 @@ const { bucketPut } = require('../../../lib/api/bucketPut'); const bucketPutObjectLock = require('../../../lib/api/bucketPutObjectLock'); const bucketPutACL = require('../../../lib/api/bucketPutACL'); const bucketPutVersioning = require('../../../lib/api/bucketPutVersioning'); +const bucketPutPolicy = require('../../../lib/api/bucketPutPolicy'); const { parseTagFromQuery } = s3middleware.tagging; const { cleanup, DummyRequestLogger, makeAuthInfo, versioningTestUtils } = require('../helpers'); @@ -634,6 +635,86 @@ describe('objectPut API', () => { }); }); }); + + it('should not set bucketOwnerId if requester owns the bucket', done => { + const testPutObjectRequest = new DummyRequest({ + bucketName, + namespace, + objectKey: objectName, + headers: {}, + url: `/${bucketName}/${objectName}`, + calculatedHash: 'vnR+tLdVF79rPPfF+7YvOg==', + }, postBody); + + bucketPut(authInfo, testPutBucketRequest, log, () => { + objectPut(authInfo, testPutObjectRequest, undefined, log, + err => { + assert.ifError(err); + sinon.assert.calledWith(metadata.putObjectMD.lastCall, + bucketName, + objectName, + sinon.match({ bucketOwnerId: sinon.match.typeOf('undefined') }), + any, + any, + any + ); + done(); + } + ); + }); + }); + + it('should set bucketOwnerId if requester does not own the bucket', done => { + const authInfo2 = makeAuthInfo('accessKey2'); + + const testPutObjectRequest = new DummyRequest({ + bucketName, + namespace, + objectKey: objectName, + headers: {}, + url: `/${bucketName}/${objectName}`, + calculatedHash: 'vnR+tLdVF79rPPfF+7YvOg==', + }, postBody); + + const testPutPolicyRequest = new DummyRequest({ + bucketName, + namespace, + headers: { host: `${bucketName}.s3.amazonaws.com` }, + url: '/', + post: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Sid: 'AllowCrossAccountReadWrite', + Effect: 'Allow', + Principal: { AWS: `arn:aws:iam::${authInfo2.shortid}:root` }, + Action: ['s3:PutObject'], + Resource: [`arn:aws:s3:::${bucketName}/*`], + }, + ], + }), + }); + + bucketPut(authInfo, testPutBucketRequest, log, () => { + bucketPutPolicy(authInfo, testPutPolicyRequest, log, err => { + assert.ifError(err); + objectPut(authInfo, testPutObjectRequest, undefined, log, + err => { + assert.ifError(err); + sinon.assert.calledWith(metadata.putObjectMD.lastCall, + bucketName, + objectName, + sinon.match({ bucketOwnerId: authInfo.canonicalId }), + any, + any, + any + ); + done(); + } + ); + }); + }); + }); }); describe('objectPut API with versioning', () => { From b5f35c09acd8dda6e41d9eb84e382dceebcdf3d9 Mon Sep 17 00:00:00 2001 From: Mickael Bourgois Date: Fri, 20 Jun 2025 19:24:15 +0200 Subject: [PATCH 5/8] CLDSRV-621: Fix backported tests --- tests/unit/api/multipartUpload.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/unit/api/multipartUpload.js b/tests/unit/api/multipartUpload.js index a096832233..72dcbdecd4 100644 --- a/tests/unit/api/multipartUpload.js +++ b/tests/unit/api/multipartUpload.js @@ -2401,7 +2401,7 @@ describe('complete mpu with bucket policy', () => { async.waterfall([ next => bucketPutPolicy(authInfo, bucketPutPolicyRequest, log, next), (corsHeaders, next) => initiateMultipartUpload(authInfoOtherAcc, - initiateRequest, log, next), + initiateReqFixed, log, next), (result, corsHeaders, next) => parseString(result, next), ], (err, json) => { @@ -2412,7 +2412,7 @@ describe('complete mpu with bucket policy', () => { json.InitiateMultipartUploadResult.UploadId[0]; const md5Hash = crypto.createHash('md5').update(partBody); const calculatedHash = md5Hash.digest('hex'); - const partRequest = new DummyRequest({ + const partRequest = new DummyRequest(Object.assign({ bucketName, namespace, objectKey, @@ -2434,7 +2434,7 @@ describe('complete mpu with bucket policy', () => { socket: { remoteAddress: '1.1.1.1', }, - }, partBody); + }, requestFix), partBody); objectPutPart(authInfoOtherAcc, partRequest, undefined, log, err => { assert.ifError(err); const completeBody = '' + @@ -2443,7 +2443,7 @@ describe('complete mpu with bucket policy', () => { `"${calculatedHash}"` + '' + ''; - const completeRequest = { + const completeRequest = new DummyRequest(Object.assign({ bucketName, namespace, objectKey, @@ -2456,7 +2456,7 @@ describe('complete mpu with bucket policy', () => { socket: { remoteAddress: '1.1.1.1', }, - }; + }, requestFix)); completeMultipartUpload(authInfoOtherAcc, completeRequest, log, err => { assert.ifError(err); From 53b145c23cae04bacd8a14f3c39c9e7f1b8f9d96 Mon Sep 17 00:00:00 2001 From: Mickael Bourgois Date: Fri, 20 Jun 2025 19:11:03 +0200 Subject: [PATCH 6/8] CLDSRV-621: Bump arsenal --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index a011d0e273..782f9f7db9 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "homepage": "https://github.com/scality/S3#readme", "dependencies": { "@hapi/joi": "^17.1.0", - "arsenal": "git+https://github.com/scality/Arsenal#7.70.46", + "arsenal": "git+https://github.com/scality/Arsenal#7.70.47", "async": "~2.5.0", "aws-sdk": "2.905.0", "azure-storage": "^2.1.0", diff --git a/yarn.lock b/yarn.lock index 8e15576cd0..1492ded08a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -501,9 +501,9 @@ arraybuffer.slice@~0.0.7: optionalDependencies: ioctl "^2.0.2" -"arsenal@git+https://github.com/scality/Arsenal#7.70.46": - version "7.70.46" - resolved "git+https://github.com/scality/Arsenal#b017a414d9952779ad9f0b65ec2dfc27e5d81d0f" +"arsenal@git+https://github.com/scality/Arsenal#7.70.47": + version "7.70.47" + resolved "git+https://github.com/scality/Arsenal#6ff3267c33ceee0e4af3aa7757f0a17a5d53db54" dependencies: "@js-sdsl/ordered-set" "^4.4.2" "@types/async" "^3.2.12" From 612b824d9aac92bac1ab8bdce6ba001bdd1c7d8e Mon Sep 17 00:00:00 2001 From: Mickael Bourgois Date: Fri, 20 Jun 2025 20:04:25 +0200 Subject: [PATCH 7/8] CLDSRV-621: Bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 782f9f7db9..37ef7f851a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "s3", - "version": "7.70.71", + "version": "7.70.72", "description": "S3 connector", "main": "index.js", "engines": { From 3bd57618142b69106b960df54f2fa106cead2aee Mon Sep 17 00:00:00 2001 From: Mickael Bourgois Date: Fri, 20 Jun 2025 20:22:08 +0200 Subject: [PATCH 8/8] CLDSRV-621: Bump arsenal --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index c4ad40744f..dfa8b356ec 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dependencies": { "@azure/storage-blob": "^12.12.0", "@hapi/joi": "^17.1.0", - "arsenal": "git+https://github.com/scality/arsenal#8.1.158", + "arsenal": "git+https://github.com/scality/arsenal#8.1.159", "async": "~2.5.0", "aws-sdk": "2.905.0", "bucketclient": "scality/bucketclient#8.1.14", diff --git a/yarn.lock b/yarn.lock index 5ad5b1d2d0..91df06ab51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1222,9 +1222,9 @@ arraybuffer.slice@~0.0.7: optionalDependencies: ioctl "^2.0.2" -"arsenal@git+https://github.com/scality/arsenal#8.1.158": - version "8.1.158" - resolved "git+https://github.com/scality/arsenal#92e4c51bb1691d37f289fa20b694d94801d271e5" +"arsenal@git+https://github.com/scality/arsenal#8.1.159": + version "8.1.159" + resolved "git+https://github.com/scality/arsenal#c1ff3cefdc73602fdbcb73d19edbbf0e8de23e99" dependencies: "@azure/identity" "^3.1.1" "@azure/storage-blob" "^12.12.0"