For your security, the link will expire in 4 hours time.
+For your security, the link will expire in 24 hours time.
See you soon!
The team at ${siteTitle}
You can also copy & paste this URL into your browser:
diff --git a/core/server/services/members/emails/signup.js b/core/server/services/members/emails/signup.js index 4bc727ab10..512c446c09 100644 --- a/core/server/services/members/emails/signup.js +++ b/core/server/services/members/emails/signup.js @@ -126,7 +126,7 @@ module.exports = ({siteTitle, email, url}) => ` -For your security, the link will expire in 4 hours time.
+For your security, the link will expire in 24 hours time.
See you soon!
The team at ${siteTitle}
You can also copy & paste this URL into your browser:
diff --git a/core/server/services/members/emails/subscribe.js b/core/server/services/members/emails/subscribe.js index c444e6c363..dab9f51c3e 100644 --- a/core/server/services/members/emails/subscribe.js +++ b/core/server/services/members/emails/subscribe.js @@ -126,7 +126,7 @@ module.exports = ({siteTitle, email, url}) => ` -For your security, the link will expire in 4 hours time.
+For your security, the link will expire in 24 hours time.
All the best!
The team at ${siteTitle}
You can also copy & paste this URL into your browser:
diff --git a/core/server/services/members/emails/updateEmail.js b/core/server/services/members/emails/updateEmail.js index 7781b88312..9814103815 100644 --- a/core/server/services/members/emails/updateEmail.js +++ b/core/server/services/members/emails/updateEmail.js @@ -125,7 +125,7 @@ module.exports = ({email, url}) => ` -For your security, the link will expire in 4 hours time.
+For your security, the link will expire in 24 hours time.
You can also copy & paste this URL into your browser:
${url}
diff --git a/core/server/services/members/middleware.js b/core/server/services/members/middleware.js index 7e7d555553..da3860d64c 100644 --- a/core/server/services/members/middleware.js +++ b/core/server/services/members/middleware.js @@ -1,6 +1,5 @@ const _ = require('lodash'); const logging = require('../../../shared/logging'); -const config = require('../../../shared/config'); const labsService = require('../labs'); const membersService = require('./index'); const urlUtils = require('../../../shared/url-utils'); @@ -116,11 +115,6 @@ const getMemberSiteData = async function (req, res) { members_support_address: supportAddress }; - // accent_color is currently an experimental feature - if (!config.get('enableDeveloperExperiments')) { - delete response.accent_color; - } - res.json({site: response}); }; diff --git a/core/server/services/members/settings.js b/core/server/services/members/settings.js index 21f0c7fda9..5773e9cbfe 100644 --- a/core/server/services/members/settings.js +++ b/core/server/services/members/settings.js @@ -8,7 +8,7 @@ const mail = require('../mail'); const updateEmailTemplate = require('./emails/updateEmail'); const SingleUseTokenProvider = require('./SingleUseTokenProvider'); const models = require('../../models'); -const MAGIC_LINK_TOKEN_VALIDITY = 4 * 60 * 60 * 1000; +const MAGIC_LINK_TOKEN_VALIDITY = 24 * 60 * 60 * 1000; const ghostMailer = new mail.GhostMailer(); @@ -39,7 +39,7 @@ function createSettingsInstance(config) { ${url} - For your security, the link will expire in 4 hours time. + For your security, the link will expire in 24 hours time. --- diff --git a/core/server/services/settings/index.js b/core/server/services/settings/index.js index eb209d2bef..e4ef0b6551 100644 --- a/core/server/services/settings/index.js +++ b/core/server/services/settings/index.js @@ -12,11 +12,19 @@ module.exports = { }, async reinit() { + const oldSettings = SettingsCache.getAll(); + SettingsCache.shutdown(); const settingsCollection = await models.Settings.populateDefaults(); - SettingsCache.init(settingsCollection); + const newSettings = SettingsCache.init(settingsCollection); + for (const model of settingsCollection.models) { - model.emitChange(model.attributes.key + '.' + 'edited', {}); + const key = model.attributes.key; + + // The type of setting is object. That's why we need to compare the value of the `value` property. + if (newSettings[key].value !== oldSettings[key].value) { + model.emitChange(key + '.' + 'edited', {}); + } } }, diff --git a/core/server/translations/en.json b/core/server/translations/en.json index 1f1a71d182..b0128e8f37 100644 --- a/core/server/translations/en.json +++ b/core/server/translations/en.json @@ -486,6 +486,10 @@ "noIntegrationIdProvided": { "context": "You may only create webhooks with 'integration_id' when using session authentication." }, + "nonExistingIntegrationIdProvided": { + "context": "'integration_id' value does not match any existing integration.", + "help": "Provide the 'integration_id' of an existing integration." + }, "webhookAlreadyExists": "Target URL has already been used for this event." }, "oembed": { @@ -573,7 +577,7 @@ }, "mega": { "requestFailed": { - "error" : "The email service was unable to send an email batch." + "error": "The email service was unable to send an email batch." } } }, @@ -711,7 +715,7 @@ "valueIsNotInteger": "Value in [{tableName}.{columnKey}] is not an integer.", "themeCannotBeActivated": "{themeName} cannot be activated because it is not currently installed.", "validationFailed": "Validation ({validationName}) failed for {key}", - "schemaValidationFailed": "Validation failed for '{key}'", + "schemaValidationFailed": "Validation failed for '{key}'.", "validationFailedTypes": { "isLength": "Value in [{tableName}.{key}] exceeds maximum length of {max} characters." } diff --git a/core/server/web/admin/views/default-prod.html b/core/server/web/admin/views/default-prod.html index a9c44f2801..bdddefa09d 100644 --- a/core/server/web/admin/views/default-prod.html +++ b/core/server/web/admin/views/default-prod.html @@ -8,7 +8,7 @@