|
2 | 2 | const getConfig = require('../aws-node-sdk/test/support/config');
|
3 | 3 | const { S3 } = require('aws-sdk');
|
4 | 4 | const kms = require('../../../lib/kms/wrapper');
|
| 5 | +const filekms = require('../../../lib/kms/file/backend'); |
5 | 6 | const { promisify } = require('util');
|
6 | 7 | const BucketInfo = require('arsenal').models.BucketInfo;
|
7 | 8 | const { DummyRequestLogger } = require('../../unit/helpers');
|
@@ -65,8 +66,7 @@ kms.client._supportsDefaultKeyPerAccount = false; // To generate keys without va
|
65 | 66 | // Fix for before migration run
|
66 | 67 | // if (!kms.arnPrefix) kms.arnPrefix = '';
|
67 | 68 |
|
68 |
| -const memKms = require('../../../lib/kms/in_memory/backend').backend; |
69 |
| - |
| 69 | +const fileKmsPrefix = filekms.backend.arnPrefix; |
70 | 70 |
|
71 | 71 | function hydrateSSEConfig({ algo: SSEAlgorithm, masterKeyId: KMSMasterKeyID }) {
|
72 | 72 | // stringify and parse to strip undefined values
|
@@ -123,6 +123,41 @@ async function putEncryptedObject(Bucket, Key, sseConfig, kmsKeyId, Body) {
|
123 | 123 | }).promise();
|
124 | 124 | }
|
125 | 125 |
|
| 126 | +async function assertObjectSSEMigrationFILE(Bucket, Key, objConf, obj, bktConf, bkt, VersionId, Body) { |
| 127 | + const sseMD = await getObjectMDSSE(Bucket, Key); |
| 128 | + const head = await s3.headObject({ Bucket, Key, VersionId }).promise(); |
| 129 | + const sseMDMigrated = await getObjectMDSSE(Bucket, Key); |
| 130 | + const expectedKey = `${sseMD.SSEKMSKeyId && sseMD.SSEKMSKeyId.startsWith('arn:scality:kms') |
| 131 | + ? '' : fileKmsPrefix}${sseMD.SSEKMSKeyId}`; |
| 132 | + |
| 133 | + if (sseMD.SSEKMSKeyId) { |
| 134 | + // assert.doesNotMatch(sseMD.SSEKMSKeyId, /^arn:scality:kms/); |
| 135 | + } |
| 136 | + |
| 137 | + // obj precedence over bkt |
| 138 | + assert.strictEqual(head.ServerSideEncryption, (objConf.algo || bktConf.algo)); |
| 139 | + |
| 140 | + if (sseMDMigrated.SSEKMSKeyId) { |
| 141 | + assert.strictEqual(sseMDMigrated.SSEKMSKeyId, expectedKey); |
| 142 | + } |
| 143 | + |
| 144 | + if (obj.kmsKey) { |
| 145 | + assert.strictEqual(head.SSEKMSKeyId, getKey(expectedKey)); |
| 146 | + } else if (objConf.algo !== 'AES256' && bkt.kmsKey) { |
| 147 | + assert.strictEqual(head.SSEKMSKeyId, getKey(expectedKey)); |
| 148 | + } else if (head.ServerSideEncryption === 'aws:kms') { |
| 149 | + // We differ from aws behavior and always return a |
| 150 | + // masterKeyId even when not explicitly configured. |
| 151 | + assert.strictEqual(head.SSEKMSKeyId, getKey(expectedKey)); |
| 152 | + } else { |
| 153 | + assert.strictEqual(head.SSEKMSKeyId, undefined); |
| 154 | + } |
| 155 | + |
| 156 | + // always verify GetObject as well to ensure acurate decryption |
| 157 | + const get = await s3.getObject({ Bucket, Key, ...(VersionId && { VersionId }) }).promise(); |
| 158 | + assert.strictEqual(get.Body.toString(), Body); |
| 159 | +} |
| 160 | + |
126 | 161 | async function assertObjectSSEMigration(Bucket, Key, objConf, obj, bktConf, bkt, VersionId, Body) {
|
127 | 162 | const sseMD = await getObjectMDSSE(Bucket, Key);
|
128 | 163 | const head = await s3.headObject({ Bucket, Key, VersionId }).promise();
|
@@ -298,7 +333,7 @@ describe('SSE KMS migration', () => {
|
298 | 333 |
|
299 | 334 | testCasesObj.forEach(objConf => it(`should have pre uploaded object with SSE ${objConf.name}`, async () => {
|
300 | 335 | const obj = bkt.objs[objConf.name];
|
301 |
| - void await assertObjectSSEMigration(bkt.name, obj.name, objConf, obj, bktConf, bkt, null, obj.body); |
| 336 | + void await assertObjectSSEMigrationFILE(bkt.name, obj.name, objConf, obj, bktConf, bkt, null, obj.body); |
302 | 337 | }));
|
303 | 338 |
|
304 | 339 | testCasesObj.forEach(objConf => describe(`object enc-obj-${objConf.name}`, () => {
|
@@ -336,19 +371,19 @@ describe('SSE KMS migration', () => {
|
336 | 371 | const mpuKey = `${obj.name}-mpu`;
|
337 | 372 |
|
338 | 373 | const fullBody = `${obj.body}-MPU1${obj.body}-MPU2`;
|
339 |
| - void await assertObjectSSEMigration(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
| 374 | + void await assertObjectSSEMigrationFILE(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
340 | 375 | });
|
341 | 376 |
|
342 | 377 | optionalSkip('should migrate completed MPU that had copy', async () => {
|
343 | 378 | const mpuKey = `${obj.name}-mpucopy`;
|
344 | 379 | const fullBody = `BODY(copy)${obj.body}-MPU2`;
|
345 |
| - void await assertObjectSSEMigration(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
| 380 | + void await assertObjectSSEMigrationFILE(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
346 | 381 | });
|
347 | 382 |
|
348 | 383 | optionalSkip('should migrate completed MPU that had byte range copy', async () => {
|
349 | 384 | const mpuKey = `${obj.name}-mpucopyrange`;
|
350 | 385 | const fullBody = 'copyBODY';
|
351 |
| - void await assertObjectSSEMigration(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
| 386 | + void await assertObjectSSEMigrationFILE(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
352 | 387 | });
|
353 | 388 | const mpus = {};
|
354 | 389 | before('retrieve MPUS', async () => {
|
@@ -399,7 +434,7 @@ describe('SSE KMS migration', () => {
|
399 | 434 | }).promise();
|
400 | 435 | // console.log('complete', complete);
|
401 | 436 | const fullBody = `${obj.body}-MPU1${obj.body}-MPU2`;
|
402 |
| - void await assertObjectSSEMigration(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
| 437 | + void await assertObjectSSEMigrationFILE(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
403 | 438 | });
|
404 | 439 |
|
405 | 440 | optionalSkip('should prepare encrypte MPU and put 2 encrypted parts without completion', async () => {
|
@@ -444,7 +479,7 @@ describe('SSE KMS migration', () => {
|
444 | 479 | }).promise();
|
445 | 480 | // console.log('complete', complete);
|
446 | 481 | const fullBody = `${obj.body}-MPU1${obj.body}-MPU2`.repeat(2);
|
447 |
| - void await assertObjectSSEMigration(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
| 482 | + void await assertObjectSSEMigrationFILE(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
448 | 483 | });
|
449 | 484 |
|
450 | 485 | optionalSkip('should prepare encrypted MPU and copy an encrypted parts from encrypted bucket without completion', async () => {
|
@@ -490,7 +525,7 @@ describe('SSE KMS migration', () => {
|
490 | 525 | }).promise();
|
491 | 526 | // console.log('complete', complete);
|
492 | 527 | const fullBody = `BODY(copy)${obj.body}-MPU2`.repeat(2);
|
493 |
| - void await assertObjectSSEMigration(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
| 528 | + void await assertObjectSSEMigrationFILE(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
494 | 529 | });
|
495 | 530 |
|
496 | 531 | optionalSkip('should prepare encrypte MPU and copy an encrypted range parts from encrypted bucket without completion', async () => {
|
@@ -537,7 +572,7 @@ describe('SSE KMS migration', () => {
|
537 | 572 | }).promise();
|
538 | 573 | // console.log('complete', complete);
|
539 | 574 | const fullBody = 'copyBODY'.repeat(2);
|
540 |
| - void await assertObjectSSEMigration(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
| 575 | + void await assertObjectSSEMigrationFILE(bkt.name, mpuKey, objConf, obj, bktConf, bkt, null, fullBody); |
541 | 576 | });
|
542 | 577 |
|
543 | 578 | it(`should CopyObject ${obj.name} into encrypted destination bucket`, async () => {
|
@@ -706,6 +741,6 @@ describe('SSE KMS migration', () => {
|
706 | 741 | }).promise();
|
707 | 742 | // console.log('complete', complete);
|
708 | 743 | const fullBody = parts.reduce((acc, part) => `${acc}${part.body}`, '').repeat(2);
|
709 |
| - void await assertObjectSSEMigration(mpuCopyBkt, mpuKey, {}, {}, { algo: 'AES256' }, {}, null, fullBody); |
| 744 | + void await assertObjectSSEMigrationFILE(mpuCopyBkt, mpuKey, {}, {}, { algo: 'AES256' }, {}, null, fullBody); |
710 | 745 | });
|
711 | 746 | });
|
0 commit comments