Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions lib/api/apiUtils/authorization/permissionChecks.js
Original file line number Diff line number Diff line change
@@ -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');
Expand Down Expand Up @@ -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);
}
}
}
Expand Down
20 changes: 10 additions & 10 deletions lib/api/apiUtils/bucket/bucketCors.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const { parseString } = require('xml2js');
const { errors, s3middleware } = require('arsenal');
const { errors, errorInstances, s3middleware } = require('arsenal');

const escapeForXml = s3middleware.escapeForXml;

Expand Down Expand Up @@ -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;
},
Expand All @@ -92,7 +92,7 @@ const _validator = {
*/
validateNumberRules(length) {
if (length > 100) {
return errors.InvalidRequest
return errorInstances.InvalidRequest
.customizeDescription(customizedErrs.numberRules);
}
return true;
Expand All @@ -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
Expand All @@ -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;
},
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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++) {
Expand Down Expand Up @@ -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 =
Expand Down
9 changes: 5 additions & 4 deletions lib/api/apiUtils/bucket/bucketEncryption.js
Original file line number Diff line number Diff line change
@@ -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');
Expand Down Expand Up @@ -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'));
}

Expand Down Expand Up @@ -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'),
};
}
Expand Down
50 changes: 25 additions & 25 deletions lib/api/apiUtils/bucket/bucketWebsite.js
Original file line number Diff line number Diff line change
@@ -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 } =
Expand Down Expand Up @@ -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) {
Expand All @@ -162,23 +162,23 @@ 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 })) {
if (parent[0].Protocol[0] !== 'http' &&
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];
}
Expand All @@ -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]);
}
Expand All @@ -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]);
}
Expand All @@ -215,15 +215,15 @@ 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];
const ruleObj = { redirect: {} };
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
Expand All @@ -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) ||
Expand All @@ -246,24 +246,24 @@ 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];
}
if (rule.Redirect[0].HttpRedirectCode) {
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;
}
Expand All @@ -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()}` +
Expand All @@ -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 = {};
Expand All @@ -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];
Expand All @@ -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;
Expand All @@ -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 =
Expand Down
6 changes: 3 additions & 3 deletions lib/api/apiUtils/bucket/getNotificationConfiguration.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { errors, models } = require('arsenal');
const { errorInstances, models } = require('arsenal');
const { NotificationConfiguration } = models;

const { config } = require('../../../Config');
Expand All @@ -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));
Expand All @@ -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;
}
Expand Down
4 changes: 2 additions & 2 deletions lib/api/apiUtils/object/createAndStoreObject.js
Original file line number Diff line number Diff line change
@@ -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');
Expand Down Expand Up @@ -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));
});
}
Expand Down
4 changes: 2 additions & 2 deletions lib/api/apiUtils/object/locationConstraintCheck.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { errors } = require('arsenal');
const { errorInstances } = require('arsenal');

const { BackendInfo } = require('./BackendInfo');
const constants = require('../../../../constants');
Expand Down Expand Up @@ -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;
Expand Down
Loading
Loading