From 0b58f4cf6226ac1fa31046e4411bad29ee4abc57 Mon Sep 17 00:00:00 2001 From: Fabien O'Carroll Date: Tue, 11 Dec 2018 14:57:01 +0700 Subject: [PATCH] Added members service to create instance of members lib (#10261) refs #10213 * Added members service to create instance of members lib --- core/server/services/members/api.js | 111 ++++++++++++++++++++++++++ core/server/services/members/index.js | 9 +++ 2 files changed, 120 insertions(+) create mode 100644 core/server/services/members/api.js create mode 100644 core/server/services/members/index.js diff --git a/core/server/services/members/api.js b/core/server/services/members/api.js new file mode 100644 index 0000000000..1d004010b3 --- /dev/null +++ b/core/server/services/members/api.js @@ -0,0 +1,111 @@ +const settingsCache = require('../settings/cache'); +const config = require('../../config'); +const MembersApi = require('../../lib/members'); +const models = require('../../models'); +const URL = require('url').URL; +const mail = require('../mail'); + +function createMember({name, email, password}) { + return models.Member.add({ + name, + email, + password + }).then((member) => { + return member.toJSON(); + }); +} + +function updateMember(member, newData) { + return models.Member.findOne(member, { + require: true + }).then(({id}) => { + return models.Member.edit(newData, {id}); + }).then((member) => { + return member.toJSON(); + }); +} + +function getMember(member) { + return models.Member.findOne(member, { + require: true + }).then((member) => { + return member.toJSON(); + }); +} + +function validateMember({email, password}) { + return models.Member.findOne({email}, { + require: true + }).then((member) => { + return member.comparePassword(password).then((res) => { + if (!res) { + throw new Error('Password is incorrect'); + } + return member; + }); + }).then((member) => { + return member.toJSON(); + }); +} + +// @TODO this should check some config/settings and return Promise.reject by default +function validateAudience({audience, origin}) { + if (audience === origin) { + return Promise.resolve(); + } + return Promise.resolve(); +} + +const publicKey = settingsCache.get('members_public_key'); +const privateKey = settingsCache.get('members_private_key'); +const sessionSecret = settingsCache.get('members_session_secret'); +const passwordResetUrl = config.get('url'); +const issuer = config.get('url'); +const ssoOrigin = new URL(config.get('url')).origin; +let mailer; + +function sendEmail(member, {token}) { + if (!(mailer instanceof mail.GhostMailer)) { + mailer = new mail.GhostMailer(); + } + const message = { + to: member.email, + subject: 'Reset password', + html: ` + Hi ${member.name}, + + To reset your password, click the following link and follow the instructions: + + ${passwordResetUrl}#reset-password?token=${token} + + If you didn't request a password change, just ignore this email. + ` + }; + + /* eslint-disable */ + // @TODO remove this + console.log(message.html); + /* eslint-enable */ + return mailer.send(message).catch((err) => { + return Promise.reject(err); + }); +} + +const api = MembersApi({ + config: { + issuer, + publicKey, + privateKey, + sessionSecret, + ssoOrigin + }, + validateAudience, + createMember, + getMember, + validateMember, + updateMember, + sendEmail +}); + +module.exports = api; +module.exports.publicKey = publicKey; diff --git a/core/server/services/members/index.js b/core/server/services/members/index.js new file mode 100644 index 0000000000..7a291e280c --- /dev/null +++ b/core/server/services/members/index.js @@ -0,0 +1,9 @@ +const labs = require('../labs'); +module.exports = { + get api() { + if (!labs.isSet('members')) { + return {}; + } + return require('./api'); + } +};