diff --git a/lib/api/apiUtils/authorization/permissionChecks.js b/lib/api/apiUtils/authorization/permissionChecks.js index cfb685ee7a..ad6bdee50d 100644 --- a/lib/api/apiUtils/authorization/permissionChecks.js +++ b/lib/api/apiUtils/authorization/permissionChecks.js @@ -1,5 +1,5 @@ const { evaluators, actionMaps, RequestContext, requestUtils } = require('arsenal').policies; -const { errors } = require('arsenal'); +const { errorInstances } = require('arsenal'); const { parseCIDR, isValid } = require('ipaddr.js'); const constants = require('../../../../constants'); const { config } = require('../../../Config'); @@ -566,12 +566,12 @@ function validatePolicyConditions(policy) { // AWS returns does not return an error if the condition starts with 'aws:' // so we reproduce this behaviour if (!validCondition && !conditionKey.startsWith('aws:')) { - return errors.MalformedPolicy.customizeDescription('Policy has an invalid condition key'); + return errorInstances.MalformedPolicy.customizeDescription('Policy has an invalid condition key'); } if (validCondition && validCondition.conditionValueTypeChecker) { const conditionValueTypeError = validCondition.conditionValueTypeChecker(conditionValue); if (conditionValueTypeError) { - return errors.MalformedPolicy.customizeDescription(conditionValueTypeError); + return errorInstances.MalformedPolicy.customizeDescription(conditionValueTypeError); } } } diff --git a/lib/api/apiUtils/bucket/bucketCors.js b/lib/api/apiUtils/bucket/bucketCors.js index 88357621a5..e81c3b1199 100644 --- a/lib/api/apiUtils/bucket/bucketCors.js +++ b/lib/api/apiUtils/bucket/bucketCors.js @@ -1,5 +1,5 @@ const { parseString } = require('xml2js'); -const { errors, s3middleware } = require('arsenal'); +const { errors, errorInstances, s3middleware } = require('arsenal'); const escapeForXml = s3middleware.escapeForXml; @@ -82,7 +82,7 @@ const _validator = { const parsedValue = parseInt(seconds[0], 10); const errMsg = `MaxAgeSeconds "${seconds[0]}" is not a valid value.`; if (Number.isNaN(parsedValue) || parsedValue < 0) { - return errors.MalformedXML.customizeDescription(errMsg); + return errorInstances.MalformedXML.customizeDescription(errMsg); } return parsedValue; }, @@ -92,7 +92,7 @@ const _validator = { */ validateNumberRules(length) { if (length > 100) { - return errors.InvalidRequest + return errorInstances.InvalidRequest .customizeDescription(customizedErrs.numberRules); } return true; @@ -110,7 +110,7 @@ const _validator = { allowedMethods.length > 0) { return true; } - return errors.MalformedXML + return errorInstances.MalformedXML .customizeDescription(customizedErrs.originAndMethodExist); }, /** _validator.validateMethods - check values of AllowedMethod's @@ -130,7 +130,7 @@ const _validator = { if (!methods.every(isValidMethod)) { const errMsg = 'Found unsupported HTTP method in CORS config. ' + `Unsupported method is "${invalidMethod}"`; - return errors.InvalidRequest.customizeDescription(errMsg); + return errorInstances.InvalidRequest.customizeDescription(errMsg); } return true; }, @@ -148,7 +148,7 @@ const _validator = { if (!this.validateNumberWildcards(element)) { const errMsg = `${typeElement} "${element}" can not have ` + 'more than one wildcard.'; - return errors.InvalidRequest.customizeDescription(errMsg); + return errorInstances.InvalidRequest.customizeDescription(errMsg); } } return true; @@ -192,12 +192,12 @@ const _validator = { if (header.indexOf('*') !== -1) { const errMsg = `ExposeHeader ${header} contains a wildcard. ` + 'Wildcards are currently not supported for ExposeHeader.'; - return errors.InvalidRequest.customizeDescription(errMsg); + return errorInstances.InvalidRequest.customizeDescription(errMsg); } if (!/^[A-Za-z0-9-]*$/.test(header)) { const errMsg = `ExposeHeader ${header} contains invalid ` + 'character.'; - return errors.InvalidRequest.customizeDescription(errMsg); + return errorInstances.InvalidRequest.customizeDescription(errMsg); } } return true; @@ -221,7 +221,7 @@ function _validateCorsXml(rules) { let result; if (rules.length > 100) { - return errors.InvalidRequest + return errorInstances.InvalidRequest .customizeDescription(customizedErrs.numberRules); } for (let i = 0; i < rules.length; i++) { @@ -302,7 +302,7 @@ function parseCorsXml(xml, log, cb) { !result.CORSConfiguration.CORSRule || !Array.isArray(result.CORSConfiguration.CORSRule)) { const errMsg = 'Invalid cors configuration xml'; - return cb(errors.MalformedXML.customizeDescription(errMsg)); + return cb(errorInstances.MalformedXML.customizeDescription(errMsg)); } const validationRes = diff --git a/lib/api/apiUtils/bucket/bucketEncryption.js b/lib/api/apiUtils/bucket/bucketEncryption.js index fe45541f29..6dfde236d9 100644 --- a/lib/api/apiUtils/bucket/bucketEncryption.js +++ b/lib/api/apiUtils/bucket/bucketEncryption.js @@ -1,4 +1,4 @@ -const { errors } = require('arsenal'); +const { errors, errorInstances } = require('arsenal'); const metadata = require('../../../metadata/wrapper'); const kms = require('../../../kms/wrapper'); const { parseString } = require('xml2js'); @@ -83,7 +83,7 @@ function parseEncryptionXml(xml, log, cb) { log.trace('error in sse config, can not specify KMSMasterKeyID when using AES256', { method: 'parseEncryptionXml', }); - return cb(errors.InvalidArgument.customizeDescription( + return cb(errorInstances.InvalidArgument.customizeDescription( 'a KMSMasterKeyID is not applicable if the default sse algorithm is not aws:kms')); } @@ -151,13 +151,14 @@ function parseObjectEncryptionHeaders(headers) { if (sseAlgorithm && sseAlgorithm !== 'AES256' && sseAlgorithm !== 'aws:kms') { return { - error: errors.InvalidArgument.customizeDescription('The encryption method specified is not supported'), + error: errorInstances.InvalidArgument + .customizeDescription('The encryption method specified is not supported'), }; } if (sseAlgorithm !== 'aws:kms' && configuredMasterKeyId) { return { - error: errors.InvalidArgument.customizeDescription( + error: errorInstances.InvalidArgument.customizeDescription( 'a KMSMasterKeyID is not applicable if the default sse algorithm is not aws:kms'), }; } diff --git a/lib/api/apiUtils/bucket/bucketWebsite.js b/lib/api/apiUtils/bucket/bucketWebsite.js index 88d0705a8e..e723e2387a 100644 --- a/lib/api/apiUtils/bucket/bucketWebsite.js +++ b/lib/api/apiUtils/bucket/bucketWebsite.js @@ -1,5 +1,5 @@ const { parseString } = require('xml2js'); -const { errors, s3middleware } = require('arsenal'); +const { errors, errorInstances, s3middleware } = require('arsenal'); const escapeForXml = s3middleware.escapeForXml; const { WebsiteConfiguration } = @@ -152,7 +152,7 @@ function _validateWebsiteConfigXml(parsingResult) { if (!parsingResult.IndexDocument && !parsingResult.RedirectAllRequestsTo) { errMsg = 'Value for IndexDocument Suffix must be provided if ' + 'RedirectAllRequestsTo is empty'; - return errors.InvalidArgument.customizeDescription(errMsg); + return errorInstances.InvalidArgument.customizeDescription(errMsg); } if (parsingResult.RedirectAllRequestsTo) { @@ -162,15 +162,15 @@ function _validateWebsiteConfigXml(parsingResult) { parsingResult.RoutingRules) { errMsg = 'RedirectAllRequestsTo cannot be provided in ' + 'conjunction with other Routing Rules.'; - return errors.InvalidRequest.customizeDescription(errMsg); + return errorInstances.InvalidRequest.customizeDescription(errMsg); } if (!xmlContainsElem(parent, 'HostName')) { errMsg = 'RedirectAllRequestsTo not well-formed'; - return errors.MalformedXML.customizeDescription(errMsg); + return errorInstances.MalformedXML.customizeDescription(errMsg); } if (!_isValidString(parent[0].HostName[0])) { errMsg = 'Valid HostName required in RedirectAllRequestsTo'; - return errors.InvalidRequest.customizeDescription(errMsg); + return errorInstances.InvalidRequest.customizeDescription(errMsg); } redirectAllObj.hostName = parent[0].HostName[0]; if (xmlContainsElem(parent, 'Protocol', { validateParent: false })) { @@ -178,7 +178,7 @@ function _validateWebsiteConfigXml(parsingResult) { parent[0].Protocol[0] !== 'https') { errMsg = 'Invalid protocol, protocol can be http or https. ' + 'If not defined, the protocol will be selected automatically.'; - return errors.InvalidRequest.customizeDescription(errMsg); + return errorInstances.InvalidRequest.customizeDescription(errMsg); } redirectAllObj.protocol = parent[0].Protocol[0]; } @@ -189,11 +189,11 @@ function _validateWebsiteConfigXml(parsingResult) { const parent = parsingResult.IndexDocument; if (!xmlContainsElem(parent, 'Suffix')) { errMsg = 'IndexDocument is not well-formed'; - return errors.MalformedXML.customizeDescription(errMsg); + return errorInstances.MalformedXML.customizeDescription(errMsg); } else if (!_isValidString(parent[0].Suffix[0]) || parent[0].Suffix[0].indexOf('/') !== -1) { errMsg = 'IndexDocument Suffix is not well-formed'; - return errors.InvalidArgument.customizeDescription(errMsg); + return errorInstances.InvalidArgument.customizeDescription(errMsg); } websiteConfig.setIndexDocument(parent[0].Suffix[0]); } @@ -202,11 +202,11 @@ function _validateWebsiteConfigXml(parsingResult) { const parent = parsingResult.ErrorDocument; if (!xmlContainsElem(parent, 'Key')) { errMsg = 'ErrorDocument is not well-formed'; - return errors.MalformedXML.customizeDescription(errMsg); + return errorInstances.MalformedXML.customizeDescription(errMsg); } if (!_isValidString(parent[0].Key[0])) { errMsg = 'ErrorDocument Key is not well-formed'; - return errors.InvalidArgument.customizeDescription(errMsg); + return errorInstances.InvalidArgument.customizeDescription(errMsg); } websiteConfig.setErrorDocument(parent[0].Key[0]); } @@ -215,7 +215,7 @@ function _validateWebsiteConfigXml(parsingResult) { const parent = parsingResult.RoutingRules; if (!xmlContainsElem(parent, 'RoutingRule', { isList: true })) { errMsg = 'RoutingRules is not well-formed'; - return errors.MalformedXML.customizeDescription(errMsg); + return errorInstances.MalformedXML.customizeDescription(errMsg); } for (let i = 0; i < parent[0].RoutingRule.length; i++) { const rule = parent[0].RoutingRule[i]; @@ -223,7 +223,7 @@ function _validateWebsiteConfigXml(parsingResult) { if (!_isValidElem(rule.Redirect)) { errMsg = 'RoutingRule requires Redirect, which is ' + 'missing or not well-formed'; - return errors.MalformedXML.customizeDescription(errMsg); + return errorInstances.MalformedXML.customizeDescription(errMsg); } // Looks like AWS doesn't actually make this check, but AWS // documentation specifies at least one of the following elements @@ -237,7 +237,7 @@ function _validateWebsiteConfigXml(parsingResult) { errMsg = 'Redirect must contain at least one of ' + 'following: Protocol, HostName, ReplaceKeyPrefixWith, ' + 'ReplaceKeyWith, or HttpRedirectCode element'; - return errors.MalformedXML.customizeDescription(errMsg); + return errorInstances.MalformedXML.customizeDescription(errMsg); } if (rule.Redirect[0].Protocol) { if (!_isValidElem(rule.Redirect[0].Protocol) || @@ -246,7 +246,7 @@ function _validateWebsiteConfigXml(parsingResult) { errMsg = 'Invalid protocol, protocol can be http or ' + 'https. If not defined, the protocol will be selected ' + 'automatically.'; - return errors.InvalidRequest.customizeDescription(errMsg); + return errorInstances.InvalidRequest.customizeDescription(errMsg); } ruleObj.redirect.protocol = rule.Redirect[0].Protocol[0]; } @@ -254,16 +254,16 @@ function _validateWebsiteConfigXml(parsingResult) { errMsg = 'The provided HTTP redirect code is not valid. ' + 'It should be a string containing a number.'; if (!_isValidElem(rule.Redirect[0].HttpRedirectCode)) { - return errors.MalformedXML.customizeDescription(errMsg); + return errorInstances.MalformedXML.customizeDescription(errMsg); } const code = parseInt(rule.Redirect[0].HttpRedirectCode[0], 10); if (Number.isNaN(code)) { - return errors.MalformedXML.customizeDescription(errMsg); + return errorInstances.MalformedXML.customizeDescription(errMsg); } if (!(code > 300 && code < 400)) { errMsg = `The provided HTTP redirect code (${code}) is ` + 'not valid. Valid codes are 3XX except 300'; - return errors.InvalidRequest.customizeDescription(errMsg); + return errorInstances.InvalidRequest.customizeDescription(errMsg); } ruleObj.redirect.httpRedirectCode = code; } @@ -273,7 +273,7 @@ function _validateWebsiteConfigXml(parsingResult) { if (elem) { if (!_isValidElem(elem) || !_isValidString(elem[0])) { errMsg = `Redirect ${elem} is not well-formed`; - return errors.InvalidArgument + return errorInstances.InvalidArgument .customizeDescription(errMsg); } ruleObj.redirect[`${elemName.charAt(0).toLowerCase()}` + @@ -286,7 +286,7 @@ function _validateWebsiteConfigXml(parsingResult) { { validateParent: false, checkForAll: true })) { errMsg = 'Redirect must not contain both ReplaceKeyWith ' + 'and ReplaceKeyPrefixWith'; - return errors.InvalidRequest.customizeDescription(errMsg); + return errorInstances.InvalidRequest.customizeDescription(errMsg); } if (Array.isArray(rule.Condition) && rule.Condition.length === 1) { ruleObj.condition = {}; @@ -295,14 +295,14 @@ function _validateWebsiteConfigXml(parsingResult) { errMsg = 'Condition is not well-formed. ' + 'Condition should contain valid KeyPrefixEquals or ' + 'HttpErrorCodeReturnEquals element.'; - return errors.InvalidRequest.customizeDescription(errMsg); + return errorInstances.InvalidRequest.customizeDescription(errMsg); } if (rule.Condition[0].KeyPrefixEquals) { const keyPrefixEquals = rule.Condition[0].KeyPrefixEquals; if (!_isValidElem(keyPrefixEquals) || !_isValidString(keyPrefixEquals[0])) { errMsg = 'Condition KeyPrefixEquals is not well-formed'; - return errors.InvalidArgument + return errorInstances.InvalidArgument .customizeDescription(errMsg); } ruleObj.condition.keyPrefixEquals = keyPrefixEquals[0]; @@ -312,17 +312,17 @@ function _validateWebsiteConfigXml(parsingResult) { 'It should be a string containing a number.'; if (!_isValidElem(rule.Condition[0] .HttpErrorCodeReturnedEquals)) { - return errors.MalformedXML.customizeDescription(errMsg); + return errorInstances.MalformedXML.customizeDescription(errMsg); } const code = parseInt(rule.Condition[0] .HttpErrorCodeReturnedEquals[0], 10); if (Number.isNaN(code)) { - return errors.MalformedXML.customizeDescription(errMsg); + return errorInstances.MalformedXML.customizeDescription(errMsg); } if (!(code > 399 && code < 600)) { errMsg = `The provided HTTP error code (${code}) is ` + 'not valid. Valid codes are 4XX or 5XX.'; - return errors.InvalidRequest + return errorInstances.InvalidRequest .customizeDescription(errMsg); } ruleObj.condition.httpErrorCodeReturnedEquals = code; @@ -347,7 +347,7 @@ function parseWebsiteConfigXml(xml, log, cb) { if (!result || !result.WebsiteConfiguration) { const errMsg = 'Invalid website configuration xml'; - return cb(errors.MalformedXML.customizeDescription(errMsg)); + return cb(errorInstances.MalformedXML.customizeDescription(errMsg)); } const validationRes = diff --git a/lib/api/apiUtils/bucket/getNotificationConfiguration.js b/lib/api/apiUtils/bucket/getNotificationConfiguration.js index 1b88b31b3f..36746af49d 100644 --- a/lib/api/apiUtils/bucket/getNotificationConfiguration.js +++ b/lib/api/apiUtils/bucket/getNotificationConfiguration.js @@ -1,4 +1,4 @@ -const { errors, models } = require('arsenal'); +const { errorInstances, models } = require('arsenal'); const { NotificationConfiguration } = models; const { config } = require('../../../Config'); @@ -10,7 +10,7 @@ function getNotificationConfiguration(parsedXml) { return notifConfig; } if (!config.bucketNotificationDestinations) { - return { error: errors.InvalidArgument.customizeDescription( + return { error: errorInstances.InvalidArgument.customizeDescription( 'Unable to validate the following destination configurations') }; } const targets = new Set(config.bucketNotificationDestinations.map(t => t.resource)); @@ -19,7 +19,7 @@ function getNotificationConfiguration(parsedXml) { // TODO: match the error message to AWS's response along with // the request destination name in the response const errDesc = 'Unable to validate the destination configuration'; - return { error: errors.InvalidArgument.customizeDescription(errDesc) }; + return { error: errorInstances.InvalidArgument.customizeDescription(errDesc) }; } return notifConfig; } diff --git a/lib/api/apiUtils/object/createAndStoreObject.js b/lib/api/apiUtils/object/createAndStoreObject.js index 7dc84089bf..72de71be66 100644 --- a/lib/api/apiUtils/object/createAndStoreObject.js +++ b/lib/api/apiUtils/object/createAndStoreObject.js @@ -1,5 +1,5 @@ const async = require('async'); -const { errors, s3middleware } = require('arsenal'); +const { errors, errorInstances, s3middleware } = require('arsenal'); const getMetaHeaders = s3middleware.userMetadata.getMetaHeaders; const constants = require('../../../../constants'); @@ -190,7 +190,7 @@ function createAndStoreObject(bucketName, bucketMD, objectKey, objMD, authInfo, log.debug(externalVersioningErrorMessage, { method: 'createAndStoreObject', error: errors.NotImplemented }); return process.nextTick(() => { - callback(errors.NotImplemented.customizeDescription( + callback(errorInstances.NotImplemented.customizeDescription( externalVersioningErrorMessage)); }); } diff --git a/lib/api/apiUtils/object/locationConstraintCheck.js b/lib/api/apiUtils/object/locationConstraintCheck.js index f3751bb434..49554ae375 100644 --- a/lib/api/apiUtils/object/locationConstraintCheck.js +++ b/lib/api/apiUtils/object/locationConstraintCheck.js @@ -1,4 +1,4 @@ -const { errors } = require('arsenal'); +const { errorInstances } = require('arsenal'); const { BackendInfo } = require('./BackendInfo'); const constants = require('../../../../constants'); @@ -34,7 +34,7 @@ function locationConstraintCheck(request, metaHeaders, bucket, log) { requestEndpoint, log); if (!controllingBackend.isValid) { backendInfoObj = { - err: errors.InvalidArgument.customizeDescription(controllingBackend. + err: errorInstances.InvalidArgument.customizeDescription(controllingBackend. description), }; return backendInfoObj; diff --git a/lib/api/apiUtils/object/locationStorageCheck.js b/lib/api/apiUtils/object/locationStorageCheck.js index 134bbcca2e..88cbbb18a3 100644 --- a/lib/api/apiUtils/object/locationStorageCheck.js +++ b/lib/api/apiUtils/object/locationStorageCheck.js @@ -1,4 +1,4 @@ -const { errors } = require('arsenal'); +const { errorInstances } = require('arsenal'); const { config } = require('../../../Config'); const { getLocationMetric, pushLocationMetric } = @@ -37,7 +37,7 @@ function locationStorageCheck(location, updateSize, log, cb) { const newStorageSize = parseInt(bytesStored, 10) + updateSize; const sizeLimitBytes = _gbToBytes(sizeLimitGB); if (sizeLimitBytes < newStorageSize) { - return cb(errors.AccessDenied.customizeDescription( + return cb(errorInstances.AccessDenied.customizeDescription( `The assigned storage space limit for location ${location} ` + 'will be exceeded')); } diff --git a/lib/api/apiUtils/object/objectLockHelpers.js b/lib/api/apiUtils/object/objectLockHelpers.js index ac2eb713b3..80fa039284 100644 --- a/lib/api/apiUtils/object/objectLockHelpers.js +++ b/lib/api/apiUtils/object/objectLockHelpers.js @@ -1,4 +1,4 @@ -const { errors, auth, policies } = require('arsenal'); +const { errors, errorInstances, auth, policies } = require('arsenal'); const moment = require('moment'); const { config } = require('../../../Config'); @@ -41,29 +41,29 @@ function validateHeaders(bucket, headers, log) { if ((objectLockDate || objectLockMode || objectLegalHold) && !bucketObjectLockEnabled) { log.trace('bucket is missing ObjectLockConfiguration'); - return errors.InvalidRequest.customizeDescription( + return errorInstances.InvalidRequest.customizeDescription( 'Bucket is missing ObjectLockConfiguration'); } if ((objectLockMode || objectLockDate) && !(objectLockMode && objectLockDate)) { - return errors.InvalidArgument.customizeDescription( + return errorInstances.InvalidArgument.customizeDescription( 'x-amz-object-lock-retain-until-date and ' + 'x-amz-object-lock-mode must both be supplied', ); } const validModes = new Set(['GOVERNANCE', 'COMPLIANCE']); if (objectLockMode && !validModes.has(objectLockMode)) { - return errors.InvalidArgument.customizeDescription( + return errorInstances.InvalidArgument.customizeDescription( 'Unknown wormMode directive'); } const validLegalHolds = new Set(['ON', 'OFF']); if (objectLegalHold && !validLegalHolds.has(objectLegalHold)) { - return errors.InvalidArgument.customizeDescription( + return errorInstances.InvalidArgument.customizeDescription( 'Legal hold status must be one of "ON", "OFF"'); } const currentDate = new Date().toISOString(); if (objectLockMode && objectLockDate <= currentDate) { - return errors.InvalidArgument.customizeDescription( + return errorInstances.InvalidArgument.customizeDescription( 'The retain until date must be in the future!'); } return null; diff --git a/lib/api/apiUtils/object/setUpCopyLocator.js b/lib/api/apiUtils/object/setUpCopyLocator.js index c8313e5e92..a232fa3620 100644 --- a/lib/api/apiUtils/object/setUpCopyLocator.js +++ b/lib/api/apiUtils/object/setUpCopyLocator.js @@ -1,4 +1,4 @@ -const { errors } = require('arsenal'); +const { errors, errorInstances } = require('arsenal'); const { parseRangeSpec, parseRange, @@ -75,7 +75,7 @@ function setUpCopyLocator(sourceObjMD, rangeHeader, log) { || dataLocator[0].size === undefined)) { log.trace('data model before version 2 so ' + 'cannot support get range copy part'); - return { error: errors.NotImplemented + return { error: errorInstances.NotImplemented .customizeDescription('Stored object ' + 'has legacy data storage model so does' + ' not support range headers on copy part'), diff --git a/lib/api/apiUtils/object/validateChecksumHeaders.js b/lib/api/apiUtils/object/validateChecksumHeaders.js index 90c5041516..d2a50395a3 100644 --- a/lib/api/apiUtils/object/validateChecksumHeaders.js +++ b/lib/api/apiUtils/object/validateChecksumHeaders.js @@ -1,14 +1,13 @@ -const { errors } = require('arsenal'); +const { errorInstances } = require('arsenal'); const { unsupportedSignatureChecksums, supportedSignatureChecksums } = require('../../../../constants'); function validateChecksumHeaders(headers) { // If the x-amz-trailer header is present the request is using one of the // trailing checksum algorithms, which are not supported. - if (headers['x-amz-trailer'] !== undefined && headers['x-amz-content-sha256'] !== 'STREAMING-UNSIGNED-PAYLOAD-TRAILER') { - return errors.BadRequest.customizeDescription('signed trailing checksum is not supported'); + return errorInstances.BadRequest.customizeDescription('signed trailing checksum is not supported'); } const signatureChecksum = headers['x-amz-content-sha256']; @@ -28,7 +27,7 @@ function validateChecksumHeaders(headers) { return null; } - return errors.BadRequest.customizeDescription('unsupported checksum algorithm'); + return errorInstances.BadRequest.customizeDescription('unsupported checksum algorithm'); } module.exports = validateChecksumHeaders; diff --git a/lib/api/apiUtils/object/versioning.js b/lib/api/apiUtils/object/versioning.js index cceb1d71b0..09c3347ac7 100644 --- a/lib/api/apiUtils/object/versioning.js +++ b/lib/api/apiUtils/object/versioning.js @@ -1,4 +1,4 @@ -const { errors, versioning } = require('arsenal'); +const { errorInstances, versioning } = require('arsenal'); const async = require('async'); const metadata = require('../../../metadata/wrapper'); @@ -26,7 +26,7 @@ function decodeVersionId(reqQuery) { } versionId = versionIdUtils.decode(versionId); if (versionId instanceof Error) { - return errors.InvalidArgument + return errorInstances.InvalidArgument .customizeDescription('Invalid version id specified'); } return versionId; @@ -57,7 +57,7 @@ function getVersionIdResHeader(verCfg, objectMD) { function checkQueryVersionId(query) { if (query && query.versionId !== undefined) { const customMsg = 'This operation does not accept a version-id.'; - return errors.InvalidArgument.customizeDescription(customMsg); + return errorInstances.InvalidArgument.customizeDescription(customMsg); } return undefined; } diff --git a/lib/api/backbeat/listLifecycleCurrents.js b/lib/api/backbeat/listLifecycleCurrents.js index faba301ba0..b11fdc8767 100644 --- a/lib/api/backbeat/listLifecycleCurrents.js +++ b/lib/api/backbeat/listLifecycleCurrents.js @@ -1,4 +1,4 @@ -const { errors } = require('arsenal'); +const { errors, errorInstances } = require('arsenal'); const constants = require('../../../constants'); const services = require('../../services'); const { standardMetadataValidateBucket } = require('../../metadata/metadataUtils'); @@ -58,7 +58,7 @@ function listLifecycleCurrents(authInfo, locationConstraints, request, log, call log.error(`locationConstraint is invalid - ${errMsg}`, { locationConstraint: excludedDataStoreName }); monitoring.promMetrics('GET', bucketName, 400, 'listLifecycleCurrents'); - return callback(errors.InvalidLocationConstraint.customizeDescription(errMsg)); + return callback(errorInstances.InvalidLocationConstraint.customizeDescription(errMsg)); } const metadataValParams = { diff --git a/lib/api/backbeat/listLifecycleNonCurrents.js b/lib/api/backbeat/listLifecycleNonCurrents.js index bce5196413..818e26c63d 100644 --- a/lib/api/backbeat/listLifecycleNonCurrents.js +++ b/lib/api/backbeat/listLifecycleNonCurrents.js @@ -1,4 +1,4 @@ -const { errors, versioning } = require('arsenal'); +const { errors, errorInstances, versioning } = require('arsenal'); const constants = require('../../../constants'); const services = require('../../services'); const { standardMetadataValidateBucket } = require('../../metadata/metadataUtils'); @@ -61,7 +61,7 @@ function listLifecycleNonCurrents(authInfo, locationConstraints, request, log, c log.error(`locationConstraint is invalid - ${errMsg}`, { locationConstraint: excludedDataStoreName }); monitoring.promMetrics('GET', bucketName, 400, 'listLifecycleCurrents'); - return callback(errors.InvalidLocationConstraint.customizeDescription(errMsg)); + return callback(errorInstances.InvalidLocationConstraint.customizeDescription(errMsg)); } const metadataValParams = { @@ -95,7 +95,7 @@ function listLifecycleNonCurrents(authInfo, locationConstraints, request, log, c const isBucketVersioned = vcfg && (vcfg.Status === 'Enabled' || vcfg.Status === 'Suspended'); if (!isBucketVersioned) { log.debug('bucket is not versioned'); - return callback(errors.InvalidRequest.customizeDescription( + return callback(errorInstances.InvalidRequest.customizeDescription( 'bucket is not versioned'), null); } diff --git a/lib/api/backbeat/listLifecycleOrphanDeleteMarkers.js b/lib/api/backbeat/listLifecycleOrphanDeleteMarkers.js index ae4224fbe7..173c4c23d0 100644 --- a/lib/api/backbeat/listLifecycleOrphanDeleteMarkers.js +++ b/lib/api/backbeat/listLifecycleOrphanDeleteMarkers.js @@ -1,4 +1,4 @@ -const { errors } = require('arsenal'); +const { errors, errorInstances } = require('arsenal'); const constants = require('../../../constants'); const services = require('../../services'); const { standardMetadataValidateBucket } = require('../../metadata/metadataUtils'); @@ -80,7 +80,7 @@ function listLifecycleOrphanDeleteMarkers(authInfo, locationConstraints, request const isBucketVersioned = vcfg && (vcfg.Status === 'Enabled' || vcfg.Status === 'Suspended'); if (!isBucketVersioned) { log.debug('bucket is not versioned or suspended'); - return callback(errors.InvalidRequest.customizeDescription( + return callback(errorInstances.InvalidRequest.customizeDescription( 'bucket is not versioned'), null); } diff --git a/lib/api/bucketGet.js b/lib/api/bucketGet.js index e6453dfb27..1a522ba1ff 100644 --- a/lib/api/bucketGet.js +++ b/lib/api/bucketGet.js @@ -1,5 +1,5 @@ const querystring = require('querystring'); -const { errors, versioning, s3middleware } = require('arsenal'); +const { errors, errorInstances, versioning, s3middleware } = require('arsenal'); const constants = require('../../constants'); const services = require('../services'); @@ -293,7 +293,7 @@ function bucketGet(authInfo, request, log, callback) { const bucketName = request.bucketName; const v2 = params['list-type']; if (v2 !== undefined && Number.parseInt(v2, 10) !== 2) { - return callback(errors.InvalidArgument.customizeDescription('Invalid ' + + return callback(errorInstances.InvalidArgument.customizeDescription('Invalid ' + 'List Type specified in Request')); } if (v2) { @@ -310,7 +310,7 @@ function bucketGet(authInfo, request, log, callback) { if (encoding !== undefined && encoding !== 'url') { monitoring.promMetrics( 'GET', bucketName, 400, 'listBucket'); - return callback(errors.InvalidArgument.customizeDescription('Invalid ' + + return callback(errorInstances.InvalidArgument.customizeDescription('Invalid ' + 'Encoding Method specified in Request')); } const requestMaxKeys = params['max-keys'] ? diff --git a/lib/api/bucketPut.js b/lib/api/bucketPut.js index 657a167135..1cfa212b8c 100644 --- a/lib/api/bucketPut.js +++ b/lib/api/bucketPut.js @@ -1,6 +1,6 @@ const { waterfall } = require('async'); const { parseString } = require('xml2js'); -const { auth, errors, policies } = require('arsenal'); +const { auth, errors, errorInstances, policies } = require('arsenal'); const vault = require('../auth/vault'); const { createBucket } = require('./apiUtils/bucket/bucketCreation'); @@ -52,7 +52,7 @@ function checkLocationConstraint(request, locationConstraint, log) { 'locationConstraint config'; log.trace(`locationConstraint is invalid - ${errMsg}`, { locationConstraint: locationConstraintChecked }); - return { error: errors.InvalidLocationConstraint. + return { error: errorInstances.InvalidLocationConstraint. customizeDescription(errMsg) }; } return { error: null, locationConstraint: locationConstraintChecked }; @@ -217,7 +217,7 @@ function bucketPut(authInfo, request, log, callback) { if (request.bucketName === 'METADATA') { monitoring.promMetrics( 'PUT', bucketName, 403, 'createBucket'); - return callback(errors.AccessDenied + return callback(errorInstances.AccessDenied .customizeDescription('The bucket METADATA is used ' + 'for internal purposes')); } diff --git a/lib/api/bucketPutCors.js b/lib/api/bucketPutCors.js index 1bebc05d08..490aa2202e 100644 --- a/lib/api/bucketPutCors.js +++ b/lib/api/bucketPutCors.js @@ -1,6 +1,6 @@ const crypto = require('crypto'); const async = require('async'); -const { errors } = require('arsenal'); +const { errors, errorInstances } = require('arsenal'); const bucketShield = require('./apiUtils/bucket/bucketShield'); const collectCorsHeaders = require('../utilities/collectCorsHeaders'); @@ -45,7 +45,7 @@ function bucketPutCors(authInfo, request, log, callback) { const errMsg = 'The CORS XML document is limited to 64 KB in size.'; log.debug(errMsg, { error: errors.MalformedXML }); monitoring.promMetrics('PUT', bucketName, 400, 'putBucketCors'); - return callback(errors.MalformedXML.customizeDescription(errMsg)); + return callback(errorInstances.MalformedXML.customizeDescription(errMsg)); } return async.waterfall([ diff --git a/lib/api/bucketPutObjectLock.js b/lib/api/bucketPutObjectLock.js index d1f8ef4731..a3d549789a 100644 --- a/lib/api/bucketPutObjectLock.js +++ b/lib/api/bucketPutObjectLock.js @@ -1,7 +1,7 @@ const { waterfall } = require('async'); const arsenal = require('arsenal'); -const { errors } = arsenal; +const { errorInstances } = arsenal; const { models: { ObjectLockConfiguration } } = arsenal; const parseXML = require('../utilities/parseXML'); @@ -52,7 +52,7 @@ function bucketPutObjectLock(authInfo, request, log, callback) { const isObjectLockEnabled = bucket.isObjectLockEnabled(); process.nextTick(() => { if (!isObjectLockEnabled) { - return next(errors.InvalidBucketState.customizeDescription( + return next(errorInstances.InvalidBucketState.customizeDescription( 'Object Lock configuration cannot be enabled on ' + 'existing buckets'), bucket); } diff --git a/lib/api/bucketPutPolicy.js b/lib/api/bucketPutPolicy.js index b82a1dc1d2..56f48e2a7f 100644 --- a/lib/api/bucketPutPolicy.js +++ b/lib/api/bucketPutPolicy.js @@ -1,5 +1,5 @@ const async = require('async'); -const { errors, models } = require('arsenal'); +const { errorInstances, models } = require('arsenal'); const collectCorsHeaders = require('../utilities/collectCorsHeaders'); const metadata = require('../metadata/wrapper'); const { standardMetadataValidateBucket } = require('../metadata/metadataUtils'); @@ -47,12 +47,12 @@ function bucketPutPolicy(authInfo, request, log, callback) { process.nextTick(() => { const policyObj = bucketPolicy.getBucketPolicy(); if (_checkNotImplementedPolicy(request.post)) { - const err = errors.NotImplemented.customizeDescription( + const err = errorInstances.NotImplemented.customizeDescription( 'Bucket policy contains element not yet implemented'); return next(err); } if (policyObj.error) { - const err = errors.MalformedPolicy.customizeDescription( + const err = errorInstances.MalformedPolicy.customizeDescription( policyObj.error.description); return next(err); } @@ -62,7 +62,7 @@ function bucketPutPolicy(authInfo, request, log, callback) { (bucketPolicy, next) => { process.nextTick(() => { if (!validatePolicyResource(bucketName, bucketPolicy)) { - return next(errors.MalformedPolicy.customizeDescription( + return next(errorInstances.MalformedPolicy.customizeDescription( 'Policy has invalid resource')); } return next(validatePolicyConditions(bucketPolicy), bucketPolicy); diff --git a/lib/api/bucketPutReplication.js b/lib/api/bucketPutReplication.js index f8346f687c..04da646591 100644 --- a/lib/api/bucketPutReplication.js +++ b/lib/api/bucketPutReplication.js @@ -1,5 +1,5 @@ const { waterfall } = require('async'); -const { errors } = require('arsenal'); +const { errorInstances } = require('arsenal'); const metadata = require('../metadata/wrapper'); const { standardMetadataValidateBucket } = require('../metadata/metadataUtils'); @@ -10,7 +10,7 @@ const collectCorsHeaders = require('../utilities/collectCorsHeaders'); const monitoring = require('../utilities/metrics'); // The error response when a bucket does not have versioning 'Enabled'. -const versioningNotEnabledError = errors.InvalidRequest.customizeDescription( +const versioningNotEnabledError = errorInstances.InvalidRequest.customizeDescription( 'Versioning must be \'Enabled\' on the bucket to apply a replication ' + 'configuration'); diff --git a/lib/api/bucketPutVersioning.js b/lib/api/bucketPutVersioning.js index 02d0b09be2..53d6e4f536 100644 --- a/lib/api/bucketPutVersioning.js +++ b/lib/api/bucketPutVersioning.js @@ -1,6 +1,6 @@ const { waterfall } = require('async'); const { parseString } = require('xml2js'); -const { errors } = require('arsenal'); +const { errors, errorInstances } = require('arsenal'); const collectCorsHeaders = require('../utilities/collectCorsHeaders'); const metadata = require('../metadata/wrapper'); @@ -56,7 +56,7 @@ function _parseXML(request, log, cb) { } if (versioningConf && mfaDelete === 'Enabled') { log.debug('mfa deletion is not implemented'); - return cb(errors.NotImplemented + return cb(errorInstances.NotImplemented .customizeDescription('MFA Deletion is not supported yet.')); } return process.nextTick(() => cb(null)); @@ -107,7 +107,7 @@ function bucketPutVersioning(authInfo, request, log, callback) { log.debug(externalVersioningErrorMessage, { method: 'bucketPutVersioning', error: errors.NotImplemented }); - const error = errors.NotImplemented.customizeDescription( + const error = errorInstances.NotImplemented.customizeDescription( externalVersioningErrorMessage); return next(error, bucket); } @@ -132,13 +132,13 @@ function bucketPutVersioning(authInfo, request, log, callback) { && replicationConfig.rules && replicationConfig.rules.some(r => r.enabled); if (invalidAction) { - next(errors.InvalidBucketState + next(errorInstances.InvalidBucketState .customizeDescription(invalidBucketStateMessage)); return; } const objectLockEnabled = bucket.isObjectLockEnabled(); if (objectLockEnabled) { - next(errors.InvalidBucketState + next(errorInstances.InvalidBucketState .customizeDescription(objectLockErrorMessage)); return; } diff --git a/lib/api/corsPreflight.js b/lib/api/corsPreflight.js index d76a64eade..78ad92caf5 100644 --- a/lib/api/corsPreflight.js +++ b/lib/api/corsPreflight.js @@ -1,4 +1,4 @@ -const { errors } = require('arsenal'); +const { errors, errorInstances } = require('arsenal'); const metadata = require('../metadata/wrapper'); const bucketShield = require('./apiUtils/bucket/bucketShield'); @@ -51,7 +51,7 @@ function corsPreflight(request, log, callback) { const corsRules = bucket.getCors(); if (!corsRules) { - const err = errors.AccessForbidden + const err = errorInstances.AccessForbidden .customizeDescription(customizedErrs.corsNotEnabled); log.trace('no existing cors configuration', { error: err, @@ -65,7 +65,7 @@ function corsPreflight(request, log, callback) { corsHeaders); if (!corsRule) { - const err = errors.AccessForbidden + const err = errorInstances.AccessForbidden .customizeDescription(customizedErrs.notAllowed); log.trace('no matching cors rule', { error: err, diff --git a/lib/api/initiateMultipartUpload.js b/lib/api/initiateMultipartUpload.js index b2c6d32d77..76801625e1 100644 --- a/lib/api/initiateMultipartUpload.js +++ b/lib/api/initiateMultipartUpload.js @@ -1,5 +1,5 @@ const { v4: uuidv4 } = require('uuid'); -const { errors, s3middleware } = require('arsenal'); +const { errors, errorInstances, s3middleware } = require('arsenal'); const async = require('async'); const getMetaHeaders = s3middleware.userMetadata.getMetaHeaders; const convertToXml = s3middleware.convertToXml; @@ -50,7 +50,7 @@ function initiateMultipartUpload(authInfo, request, log, callback) { const objectKey = request.objectKey; if (hasNonPrintables(objectKey)) { - return callback(errors.InvalidInput.customizeDescription( + return callback(errorInstances.InvalidInput.customizeDescription( 'object keys cannot contain non-printable characters', )); } diff --git a/lib/api/objectCopy.js b/lib/api/objectCopy.js index c689df5233..c2b26fbfc7 100644 --- a/lib/api/objectCopy.js +++ b/lib/api/objectCopy.js @@ -1,6 +1,6 @@ const async = require('async'); -const { errors, versioning, s3middleware } = require('arsenal'); +const { errors, errorInstances, versioning, s3middleware } = require('arsenal'); const getMetaHeaders = s3middleware.userMetadata.getMetaHeaders; const validateHeaders = s3middleware.validateConditionalHeaders; @@ -59,7 +59,7 @@ function _prepMetadata(request, sourceObjMD, headers, sourceIsDestination, // Default is COPY whichTagging = whichTagging === undefined ? 'COPY' : whichTagging; if (whichTagging !== 'COPY' && whichTagging !== 'REPLACE') { - return { error: errors.InvalidArgument + return { error: errorInstances.InvalidArgument .customizeDescription('Unknown tagging directive') }; } const overrideMetadata = {}; @@ -80,14 +80,14 @@ function _prepMetadata(request, sourceObjMD, headers, sourceIsDestination, const legalHoldHeader = headers['x-amz-object-lock-legal-hold']; if ((retentionHeaders || legalHoldHeader) && !destBucketMD.isObjectLockEnabled()) { - return { error: errors.InvalidRequest.customizeDescription( + return { error: errorInstances.InvalidRequest.customizeDescription( 'Bucket is missing ObjectLockConfiguration') }; } // Cannot copy from same source and destination if no MD // changed and no source version id if (sourceIsDestination && whichMetadata === 'COPY' && Object.keys(overrideMetadata).length === 0 && !sourceVersionId) { - return { error: errors.InvalidRequest.customizeDescription('This copy' + + return { error: errorInstances.InvalidRequest.customizeDescription('This copy' + ' request is illegal because it is trying to copy an ' + 'object to itself without changing the object\'s metadata, ' + 'storage class, website redirect location or encryption ' + @@ -283,7 +283,7 @@ function objectCopy(authInfo, request, sourceBucket, log.debug('delete marker on source object', { sourceObject }); if (sourceVersionId) { - const err = errors.InvalidRequest + const err = errorInstances.InvalidRequest .customizeDescription('The source of a copy ' + 'request may not specifically refer to a delete' + 'marker by version id.'); @@ -386,7 +386,7 @@ function objectCopy(authInfo, request, sourceBucket, log.debug(externalVersioningErrorMessage, { method: 'multipleBackendGateway', error: errors.NotImplemented }); - return next(errors.NotImplemented.customizeDescription( + return next(errorInstances.NotImplemented.customizeDescription( externalVersioningErrorMessage), destBucketMD); } if (dataLocator.length === 0) { diff --git a/lib/api/objectGet.js b/lib/api/objectGet.js index 83dec1a6f1..3a91f5393d 100644 --- a/lib/api/objectGet.js +++ b/lib/api/objectGet.js @@ -1,4 +1,4 @@ -const { errors, s3middleware } = require('arsenal'); +const { errors, errorInstances, s3middleware } = require('arsenal'); const { parseRange } = require('arsenal').network.http.utils; const { data } = require('../data/wrapper'); @@ -147,7 +147,7 @@ function objectGet(authInfo, request, returnTagCount, log, callback) { let partNumber = null; if (request.query && request.query.partNumber !== undefined) { if (byteRange) { - const error = errors.InvalidRequest + const error = errorInstances.InvalidRequest .customizeDescription('Cannot specify both Range ' + 'header and partNumber query parameter.'); monitoring.promMetrics( @@ -156,14 +156,14 @@ function objectGet(authInfo, request, returnTagCount, log, callback) { } partNumber = Number.parseInt(request.query.partNumber, 10); if (Number.isNaN(partNumber)) { - const error = errors.InvalidArgument + const error = errorInstances.InvalidArgument .customizeDescription('Part number must be a number.'); monitoring.promMetrics( 'GET', bucketName, 400, 'getObject'); return callback(error, null, corsHeaders); } if (partNumber < 1 || partNumber > 10000) { - const error = errors.InvalidArgument + const error = errorInstances.InvalidArgument .customizeDescription('Part number must be an ' + 'integer between 1 and 10000, inclusive.'); monitoring.promMetrics( diff --git a/lib/api/objectGetLegalHold.js b/lib/api/objectGetLegalHold.js index e199260a05..2f165748f3 100644 --- a/lib/api/objectGetLegalHold.js +++ b/lib/api/objectGetLegalHold.js @@ -1,5 +1,5 @@ const async = require('async'); -const { errors, s3middleware } = require('arsenal'); +const { errors, errorInstances, s3middleware } = require('arsenal'); const { decodeVersionId, getVersionIdResHeader } = require('./apiUtils/object/versioning'); @@ -76,7 +76,7 @@ function objectGetLegalHold(authInfo, request, log, callback) { if (!bucket.isObjectLockEnabled()) { log.trace('object lock not enabled on bucket', { method: 'objectGetRetention' }); - return next(errors.InvalidRequest.customizeDescription( + return next(errorInstances.InvalidRequest.customizeDescription( 'Bucket is missing Object Lock Configuration')); } return next(null, bucket, objectMD); diff --git a/lib/api/objectGetRetention.js b/lib/api/objectGetRetention.js index 4852e9e27c..3ac4c19c98 100644 --- a/lib/api/objectGetRetention.js +++ b/lib/api/objectGetRetention.js @@ -1,5 +1,5 @@ const async = require('async'); -const { errors, s3middleware } = require('arsenal'); +const { errors, errorInstances, s3middleware } = require('arsenal'); const { decodeVersionId, getVersionIdResHeader } = require('./apiUtils/object/versioning'); @@ -76,7 +76,7 @@ function objectGetRetention(authInfo, request, log, callback) { if (!bucket.isObjectLockEnabled()) { log.trace('object lock not enabled on bucket', { method: 'objectGetRetention' }); - return next(errors.InvalidRequest.customizeDescription( + return next(errorInstances.InvalidRequest.customizeDescription( 'Bucket is missing Object Lock Configuration')); } return next(null, bucket, objectMD); diff --git a/lib/api/objectHead.js b/lib/api/objectHead.js index 07bdf647c0..7e8d1f6759 100644 --- a/lib/api/objectHead.js +++ b/lib/api/objectHead.js @@ -1,4 +1,4 @@ -const { errors, s3middleware } = require('arsenal'); +const { errors, errorInstances, s3middleware } = require('arsenal'); const validateHeaders = s3middleware.validateConditionalHeaders; const { parseRange } = require('arsenal').network.http.utils; @@ -126,13 +126,13 @@ function objectHead(authInfo, request, log, callback) { const partNumber = getPartNumber(request.query); if (partNumber !== undefined) { if (byteRange) { - const error = errors.InvalidRequest + const error = errorInstances.InvalidRequest .customizeDescription('Cannot specify both Range ' + 'header and partNumber query parameter.'); return callback(error, corsHeaders); } if (Number.isNaN(partNumber)) { - const error = errors.InvalidArgument + const error = errorInstances.InvalidArgument .customizeDescription('Part number must be a number.'); return callback(error, corsHeaders); } diff --git a/lib/api/objectPut.js b/lib/api/objectPut.js index 37f719c4e0..81174c8ffc 100644 --- a/lib/api/objectPut.js +++ b/lib/api/objectPut.js @@ -1,5 +1,5 @@ const async = require('async'); -const { errors, versioning } = require('arsenal'); +const { errors, errorInstances, versioning } = require('arsenal'); const aclUtils = require('../utilities/aclUtils'); const { cleanUpBucket } = require('./apiUtils/bucket/bucketCreation'); @@ -61,14 +61,14 @@ function objectPut(authInfo, request, streamingV4Params, log, callback) { if (queryContainsVersionId instanceof Error) { return callback(queryContainsVersionId); } - const invalidSSEError = errors.InvalidArgument.customizeDescription( + const invalidSSEError = errorInstances.InvalidArgument.customizeDescription( 'The encryption method specified is not supported'); const requestType = request.apiMethods || 'objectPut'; const valParams = { authInfo, bucketName, objectKey, requestType, request }; const canonicalID = authInfo.getCanonicalID(); if (hasNonPrintables(objectKey)) { - return callback(errors.InvalidInput.customizeDescription( + return callback(errorInstances.InvalidInput.customizeDescription( 'object keys cannot contain non-printable characters', )); } diff --git a/lib/api/objectPutCopyPart.js b/lib/api/objectPutCopyPart.js index c6740af93a..8013e3eca2 100644 --- a/lib/api/objectPutCopyPart.js +++ b/lib/api/objectPutCopyPart.js @@ -1,5 +1,5 @@ const async = require('async'); -const { errors, versioning, s3middleware } = require('arsenal'); +const { errors, errorInstances, versioning, s3middleware } = require('arsenal'); const validateHeaders = s3middleware.validateConditionalHeaders; const collectCorsHeaders = require('../utilities/collectCorsHeaders'); @@ -138,7 +138,7 @@ function objectPutCopyPart(authInfo, request, sourceBucket, log.debug('delete marker on source object', { sourceObject }); if (reqVersionId) { - const err = errors.InvalidRequest + const err = errorInstances.InvalidRequest .customizeDescription('The source of a copy ' + 'request may not specifically refer to a delete' + 'marker by version id.'); diff --git a/lib/api/objectPutLegalHold.js b/lib/api/objectPutLegalHold.js index e5ba15b44b..0c27872b83 100644 --- a/lib/api/objectPutLegalHold.js +++ b/lib/api/objectPutLegalHold.js @@ -1,5 +1,5 @@ const async = require('async'); -const { errors, s3middleware } = require('arsenal'); +const { errors, errorInstances, s3middleware } = require('arsenal'); const collectCorsHeaders = require('../utilities/collectCorsHeaders'); const { decodeVersionId, getVersionIdResHeader, getVersionSpecificMetadataOptions } = @@ -72,7 +72,7 @@ function objectPutLegalHold(authInfo, request, log, callback) { if (!bucket.isObjectLockEnabled()) { log.trace('object lock not enabled on bucket', { method: 'objectPutLegalHold' }); - return next(errors.InvalidRequest.customizeDescription( + return next(errorInstances.InvalidRequest.customizeDescription( 'Bucket is missing Object Lock Configuration' ), bucket); } diff --git a/lib/api/objectPutRetention.js b/lib/api/objectPutRetention.js index 9bbf9fca14..3275caaf90 100644 --- a/lib/api/objectPutRetention.js +++ b/lib/api/objectPutRetention.js @@ -1,5 +1,5 @@ const async = require('async'); -const { errors, s3middleware } = require('arsenal'); +const { errors, errorInstances, s3middleware } = require('arsenal'); const { decodeVersionId, getVersionIdResHeader, getVersionSpecificMetadataOptions } = require('./apiUtils/object/versioning'); @@ -86,7 +86,7 @@ function objectPutRetention(authInfo, request, log, callback) { if (!bucket.isObjectLockEnabled()) { log.trace('object lock not enabled on bucket', { method: 'objectPutRetention' }); - return next(errors.InvalidRequest.customizeDescription( + return next(errorInstances.InvalidRequest.customizeDescription( 'Bucket is missing Object Lock Configuration' ), bucket); } diff --git a/lib/routes/routeBackbeat.js b/lib/routes/routeBackbeat.js index a972967d48..42250d0493 100644 --- a/lib/routes/routeBackbeat.js +++ b/lib/routes/routeBackbeat.js @@ -6,7 +6,7 @@ const querystring = require('querystring'); const backbeatProxy = httpProxy.createProxyServer({ ignorePath: true, }); -const { auth, errors, s3middleware, s3routes, models, storage } = +const { auth, errors, errorInstances, s3middleware, s3routes, models, storage } = require('arsenal'); const { responseJSONBody } = s3routes.routesUtils; const { getSubPartIds } = s3middleware.azureHelper.mpuUtils; @@ -133,26 +133,26 @@ function _checkMultipleBackendRequest(request, log) { if (storageType === undefined) { errMessage = 'bad request: missing x-scal-storage-type header'; log.error(errMessage); - return errors.BadRequest.customizeDescription(errMessage); + return errorInstances.BadRequest.customizeDescription(errMessage); } if (operation === 'putpart' && headers['x-scal-part-number'] === undefined) { errMessage = 'bad request: missing part-number header'; log.error(errMessage); - return errors.BadRequest.customizeDescription(errMessage); + return errorInstances.BadRequest.customizeDescription(errMessage); } const isMPUOperation = ['putpart', 'completempu', 'abortmpu'].includes(operation); if (isMPUOperation && headers['x-scal-upload-id'] === undefined) { errMessage = 'bad request: missing upload-id header'; log.error(errMessage); - return errors.BadRequest.customizeDescription(errMessage); + return errorInstances.BadRequest.customizeDescription(errMessage); } if (operation === 'putobject' && headers['x-scal-canonical-id'] === undefined) { errMessage = 'bad request: missing x-scal-canonical-id header'; log.error(errMessage); - return errors.BadRequest.customizeDescription(errMessage); + return errorInstances.BadRequest.customizeDescription(errMessage); } // Ensure the external backend has versioning before asserting version ID. if (!constants.versioningNotImplBackends[storageType] && @@ -161,30 +161,30 @@ function _checkMultipleBackendRequest(request, log) { errMessage = 'bad request: missing x-scal-data-store-version-id header'; log.error(errMessage); - return errors.BadRequest.customizeDescription(errMessage); + return errorInstances.BadRequest.customizeDescription(errMessage); } if (headers['x-scal-source-bucket'] === undefined) { errMessage = 'bad request: missing x-scal-source-bucket header'; log.error(errMessage); - return errors.BadRequest.customizeDescription(errMessage); + return errorInstances.BadRequest.customizeDescription(errMessage); } if (headers['x-scal-replication-endpoint-site'] === undefined) { errMessage = 'bad request: missing ' + 'x-scal-replication-endpoint-site'; log.error(errMessage); - return errors.BadRequest.customizeDescription(errMessage); + return errorInstances.BadRequest.customizeDescription(errMessage); } } if (operation === 'putobject' && headers['content-md5'] === undefined) { errMessage = 'bad request: missing content-md5 header'; log.error(errMessage); - return errors.BadRequest.customizeDescription(errMessage); + return errorInstances.BadRequest.customizeDescription(errMessage); } if (headers['x-scal-storage-class'] === undefined) { errMessage = 'bad request: missing x-scal-storage-class header'; log.error(errMessage); - return errors.BadRequest.customizeDescription(errMessage); + return errorInstances.BadRequest.customizeDescription(errMessage); } const location = locationConstraints[headers['x-scal-storage-class']]; const storageTypeList = storageType.split(','); @@ -198,7 +198,7 @@ function _checkMultipleBackendRequest(request, log) { objectKey: request.objectKey, resourceType: request.resourceType, }); - return errors.InvalidRequest.customizeDescription(errMessage); + return errorInstances.InvalidRequest.customizeDescription(errMessage); } return undefined; } @@ -357,11 +357,11 @@ function headObject(request, response, log, cb) { locations = JSON.parse(request.headers['x-scal-locations']); } catch (e) { const msg = 'x-scal-locations header is invalid'; - return cb(errors.InvalidRequest.customizeDescription(msg)); + return cb(errorInstances.InvalidRequest.customizeDescription(msg)); } if (!Array.isArray(locations)) { const msg = 'x-scal-locations header is invalid'; - return cb(errors.InvalidRequest.customizeDescription(msg)); + return cb(errorInstances.InvalidRequest.customizeDescription(msg)); } return _getLastModified(locations, log, (err, lastModified) => { if (err) { @@ -391,13 +391,13 @@ function putData(request, response, bucketInfo, objMd, log, callback) { if (canonicalID === undefined) { errMessage = 'bad request: missing x-scal-canonical-id header'; log.error(errMessage); - return callback(errors.BadRequest.customizeDescription(errMessage)); + return callback(errorInstances.BadRequest.customizeDescription(errMessage)); } const contentMD5 = request.headers['content-md5']; if (contentMD5 === undefined) { errMessage = 'bad request: missing content-md5 header'; log.error(errMessage); - return callback(errors.BadRequest.customizeDescription(errMessage)); + return callback(errorInstances.BadRequest.customizeDescription(errMessage)); } const context = { bucketName: request.bucketName, @@ -1156,7 +1156,7 @@ function listLifecycle(request, response, userInfo, log, cb) { if (!request.query || !request.query['list-type']) { const errMessage = 'bad request: missing list-type query parameter'; log.error(errMessage); - return cb(errors.BadRequest.customizeDescription(errMessage)); + return cb(errorInstances.BadRequest.customizeDescription(errMessage)); } const listType = request.query['list-type']; @@ -1166,7 +1166,7 @@ function listLifecycle(request, response, userInfo, log, cb) { } else { const errMessage = `bad request: invalid list-type query parameter: ${listType}`; log.error(errMessage); - return cb(errors.BadRequest.customizeDescription(errMessage)); + return cb(errorInstances.BadRequest.customizeDescription(errMessage)); } return call(userInfo, locationConstraints, request, log, (err, data) => { diff --git a/package.json b/package.json index c65f511ff9..c1bb21cd3e 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "homepage": "https://github.com/scality/S3#readme", "dependencies": { "@hapi/joi": "^17.1.0", - "arsenal": "git+https://github.com/scality/arsenal#7.70.29", + "arsenal": "git+https://github.com/scality/arsenal#7.70.39", "async": "~2.5.0", "aws-sdk": "2.905.0", "azure-storage": "^2.1.0", diff --git a/tests/functional/aws-node-sdk/test/bucket/aclUsingPredefinedGroups.js b/tests/functional/aws-node-sdk/test/bucket/aclUsingPredefinedGroups.js index 439a9ec1e5..d4cd4f8be2 100644 --- a/tests/functional/aws-node-sdk/test/bucket/aclUsingPredefinedGroups.js +++ b/tests/functional/aws-node-sdk/test/bucket/aclUsingPredefinedGroups.js @@ -1,6 +1,6 @@ const assert = require('assert'); const AWS = require('aws-sdk'); -const { errors } = require('arsenal'); +const { errorInstances } = require('arsenal'); const withV4 = require('../support/withV4'); const BucketUtility = require('../../lib/utility/bucket-util'); @@ -41,7 +41,7 @@ withV4(sigCfg => { function cbWithError(done) { return err => { assert.notStrictEqual(err, null); - assert.strictEqual(err.statusCode, errors.AccessDenied.code); + assert.strictEqual(err.statusCode, errorInstances.AccessDenied.code); done(); }; } @@ -181,7 +181,7 @@ withV4(sigCfg => { assert.notStrictEqual(err, null); assert.strictEqual( err.statusCode, - errors.AccessDenied.code + errorInstances.AccessDenied.code ); } done(); diff --git a/tests/functional/aws-node-sdk/test/bucket/bucketPolicyWithResourceStatements.js b/tests/functional/aws-node-sdk/test/bucket/bucketPolicyWithResourceStatements.js index b97d8a32ba..b60941678b 100644 --- a/tests/functional/aws-node-sdk/test/bucket/bucketPolicyWithResourceStatements.js +++ b/tests/functional/aws-node-sdk/test/bucket/bucketPolicyWithResourceStatements.js @@ -1,6 +1,6 @@ const assert = require('assert'); const AWS = require('aws-sdk'); -const { errors } = require('arsenal'); +const { errorInstances } = require('arsenal'); const withV4 = require('../support/withV4'); const BucketUtility = require('../../lib/utility/bucket-util'); @@ -32,7 +32,7 @@ withV4(sigCfg => { function cbWithError(done) { return err => { - assert.strictEqual(err.statusCode, errors.AccessDenied.code); + assert.strictEqual(err.statusCode, errorInstances.AccessDenied.code); done(); }; } diff --git a/tests/functional/aws-node-sdk/test/bucket/deleteBucketReplication.js b/tests/functional/aws-node-sdk/test/bucket/deleteBucketReplication.js index 1064732d84..1c0eb8c1d0 100644 --- a/tests/functional/aws-node-sdk/test/bucket/deleteBucketReplication.js +++ b/tests/functional/aws-node-sdk/test/bucket/deleteBucketReplication.js @@ -1,7 +1,7 @@ const assert = require('assert'); const { S3 } = require('aws-sdk'); const { series } = require('async'); -const { errors } = require('arsenal'); +const { errorInstances } = require('arsenal'); const getConfig = require('../support/config'); const BucketUtility = require('../../lib/utility/bucket-util'); @@ -81,7 +81,7 @@ describe('aws-node-sdk test deleteBucketReplication', () => { }), next => deleteReplicationAndCheckResponse(bucket, next), next => s3.getBucketReplication({ Bucket: bucket }, err => { - assert(errors.ReplicationConfigurationNotFoundError.is[err.code]); + assert(errorInstances.ReplicationConfigurationNotFoundError.is[err.code]); return next(); }), ], done)); diff --git a/tests/functional/aws-node-sdk/test/bucket/getBucketReplication.js b/tests/functional/aws-node-sdk/test/bucket/getBucketReplication.js index f4ab62cd80..66e97181c7 100644 --- a/tests/functional/aws-node-sdk/test/bucket/getBucketReplication.js +++ b/tests/functional/aws-node-sdk/test/bucket/getBucketReplication.js @@ -1,7 +1,7 @@ const assert = require('assert'); const { S3 } = require('aws-sdk'); const { series } = require('async'); -const { errors } = require('arsenal'); +const { errorInstances } = require('arsenal'); const getConfig = require('../support/config'); const BucketUtility = require('../../lib/utility/bucket-util'); @@ -45,7 +45,7 @@ describe('aws-node-sdk test getBucketReplication', () => { it("should return 'ReplicationConfigurationNotFoundError' if bucket does " + 'not have a replication configuration', done => s3.getBucketReplication({ Bucket: bucket }, err => { - assert(errors.ReplicationConfigurationNotFoundError.is[err.code]); + assert(errorInstances.ReplicationConfigurationNotFoundError.is[err.code]); return done(); })); diff --git a/tests/functional/aws-node-sdk/test/object/objectHead.js b/tests/functional/aws-node-sdk/test/object/objectHead.js index dc68c9e4dd..a044cf2196 100644 --- a/tests/functional/aws-node-sdk/test/object/objectHead.js +++ b/tests/functional/aws-node-sdk/test/object/objectHead.js @@ -1,6 +1,6 @@ const assert = require('assert'); const async = require('async'); -const { errors } = require('arsenal'); +const { errorInstances } = require('arsenal'); const moment = require('moment'); const Promise = require('bluebird'); @@ -127,7 +127,7 @@ describe('HEAD object, conditions', () => { it('If-Match: returns PreconditionFailed when ETag does not match', done => { requestHead({ IfMatch: 'non-matching ETag' }, err => { - checkError(err, errors.PreconditionFailed.code); + checkError(err, errorInstances.PreconditionFailed.code); done(); }); }); @@ -244,7 +244,7 @@ describe('HEAD object, conditions', () => { 'lastModified date is lesser', done => { requestHead({ IfUnmodifiedSince: dateFromNow(-1) }, err => { - checkError(err, errors.PreconditionFailed.code); + checkError(err, errorInstances.PreconditionFailed.code); done(); }); }); @@ -276,7 +276,7 @@ describe('HEAD object, conditions', () => { IfMatch: 'non-matching', IfUnmodifiedSince: dateFromNow(-1), }, err => { - checkError(err, errors.PreconditionFailed.code); + checkError(err, errorInstances.PreconditionFailed.code); done(); }); }); @@ -286,7 +286,7 @@ describe('HEAD object, conditions', () => { IfMatch: 'non-matching', IfUnmodifiedSince: dateFromNow(1), }, err => { - checkError(err, errors.PreconditionFailed.code); + checkError(err, errorInstances.PreconditionFailed.code); done(); }); }); @@ -318,7 +318,7 @@ describe('HEAD object, conditions', () => { IfMatch: 'non-matching', IfModifiedSince: dateFromNow(1), }, err => { - checkError(err, errors.PreconditionFailed.code); + checkError(err, errorInstances.PreconditionFailed.code); done(); }); }); @@ -328,7 +328,7 @@ describe('HEAD object, conditions', () => { IfMatch: 'non-matching', IfModifiedSince: dateFromNow(-1), }, err => { - checkError(err, errors.PreconditionFailed.code); + checkError(err, errorInstances.PreconditionFailed.code); done(); }); }); @@ -392,7 +392,7 @@ describe('HEAD object, conditions', () => { IfNoneMatch: 'non-matching', IfUnmodifiedSince: dateFromNow(-1), }, err => { - checkError(err, errors.PreconditionFailed.code); + checkError(err, errorInstances.PreconditionFailed.code); done(); }); }); @@ -412,7 +412,7 @@ describe('HEAD object, conditions', () => { IfNoneMatch: etagTrim, IfUnmodifiedSince: dateFromNow(-1), }, err => { - checkError(err, errors.PreconditionFailed.code); + checkError(err, errorInstances.PreconditionFailed.code); done(); }); }); diff --git a/tests/multipleBackend/multipartUpload.js b/tests/multipleBackend/multipartUpload.js index 36f92da26e..7c480530b7 100644 --- a/tests/multipleBackend/multipartUpload.js +++ b/tests/multipleBackend/multipartUpload.js @@ -2,7 +2,7 @@ const assert = require('assert'); const async = require('async'); const AWS = require('aws-sdk'); const { parseString } = require('xml2js'); -const { errors, models } = require('arsenal'); +const { errors, errorInstances, models } = require('arsenal'); const BucketInfo = models.BucketInfo; const { getRealAwsConfig } = @@ -466,7 +466,7 @@ describe('Multipart Upload API with AWS Backend', function mpuTestSuite() { abortMPU(uploadId, getAwsParams(objectKey), () => { const listParams = getListParams(objectKey, uploadId); listParts(authInfo, listParams, log, err => { - assert.deepStrictEqual(err, errors.ServiceUnavailable + assert.deepStrictEqual(err, errorInstances.ServiceUnavailable .customizeDescription('Error returned from AWS: ' + 'The specified upload does not exist. The upload ID ' + 'may be invalid, or the upload may have been aborted ' + diff --git a/tests/unit/api/apiUtils/objectLockHelpers.js b/tests/unit/api/apiUtils/objectLockHelpers.js index 0ccfa22a8c..808ff2b0ca 100644 --- a/tests/unit/api/apiUtils/objectLockHelpers.js +++ b/tests/unit/api/apiUtils/objectLockHelpers.js @@ -1,6 +1,6 @@ const assert = require('assert'); const moment = require('moment'); -const { errors } = require('arsenal'); +const { errorInstances } = require('arsenal'); const BucketInfo = require('arsenal').models.BucketInfo; const { DummyRequestLogger } = require('../../helpers'); const { @@ -35,7 +35,7 @@ describe('objectLockHelpers: validateHeaders', () => { }; const objectLockValidationError = validateHeaders(objLockDisabledBucketInfo, headers, log); - const expectedError = errors.InvalidRequest.customizeDescription( + const expectedError = errorInstances.InvalidRequest.customizeDescription( 'Bucket is missing ObjectLockConfiguration'); assert.strictEqual(objectLockValidationError.is.InvalidRequest, true); assert.strictEqual(objectLockValidationError.description, @@ -87,7 +87,7 @@ describe('objectLockHelpers: validateHeaders', () => { }; const objectLockValidationError = validateHeaders(bucketInfo, headers, log); - const expectedError = errors.InvalidArgument.customizeDescription( + const expectedError = errorInstances.InvalidArgument.customizeDescription( 'x-amz-object-lock-retain-until-date and x-amz-object-lock-mode ' + 'must both be supplied'); assert.strictEqual(objectLockValidationError.is.InvalidArgument, true); @@ -101,7 +101,7 @@ describe('objectLockHelpers: validateHeaders', () => { }; const objectLockValidationError = validateHeaders(bucketInfo, headers, log); - const expectedError = errors.InvalidArgument.customizeDescription( + const expectedError = errorInstances.InvalidArgument.customizeDescription( 'x-amz-object-lock-retain-until-date and x-amz-object-lock-mode ' + 'must both be supplied'); assert.strictEqual(objectLockValidationError.is.InvalidArgument, true); @@ -114,7 +114,7 @@ describe('objectLockHelpers: validateHeaders', () => { 'x-amz-object-lock-retain-until-date': '2005-10-12', 'x-amz-object-lock-mode': 'COMPLIANCE', }; - const expectedError = errors.InvalidArgument.customizeDescription( + const expectedError = errorInstances.InvalidArgument.customizeDescription( 'The retain until date must be in the future!'); const objectLockValidationError = validateHeaders(bucketInfo, headers, log); @@ -129,7 +129,7 @@ describe('objectLockHelpers: validateHeaders', () => { }; const objectLockValidationError = validateHeaders(bucketInfo, headers, log); - const expectedError = errors.InvalidArgument.customizeDescription( + const expectedError = errorInstances.InvalidArgument.customizeDescription( 'Legal hold status must be one of "ON", "OFF"'); assert.strictEqual(objectLockValidationError.is.InvalidArgument, true); assert.strictEqual(objectLockValidationError.description, @@ -143,7 +143,7 @@ describe('objectLockHelpers: validateHeaders', () => { }; const objectLockValidationError = validateHeaders(bucketInfo, headers, log); - const expectedError = errors.InvalidArgument.customizeDescription( + const expectedError = errorInstances.InvalidArgument.customizeDescription( 'Unknown wormMode directive'); assert.strictEqual(objectLockValidationError.is.InvalidArgument, true); assert.strictEqual(objectLockValidationError.description, diff --git a/tests/unit/api/objectHead.js b/tests/unit/api/objectHead.js index a917835a2a..e302beb43f 100644 --- a/tests/unit/api/objectHead.js +++ b/tests/unit/api/objectHead.js @@ -1,5 +1,5 @@ const assert = require('assert'); -const { errors } = require('arsenal'); +const { errors, errorInstances } = require('arsenal'); const { bucketPut } = require('../../../lib/api/bucketPut'); const { cleanup, DummyRequestLogger, makeAuthInfo } = require('../helpers'); @@ -183,7 +183,7 @@ describe('objectHead API', () => { }, actionImplicitDenies: false, }; - const customizedInvalidRequestError = errors.InvalidRequest + const customizedInvalidRequestError = errorInstances.InvalidRequest .customizeDescription('Cannot specify both Range header and ' + 'partNumber query parameter.'); @@ -211,7 +211,7 @@ describe('objectHead API', () => { }, actionImplicitDenies: false, }; - const customizedInvalidArgumentError = errors.InvalidArgument + const customizedInvalidArgumentError = errorInstances.InvalidArgument .customizeDescription('Part number must be a number.'); bucketPut(authInfo, testPutBucketRequest, log, () => { diff --git a/tests/unit/api/objectPut.js b/tests/unit/api/objectPut.js index fdcd0812c9..11ec8a33f9 100644 --- a/tests/unit/api/objectPut.js +++ b/tests/unit/api/objectPut.js @@ -1,7 +1,7 @@ const assert = require('assert'); const async = require('async'); const moment = require('moment'); -const { errors, s3middleware } = require('arsenal'); +const { errors, errorInstances, s3middleware } = require('arsenal'); const sinon = require('sinon'); const { bucketPut } = require('../../../lib/api/bucketPut'); @@ -546,7 +546,7 @@ describe('objectPut API', () => { bucketPut(authInfo, testPutBucketRequest, log, () => { objectPut(authInfo, testPutObjectRequest, undefined, log, err => { - assert.deepStrictEqual(err, errors.InvalidRequest + assert.deepStrictEqual(err, errorInstances.InvalidRequest .customizeDescription( 'Bucket is missing ObjectLockConfiguration')); done(); diff --git a/tests/unit/api/objectPutACL.js b/tests/unit/api/objectPutACL.js index 83a2d8caea..0ad7c56ab1 100644 --- a/tests/unit/api/objectPutACL.js +++ b/tests/unit/api/objectPutACL.js @@ -1,7 +1,7 @@ const assert = require('assert'); const async = require('async'); -const { errors } = require('arsenal'); +const { errors, errorInstances } = require('arsenal'); const AuthInfo = require('arsenal').auth.AuthInfo; const { bucketPut } = require('../../../lib/api/bucketPut'); @@ -586,7 +586,7 @@ describe('putObjectACL API', () => { testObjACLRequest, log, next), ], err => { assert(err instanceof Error); - assert.strictEqual(err.code, errors.AccessDenied.code); + assert.strictEqual(err.code, errorInstances.AccessDenied.code); done(); }); }); diff --git a/yarn.lock b/yarn.lock index b1f57ee496..d4ea8fb378 100644 --- a/yarn.lock +++ b/yarn.lock @@ -499,9 +499,9 @@ arraybuffer.slice@~0.0.7: optionalDependencies: ioctl "^2.0.2" -"arsenal@git+https://github.com/scality/arsenal#7.70.29": - version "7.70.29" - resolved "git+https://github.com/scality/arsenal#a643a3e6ccbc49327339a285de1d4cb17afcd171" +"arsenal@git+https://github.com/scality/arsenal#7.70.39": + version "7.70.39" + resolved "git+https://github.com/scality/arsenal#81119e8aa832eeaaa06ba4233b50e9de618dc99d" dependencies: "@js-sdsl/ordered-set" "^4.4.2" "@types/async" "^3.2.12"