Aurélien Georget bd91a2ef93 Add 'packages/strapi-plugin-settings-manager/' from commit 'cd241c14c6a6239bca279e7accd709ba58e87cc8'
git-subtree-dir: packages/strapi-plugin-settings-manager
git-subtree-mainline: 80aa83d8460c95366547e143c74bf79ea6ae69f8
git-subtree-split: cd241c14c6a6239bca279e7accd709ba58e87cc8
2017-01-15 20:14:40 +01:00

202 lines
5.0 KiB
JavaScript

'use strict';
/**
* Schema security dependencies
*/
// Public node modules
var _ = require('lodash');
var validator = require('validator');
var SchemaSecurity = function(app) {
var schema = {
session: {
type: ['boolean', 'object'],
path: 'config/environments/' + app.currentUpdatedEnvironment + '/security.json',
values: {
object: {
key: {
type: 'string'
},
secretKeys: {
type: 'array'
},
maxAge: {
type: 'integer'
}
}
}
},
csrf: {
type: ['boolean', 'object'],
path: 'config/environments/' + app.currentUpdatedEnvironment + '/security.json',
values: {
object: {
key: {
type: 'string'
},
secret: {
type: 'string'
}
}
}
},
csp: {
type: ['boolean', 'object'],
path: 'config/environments/' + app.currentUpdatedEnvironment + '/security.json',
values: {
object: {
reportOnly: {
type: 'boolean'
},
reportUri: {
type: 'string'
}
}
},
resolve: function(rootValue, value, scope, cb) {
if (_.isObject(value)) {
if (validator.isURL(value.reportUri)) {
return cb(null, value);
}
return cb('ReportURI is not a valid URL', null);
}
return cb(null, value);
}
},
hsts: {
type: ['boolean', 'object'],
path: 'config/environments/' + app.currentUpdatedEnvironment + '/security.json',
values: {
object: {
maxAge: {
type: 'integer'
},
includeSubDomains: {
type: 'boolean'
}
}
}
},
xframe: {
type: ['boolean', 'string'],
path: 'config/environments/' + app.currentUpdatedEnvironment + '/security.json'
},
xssProtection: {
type: ['boolean', 'object'],
path: 'config/environments/' + app.currentUpdatedEnvironment + '/security.json',
values: {
object: {
enabled: {
type: 'boolean'
},
mode: {
type: 'string'
}
}
}
},
cors: {
type: ['boolean', 'object'],
path: 'config/environments/' + app.currentUpdatedEnvironment + '/security.json',
values: {
object: {
origin: {
type: 'boolean'
},
expose: {
type: 'array'
},
maxAge: {
type: 'integer'
},
credentials: {
type: 'boolean'
},
methods: {
type: 'array'
},
headers: {
type: 'array'
}
}
}
},
ssl: {
type: ['boolean', 'object'],
path: 'config/environments/' + app.currentUpdatedEnvironment + '/security.json',
values: {
object: {
disabled: {
type: 'boolean'
},
trustProxy: {
type: 'boolean'
}
}
}
},
ip: {
type: 'object',
path: 'config/environments/' + app.currentUpdatedEnvironment + '/security.json',
values: {
object: {
whiteList: {
type: 'array'
},
blackList: {
type: 'array'
}
}
},
resolver: function(rootValue, value, scope, cb) {
var arrayOfWhiteIP = [];
var arrayOfBlackIP = [];
_.forEach(value.whiteList, function(whiteListIP) {
if (!validator.isIP(whiteListIP) && !validator.isURL(whiteListIP)) {
arrayOfWhiteIP.push(whiteListIP);
}
});
_.forEach(value.blackList, function(blackListIP) {
if (!validator.isIP(blackListIP) && !validator.isURL(blackListIP)) {
arrayOfBlackIP.push(blackListIP);
}
});
if (_.isEmpty(arrayOfBlackIP) && !_.isEmpty(arrayOfWhiteIP)) {
return cb('Those whitelisted IP are invalid: ' + arrayOfWhiteIP.toString(), null);
} else if (!_.isEmpty(arrayOfBlackIP) && _.isEmpty(arrayOfWhiteIP)) {
return cb('Those blacklisted IP are invalid: ' + arrayOfBlackIP.toString(), null);
} else if (!_.isEmpty(arrayOfBlackIP) && !_.isEmpty(arrayOfWhiteIP)) {
return cb('Those blacklisted and whitelisted IP are invalid: ' + arrayOfBlackIP.toString() + arrayOfWhiteIP.toString(), null);
}
return cb(null, value);
}
},
proxy: {
type: ['boolean', 'string'],
path: 'config/environments/' + app.currentUpdatedEnvironment + '/security.json',
resolver: function(rootValue, value, scope, cb) {
if (_.isString(value)) {
if (validator.isURL(value) || validator.isIP(value)) {
return cb(null, value);
}
return cb('Invalid proxy host', null);
}
return cb(null, value);
}
}
};
return schema;
};
module.exports = SchemaSecurity;