2016-09-13 18:20:44 +03:00
|
|
|
var path = require('path'),
|
2017-06-07 12:31:01 +03:00
|
|
|
fs = require('fs-extra'),
|
2017-03-02 19:02:23 +03:00
|
|
|
_ = require('lodash');
|
2016-09-13 18:20:44 +03:00
|
|
|
|
|
|
|
exports.isPrivacyDisabled = function isPrivacyDisabled(privacyFlag) {
|
|
|
|
if (!this.get('privacy')) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-02-03 21:25:39 +03:00
|
|
|
// CASE: disable all privacy features
|
2016-09-13 18:20:44 +03:00
|
|
|
if (this.get('privacy').useTinfoil === true) {
|
2017-02-03 21:25:39 +03:00
|
|
|
// CASE: you can still enable single features
|
|
|
|
if (this.get('privacy')[privacyFlag] === true) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2016-09-13 18:20:44 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.get('privacy')[privacyFlag] === false;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* transform all relative paths to absolute paths
|
2016-10-18 11:04:44 +03:00
|
|
|
* @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
|
2016-09-13 18:20:44 +03:00
|
|
|
*/
|
2016-10-18 11:04:44 +03:00
|
|
|
exports.makePathsAbsolute = function makePathsAbsolute(obj, parent) {
|
2016-09-13 18:20:44 +03:00
|
|
|
var self = this;
|
|
|
|
|
2016-10-18 11:04:44 +03:00
|
|
|
_.each(obj, function (configValue, pathsKey) {
|
2016-09-13 18:20:44 +03:00
|
|
|
if (_.isObject(configValue)) {
|
|
|
|
makePathsAbsolute.bind(self)(configValue, parent + ':' + pathsKey);
|
2017-07-06 01:04:18 +03:00
|
|
|
} else if (
|
|
|
|
_.isString(configValue) &&
|
|
|
|
(configValue.match(/\/+|\\+/) || configValue === '.') &&
|
|
|
|
!path.isAbsolute(configValue)
|
|
|
|
) {
|
|
|
|
self.set(parent + ':' + pathsKey, path.normalize(path.join(__dirname, '../../..', configValue)));
|
2016-09-13 18:20:44 +03:00
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
2016-09-13 23:24:57 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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 'apps':
|
|
|
|
return path.join(this.get('paths:contentPath'), 'apps/');
|
|
|
|
case 'themes':
|
|
|
|
return path.join(this.get('paths:contentPath'), 'themes/');
|
2017-04-07 12:53:38 +03:00
|
|
|
case 'storage':
|
|
|
|
return path.join(this.get('paths:contentPath'), 'adapters', 'storage/');
|
2016-09-13 23:24:57 +03:00
|
|
|
case 'scheduling':
|
2017-04-07 12:53:38 +03:00
|
|
|
return path.join(this.get('paths:contentPath'), 'adapters', 'scheduling/');
|
2016-10-25 14:17:43 +03:00
|
|
|
case 'logs':
|
|
|
|
return path.join(this.get('paths:contentPath'), 'logs/');
|
2017-02-06 17:32:40 +03:00
|
|
|
case 'data':
|
|
|
|
return path.join(this.get('paths:contentPath'), 'data/');
|
YAML settings loader and parser
closes #9528
These code changes introduce a YAML parser which will load and parse YAML files from the `/content/settings` directory. There are three major parts involved:
1. `ensure-settings.js`: this fn takes care that on bootstrap, the supported files are present in the `/content/settings` directory. If the files are not present, they get copied back from our default files. The default files to copy from are located in `core/server/services/settings`.
2. `loader.js`: the settings loader reads the requested `yaml` file from the disk and passes it to the yaml parser, which returns a `json` object of the file. The settings loader throws an error, if the file is not accessible, e. g. because of permission errors.
3. `yaml-parser`: gets passed a `yaml` file and returns a `json` object. If the file is not parseable, it returns a clear error that contains the information, what and where the parsing error occurred (e. g. line number and reason).
- added a `get()` fn to settings services, that returns the settings object that's asked for. e. g. `settings.get('routes').then(()...` will return the `routes` settings.
- added a `getAll()` fn to settings services, that returns all available settings in an object. The object looks like: `{routes: {routes: {}, collections: {}, resources: {}}, globals: {value: {}}`, assuming that we have to supported settings `routes` and `globals`.
Further additions:
- config `contentPath` for `settings`
- config overrides for default `yaml` files location in `/core/server/services/settings`
**Important**: These code changes are in preparation for Dynamic Routing and not yet used. The process of copying the supported `yaml` files (in this first step, the `routes.yaml` file) is not yet activated.
2018-04-13 04:34:03 +03:00
|
|
|
case 'settings':
|
|
|
|
return path.join(this.get('paths:contentPath'), 'settings/');
|
2016-09-13 23:24:57 +03:00
|
|
|
default:
|
|
|
|
throw new Error('getContentPath was called with: ' + type);
|
|
|
|
}
|
|
|
|
};
|
2017-02-11 21:02:12 +03:00
|
|
|
|
2017-06-07 12:31:01 +03:00
|
|
|
/**
|
|
|
|
* @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.');
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2017-05-21 19:00:11 +03:00
|
|
|
/**
|
|
|
|
* 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() {
|
|
|
|
var 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"');
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2017-02-11 21:02:12 +03:00
|
|
|
/**
|
|
|
|
* 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() {
|
|
|
|
var 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);
|
|
|
|
};
|