1- const async = require ( 'async' ) ;
21const { errors, errorInstances, s3middleware } = require ( 'arsenal' ) ;
32
43const { decodeVersionId, getVersionIdResHeader }
@@ -15,26 +14,21 @@ const { convertToXml } = s3middleware.objectLegalHold;
1514 * @param {AuthInfo } authInfo - Instance of AuthInfo class with requester's info
1615 * @param {object } request - http request object
1716 * @param {object } log - Werelogs logger
18- * @param {function } callback - callback to server
19- * @return {undefined }
17+ * @return {Promise<object> } - object containing xml and additionalResHeaders
2018 */
21- function objectGetLegalHold ( authInfo , request , log , callback ) {
19+ async function objectGetLegalHold ( authInfo , request , log , callback ) {
2220 log . debug ( 'processing request' , { method : 'objectGetLegalHold' } ) ;
2321
2422 const { bucketName, objectKey, query } = request ;
2523
2624 const decodedVidResult = decodeVersionId ( query ) ;
2725 if ( decodedVidResult instanceof Error ) {
28- log . trace ( 'invalid versionId query' , {
29- versionId : query . versionId ,
30- error : decodedVidResult ,
31- } ) ;
26+ log . trace ( 'invalid versionId query' , { versionId : query . versionId , error : decodedVidResult } ) ;
3227 return process . nextTick ( ( ) => callback ( decodedVidResult ) ) ;
3328 }
3429 const versionId = decodedVidResult ;
3530
36- // FIXME pass 'getDeleteMarker: true' option to set
37- // 'x-amz-delete-marker' header (see S3C-7592)
31+ // FIXME pass 'getDeleteMarker: true' option to set 'x-amz-delete-marker' header (see S3C-7592)
3832 const metadataValParams = {
3933 authInfo,
4034 bucketName,
@@ -44,71 +38,69 @@ function objectGetLegalHold(authInfo, request, log, callback) {
4438 request,
4539 } ;
4640
47- return async . waterfall ( [
48- next => standardMetadataValidateBucketAndObj ( metadataValParams , request . actionImplicitDenies , log ,
49- ( err , bucket , objectMD ) => {
50- if ( err ) {
51- log . trace ( 'request authorization failed' ,
52- { method : 'objectGetLegalHold' , error : err } ) ;
53- return next ( err ) ;
54- }
55- if ( ! objectMD ) {
56- const err = versionId ? errors . NoSuchVersion :
57- errors . NoSuchKey ;
58- log . trace ( 'error no object metadata found' ,
59- { method : 'objectGetLegalHold' , error : err } ) ;
60- return next ( err , bucket ) ;
61- }
62- if ( objectMD . isDeleteMarker ) {
63- if ( versionId ) {
64- log . trace ( 'requested version is delete marker' ,
65- { method : 'objectGetLegalHold' } ) ;
66- // FIXME we should return a `x-amz-delete-marker: true` header,
67- // see S3C-7592
68- return next ( errors . MethodNotAllowed ) ;
41+ let bucket ;
42+ let objectMD ;
43+
44+ try {
45+ ( { bucket, objectMD } = await new Promise ( ( resolve , reject ) => {
46+ standardMetadataValidateBucketAndObj (
47+ metadataValParams , request . actionImplicitDenies , log ,
48+ ( err , bucket , objectMD ) => {
49+ if ( err ) {
50+ log . trace ( 'request authorization failed' , { method : 'objectGetLegalHold' , error : err } ) ;
51+ return reject ( err ) ;
6952 }
70- log . trace ( 'most recent version is delete marker' ,
71- { method : 'objectGetLegalHold' } ) ;
72- // FIXME we should return a `x-amz-delete-marker: true` header,
73- // see S3C-7592
74- return next ( errors . NoSuchKey ) ;
75- }
76- if ( ! bucket . isObjectLockEnabled ( ) ) {
77- log . trace ( 'object lock not enabled on bucket' ,
78- { method : 'objectGetRetention' } ) ;
79- return next ( errorInstances . InvalidRequest . customizeDescription (
80- 'Bucket is missing Object Lock Configuration' ) ) ;
81- }
82- return next ( null , bucket , objectMD ) ;
83- } ) ,
84- ( bucket , objectMD , next ) => {
85- const { legalHold } = objectMD ;
86- const xml = convertToXml ( legalHold ) ;
87- if ( xml === '' ) {
88- return next ( errors . NoSuchObjectLockConfiguration ) ;
53+ return resolve ( { bucket, objectMD } ) ;
54+ } ) ;
55+ } ) ) ;
56+
57+ if ( ! objectMD ) {
58+ const err = versionId ? errors . NoSuchVersion : errors . NoSuchKey ;
59+ log . trace ( 'error no object metadata found' , { method : 'objectGetLegalHold' , error : err } ) ;
60+ throw err ;
61+ }
62+
63+ if ( objectMD . isDeleteMarker ) {
64+ if ( versionId ) {
65+ log . trace ( 'requested version is delete marker' , { method : 'objectGetLegalHold' } ) ;
66+ // FIXME we should return a `x-amz-delete-marker: true` header, see S3C-7592
67+ throw errors . MethodNotAllowed ;
8968 }
90- return next ( null , bucket , xml , objectMD ) ;
91- } ,
92- ] , ( err , bucket , xml , objectMD ) => {
93- const additionalResHeaders = collectCorsHeaders ( request . headers . origin ,
94- request . method , bucket ) ;
95- if ( err ) {
96- log . trace ( 'error processing request' , { error : err ,
97- method : 'objectGetLegalHold' } ) ;
98- } else {
99- pushMetric ( 'getObjectLegalHold' , log , {
100- authInfo,
101- bucket : bucketName ,
102- keys : [ objectKey ] ,
103- versionId : objectMD ? objectMD . versionId : undefined ,
104- location : objectMD ? objectMD . dataStoreName : undefined ,
105- } ) ;
106- const verCfg = bucket . getVersioningConfiguration ( ) ;
107- additionalResHeaders [ 'x-amz-version-id' ] =
108- getVersionIdResHeader ( verCfg , objectMD ) ;
69+
70+ log . trace ( 'most recent version is delete marker' , { method : 'objectGetLegalHold' } ) ;
71+ // FIXME we should return a `x-amz-delete-marker: true` header, see S3C-7592
72+ throw errors . NoSuchKey ;
73+ }
74+
75+ if ( ! bucket . isObjectLockEnabled ( ) ) {
76+ log . trace ( 'object lock not enabled on bucket' , { method : 'objectGetRetention' } ) ;
77+ throw errorInstances . InvalidRequest . customizeDescription ( 'Bucket is missing Object Lock Configuration' ) ;
10978 }
110- return callback ( err , xml , additionalResHeaders ) ;
111- } ) ;
79+
80+ const { legalHold } = objectMD ;
81+ const xml = convertToXml ( legalHold ) ;
82+ if ( xml === '' ) {
83+ throw errors . NoSuchObjectLockConfiguration ;
84+ }
85+
86+ const additionalResHeaders = collectCorsHeaders ( request . headers . origin , request . method , bucket ) ;
87+
88+ pushMetric ( 'getObjectLegalHold' , log , {
89+ authInfo,
90+ bucket : bucketName ,
91+ keys : [ objectKey ] ,
92+ versionId : objectMD ? objectMD . versionId : undefined ,
93+ location : objectMD ? objectMD . dataStoreName : undefined ,
94+ } ) ;
95+ const verCfg = bucket . getVersioningConfiguration ( ) ;
96+ additionalResHeaders [ 'x-amz-version-id' ] = getVersionIdResHeader ( verCfg , objectMD ) ;
97+
98+ return callback ( null , xml , additionalResHeaders ) ;
99+ } catch ( err ) {
100+ const additionalResHeaders = collectCorsHeaders ( request . headers . origin , request . method , bucket ) ;
101+ err . additionalResHeaders = additionalResHeaders ;
102+ return callback ( err ) ;
103+ }
112104}
113105
114106module . exports = objectGetLegalHold ;
0 commit comments