@@ -10,13 +10,15 @@ const { onlyOwnerAllowed } = require('../../constants');
1010const { actionNeedQuotaCheck, actionWithDataDeletion } = require ( 'arsenal/build/lib/policyEvaluator/RequestContext' ) ;
1111const { processBytesToWrite, validateQuotas } = require ( '../api/apiUtils/quotas/quotaUtils' ) ;
1212
13- function storeServerAccessLogInfo ( request , authInfo , bucket ) {
13+ function storeServerAccessLogInfo ( request , bucket , raftSessionId ) {
1414 /* eslint-disable no-param-reassign */
1515
1616 if ( ! request || ! request . serverAccessLog ) {
1717 return ;
1818 }
1919
20+ request . serverAccessLog . raftSessionID = raftSessionId ;
21+
2022 if ( bucket ) {
2123 request . serverAccessLog . bucketOwner = bucket . getOwner ( ) ;
2224 request . serverAccessLog . bucketName = bucket . getName ( ) ;
@@ -216,50 +218,51 @@ function standardMetadataValidateBucketAndObj(params, actionImplicitDenies, log,
216218 if ( getDeleteMarker ) {
217219 getOptions . getDeleteMarker = true ;
218220 }
219- return metadata . getBucketAndObjectMD ( bucketName , objectKey , getOptions , log , ( err , getResult ) => {
220- if ( err ) {
221- // if some implicit iamAuthzResults, return AccessDenied
222- // before leaking any state information
223- if ( actionImplicitDenies && Object . values ( actionImplicitDenies ) . some ( v => v === true ) ) {
224- return next ( errors . AccessDenied ) ;
221+ return metadata . getBucketAndObjectMD ( bucketName , objectKey , getOptions , log ,
222+ ( err , getResult , raftSessionId ) => {
223+ if ( err ) {
224+ // if some implicit iamAuthzResults, return AccessDenied
225+ // before leaking any state information
226+ if ( actionImplicitDenies && Object . values ( actionImplicitDenies ) . some ( v => v === true ) ) {
227+ return next ( errors . AccessDenied ) ;
228+ }
229+ return next ( err ) ;
225230 }
226- return next ( err ) ;
227- }
228- return next ( null , getResult ) ;
229- } ) ;
231+ return next ( null , getResult , raftSessionId ) ;
232+ } ) ;
230233 } ,
231- ( getResult , next ) => {
234+ ( getResult , raftSessionId , next ) => {
232235 const bucket = getResult . bucket ?
233236 BucketInfo . deSerialize ( getResult . bucket ) : undefined ;
234237 if ( ! bucket ) {
235238 log . debug ( 'bucketAttrs is undefined' , {
236239 bucket : bucketName ,
237240 method : 'metadataValidateBucketAndObj' ,
238241 } ) ;
239- return next ( errors . NoSuchBucket ) ;
242+ return next ( errors . NoSuchBucket , raftSessionId ) ;
240243 }
241244 const validationError = validateBucket ( bucket , params , log , actionImplicitDenies ) ;
242245 if ( validationError ) {
243- return next ( validationError , bucket ) ;
246+ return next ( validationError , bucket , raftSessionId ) ;
244247 }
245248 const objMD = getResult . obj ? JSON . parse ( getResult . obj ) : undefined ;
246249 if ( ! objMD && versionId === 'null' ) {
247250 return getNullVersionFromMaster ( bucketName , objectKey , log ,
248- ( err , nullVer ) => next ( err , bucket , nullVer ) ) ;
251+ ( err , nullVer ) => next ( err , bucket , nullVer , raftSessionId ) ) ;
249252 }
250- return next ( null , bucket , objMD ) ;
253+ return next ( null , bucket , objMD , raftSessionId ) ;
251254 } ,
252- ( bucket , objMD , next ) => {
255+ ( bucket , objMD , raftSessionId , next ) => {
253256 const objMetadata = objMD ;
254257 const canonicalID = authInfo . getCanonicalID ( ) ;
255258 if ( ! isObjAuthorized ( bucket , objMetadata , requestType , canonicalID , authInfo , log , request ,
256259 actionImplicitDenies ) ) {
257260 log . debug ( 'access denied for user on object' , { requestType } ) ;
258- return next ( errors . AccessDenied , bucket ) ;
261+ return next ( errors . AccessDenied , bucket , undefined , raftSessionId ) ;
259262 }
260263
261264 if ( ! objMetadata ) {
262- return next ( null , bucket , objMetadata ) ;
265+ return next ( null , bucket , objMetadata , raftSessionId ) ;
263266 }
264267
265268 let returnTagCount = false ;
@@ -276,25 +279,25 @@ function standardMetadataValidateBucketAndObj(params, actionImplicitDenies, log,
276279
277280 objMetadata . returnTagCount = returnTagCount ;
278281 }
279- return next ( null , bucket , objMetadata ) ;
282+ return next ( null , bucket , objMetadata , raftSessionId ) ;
280283 } ,
281- ( bucket , objMD , next ) => {
284+ ( bucket , objMD , raftSessionId , next ) => {
282285 const needQuotaCheck = requestType => requestType . some ( type => actionNeedQuotaCheck [ type ] ||
283286 actionWithDataDeletion [ type ] ) ;
284287 const checkQuota = params . checkQuota === undefined ? needQuotaCheck ( requestType ) : params . checkQuota ;
285288 // withVersionId cover cases when an object is being restored with a specific version ID.
286289 // In this case, the storage space was already accounted for when the RestoreObject API call
287290 // was made, so we don't need to add any inflight, but quota must be evaluated.
288291 if ( ! checkQuota ) {
289- return next ( null , bucket , objMD ) ;
292+ return next ( null , bucket , objMD , raftSessionId ) ;
290293 }
291294 const contentLength = processBytesToWrite ( request . apiMethod , bucket , versionId ,
292295 request ?. parsedContentLength || 0 , objMD , params . destObjMD ) ;
293296 return validateQuotas ( request , bucket , request . accountQuotas , requestType , request . apiMethod ,
294- contentLength , withVersionId , log , err => next ( err , bucket , objMD ) ) ;
297+ contentLength , withVersionId , log , err => next ( err , bucket , objMD , raftSessionId ) ) ;
295298 } ,
296- ] , ( err , bucket , objMD ) => {
297- storeServerAccessLogInfo ( request , authInfo , bucket ) ;
299+ ] , ( err , bucket , objMD , raftSessionId ) => {
300+ storeServerAccessLogInfo ( request , bucket , raftSessionId ) ;
298301 if ( err ) {
299302 // still return bucket for cors headers
300303 return callback ( err , bucket ) ;
@@ -316,8 +319,8 @@ function standardMetadataValidateBucketAndObj(params, actionImplicitDenies, log,
316319 */
317320function standardMetadataValidateBucket ( params , actionImplicitDenies , log , callback ) {
318321 const { bucketName } = params ;
319- return metadata . getBucket ( bucketName , log , ( err , bucket ) => {
320- storeServerAccessLogInfo ( params . request , params . authInfo , bucket ) ;
322+ return metadata . getBucket ( bucketName , log , ( err , bucket , raftSessionId ) => { // Extract raft session id
323+ storeServerAccessLogInfo ( params . request , bucket , raftSessionId ) ;
321324 if ( err ) {
322325 // if some implicit actionImplicitDenies, return AccessDenied before
323326 // leaking any state information
0 commit comments