|
@@ -9,13 +9,48 @@ const logger = require('../server/logger')
|
|
|
const { version } = require('../../package.json')
|
|
|
|
|
|
/**
|
|
|
- * Reads all companion configuration set via environment variables
|
|
|
- * and via the config file path
|
|
|
+ * Tries to read the secret from a file if the according environment variable is set.
|
|
|
+ * Otherwise it falls back to the standard secret environment variable.
|
|
|
*
|
|
|
- * @returns {object}
|
|
|
+ * @param {string} baseEnvVar
|
|
|
+ *
|
|
|
+ * @returns {string}
|
|
|
*/
|
|
|
-exports.getCompanionOptions = (options = {}) => {
|
|
|
- return merge({}, getConfigFromEnv(), getConfigFromFile(), options)
|
|
|
+const getSecret = (baseEnvVar) => {
|
|
|
+ const secretFile = process.env[`${baseEnvVar}_FILE`]
|
|
|
+ return secretFile
|
|
|
+ ? fs.readFileSync(secretFile).toString()
|
|
|
+ : process.env[baseEnvVar]
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Auto-generates server secret
|
|
|
+ *
|
|
|
+ * @returns {string}
|
|
|
+ */
|
|
|
+exports.generateSecret = () => {
|
|
|
+ logger.warn('auto-generating server secret because none was specified', 'startup.secret')
|
|
|
+ return crypto.randomBytes(64).toString('hex')
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ * @param {string} url
|
|
|
+ */
|
|
|
+const hasProtocol = (url) => {
|
|
|
+ return url.startsWith('https://') || url.startsWith('http://')
|
|
|
+}
|
|
|
+
|
|
|
+function getCorsOrigins () {
|
|
|
+ if (process.env.COMPANION_CLIENT_ORIGINS) {
|
|
|
+ return process.env.COMPANION_CLIENT_ORIGINS
|
|
|
+ .split(',')
|
|
|
+ .map((url) => (hasProtocol(url) ? url : `${process.env.COMPANION_PROTOCOL || 'http'}://${url}`))
|
|
|
+ }
|
|
|
+ if (process.env.COMPANION_CLIENT_ORIGINS_REGEX) {
|
|
|
+ return new RegExp(process.env.COMPANION_CLIENT_ORIGINS_REGEX)
|
|
|
+ }
|
|
|
+ return undefined
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -104,8 +139,8 @@ const getConfigFromEnv = () => {
|
|
|
redisOptions: {},
|
|
|
sendSelfEndpoint: process.env.COMPANION_SELF_ENDPOINT,
|
|
|
uploadUrls: uploadUrls ? uploadUrls.split(',') : null,
|
|
|
- secret: getSecret('COMPANION_SECRET') || generateSecret(),
|
|
|
- preAuthSecret: getSecret('COMPANION_PREAUTH_SECRET') || generateSecret(),
|
|
|
+ secret: getSecret('COMPANION_SECRET'),
|
|
|
+ preAuthSecret: getSecret('COMPANION_PREAUTH_SECRET'),
|
|
|
allowLocalUrls: process.env.COMPANION_ALLOW_LOCAL_URLS === 'true',
|
|
|
// cookieDomain is kind of a hack to support distributed systems. This should be improved but we never got so far.
|
|
|
cookieDomain: process.env.COMPANION_COOKIE_DOMAIN,
|
|
@@ -115,32 +150,29 @@ const getConfigFromEnv = () => {
|
|
|
clientSocketConnectTimeout: process.env.COMPANION_CLIENT_SOCKET_CONNECT_TIMEOUT
|
|
|
? parseInt(process.env.COMPANION_CLIENT_SOCKET_CONNECT_TIMEOUT, 10) : undefined,
|
|
|
metrics: process.env.COMPANION_HIDE_METRICS !== 'true',
|
|
|
+ loggerProcessName: process.env.COMPANION_LOGGER_PROCESS_NAME,
|
|
|
+ corsOrigins: getCorsOrigins(),
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Tries to read the secret from a file if the according environment variable is set.
|
|
|
- * Otherwise it falls back to the standard secret environment variable.
|
|
|
- *
|
|
|
- * @param {string} baseEnvVar
|
|
|
+ * Returns the config path specified via cli arguments
|
|
|
*
|
|
|
* @returns {string}
|
|
|
*/
|
|
|
-const getSecret = (baseEnvVar) => {
|
|
|
- const secretFile = process.env[`${baseEnvVar}_FILE`]
|
|
|
- return secretFile
|
|
|
- ? fs.readFileSync(secretFile).toString()
|
|
|
- : process.env[baseEnvVar]
|
|
|
-}
|
|
|
+const getConfigPath = () => {
|
|
|
+ let configPath
|
|
|
|
|
|
-/**
|
|
|
- * Auto-generates server secret
|
|
|
- *
|
|
|
- * @returns {string}
|
|
|
- */
|
|
|
-const generateSecret = () => {
|
|
|
- logger.warn('auto-generating server secret because none was specified', 'startup.secret')
|
|
|
- return crypto.randomBytes(64).toString('hex')
|
|
|
+ for (let i = process.argv.length - 1; i >= 0; i--) {
|
|
|
+ const isConfigFlag = process.argv[i] === '-c' || process.argv[i] === '--config'
|
|
|
+ const flagHasValue = i + 1 <= process.argv.length
|
|
|
+ if (isConfigFlag && flagHasValue) {
|
|
|
+ configPath = process.argv[i + 1]
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return configPath
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -158,31 +190,13 @@ const getConfigFromFile = () => {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Returns the config path specified via cli arguments
|
|
|
- *
|
|
|
- * @returns {string}
|
|
|
- */
|
|
|
-const getConfigPath = () => {
|
|
|
- let configPath
|
|
|
-
|
|
|
- for (let i = process.argv.length - 1; i >= 0; i--) {
|
|
|
- const isConfigFlag = process.argv[i] === '-c' || process.argv[i] === '--config'
|
|
|
- const flagHasValue = i + 1 <= process.argv.length
|
|
|
- if (isConfigFlag && flagHasValue) {
|
|
|
- configPath = process.argv[i + 1]
|
|
|
- break
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return configPath
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
+ * Reads all companion configuration set via environment variables
|
|
|
+ * and via the config file path
|
|
|
*
|
|
|
- * @param {string} url
|
|
|
+ * @returns {object}
|
|
|
*/
|
|
|
-exports.hasProtocol = (url) => {
|
|
|
- return url.startsWith('http://') || url.startsWith('https://')
|
|
|
+exports.getCompanionOptions = (options = {}) => {
|
|
|
+ return merge({}, getConfigFromEnv(), getConfigFromFile(), options)
|
|
|
}
|
|
|
|
|
|
exports.buildHelpfulStartupMessage = (companionOptions) => {
|