Mailspring/packages/isomorphic-core/src/auth-helpers.js

123 lines
3.9 KiB
JavaScript
Raw Normal View History

2016-12-07 02:42:32 +08:00
const _ = require('underscore')
const Joi = require('joi');
2016-12-07 02:42:32 +08:00
const IMAPErrors = require('./imap-errors')
const IMAPConnection = require('./imap-connection')
const imapSmtpSettings = Joi.object().keys({
imap_host: [Joi.string().ip().required(), Joi.string().hostname().required()],
imap_port: Joi.number().integer().required(),
imap_username: Joi.string().required(),
imap_password: Joi.string().required(),
smtp_host: [Joi.string().ip().required(), Joi.string().hostname().required()],
smtp_port: Joi.number().integer().required(),
smtp_username: Joi.string().required(),
smtp_password: Joi.string().required(),
ssl_required: Joi.boolean().required(),
}).required();
const resolvedGmailSettings = Joi.object().keys({
xoauth2: Joi.string().required(),
}).required();
const exchangeSettings = Joi.object().keys({
username: Joi.string().required(),
password: Joi.string().required(),
eas_server_host: [Joi.string().ip().required(), Joi.string().hostname().required()],
}).required();
const USER_ERRORS = {
AUTH_500: "Please contact support@nylas.com. An unforseen error has occurred.",
IMAP_AUTH: "Incorrect username or password",
IMAP_RETRY: "We were unable to reach your mail provider. Please try again.",
}
2016-12-07 06:53:24 +08:00
module.exports = {
2016-12-07 02:42:32 +08:00
imapAuthRouteConfig() {
return {
description: 'Authenticates a new account.',
tags: ['accounts'],
auth: false,
validate: {
payload: {
email: Joi.string().email().required(),
name: Joi.string().required(),
provider: Joi.string().valid('imap', 'gmail').required(),
settings: Joi.alternatives().try(imapSmtpSettings, exchangeSettings, resolvedGmailSettings),
},
},
}
},
2016-12-07 02:42:32 +08:00
imapAuthHandler(accountBuildFn) {
return (request, reply) => {
const dbStub = {};
const connectionChecks = [];
const {settings, email, provider, name} = request.payload;
let connectionSettings = null;
let connectionCredentials = null;
if (provider === 'imap') {
connectionSettings = _.pick(settings, [
'imap_host', 'imap_port',
'smtp_host', 'smtp_port',
'ssl_required',
]);
connectionCredentials = _.pick(settings, [
'imap_username', 'imap_password',
'smtp_username', 'smtp_password',
]);
}
if (provider === 'gmail') {
connectionSettings = {
imap_username: email,
imap_host: 'imap.gmail.com',
imap_port: 993,
smtp_username: email,
smtp_host: 'smtp.gmail.com',
smtp_port: 465,
ssl_required: true,
}
connectionCredentials = {
xoauth2: settings.xoauth2,
}
}
connectionChecks.push(IMAPConnection.connect({
settings: Object.assign({}, connectionSettings, connectionCredentials),
logger: request.logger,
db: dbStub,
}));
Promise.all(connectionChecks).then((conns) => {
for (const conn of conns) {
if (conn) { conn.end(); }
}
const accountParams = {
name: name,
provider: provider,
emailAddress: email,
connectionSettings: connectionSettings,
}
return accountBuildFn(accountParams, connectionCredentials)
})
.then(({account, token}) => {
const response = account.toJSON();
response.account_token = token.value;
2016-12-07 06:53:24 +08:00
return reply(JSON.stringify(response));
2016-12-07 02:42:32 +08:00
})
.catch((err) => {
request.logger.error(err)
2016-12-07 06:53:24 +08:00
if (err instanceof IMAPErrors.IMAPAuthenticationError) {
return reply({message: USER_ERRORS.IMAP_AUTH, type: "api_error"}).code(401);
2016-12-07 06:53:24 +08:00
}
if (err instanceof IMAPErrors.RetryableError) {
return reply({message: USER_ERRORS.IMAP_RETRY, type: "api_error"}).code(408);
}
return reply({message: USER_ERRORS.AUTH_500, type: "api_error"}).code(500);
2016-12-07 02:42:32 +08:00
})
}
},
}