feat: use of env vars anywhere in config files

This commit is contained in:
NGPixel 2017-05-13 10:41:33 -04:00
parent 4da9c3d7f2
commit c96e1c01aa
5 changed files with 37 additions and 42 deletions

View File

@ -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

View File

@ -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

View File

@ -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',

View File

@ -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 {

View File

@ -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