Skip to content

Commit 9e85e8d

Browse files
committed
Merge branch 'bugfix/CLDSRV-246/objectPutVersion' into q/8.5
2 parents bcb879c + f3f4937 commit 9e85e8d

File tree

2 files changed

+160
-23
lines changed

2 files changed

+160
-23
lines changed

lib/api/apiUtils/authorization/prepareRequestContexts.js

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -103,39 +103,42 @@ function prepareRequestContexts(apiMethod, request, sourceBucket,
103103
generateRequestContext(objectGetTaggingAction);
104104
requestContexts.push(getRequestContext, getTaggingRequestContext);
105105
} else if (apiMethodAfterVersionCheck === 'objectPut') {
106-
const putRequestContext =
107-
generateRequestContext(apiMethodAfterVersionCheck);
108-
requestContexts.push(putRequestContext);
109-
// if put object (versioning) with tag set
110-
if (request.headers['x-amz-tagging']) {
111-
const putTaggingRequestContext =
112-
generateRequestContext('objectPutTagging');
113-
requestContexts.push(putTaggingRequestContext);
114-
}
115-
// if put object (versioning) with ACL
116-
if (isHeaderAcl(request.headers)) {
117-
const putAclRequestContext =
118-
generateRequestContext('objectPutACL');
119-
requestContexts.push(putAclRequestContext);
120-
}
121106
// if put object with version
122107
if (request.headers['x-scal-s3-version-id'] ||
123108
request.headers['x-scal-s3-version-id'] === '') {
124-
// CLDSRV-245
125-
// const putVersionRequestContext =
126-
// generateRequestContext('objectPutVersion');
127-
// requestContexts.push(putVersionRequestContext);
109+
const putVersionRequestContext =
110+
generateRequestContext('objectPutVersion');
111+
requestContexts.push(putVersionRequestContext);
112+
} else {
113+
const putRequestContext =
114+
generateRequestContext(apiMethodAfterVersionCheck);
115+
requestContexts.push(putRequestContext);
116+
// if put object (versioning) with tag set
117+
if (request.headers['x-amz-tagging']) {
118+
const putTaggingRequestContext =
119+
generateRequestContext('objectPutTagging');
120+
requestContexts.push(putTaggingRequestContext);
121+
}
122+
// if put object (versioning) with ACL
123+
if (isHeaderAcl(request.headers)) {
124+
const putAclRequestContext =
125+
generateRequestContext('objectPutACL');
126+
requestContexts.push(putAclRequestContext);
127+
}
128128
}
129129
} else if (apiMethodAfterVersionCheck === 'initiateMultipartUpload' ||
130130
apiMethodAfterVersionCheck === 'objectPutPart' ||
131131
apiMethodAfterVersionCheck === 'completeMultipartUpload'
132132
) {
133133
if (request.headers['x-scal-s3-version-id'] ||
134134
request.headers['x-scal-s3-version-id'] === '') {
135-
// CLDSRV-245
136-
// const putVersionRequestContext =
137-
// generateRequestContext('objectPutVersion');
138-
// requestContexts.push(putVersionRequestContext);
135+
const putVersionRequestContext =
136+
generateRequestContext('objectPutVersion');
137+
requestContexts.push(putVersionRequestContext);
138+
} else {
139+
const putRequestContext =
140+
generateRequestContext(apiMethodAfterVersionCheck);
141+
requestContexts.push(putRequestContext);
139142
}
140143
} else {
141144
const requestContext =
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
const assert = require('assert');
2+
const DummyRequest = require('../../../DummyRequest');
3+
const prepareRequestContexts =
4+
require('../../../../../lib/api/apiUtils/authorization/prepareRequestContexts.js');
5+
6+
const makeRequest = (headers, query) => new DummyRequest({
7+
headers,
8+
url: '/',
9+
parsedHost: 'localhost',
10+
socket: {},
11+
query,
12+
});
13+
const sourceBucket = 'bucketsource';
14+
const sourceObject = 'objectsource';
15+
const sourceVersionId = 'vid1';
16+
17+
describe('prepareRequestContexts', () => {
18+
it('should return null if multiObjectDelete method', () => {
19+
const apiMethod = 'multiObjectDelete';
20+
const request = makeRequest();
21+
const results = prepareRequestContexts(apiMethod, request, sourceBucket,
22+
sourceObject, sourceVersionId);
23+
24+
assert.strictEqual(results, null);
25+
});
26+
27+
it('should return s3:PutObjectVersion request context action for objectPut method with x-scal-s3-version-id' +
28+
' header', () => {
29+
const apiMethod = 'objectPut';
30+
const request = makeRequest({
31+
'x-scal-s3-version-id': 'vid',
32+
});
33+
const results = prepareRequestContexts(apiMethod, request, sourceBucket,
34+
sourceObject, sourceVersionId);
35+
36+
assert.strictEqual(results.length, 1);
37+
const expectedAction = 's3:PutObjectVersion';
38+
assert.strictEqual(results[0].getAction(), expectedAction);
39+
});
40+
41+
it('should return s3:PutObjectVersion request context action for objectPut method with empty x-scal-s3-version-id' +
42+
' header', () => {
43+
const apiMethod = 'objectPut';
44+
const request = makeRequest({
45+
'x-scal-s3-version-id': '',
46+
});
47+
const results = prepareRequestContexts(apiMethod, request, sourceBucket,
48+
sourceObject, sourceVersionId);
49+
50+
assert.strictEqual(results.length, 1);
51+
const expectedAction = 's3:PutObjectVersion';
52+
assert.strictEqual(results[0].getAction(), expectedAction);
53+
});
54+
55+
it('should return s3:PutObject request context action for objectPut method and no header', () => {
56+
const apiMethod = 'objectPut';
57+
const request = makeRequest({});
58+
const results = prepareRequestContexts(apiMethod, request, sourceBucket,
59+
sourceObject, sourceVersionId);
60+
61+
assert.strictEqual(results.length, 1);
62+
const expectedAction = 's3:PutObject';
63+
assert.strictEqual(results[0].getAction(), expectedAction);
64+
});
65+
66+
it('should return s3:PutObject and s3:PutObjectTagging actions for objectPut method with' +
67+
' x-amz-tagging header', () => {
68+
const apiMethod = 'objectPut';
69+
const request = makeRequest({
70+
'x-amz-tagging': 'key1=value1&key2=value2',
71+
});
72+
const results = prepareRequestContexts(apiMethod, request, sourceBucket,
73+
sourceObject, sourceVersionId);
74+
75+
assert.strictEqual(results.length, 2);
76+
const expectedAction1 = 's3:PutObject';
77+
const expectedAction2 = 's3:PutObjectTagging';
78+
assert.strictEqual(results[0].getAction(), expectedAction1);
79+
assert.strictEqual(results[1].getAction(), expectedAction2);
80+
});
81+
82+
it('should return s3:PutObject and s3:PutObjectAcl actions for objectPut method with ACL header', () => {
83+
const apiMethod = 'objectPut';
84+
const request = makeRequest({
85+
'x-amz-acl': 'private',
86+
});
87+
const results = prepareRequestContexts(apiMethod, request, sourceBucket,
88+
sourceObject, sourceVersionId);
89+
90+
assert.strictEqual(results.length, 2);
91+
const expectedAction1 = 's3:PutObject';
92+
const expectedAction2 = 's3:PutObjectAcl';
93+
assert.strictEqual(results[0].getAction(), expectedAction1);
94+
assert.strictEqual(results[1].getAction(), expectedAction2);
95+
});
96+
97+
['initiateMultipartUpload', 'objectPutPart', 'completeMultipartUpload'].forEach(apiMethod => {
98+
it(`should return s3:PutObjectVersion request context action for ${apiMethod} method ` +
99+
'with x-scal-s3-version-id header', () => {
100+
const request = makeRequest({
101+
'x-scal-s3-version-id': '',
102+
});
103+
const results = prepareRequestContexts(apiMethod, request, sourceBucket,
104+
sourceObject, sourceVersionId);
105+
106+
assert.strictEqual(results.length, 1);
107+
const expectedAction = 's3:PutObjectVersion';
108+
assert.strictEqual(results[0].getAction(), expectedAction);
109+
});
110+
111+
it(`should return s3:PutObjectVersion request context action for ${apiMethod} method` +
112+
'with empty x-scal-s3-version-id header', () => {
113+
const request = makeRequest({
114+
'x-scal-s3-version-id': '',
115+
});
116+
const results = prepareRequestContexts(apiMethod, request, sourceBucket,
117+
sourceObject, sourceVersionId);
118+
119+
assert.strictEqual(results.length, 1);
120+
const expectedAction = 's3:PutObjectVersion';
121+
assert.strictEqual(results[0].getAction(), expectedAction);
122+
});
123+
124+
it(`should return s3:PutObject request context action for ${apiMethod} method and no header`, () => {
125+
const request = makeRequest({});
126+
const results = prepareRequestContexts(apiMethod, request, sourceBucket,
127+
sourceObject, sourceVersionId);
128+
129+
assert.strictEqual(results.length, 1);
130+
const expectedAction = 's3:PutObject';
131+
assert.strictEqual(results[0].getAction(), expectedAction);
132+
});
133+
});
134+
});

0 commit comments

Comments
 (0)