Browse Source

feat: use of env vars anywhere in config files

pull/107/head
NGPixel 7 years ago
parent
commit
c96e1c01aa
5 changed files with 37 additions and 42 deletions
  1. 4
      config.docker.yml
  2. 7
      server/app/data.yml
  3. 16
      server/libs/auth.js
  4. 40
      server/libs/config.js
  5. 12
      server/middlewares/auth.js

4
config.docker.yml

@ -19,9 +19,8 @@ host: http://localhost
# --------------------------------------------------------------------- # ---------------------------------------------------------------------
# Port the main server should listen to (80 by default) # 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 # Data Directories
@ -103,7 +102,6 @@ sessionSecret: 1234567890abcdefghijklmnopqrstuvxyz
# --------------------------------------------------------------------- # ---------------------------------------------------------------------
# Database Connection String # Database Connection String
# --------------------------------------------------------------------- # ---------------------------------------------------------------------
# You can also use an ENV variable by using $ENV_VAR_NAME as the value
db: mongodb://mongo:27017/wiki db: mongodb://mongo:27017/wiki

7
server/app/data.yml

@ -3,10 +3,6 @@
# This is reserved for system use! # This is reserved for system use!
# --------------------------------- # ---------------------------------
name: Wiki.js name: Wiki.js
capabilities:
guest: true
rights: true
manyAuthProviders: true
defaults: defaults:
config: config:
title: Wiki title: Wiki
@ -64,6 +60,9 @@ langs:
- -
id: en id: en
name: English name: English
-
id: zh
name: Chinese - 普通话
- -
id: fr id: fr
name: French - Français name: French - Français

16
server/libs/auth.js

@ -26,7 +26,7 @@ module.exports = function (passport) {
// Local Account // 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 const LocalStrategy = require('passport-local').Strategy
passport.use('local', passport.use('local',
new LocalStrategy({ new LocalStrategy({
@ -53,7 +53,7 @@ module.exports = function (passport) {
// Google ID // 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 const GoogleStrategy = require('passport-google-oauth20').Strategy
passport.use('google', passport.use('google',
new GoogleStrategy({ new GoogleStrategy({
@ -73,7 +73,7 @@ module.exports = function (passport) {
// Microsoft Accounts // 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 const WindowsLiveStrategy = require('passport-windowslive').Strategy
passport.use('windowslive', passport.use('windowslive',
new WindowsLiveStrategy({ new WindowsLiveStrategy({
@ -93,7 +93,7 @@ module.exports = function (passport) {
// Facebook // 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 const FacebookStrategy = require('passport-facebook').Strategy
passport.use('facebook', passport.use('facebook',
new FacebookStrategy({ new FacebookStrategy({
@ -114,7 +114,7 @@ module.exports = function (passport) {
// GitHub // 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 const GitHubStrategy = require('passport-github2').Strategy
passport.use('github', passport.use('github',
new GitHubStrategy({ new GitHubStrategy({
@ -135,7 +135,7 @@ module.exports = function (passport) {
// Slack // 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 const SlackStrategy = require('passport-slack').Strategy
passport.use('slack', passport.use('slack',
new SlackStrategy({ new SlackStrategy({
@ -155,7 +155,7 @@ module.exports = function (passport) {
// LDAP // 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 const LdapStrategy = require('passport-ldapauth').Strategy
passport.use('ldapauth', passport.use('ldapauth',
new LdapStrategy({ new LdapStrategy({
@ -189,7 +189,7 @@ module.exports = function (passport) {
// AZURE AD // 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 AzureAdOAuth2Strategy = require('passport-azure-ad-oauth2').Strategy
const jwt = require('jsonwebtoken') const jwt = require('jsonwebtoken')
passport.use('azure_ad_oauth2', passport.use('azure_ad_oauth2',

40
server/libs/config.js

@ -5,6 +5,15 @@ const yaml = require('js-yaml')
const _ = require('lodash') const _ = require('lodash')
const path = require('path') 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 * Load Application Configuration
* *
@ -22,7 +31,9 @@ module.exports = (confPaths) => {
let appdata = {} let appdata = {}
try { 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 = yaml.safeLoad(fs.readFileSync(confPaths.data, 'utf8'))
appdata.regex = require(confPaths.dataRegex) appdata.regex = require(confPaths.dataRegex)
} catch (ex) { } catch (ex) {
@ -34,32 +45,21 @@ module.exports = (confPaths) => {
appconfig = _.defaultsDeep(appconfig, appdata.defaults.config) appconfig = _.defaultsDeep(appconfig, appdata.defaults.config)
// Using ENV variables?
// Check port
if (appconfig.port < 1) { if (appconfig.port < 1) {
appconfig.port = process.env.PORT || 80 appconfig.port = process.env.PORT || 80
} }
if (_.startsWith(appconfig.db, '$')) {
appconfig.db = process.env[appconfig.db.slice(1)]
}
// List authentication strategies // 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 { return {

12
server/middlewares/auth.js

@ -16,24 +16,22 @@ module.exports = (req, res, next) => {
// Is user authenticated ? // Is user authenticated ?
if (!req.isAuthenticated()) { if (!req.isAuthenticated()) {
if (!appdata.capabilities.guest || req.app.locals.appconfig.public !== true) {
if (req.app.locals.appconfig.public !== true) {
return res.redirect('/login') return res.redirect('/login')
} else { } else {
req.user = rights.guest req.user = rights.guest
res.locals.isGuest = true res.locals.isGuest = true
} }
} else if (appdata.capabilities.guest) {
} else {
res.locals.isGuest = false res.locals.isGuest = false
} }
// Check permissions // 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 // Set i18n locale

Loading…
Cancel
Save