0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-01-20 22:42:53 -05:00

Added admin email for UpdateChecker's alerts

refs https://github.com/TryGhost/Team/issues/726

- When UpdateCheck service sends a notification with "type: 'alert'" an email goes out to admin users with the "message" content of the notification.
- This functionality is aimed to handling critical messages like urgent instance updates
- Next step will be getting as much of the update check code extracted into a "service" and then moved out of Ghost's codebase
This commit is contained in:
Naz 2021-05-27 13:12:28 +04:00
parent a1556797b6
commit df4df2a4aa
2 changed files with 69 additions and 0 deletions

View file

@ -16,6 +16,7 @@ const _ = require('lodash');
const url = require('url');
const debug = require('ghost-ignition').debug('update-check');
const api = require('./api').v2;
const GhostMailer = require('./services/mail').GhostMailer;
const config = require('../shared/config');
const urlUtils = require('./../shared/url-utils');
const errors = require('@tryghost/errors');
@ -23,9 +24,12 @@ const i18n = require('../shared/i18n');
const logging = require('../shared/logging');
const request = require('./lib/request');
const ghostVersion = require('./lib/ghost-version');
const internal = {context: {internal: true}};
const allowedCheckEnvironments = ['development', 'production'];
const ghostMailer = new GhostMailer();
function nextCheckTimestamp() {
const now = Math.round(new Date().getTime() / 1000);
return now + (24 * 3600);
@ -67,6 +71,17 @@ async function createCustomNotification(notification) {
return;
}
const {users} = await api.users.browse(Object.assign({
limit: 'all',
include: ['roles']
}, internal));
const adminEmails = users
.filter(user => ['Owner', 'Administrator'].includes(user.roles[0].name))
.map(user => user.email);
const siteUrl = config.get('url');
for (const message of notification.messages) {
const toAdd = {
// @NOTE: the update check service returns "0" or "1" (https://github.com/TryGhost/UpdateCheck/issues/43)
@ -80,6 +95,21 @@ async function createCustomNotification(notification) {
message: message.content
};
if (toAdd.type === 'alert') {
for (const email of adminEmails) {
try {
ghostMailer.send({
to: email,
subject: `Action required: Critical alert from Ghost instance ${siteUrl}`,
html: toAdd.message,
forceTextContent: true
});
} catch (err) {
logging.err(err);
}
}
}
debug('Add Custom Notification', toAdd);
await api.notifications.add({notifications: [toAdd]}, {context: {internal: true}});
}

View file

@ -9,6 +9,7 @@ const testUtils = require('../../utils');
const configUtils = require('../../utils/configUtils');
const packageInfo = require('../../../package.json');
const api = require('../../../core/server/api').v2;
const mailService = require('../../../core/server/services/mail/');
let updateCheck = rewire('../../../core/server/update-check');
let ghostVersion = rewire('../../../core/server/lib/ghost-version');
@ -17,6 +18,7 @@ describe('Update Check', function () {
beforeEach(function () {
updateCheck = rewire('../../../core/server/update-check');
ghostVersion = rewire('../../../core/server/lib/ghost-version');
sinon.stub(mailService.GhostMailer.prototype, 'send').resolves('Stubed email response');
});
afterEach(function () {
@ -322,6 +324,43 @@ describe('Update Check', function () {
})
.catch(done);
});
it('should send an email for critical notification', async function () {
const createCustomNotification = updateCheck.__get__('createCustomNotification');
const notification = {
id: 1,
custom: 1,
messages: [{
id: uuid.v4(),
version: 'custom1',
content: '<p>Critical message. Upgrade your site!</p>',
dismissible: false,
top: true,
type: 'alert'
}]
};
await createCustomNotification(notification);
mailService.GhostMailer.prototype.send.called.should.be.true();
mailService.GhostMailer.prototype.send.args[0][0].to.should.equal('jbloggs@example.com');
mailService.GhostMailer.prototype.send.args[0][0].subject.should.equal('Action required: Critical alert from Ghost instance http://127.0.0.1:2369');
mailService.GhostMailer.prototype.send.args[0][0].html.should.equal('<p>Critical message. Upgrade your site!</p>');
mailService.GhostMailer.prototype.send.args[0][0].forceTextContent.should.equal(true);
const results = await api.notifications.browse(testUtils.context.internal);
should.exist(results);
should.exist(results.notifications);
results.notifications.length.should.eql(1);
const targetNotification = _.find(results.notifications, {id: notification.messages[0].id});
should.exist(targetNotification);
targetNotification.dismissible.should.eql(notification.messages[0].dismissible);
targetNotification.top.should.eql(notification.messages[0].top);
targetNotification.type.should.eql(notification.messages[0].type);
});
});
describe('fn: updateCheckResponse', function () {