From c96e1c01aaf47284ef5140b86adbb46ddb38d6e3 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Sat, 13 May 2017 10:41:33 -0400 Subject: [PATCH] feat: use of env vars anywhere in config files --- config.docker.yml | 4 +--- server/app/data.yml | 7 +++---- server/libs/auth.js | 16 +++++++-------- server/libs/config.js | 40 +++++++++++++++++++------------------- server/middlewares/auth.js | 12 +++++------- 5 files changed, 37 insertions(+), 42 deletions(-) diff --git a/config.docker.yml b/config.docker.yml index 29bec6a6..ba1820b3 100644 --- a/config.docker.yml +++ b/config.docker.yml @@ -19,9 +19,8 @@ host: http://localhost # --------------------------------------------------------------------- # Port the main server should listen to (80 by default) # --------------------------------------------------------------------- -# To use process.env.PORT, comment the line below: -# port: 80 +port: $(PORT) # --------------------------------------------------------------------- # Data Directories @@ -103,7 +102,6 @@ sessionSecret: 1234567890abcdefghijklmnopqrstuvxyz # --------------------------------------------------------------------- # Database Connection String # --------------------------------------------------------------------- -# You can also use an ENV variable by using $ENV_VAR_NAME as the value db: mongodb://mongo:27017/wiki diff --git a/server/app/data.yml b/server/app/data.yml index eda74570..450872b2 100644 --- a/server/app/data.yml +++ b/server/app/data.yml @@ -3,10 +3,6 @@ # This is reserved for system use! # --------------------------------- name: Wiki.js -capabilities: - guest: true - rights: true - manyAuthProviders: true defaults: config: title: Wiki @@ -64,6 +60,9 @@ langs: - id: en name: English + - + id: zh + name: Chinese - 普通话 - id: fr name: French - Français diff --git a/server/libs/auth.js b/server/libs/auth.js index 7add738d..24a17ecc 100644 --- a/server/libs/auth.js +++ b/server/libs/auth.js @@ -26,7 +26,7 @@ module.exports = function (passport) { // Local Account - if (!appdata.capabilities.manyAuthProviders || (appconfig.auth.local && appconfig.auth.local.enabled)) { + if (appconfig.auth.local && appconfig.auth.local.enabled) { const LocalStrategy = require('passport-local').Strategy passport.use('local', new LocalStrategy({ @@ -53,7 +53,7 @@ module.exports = function (passport) { // Google ID - if (appdata.capabilities.manyAuthProviders && appconfig.auth.google && appconfig.auth.google.enabled) { + if (appconfig.auth.google && appconfig.auth.google.enabled) { const GoogleStrategy = require('passport-google-oauth20').Strategy passport.use('google', new GoogleStrategy({ @@ -73,7 +73,7 @@ module.exports = function (passport) { // Microsoft Accounts - if (appdata.capabilities.manyAuthProviders && appconfig.auth.microsoft && appconfig.auth.microsoft.enabled) { + if (appconfig.auth.microsoft && appconfig.auth.microsoft.enabled) { const WindowsLiveStrategy = require('passport-windowslive').Strategy passport.use('windowslive', new WindowsLiveStrategy({ @@ -93,7 +93,7 @@ module.exports = function (passport) { // Facebook - if (appdata.capabilities.manyAuthProviders && appconfig.auth.facebook && appconfig.auth.facebook.enabled) { + if (appconfig.auth.facebook && appconfig.auth.facebook.enabled) { const FacebookStrategy = require('passport-facebook').Strategy passport.use('facebook', new FacebookStrategy({ @@ -114,7 +114,7 @@ module.exports = function (passport) { // GitHub - if (appdata.capabilities.manyAuthProviders && appconfig.auth.github && appconfig.auth.github.enabled) { + if (appconfig.auth.github && appconfig.auth.github.enabled) { const GitHubStrategy = require('passport-github2').Strategy passport.use('github', new GitHubStrategy({ @@ -135,7 +135,7 @@ module.exports = function (passport) { // Slack - if (appdata.capabilities.manyAuthProviders && appconfig.auth.slack && appconfig.auth.slack.enabled) { + if (appconfig.auth.slack && appconfig.auth.slack.enabled) { const SlackStrategy = require('passport-slack').Strategy passport.use('slack', new SlackStrategy({ @@ -155,7 +155,7 @@ module.exports = function (passport) { // LDAP - if (appdata.capabilities.manyAuthProviders && appconfig.auth.ldap && appconfig.auth.ldap.enabled) { + if (appconfig.auth.ldap && appconfig.auth.ldap.enabled) { const LdapStrategy = require('passport-ldapauth').Strategy passport.use('ldapauth', new LdapStrategy({ @@ -189,7 +189,7 @@ module.exports = function (passport) { // AZURE AD - if (appdata.capabilities.manyAuthProviders && appconfig.auth.azure && appconfig.auth.azure.enabled) { + if (appconfig.auth.azure && appconfig.auth.azure.enabled) { const AzureAdOAuth2Strategy = require('passport-azure-ad-oauth2').Strategy const jwt = require('jsonwebtoken') passport.use('azure_ad_oauth2', diff --git a/server/libs/config.js b/server/libs/config.js index 58f808a3..bceb7dce 100644 --- a/server/libs/config.js +++ b/server/libs/config.js @@ -5,6 +5,15 @@ const yaml = require('js-yaml') const _ = require('lodash') const path = require('path') +const deepMap = (obj, iterator, context) => { + return _.transform(obj, (result, val, key) => { + result[key] = _.isObject(val) + ? deepMap(val, iterator, context) + : iterator.call(context, val, key, obj) + }) +} +_.mixin({ deepMap }) + /** * Load Application Configuration * @@ -22,7 +31,9 @@ module.exports = (confPaths) => { let appdata = {} try { - appconfig = yaml.safeLoad(fs.readFileSync(confPaths.config, 'utf8')) + appconfig = yaml.safeLoad(_.deepMap(fs.readFileSync(confPaths.config, 'utf8'), c => { + return _.replace(c, (/\$\([A-Z0-9_]+\)/g, (m) => { return process.env[m] })) + })) appdata = yaml.safeLoad(fs.readFileSync(confPaths.data, 'utf8')) appdata.regex = require(confPaths.dataRegex) } catch (ex) { @@ -34,32 +45,21 @@ module.exports = (confPaths) => { appconfig = _.defaultsDeep(appconfig, appdata.defaults.config) - // Using ENV variables? + // Check port if (appconfig.port < 1) { appconfig.port = process.env.PORT || 80 } - if (_.startsWith(appconfig.db, '$')) { - appconfig.db = process.env[appconfig.db.slice(1)] - } - // List authentication strategies - if (appdata.capabilities.manyAuthProviders) { - appconfig.authStrategies = { - list: _.filter(appconfig.auth, ['enabled', true]), - socialEnabled: (_.chain(appconfig.auth).omit('local').filter(['enabled', true]).value().length > 0) - } - if (appconfig.authStrategies.list.length < 1) { - console.error(new Error('You must enable at least 1 authentication strategy!')) - process.exit(1) - } - } else { - appconfig.authStrategies = { - list: { local: { enabled: true } }, - socialEnabled: false - } + appconfig.authStrategies = { + list: _.filter(appconfig.auth, ['enabled', true]), + socialEnabled: (_.chain(appconfig.auth).omit('local').filter(['enabled', true]).value().length > 0) + } + if (appconfig.authStrategies.list.length < 1) { + console.error(new Error('You must enable at least 1 authentication strategy!')) + process.exit(1) } return { diff --git a/server/middlewares/auth.js b/server/middlewares/auth.js index 8c84b8d9..9518bfd6 100644 --- a/server/middlewares/auth.js +++ b/server/middlewares/auth.js @@ -16,24 +16,22 @@ module.exports = (req, res, next) => { // Is user authenticated ? if (!req.isAuthenticated()) { - if (!appdata.capabilities.guest || req.app.locals.appconfig.public !== true) { + if (req.app.locals.appconfig.public !== true) { return res.redirect('/login') } else { req.user = rights.guest res.locals.isGuest = true } - } else if (appdata.capabilities.guest) { + } else { res.locals.isGuest = false } // Check permissions - if (appdata.capabilities.rights) { - res.locals.rights = rights.check(req) + res.locals.rights = rights.check(req) - if (!res.locals.rights.read) { - return res.render('error-forbidden') - } + if (!res.locals.rights.read) { + return res.render('error-forbidden') } // Set i18n locale