You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
284 lines
6.6 KiB
284 lines
6.6 KiB
|
9 years ago
|
const blockedSettings = {};
|
||
|
|
|
||
|
|
if (process.env.SETTINGS_BLOCKED) {
|
||
|
|
process.env.SETTINGS_BLOCKED.split(',').forEach((settingId) => blockedSettings[settingId] = 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
const hiddenSettings = {};
|
||
|
|
if (process.env.SETTINGS_HIDDEN) {
|
||
|
|
process.env.SETTINGS_HIDDEN.split(',').forEach((settingId) => hiddenSettings[settingId] = 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
RocketChat.settings._sorter = {};
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Add a setting
|
||
|
|
* @param {String} _id
|
||
|
|
* @param {Mixed} value
|
||
|
|
* @param {Object} setting
|
||
|
|
*/
|
||
|
|
|
||
|
|
RocketChat.settings.add = function(_id, value, options = {}) {
|
||
|
|
if (options == null) {
|
||
|
|
options = {};
|
||
|
|
}
|
||
|
|
if (!_id || value == null) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
if (RocketChat.settings._sorter[options.group] == null) {
|
||
|
|
RocketChat.settings._sorter[options.group] = 0;
|
||
|
|
}
|
||
|
|
options.packageValue = value;
|
||
|
|
options.valueSource = 'packageValue';
|
||
|
|
options.hidden = false;
|
||
|
|
options.blocked = options.blocked || false;
|
||
|
|
if (options.sorter == null) {
|
||
|
|
options.sorter = RocketChat.settings._sorter[options.group]++;
|
||
|
|
}
|
||
|
|
if (options.enableQuery != null) {
|
||
|
|
options.enableQuery = JSON.stringify(options.enableQuery);
|
||
|
|
}
|
||
|
|
if (options.i18nDefaultQuery != null) {
|
||
|
|
options.i18nDefaultQuery = JSON.stringify(options.i18nDefaultQuery);
|
||
|
|
}
|
||
|
|
if (typeof process !== 'undefined' && process.env && process.env._id) {
|
||
|
|
let value = process.env[_id];
|
||
|
|
if (value.toLowerCase() === 'true') {
|
||
|
|
value = true;
|
||
|
|
} else if (value.toLowerCase() === 'false') {
|
||
|
|
value = false;
|
||
|
|
}
|
||
|
|
options.processEnvValue = value;
|
||
|
|
options.valueSource = 'processEnvValue';
|
||
|
|
} else if (Meteor.settings && Meteor.settings) {
|
||
|
|
const value = Meteor.settings[_id];
|
||
|
|
options.meteorSettingsValue = value;
|
||
|
|
options.valueSource = 'meteorSettingsValue';
|
||
|
|
}
|
||
|
|
if (options.i18nLabel == null) {
|
||
|
|
options.i18nLabel = _id;
|
||
|
|
}
|
||
|
|
if (options.i18nDescription == null) {
|
||
|
|
options.i18nDescription = `${ _id }_Description`;
|
||
|
|
}
|
||
|
|
if (blockedSettings[_id] != null) {
|
||
|
|
options.blocked = true;
|
||
|
|
}
|
||
|
|
if (hiddenSettings[_id] != null) {
|
||
|
|
options.hidden = true;
|
||
|
|
}
|
||
|
|
if (typeof process !== 'undefined' && process.env && process.env[`OVERWRITE_SETTING_${ _id }`]) {
|
||
|
|
let value = process.env[`OVERWRITE_SETTING_${ _id }`];
|
||
|
|
if (value.toLowerCase() === 'true') {
|
||
|
|
value = true;
|
||
|
|
} else if (value.toLowerCase() === 'false') {
|
||
|
|
value = false;
|
||
|
|
}
|
||
|
|
options.value = value;
|
||
|
|
options.processEnvValue = value;
|
||
|
|
options.valueSource = 'processEnvValue';
|
||
|
|
}
|
||
|
|
const updateOperations = {
|
||
|
|
$set: options,
|
||
|
|
$setOnInsert: {
|
||
|
|
createdAt: new Date
|
||
|
|
}
|
||
|
|
};
|
||
|
|
if (options.editor != null) {
|
||
|
|
updateOperations.$setOnInsert.editor = options.editor;
|
||
|
|
delete options.editor;
|
||
|
|
}
|
||
|
|
if (options.value == null) {
|
||
|
|
if (options.force === true) {
|
||
|
|
updateOperations.$set.value = options.packageValue;
|
||
|
|
} else {
|
||
|
|
updateOperations.$setOnInsert.value = value;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
const query = _.extend({
|
||
|
|
_id
|
||
|
|
}, updateOperations.$set);
|
||
|
|
if (options.section == null) {
|
||
|
|
updateOperations.$unset = {
|
||
|
|
section: 1
|
||
|
|
};
|
||
|
|
query.section = {
|
||
|
|
$exists: false
|
||
|
|
};
|
||
|
|
}
|
||
|
|
const existantSetting = RocketChat.models.Settings.db.findOne(query);
|
||
|
|
if (existantSetting != null) {
|
||
|
|
if (existantSetting.editor == null && updateOperations.$setOnInsert.editor != null) {
|
||
|
|
updateOperations.$set.editor = updateOperations.$setOnInsert.editor;
|
||
|
|
delete updateOperations.$setOnInsert.editor;
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
updateOperations.$set.ts = new Date;
|
||
|
|
}
|
||
|
|
return RocketChat.models.Settings.upsert({
|
||
|
|
_id
|
||
|
|
}, updateOperations);
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Add a setting group
|
||
|
|
* @param {String} _id
|
||
|
|
*/
|
||
|
|
|
||
|
|
RocketChat.settings.addGroup = function(_id, options = {}, cb) {
|
||
|
|
if (!_id) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
if (_.isFunction(options)) {
|
||
|
|
cb = options;
|
||
|
|
options = {};
|
||
|
|
}
|
||
|
|
if (options.i18nLabel == null) {
|
||
|
|
options.i18nLabel = _id;
|
||
|
|
}
|
||
|
|
if (options.i18nDescription == null) {
|
||
|
|
options.i18nDescription = `${ _id }_Description`;
|
||
|
|
}
|
||
|
|
options.ts = new Date;
|
||
|
|
options.blocked = false;
|
||
|
|
options.hidden = false;
|
||
|
|
if (blockedSettings[_id] != null) {
|
||
|
|
options.blocked = true;
|
||
|
|
}
|
||
|
|
if (hiddenSettings[_id] != null) {
|
||
|
|
options.hidden = true;
|
||
|
|
}
|
||
|
|
RocketChat.models.Settings.upsert({
|
||
|
|
_id
|
||
|
|
}, {
|
||
|
|
$set: options,
|
||
|
|
$setOnInsert: {
|
||
|
|
type: 'group',
|
||
|
|
createdAt: new Date
|
||
|
|
}
|
||
|
|
});
|
||
|
|
if (cb != null) {
|
||
|
|
cb.call({
|
||
|
|
add(id, value, options) {
|
||
|
|
if (options == null) {
|
||
|
|
options = {};
|
||
|
|
}
|
||
|
|
options.group = _id;
|
||
|
|
return RocketChat.settings.add(id, value, options);
|
||
|
|
},
|
||
|
|
section(section, cb) {
|
||
|
|
return cb.call({
|
||
|
|
add(id, value, options) {
|
||
|
|
if (options == null) {
|
||
|
|
options = {};
|
||
|
|
}
|
||
|
|
options.group = _id;
|
||
|
|
options.section = section;
|
||
|
|
return RocketChat.settings.add(id, value, options);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Remove a setting by id
|
||
|
|
* @param {String} _id
|
||
|
|
*/
|
||
|
|
|
||
|
|
RocketChat.settings.removeById = function(_id) {
|
||
|
|
if (!_id) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return RocketChat.models.Settings.removeById(_id);
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Update a setting by id
|
||
|
|
* @param {String} _id
|
||
|
|
*/
|
||
|
|
|
||
|
|
RocketChat.settings.updateById = function(_id, value, editor) {
|
||
|
|
if (!_id || value == null) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
if (editor != null) {
|
||
|
|
return RocketChat.models.Settings.updateValueAndEditorById(_id, value, editor);
|
||
|
|
}
|
||
|
|
return RocketChat.models.Settings.updateValueById(_id, value);
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Update options of a setting by id
|
||
|
|
* @param {String} _id
|
||
|
|
*/
|
||
|
|
|
||
|
|
RocketChat.settings.updateOptionsById = function(_id, options) {
|
||
|
|
if (!_id || options == null) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return RocketChat.models.Settings.updateOptionsById(_id, options);
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Update a setting by id
|
||
|
|
* @param {String} _id
|
||
|
|
*/
|
||
|
|
|
||
|
|
RocketChat.settings.clearById = function(_id) {
|
||
|
|
if (_id == null) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
return RocketChat.models.Settings.updateValueById(_id, undefined);
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Update a setting by id
|
||
|
|
*/
|
||
|
|
|
||
|
|
RocketChat.settings.init = function() {
|
||
|
|
RocketChat.settings.initialLoad = true;
|
||
|
|
RocketChat.models.Settings.find().observe({
|
||
|
|
added(record) {
|
||
|
|
Meteor.settings[record._id] = record.value;
|
||
|
|
if (record.env === true) {
|
||
|
|
process.env[record._id] = record.value;
|
||
|
|
}
|
||
|
|
return RocketChat.settings.load(record._id, record.value, RocketChat.settings.initialLoad);
|
||
|
|
},
|
||
|
|
changed(record) {
|
||
|
|
Meteor.settings[record._id] = record.value;
|
||
|
|
if (record.env === true) {
|
||
|
|
process.env[record._id] = record.value;
|
||
|
|
}
|
||
|
|
return RocketChat.settings.load(record._id, record.value, RocketChat.settings.initialLoad);
|
||
|
|
},
|
||
|
|
removed(record) {
|
||
|
|
delete Meteor.settings[record._id];
|
||
|
|
if (record.env === true) {
|
||
|
|
delete process.env[record._id];
|
||
|
|
}
|
||
|
|
return RocketChat.settings.load(record._id, undefined, RocketChat.settings.initialLoad);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
RocketChat.settings.initialLoad = false;
|
||
|
|
RocketChat.settings.afterInitialLoad.forEach(fn => fn(Meteor.settings));
|
||
|
|
};
|
||
|
|
|
||
|
|
RocketChat.settings.afterInitialLoad = [];
|
||
|
|
|
||
|
|
RocketChat.settings.onAfterInitialLoad = function(fn) {
|
||
|
|
RocketChat.settings.afterInitialLoad.push(fn);
|
||
|
|
if (RocketChat.settings.initialLoad === false) {
|
||
|
|
return fn(Meteor.settings);
|
||
|
|
}
|
||
|
|
};
|