React = require 'react' _ = require 'underscore' {RetinaImg} = require 'nylas-component-kit' {EdgehillAPI, Utils, Actions} = require 'nylas-exports' OnboardingActions = require './onboarding-actions' Providers = require './account-types' url = require 'url' class AccountChoosePage extends React.Component @displayName: "AccountChoosePage" componentDidMount: -> {existingAccount} = @props.pageData if existingAccount and not existingAccount.routed # Hack to prevent coming back to this page from drilling you back in. # This should all get re-written soon. existingAccount.routed = true providerName = existingAccount.provider providerName = 'exchange' if providerName is 'eas' providerData = _.findWhere(Providers, {name: providerName}) if providerData @_onChooseProvider(providerData) render: =>
OnboardingActions.closeWindow() }>
Select your email provider:
{@_renderProviders()}
_renderProviders: -> return Providers.map (provider) =>
@_onChooseProvider(provider)}>
{provider.displayName}
_onChooseProvider: (provider) => Actions.recordUserEvent('Auth Flow Started', { provider: provider.name }) if provider.name is 'gmail' # Show the "Sign in to Gmail" prompt for a moment before actually bouncing # to Gmail. (400msec animation + 200msec to read) _.delay => @_onBounceToGmail(provider) , 600 OnboardingActions.moveToPage("account-settings", Object.assign({provider}, @props.pageData)) _base64url: (buf) -> # Python-style urlsafe_b64encode buf.toString('base64') .replace(/\+/g, '-') # Convert '+' to '-' .replace(/\//g, '_') # Convert '/' to '_' _onBounceToGmail: (provider) => crypto = require 'crypto' # Client key is used for polling. Requirements are that it not be guessable # and that it never collides with an active key (keys are active only between # initiating gmail auth and successfully requesting the account data once. provider.clientKey = @_base64url(crypto.randomBytes(40)) # Encryption key is used to AES encrypt the account data during storage on the # server. provider.encryptionKey = crypto.randomBytes(24) provider.encryptionIv = crypto.randomBytes(16) code = NylasEnv.config.get('invitationCode') || '' state = [provider.clientKey,@_base64url(provider.encryptionKey),@_base64url(provider.encryptionIv),code].join(',') # Use a different app for production and development. env = NylasEnv.config.get('env') || 'production' google_client_id = '372024217839-cdsnrrqfr4d6b4gmlqepd7v0n0l0ip9q.apps.googleusercontent.com' if env != 'production' google_client_id = '529928329786-e5foulo1g9kiej2h9st9sb0f4dt96s6v.apps.googleusercontent.com' googleUrl = url.format({ protocol: 'https' host: 'accounts.google.com/o/oauth2/auth' query: response_type: 'code' state: state client_id: google_client_id redirect_uri: "#{EdgehillAPI.APIRoot}/oauth/google/callback" access_type: 'offline' scope: 'https://www.googleapis.com/auth/userinfo.email \ https://www.googleapis.com/auth/userinfo.profile \ https://mail.google.com/ \ https://www.google.com/m8/feeds \ https://www.googleapis.com/auth/calendar' prompt: 'consent' }) {shell} = require 'electron' shell.openExternal(googleUrl) module.exports = AccountChoosePage