Skip to content

Commit

Permalink
fix readENVTruthy and make INSECURE_USE_HTTP, SECURE_HSTS_HEADER, SEC…
Browse files Browse the repository at this point in the history
…URE_HSTS_HEADER_* and SECURE_CSP work as expected.

readENVTruthy never returned defaultValue. if not set to on|off|true|false the default value is returned
  • Loading branch information
PieterGit committed Feb 2, 2019
1 parent 04ec3ab commit 3104083
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 9 deletions.
13 changes: 6 additions & 7 deletions app.js
Expand Up @@ -14,18 +14,17 @@ function create(env, ctx) {
var appInfo = env.name + ' ' + env.version;
app.set('title', appInfo);
app.enable('trust proxy'); // Allows req.secure test on heroku https connections.
if (!process.env.INSECURE_USE_HTTP=='true') {
if (!process.env.insecureUseHttp) {
app.use((req, res, next) => {
if (req.header('x-forwarded-proto') !== 'https')
res.redirect(`https://${req.header('host')}${req.url}`);
else
next()
})
//if (env.settings.isEnabled('secureHstsHeader')) { // by TODO: find out why env.settings.isEnabled doest not work
if (process.env.SECURE_HSTS_HEADER == 'true') { // Add HSTS (HTTP Strict Transport Security) header
if (process.secureHstsHeader) { // Add HSTS (HTTP Strict Transport Security) header
const helmet = require('helmet');
var includeSubDomainsValue = process.env.SECURE_HSTS_HEADER_INCLUDESUBDOMAINS || false ; // _get(env, 'extendedSettings.secureHstsHeader.includesubdomains')
var preloadValue = process.env.SECURE_HSTS_HEADER_PRELOAD || false; // _get(env, 'extendedSettings.secureHstsHeader.preload') || false ; // default
var includeSubDomainsValue = process.env.secureHstsHeaderIncludeSubdomains;
var preloadValue = process.env.secureHstsHeaderPreload;
app.use(helmet({
hsts: {
maxAge: 31536000,
Expand All @@ -34,8 +33,8 @@ function create(env, ctx) {
}
}))
//if (env.settings.isEnabled('secureCsp')) { // Add Content-Security-Policy directive by default
if (process.env.SECURE_CSP == 'true') {
app.use(helmet.contentSecurityPolicy({ // TODO make NS work without 'unsafe-inline'
if (process.env.secureCsp) {
app.use(helmet.contentSecurityPolicy({ //TODO make NS work without 'unsafe-inline'
directives: {
defaultSrc: ["'self'"],
styleSrc: ["'self'", 'https://fonts.googleapis.com/',"'unsafe-inline'"],
Expand Down
12 changes: 10 additions & 2 deletions env.js
Expand Up @@ -55,6 +55,13 @@ function setSSL() {
env.ca = fs.readFileSync(env.SSL_CA);
}
}

env.insecureUseHttp = readENVTruthy("INSECURE_USE_HTTP", false);
env.secureHstsHeader = readENVTruthy("SECURE_HSTS_HEADER", true);
env.secureHstsHeaderIncludeSubdomains = readENVTruthy("SECURE_HSTS_HEADER_INCLUDESUBDOMAINS", false);
env.secureHstsHeaderPreload= readENVTruthy("SECURE_HSTS_HEADER_PRELOAD", false);
env.secureCsp = readENVTruthy("SECURE_CSP", false);

}

// A little ugly, but we don't want to read the secret into a var
Expand Down Expand Up @@ -144,7 +151,8 @@ function readENV(varName, defaultValue) {
function readENVTruthy(varName, defaultValue) {
var value = readENV(varName, defaultValue);
if (typeof value === 'string' && (value.toLowerCase() === 'on' || value.toLowerCase() === 'true')) { value = true; }
if (typeof value === 'string' && (value.toLowerCase() === 'off' || value.toLowerCase() === 'false')) { value = false; }
else if (typeof value === 'string' && (value.toLowerCase() === 'off' || value.toLowerCase() === 'false')) { value = false; }
else { value=defaultValue }
return value;
}

Expand Down Expand Up @@ -178,6 +186,6 @@ function findExtendedSettings (envs) {
}
});
return extended;
}
}

module.exports = config;
2 changes: 2 additions & 0 deletions lib/settings.js
Expand Up @@ -44,6 +44,8 @@ function init ( ) {
},
insecureUseHttp: false,
secureHstsHeader: true,
secureHstsHeaderIncludeSubdomains: false,
secureHstsHeaderPreload: false,
secureCsp: false
};

Expand Down
15 changes: 15 additions & 0 deletions tests/env.test.js
Expand Up @@ -52,4 +52,19 @@ describe('env', function ( ) {
delete process.env.PUSHOVER_API_TOKEN;
});

it('readENVTruthy ', function () {
process.env.INSECURE_USE_HTTP = 'true';
var env = require('../env')();
env.insecureUseHttp.should.be.true();
process.env.INSECURE_USE_HTTP = 'false';
env = require('../env')();
env.insecureUseHttp.should.be.false();
process.env.INSECURE_USE_HTTP = 'not set ok, so use default value false';
env = require('../env')();
env.insecureUseHttp.should.be.false();
delete process.env.INSECURE_USE_HTTP; // unset INSECURE_USE_HTTP
env = require('../env')();
env.insecureUseHttp.should.be.false(); // not defined should be false
});

});

0 comments on commit 3104083

Please sign in to comment.