diff options
Diffstat (limited to 'models/settings.js')
-rw-r--r-- | models/settings.js | 262 |
1 files changed, 165 insertions, 97 deletions
diff --git a/models/settings.js b/models/settings.js index e0f94fca..b97961eb 100644 --- a/models/settings.js +++ b/models/settings.js @@ -1,67 +1,85 @@ Settings = new Mongo.Collection('settings'); -Settings.attachSchema(new SimpleSchema({ - disableRegistration: { - type: Boolean, - }, - 'mailServer.username': { - type: String, - optional: true, - }, - 'mailServer.password': { - type: String, - optional: true, - }, - 'mailServer.host': { - type: String, - optional: true, - }, - 'mailServer.port': { - type: String, - optional: true, - }, - 'mailServer.enableTLS': { - type: Boolean, - optional: true, - }, - 'mailServer.from': { - type: String, - optional: true, - }, - productName: { - type: String, - optional: true, - }, - customHTMLafterBodyStart: { - type: String, - optional: true, - }, - customHTMLbeforeBodyEnd: { - type: String, - optional: true, - }, - displayAuthenticationMethod: { - type: Boolean, - optional: true, - }, - defaultAuthenticationMethod: { - type: String, - optional: false, - }, - hideLogo: { - type: Boolean, - optional: true, - }, - createdAt: { - type: Date, - denyUpdate: true, - }, - modifiedAt: { - type: Date, - }, -})); +Settings.attachSchema( + new SimpleSchema({ + disableRegistration: { + type: Boolean, + }, + 'mailServer.username': { + type: String, + optional: true, + }, + 'mailServer.password': { + type: String, + optional: true, + }, + 'mailServer.host': { + type: String, + optional: true, + }, + 'mailServer.port': { + type: String, + optional: true, + }, + 'mailServer.enableTLS': { + type: Boolean, + optional: true, + }, + 'mailServer.from': { + type: String, + optional: true, + }, + productName: { + type: String, + optional: true, + }, + customHTMLafterBodyStart: { + type: String, + optional: true, + }, + customHTMLbeforeBodyEnd: { + type: String, + optional: true, + }, + displayAuthenticationMethod: { + type: Boolean, + optional: true, + }, + defaultAuthenticationMethod: { + type: String, + optional: false, + }, + hideLogo: { + type: Boolean, + optional: true, + }, + createdAt: { + type: Date, + denyUpdate: true, + // eslint-disable-next-line consistent-return + autoValue() { + if (this.isInsert) { + return new Date(); + } else { + this.unset(); + } + }, + }, + modifiedAt: { + type: Date, + // eslint-disable-next-line consistent-return + autoValue() { + if (this.isInsert || this.isUpsert || this.isUpdate) { + return new Date(); + } else { + this.unset(); + } + }, + }, + }) +); Settings.helpers({ - mailUrl () { + mailUrl() { if (!this.mailServer.host) { return null; } @@ -69,7 +87,9 @@ Settings.helpers({ if (!this.mailServer.username && !this.mailServer.password) { return `${protocol}${this.mailServer.host}:${this.mailServer.port}/`; } - return `${protocol}${this.mailServer.username}:${encodeURIComponent(this.mailServer.password)}@${this.mailServer.host}:${this.mailServer.port}/`; + return `${protocol}${this.mailServer.username}:${encodeURIComponent( + this.mailServer.password + )}@${this.mailServer.host}:${this.mailServer.port}/`; }, }); Settings.allow({ @@ -86,50 +106,75 @@ Settings.before.update((userId, doc, fieldNames, modifier) => { if (Meteor.isServer) { Meteor.startup(() => { + Settings._collection._ensureIndex({ modifiedAt: -1 }); const setting = Settings.findOne({}); - if(!setting){ + if (!setting) { const now = new Date(); - const domain = process.env.ROOT_URL.match(/\/\/(?:www\.)?(.*)?(?:\/)?/)[1]; + const domain = process.env.ROOT_URL.match( + /\/\/(?:www\.)?(.*)?(?:\/)?/ + )[1]; const from = `Boards Support <support@${domain}>`; - const defaultSetting = {disableRegistration: false, mailServer: { - username: '', password: '', host: '', port: '', enableTLS: false, from, - }, createdAt: now, modifiedAt: now, displayAuthenticationMethod: true, - defaultAuthenticationMethod: 'password'}; + const defaultSetting = { + disableRegistration: false, + mailServer: { + username: '', + password: '', + host: '', + port: '', + enableTLS: false, + from, + }, + createdAt: now, + modifiedAt: now, + displayAuthenticationMethod: true, + defaultAuthenticationMethod: 'password', + }; Settings.insert(defaultSetting); } const newSetting = Settings.findOne(); if (!process.env.MAIL_URL && newSetting.mailUrl()) process.env.MAIL_URL = newSetting.mailUrl(); - Accounts.emailTemplates.from = process.env.MAIL_FROM ? process.env.MAIL_FROM : newSetting.mailServer.from; + Accounts.emailTemplates.from = process.env.MAIL_FROM + ? process.env.MAIL_FROM + : newSetting.mailServer.from; }); Settings.after.update((userId, doc, fieldNames) => { // assign new values to mail-from & MAIL_URL in environment if (_.contains(fieldNames, 'mailServer') && doc.mailServer.host) { const protocol = doc.mailServer.enableTLS ? 'smtps://' : 'smtp://'; if (!doc.mailServer.username && !doc.mailServer.password) { - process.env.MAIL_URL = `${protocol}${doc.mailServer.host}:${doc.mailServer.port}/`; + process.env.MAIL_URL = `${protocol}${doc.mailServer.host}:${ + doc.mailServer.port + }/`; } else { - process.env.MAIL_URL = `${protocol}${doc.mailServer.username}:${encodeURIComponent(doc.mailServer.password)}@${doc.mailServer.host}:${doc.mailServer.port}/`; + process.env.MAIL_URL = `${protocol}${ + doc.mailServer.username + }:${encodeURIComponent(doc.mailServer.password)}@${ + doc.mailServer.host + }:${doc.mailServer.port}/`; } Accounts.emailTemplates.from = doc.mailServer.from; } }); - function getRandomNum (min, max) { + function getRandomNum(min, max) { const range = max - min; const rand = Math.random(); - return (min + Math.round(rand * range)); + return min + Math.round(rand * range); } - function getEnvVar(name){ + function getEnvVar(name) { const value = process.env[name]; - if (value){ + if (value) { return value; } - throw new Meteor.Error(['var-not-exist', `The environment variable ${name} does not exist`]); + throw new Meteor.Error([ + 'var-not-exist', + `The environment variable ${name} does not exist`, + ]); } - function sendInvitationEmail (_id){ + function sendInvitationEmail(_id) { const icode = InvitationCodes.findOne(_id); const author = Users.findOne(Meteor.userId()); try { @@ -172,30 +217,47 @@ if (Meteor.isServer) { check(boards, [String]); const user = Users.findOne(Meteor.userId()); - if(!user.isAdmin){ + if (!user.isAdmin) { throw new Meteor.Error('not-allowed'); } emails.forEach((email) => { if (email && SimpleSchema.RegEx.Email.test(email)) { // Checks if the email is already link to an account. - const userExist = Users.findOne({email}); - if (userExist){ - throw new Meteor.Error('user-exist', `The user with the email ${email} has already an account.`); + const userExist = Users.findOne({ email }); + if (userExist) { + throw new Meteor.Error( + 'user-exist', + `The user with the email ${email} has already an account.` + ); } // Checks if the email is already link to an invitation. - const invitation = InvitationCodes.findOne({email}); - if (invitation){ - InvitationCodes.update(invitation, {$set : {boardsToBeInvited: boards}}); + const invitation = InvitationCodes.findOne({ email }); + if (invitation) { + InvitationCodes.update(invitation, { + $set: { boardsToBeInvited: boards }, + }); sendInvitationEmail(invitation._id); - }else { + } else { const code = getRandomNum(100000, 999999); - InvitationCodes.insert({code, email, boardsToBeInvited: boards, createdAt: new Date(), authorId: Meteor.userId()}, function(err, _id){ - if (!err && _id) { - sendInvitationEmail(_id); - } else { - throw new Meteor.Error('invitation-generated-fail', err.message); + InvitationCodes.insert( + { + code, + email, + boardsToBeInvited: boards, + createdAt: new Date(), + authorId: Meteor.userId(), + }, + function(err, _id) { + if (!err && _id) { + sendInvitationEmail(_id); + } else { + throw new Meteor.Error( + 'invitation-generated-fail', + err.message + ); + } } - }); + ); } } }); @@ -215,11 +277,15 @@ if (Meteor.isServer) { Email.send({ to: user.emails[0].address, from: Accounts.emailTemplates.from, - subject: TAPi18n.__('email-smtp-test-subject', {lng: lang}), - text: TAPi18n.__('email-smtp-test-text', {lng: lang}), + subject: TAPi18n.__('email-smtp-test-subject', { lng: lang }), + text: TAPi18n.__('email-smtp-test-text', { lng: lang }), }); - } catch ({message}) { - throw new Meteor.Error('email-fail', `${TAPi18n.__('email-fail-text', {lng: lang})}: ${ message }`, message); + } catch ({ message }) { + throw new Meteor.Error( + 'email-fail', + `${TAPi18n.__('email-fail-text', { lng: lang })}: ${message}`, + message + ); } return { message: 'email-sent', @@ -227,7 +293,7 @@ if (Meteor.isServer) { }; }, - getCustomUI(){ + getCustomUI() { const setting = Settings.findOne({}); if (!setting.productName) { return { @@ -240,7 +306,7 @@ if (Meteor.isServer) { } }, - getMatomoConf(){ + getMatomoConf() { return { address: getEnvVar('MATOMO_ADDRESS'), siteId: getEnvVar('MATOMO_SITE_ID'), @@ -275,3 +341,5 @@ if (Meteor.isServer) { }, }); } + +export default Settings; |