Skip to content

Commit 1321bca

Browse files
committed
CLDSRV-750: replace repeated logic with standardMetadataValidateBucket
1 parent a63c29f commit 1321bca

File tree

7 files changed

+174
-317
lines changed

7 files changed

+174
-317
lines changed

lib/api/bucketDeleteCors.js

Lines changed: 22 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
const { errors } = require('arsenal');
2-
3-
const bucketShield = require('./apiUtils/bucket/bucketShield');
41
const collectCorsHeaders = require('../utilities/collectCorsHeaders');
5-
const { isBucketAuthorized } =
6-
require('./apiUtils/authorization/permissionChecks');
72
const metadata = require('../metadata/wrapper');
3+
const { standardMetadataValidateBucket } = require('../metadata/metadataUtils');
84
const { pushMetric } = require('../utapi/utilities');
95
const monitoring = require('../utilities/monitoringHandler');
106

11-
const requestType = 'bucketDeleteCors';
7+
const REQUEST_TYPE = 'bucketDeleteCors';
8+
const METRICS_ACTION = 'deleteBucketCors';
129

1310
/**
1411
* Bucket Delete CORS - Delete bucket cors configuration
@@ -20,62 +17,40 @@ const requestType = 'bucketDeleteCors';
2017
*/
2118
function bucketDeleteCors(authInfo, request, log, callback) {
2219
const bucketName = request.bucketName;
23-
const canonicalID = authInfo.getCanonicalID();
24-
25-
return metadata.getBucket(bucketName, log, (err, bucket) => {
26-
const corsHeaders = collectCorsHeaders(request.headers.origin,
27-
request.method, bucket);
20+
const metadataValParams = {
21+
authInfo,
22+
bucketName,
23+
requestType: REQUEST_TYPE,
24+
request,
25+
};
26+
27+
return standardMetadataValidateBucket(metadataValParams, request.actionImplicitDenies, log, (err, bucket) => {
28+
const corsHeaders = collectCorsHeaders(request.headers.origin, request.method, bucket);
2829
if (err) {
29-
log.debug('metadata getbucket failed', { error: err });
30-
monitoring.promMetrics('DELETE', bucketName, 400,
31-
'deleteBucketCors');
30+
monitoring.promMetrics('DELETE', bucketName, err.code, METRICS_ACTION);
31+
if (err?.is?.AccessDenied) {
32+
return callback(err, corsHeaders);
33+
}
3234
return callback(err);
3335
}
34-
if (bucketShield(bucket, requestType)) {
35-
monitoring.promMetrics('DELETE', bucketName, 400,
36-
'deleteBucketCors');
37-
return callback(errors.NoSuchBucket);
38-
}
39-
log.trace('found bucket in metadata');
40-
41-
if (!isBucketAuthorized(bucket, request.apiMethods || requestType, canonicalID,
42-
authInfo, log, request, request.actionImplicitDenies)) {
43-
log.debug('access denied for user on bucket', {
44-
requestType,
45-
method: 'bucketDeleteCors',
46-
});
47-
monitoring.promMetrics('DELETE', bucketName, 403,
48-
'deleteBucketCors');
49-
return callback(errors.AccessDenied, corsHeaders);
50-
}
5136

5237
const cors = bucket.getCors();
5338
if (!cors) {
54-
log.trace('no existing cors configuration', {
55-
method: 'bucketDeleteCors',
56-
});
57-
pushMetric('deleteBucketCors', log, {
58-
authInfo,
59-
bucket: bucketName,
60-
});
39+
log.trace('no existing cors configuration', { method: REQUEST_TYPE });
40+
pushMetric(METRICS_ACTION, log, { authInfo, bucket: bucketName });
6141
return callback(null, corsHeaders);
6242
}
6343

6444
log.trace('deleting cors configuration in metadata');
6545
bucket.setCors(null);
6646
return metadata.updateBucket(bucketName, bucket, log, err => {
6747
if (err) {
68-
monitoring.promMetrics('DELETE', bucketName, 400,
69-
'deleteBucketCors');
48+
monitoring.promMetrics('DELETE', bucketName, err.code, METRICS_ACTION);
7049
return callback(err, corsHeaders);
7150
}
72-
pushMetric('deleteBucketCors', log, {
73-
authInfo,
74-
bucket: bucketName,
75-
});
76-
monitoring.promMetrics(
77-
'DELETE', bucketName, '204', 'deleteBucketCors');
78-
return callback(err, corsHeaders);
51+
pushMetric(METRICS_ACTION, log, { authInfo, bucket: bucketName });
52+
monitoring.promMetrics('DELETE', bucketName, '204', METRICS_ACTION);
53+
return callback(null , corsHeaders);
7954
});
8055
});
8156
}

lib/api/bucketDeleteWebsite.js

Lines changed: 21 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,47 @@
1-
const { errors } = require('arsenal');
2-
3-
const bucketShield = require('./apiUtils/bucket/bucketShield');
41
const collectCorsHeaders = require('../utilities/collectCorsHeaders');
5-
const { isBucketAuthorized } =
6-
require('./apiUtils/authorization/permissionChecks');
72
const metadata = require('../metadata/wrapper');
3+
const { standardMetadataValidateBucket } = require('../metadata/metadataUtils');
84
const { pushMetric } = require('../utapi/utilities');
95
const monitoring = require('../utilities/monitoringHandler');
106

11-
const requestType = 'bucketDeleteWebsite';
7+
const REQUEST_TYPE = 'bucketDeleteWebsite';
8+
const METRICS_ACTION = 'deleteBucketWebsite';
129

1310
function bucketDeleteWebsite(authInfo, request, log, callback) {
1411
const bucketName = request.bucketName;
15-
const canonicalID = authInfo.getCanonicalID();
16-
17-
return metadata.getBucket(bucketName, log, (err, bucket) => {
18-
const corsHeaders = collectCorsHeaders(request.headers.origin,
19-
request.method, bucket);
12+
const metadataValParams = {
13+
authInfo,
14+
bucketName,
15+
requestType: REQUEST_TYPE,
16+
request,
17+
};
18+
19+
return standardMetadataValidateBucket(metadataValParams, request.actionImplicitDenies, log, (err, bucket) => {
20+
const corsHeaders = collectCorsHeaders(request.headers.origin, request.method, bucket);
2021
if (err) {
21-
log.debug('metadata getbucket failed', { error: err });
22-
monitoring.promMetrics(
23-
'DELETE', bucketName, err.code, 'deleteBucketWebsite');
22+
monitoring.promMetrics('DELETE', bucketName, err.code, REQUEST_TYPE);
23+
if (err?.is?.AccessDenied) {
24+
return callback(err, corsHeaders);
25+
}
2426
return callback(err);
2527
}
26-
if (bucketShield(bucket, requestType)) {
27-
monitoring.promMetrics(
28-
'DELETE', bucketName, 404, 'deleteBucketWebsite');
29-
return callback(errors.NoSuchBucket);
30-
}
31-
log.trace('found bucket in metadata');
32-
33-
if (!isBucketAuthorized(bucket, request.apiMethods || requestType, canonicalID,
34-
authInfo, log, request, request.actionImplicitDenies)) {
35-
log.debug('access denied for user on bucket', {
36-
requestType,
37-
method: 'bucketDeleteWebsite',
38-
});
39-
monitoring.promMetrics(
40-
'DELETE', bucketName, 403, 'deleteBucketWebsite');
41-
return callback(errors.AccessDenied, corsHeaders);
42-
}
4328

4429
const websiteConfig = bucket.getWebsiteConfiguration();
4530
if (!websiteConfig) {
46-
log.trace('no existing website configuration', {
47-
method: 'bucketDeleteWebsite',
48-
});
49-
pushMetric('deleteBucketWebsite', log, {
50-
authInfo,
51-
bucket: bucketName,
52-
});
31+
log.trace('no existing website configuration', { method: REQUEST_TYPE });
32+
pushMetric(METRICS_ACTION, log, { authInfo, bucket: bucketName });
5333
return callback(null, corsHeaders);
5434
}
5535

5636
log.trace('deleting website configuration in metadata');
5737
bucket.setWebsiteConfiguration(null);
5838
return metadata.updateBucket(bucketName, bucket, log, err => {
5939
if (err) {
60-
monitoring.promMetrics(
61-
'DELETE', bucketName, err.code, 'deleteBucketWebsite');
40+
monitoring.promMetrics('DELETE', bucketName, err.code, METRICS_ACTION);
6241
return callback(err, corsHeaders);
6342
}
64-
pushMetric('deleteBucketWebsite', log, {
65-
authInfo,
66-
bucket: bucketName,
67-
});
68-
monitoring.promMetrics(
69-
'DELETE', bucketName, '200', 'deleteBucketWebsite');
43+
pushMetric(METRICS_ACTION, log, { authInfo, bucket: bucketName });
44+
monitoring.promMetrics('DELETE', bucketName, '200', METRICS_ACTION);
7045
return callback(null, corsHeaders);
7146
});
7247
});

lib/api/bucketGetCors.js

Lines changed: 20 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
const { errors } = require('arsenal');
2-
3-
const bucketShield = require('./apiUtils/bucket/bucketShield');
42
const collectCorsHeaders = require('../utilities/collectCorsHeaders');
53
const { convertToXml } = require('./apiUtils/bucket/bucketCors');
6-
const { isBucketAuthorized } =
7-
require('./apiUtils/authorization/permissionChecks');
8-
const metadata = require('../metadata/wrapper');
4+
const { standardMetadataValidateBucket } = require('../metadata/metadataUtils');
95
const { pushMetric } = require('../utapi/utilities');
106
const monitoring = require('../utilities/monitoringHandler');
117

12-
const requestType = 'bucketGetCors';
8+
const REQUEST_TYPE = 'bucketGetCors';
9+
const METRICS_ACTION = 'getBucketCors';
1310

1411
/**
1512
* Bucket Get CORS - Get bucket cors configuration
@@ -21,52 +18,34 @@ const requestType = 'bucketGetCors';
2118
*/
2219
function bucketGetCors(authInfo, request, log, callback) {
2320
const bucketName = request.bucketName;
24-
const canonicalID = authInfo.getCanonicalID();
25-
26-
metadata.getBucket(bucketName, log, (err, bucket) => {
21+
const metadataValParams = {
22+
authInfo,
23+
bucketName,
24+
requestType: REQUEST_TYPE,
25+
request,
26+
};
27+
28+
return standardMetadataValidateBucket(metadataValParams, request.actionImplicitDenies, log, (err, bucket) => {
29+
const corsHeaders = collectCorsHeaders(request.headers.origin, request.method, bucket);
2730
if (err) {
28-
log.debug('metadata getbucket failed', { error: err });
29-
monitoring.promMetrics(
30-
'GET', bucketName, err.code, 'getBucketCors');
31+
monitoring.promMetrics('GET', bucketName, err.code, METRICS_ACTION);
32+
if (err?.is?.AccessDenied) {
33+
return callback(err, corsHeaders);
34+
}
3135
return callback(err);
3236
}
33-
if (bucketShield(bucket, requestType)) {
34-
monitoring.promMetrics(
35-
'GET', bucketName, 404, 'getBucketCors');
36-
return callback(errors.NoSuchBucket);
37-
}
38-
log.trace('found bucket in metadata');
39-
const corsHeaders = collectCorsHeaders(request.headers.origin,
40-
request.method, bucket);
41-
42-
if (!isBucketAuthorized(bucket, request.apiMethods || requestType, canonicalID,
43-
authInfo, log, request, request.actionImplicitDenies)) {
44-
log.debug('access denied for user on bucket', {
45-
requestType,
46-
method: 'bucketGetCors',
47-
});
48-
monitoring.promMetrics(
49-
'GET', bucketName, 403, 'getBucketCors');
50-
return callback(errors.AccessDenied, null, corsHeaders);
51-
}
5237

5338
const cors = bucket.getCors();
5439
if (!cors) {
55-
log.debug('cors configuration does not exist', {
56-
method: 'bucketGetCors',
57-
});
58-
monitoring.promMetrics(
59-
'GET', bucketName, 404, 'getBucketCors');
40+
log.debug('cors configuration does not exist', { method: REQUEST_TYPE });
41+
monitoring.promMetrics('GET', bucketName, 404, METRICS_ACTION);
6042
return callback(errors.NoSuchCORSConfiguration, null, corsHeaders);
6143
}
6244
log.trace('converting cors configuration to xml');
6345
const xml = convertToXml(cors);
6446

65-
pushMetric('getBucketCors', log, {
66-
authInfo,
67-
bucket: bucketName,
68-
});
69-
monitoring.promMetrics('GET', bucketName, '200', 'getBucketCors');
47+
pushMetric(METRICS_ACTION, log, { authInfo, bucket: bucketName });
48+
monitoring.promMetrics('GET', bucketName, '200', METRICS_ACTION);
7049
return callback(null, xml, corsHeaders);
7150
});
7251
}

lib/api/bucketGetLocation.js

Lines changed: 23 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
1-
const { errors, s3middleware } = require('arsenal');
2-
3-
const bucketShield = require('./apiUtils/bucket/bucketShield');
4-
const { isBucketAuthorized } =
5-
require('./apiUtils/authorization/permissionChecks');
6-
const metadata = require('../metadata/wrapper');
1+
const { s3middleware } = require('arsenal');
2+
const { standardMetadataValidateBucket } = require('../metadata/metadataUtils');
73
const { pushMetric } = require('../utapi/utilities');
84
const escapeForXml = s3middleware.escapeForXml;
95
const collectCorsHeaders = require('../utilities/collectCorsHeaders');
106
const monitoring = require('../utilities/monitoringHandler');
117

12-
const requestType = 'bucketGetLocation';
8+
const REQUEST_TYPE = 'bucketGetLocation';
9+
const METRICS_ACTION = 'getBucketLocation';
1310

1411
/**
1512
* Bucket Get Location - Get bucket locationConstraint configuration
@@ -19,56 +16,38 @@ const requestType = 'bucketGetLocation';
1916
* @param {function} callback - callback to server
2017
* @return {undefined}
2118
*/
22-
2319
function bucketGetLocation(authInfo, request, log, callback) {
2420
const bucketName = request.bucketName;
25-
const canonicalID = authInfo.getCanonicalID();
26-
27-
return metadata.getBucket(bucketName, log, (err, bucket) => {
21+
const metadataValParams = {
22+
authInfo,
23+
bucketName,
24+
requestType: request.apiMethod || REQUEST_TYPE,
25+
request,
26+
};
27+
28+
return standardMetadataValidateBucket(metadataValParams, request.actionImplicitDenies, log, (err, bucket) => {
29+
const corsHeaders = collectCorsHeaders(request.headers.origin, request.method, bucket);
2830
if (err) {
29-
log.debug('metadata getbucket failed', { error: err });
30-
monitoring.promMetrics(
31-
'GET', bucketName, err.code, 'getBucketLocation');
31+
monitoring.promMetrics('GET', bucketName, err.code, METRICS_ACTION);
32+
if (err?.is?.AccessDenied) {
33+
return callback(err, corsHeaders);
34+
}
3235
return callback(err);
3336
}
34-
if (bucketShield(bucket, requestType)) {
35-
monitoring.promMetrics(
36-
'GET', bucketName, 404, 'getBucketLocation');
37-
return callback(errors.NoSuchBucket);
38-
}
39-
log.trace('found bucket in metadata');
40-
41-
const corsHeaders = collectCorsHeaders(request.headers.origin,
42-
request.method, bucket);
43-
44-
if (!isBucketAuthorized(bucket, request.apiMethods || requestType, canonicalID,
45-
authInfo, log, request, request.actionImplicitDenies)) {
46-
log.debug('access denied for account on bucket', {
47-
requestType,
48-
method: 'bucketGetLocation',
49-
});
50-
monitoring.promMetrics(
51-
'GET', bucketName, 403, 'getBucketLocation');
52-
return callback(errors.AccessDenied, null, corsHeaders);
53-
}
5437

5538
let locationConstraint = bucket.getLocationConstraint();
5639
if (!locationConstraint || locationConstraint === 'us-east-1') {
57-
// AWS returns empty string if no region has been
58-
// provided or for us-east-1
59-
// Note: AWS JS SDK sends a request with locationConstraint us-east-1
60-
// if no locationConstraint provided.
40+
// AWS returns empty string if no region has been
41+
// provided or for us-east-1
42+
// Note: AWS JS SDK sends a request with locationConstraint us-east-1
43+
// if no locationConstraint provided.
6144
locationConstraint = '';
6245
}
6346
const xml = `<?xml version="1.0" encoding="UTF-8"?>
6447
<LocationConstraint xmlns="http://s3.amazonaws.com/doc/2006-03-01/">` +
6548
`${escapeForXml(locationConstraint)}</LocationConstraint>`;
66-
pushMetric('getBucketLocation', log, {
67-
authInfo,
68-
bucket: bucketName,
69-
});
70-
monitoring.promMetrics(
71-
'GET', bucketName, '200', 'getBucketLocation');
49+
pushMetric(METRICS_ACTION, log, { authInfo, bucket: bucketName });
50+
monitoring.promMetrics('GET', bucketName, '200', METRICS_ACTION);
7251
return callback(null, xml, corsHeaders);
7352
});
7453
}

0 commit comments

Comments
 (0)