From 896f981408be6a686d46e47d59c7018aa75f869f Mon Sep 17 00:00:00 2001 From: Evan Morikawa Date: Mon, 5 Dec 2016 17:59:47 -0800 Subject: [PATCH] [isomorphic-core] extract AuthHelpers to DRY --- packages/isomorphic-core/index.js | 5 +- packages/isomorphic-core/package.json | 1 + packages/isomorphic-core/src/auth-helpers.js | 41 +++++++++++++++++ .../local-sync/src/local-api/routes/auth.js | 46 ++----------------- 4 files changed, 48 insertions(+), 45 deletions(-) create mode 100644 packages/isomorphic-core/src/auth-helpers.js diff --git a/packages/isomorphic-core/index.js b/packages/isomorphic-core/index.js index 67721a8b6..ef22e6018 100644 --- a/packages/isomorphic-core/index.js +++ b/packages/isomorphic-core/index.js @@ -5,11 +5,12 @@ module.exports = { IMAP: 'imap', }, Imap: require('imap'), - IMAPConnection: require('./src/imap-connection'), IMAPErrors: require('./src/imap-errors'), + loadModels: require('./src/load-models'), + AuthHelpers: require('./src/auth-helpers'), PromiseUtils: require('./src/promise-utils'), DatabaseTypes: require('./src/database-types'), - loadModels: require('./src/load-models'), + IMAPConnection: require('./src/imap-connection'), DeltaStreamBuilder: require('./src/delta-stream-builder'), HookTransactionLog: require('./src/hook-transaction-log'), HookIncrementVersionOnSave: require('./src/hook-increment-version-on-save'), diff --git a/packages/isomorphic-core/package.json b/packages/isomorphic-core/package.json index 6a5c04e21..a1a41509b 100644 --- a/packages/isomorphic-core/package.json +++ b/packages/isomorphic-core/package.json @@ -5,6 +5,7 @@ "main": "index.js", "dependencies": { "imap": "0.8.18", + "joi": "8.4.2", "promise-props": "1.0.0", "promise.prototype.finally": "1.0.1", "rx": "4.1.0", diff --git a/packages/isomorphic-core/src/auth-helpers.js b/packages/isomorphic-core/src/auth-helpers.js new file mode 100644 index 000000000..b60f646cc --- /dev/null +++ b/packages/isomorphic-core/src/auth-helpers.js @@ -0,0 +1,41 @@ +const Joi = require('joi'); + +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(); + +module.exports = { + authPostConfig() { + 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), + }, + }, + } + }, +} diff --git a/packages/local-sync/src/local-api/routes/auth.js b/packages/local-sync/src/local-api/routes/auth.js index ca9633231..948901832 100644 --- a/packages/local-sync/src/local-api/routes/auth.js +++ b/packages/local-sync/src/local-api/routes/auth.js @@ -3,35 +3,14 @@ const _ = require('underscore'); const crypto = require('crypto'); const Serialization = require('../serialization'); const { - IMAPConnection, IMAPErrors, + AuthHelpers, + IMAPConnection, } = require('isomorphic-core'); const DefaultSyncPolicy = require('../default-sync-policy') const LocalDatabaseConnector = require('../../shared/local-database-connector') const SyncProcessManager = require('../../local-sync-worker/sync-process-manager') -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 buildAccountWith = ({name, email, provider, settings, credentials}) => { return LocalDatabaseConnector.forShared().then((db) => { const {AccountToken, Account} = db; @@ -69,26 +48,7 @@ module.exports = (server) => { server.route({ method: 'POST', path: '/auth', - config: { - description: 'Authenticates a new account.', - notes: 'Notes go here', - 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), - }, - }, - response: { - schema: Joi.alternatives().try( - Serialization.jsonSchema('Account'), - Serialization.jsonSchema('Error') - ), - }, - }, + config: AuthHelpers.authPostConfig(), handler: (request, reply) => { const dbStub = {}; const connectionChecks = [];