Ghost/core/server/config/utils.js

111 lines
3.6 KiB
JavaScript

const path = require('path');
const fs = require('fs-extra');
const _ = require('lodash');
exports.isPrivacyDisabled = function isPrivacyDisabled(privacyFlag) {
if (!this.get('privacy')) {
return false;
}
// CASE: disable all privacy features
if (this.get('privacy').useTinfoil === true) {
// CASE: you can still enable single features
if (this.get('privacy')[privacyFlag] === true) {
return false;
}
return true;
}
return this.get('privacy')[privacyFlag] === false;
};
/**
* transform all relative paths to absolute paths
* @TODO: re-write this function a little bit so we don't have to add the parent path - that is hard to understand
*
* Path must be string.
* Path must match minimum one / or \
* Path can be a "." to re-present current folder
*/
exports.makePathsAbsolute = function makePathsAbsolute(obj, parent) {
const self = this;
_.each(obj, function (configValue, pathsKey) {
if (_.isObject(configValue)) {
makePathsAbsolute.bind(self)(configValue, parent + ':' + pathsKey);
} else if (
_.isString(configValue) &&
(configValue.match(/\/+|\\+/) || configValue === '.') &&
!path.isAbsolute(configValue)
) {
self.set(parent + ':' + pathsKey, path.normalize(path.join(__dirname, '../../..', configValue)));
}
});
};
/**
* we can later support setting folder names via custom config values
*/
exports.getContentPath = function getContentPath(type) {
switch (type) {
case 'images':
return path.join(this.get('paths:contentPath'), 'images/');
case 'themes':
return path.join(this.get('paths:contentPath'), 'themes/');
case 'adapters':
return path.join(this.get('paths:contentPath'), 'adapters/');
case 'logs':
return path.join(this.get('paths:contentPath'), 'logs/');
case 'data':
return path.join(this.get('paths:contentPath'), 'data/');
case 'settings':
return path.join(this.get('paths:contentPath'), 'settings/');
default:
throw new Error('getContentPath was called with: ' + type);
}
};
/**
* @TODO:
* - content/logs folder is required right now, otherwise Ghost want start
*/
exports.doesContentPathExist = function doesContentPathExist() {
if (!fs.pathExistsSync(this.get('paths:contentPath'))) {
throw new Error('Your content path does not exist! Please double check `paths.contentPath` in your custom config file e.g. config.production.json.');
}
};
/**
* Check if the URL in config has a protocol and sanitise it if not including a warning that it should be changed
*/
exports.checkUrlProtocol = function checkUrlProtocol() {
const url = this.get('url');
if (!url.match(/^https?:\/\//i)) {
throw new Error('URL in config must be provided with protocol, eg. "http://my-ghost-blog.com"');
}
};
/**
* nconf merges all database keys together and this can be confusing
* e.g. production default database is sqlite, but you override the configuration with mysql
*
* this.clear('key') does not work
* https://github.com/indexzero/nconf/issues/235#issuecomment-257606507
*/
exports.sanitizeDatabaseProperties = function sanitizeDatabaseProperties() {
const database = this.get('database');
if (this.get('database:client') === 'mysql') {
delete database.connection.filename;
} else {
delete database.connection.host;
delete database.connection.user;
delete database.connection.password;
delete database.connection.database;
}
this.set('database', database);
};