mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-01-10 02:03:07 +08:00
feat(plugin-auth): add plugin auth function in NylasAPI
Summary: Adds two new functions in NylasAPI to allow auth and unauth of plugin backends. The `authPlugin` function should be called within plugins before taking any action that requires offline account access from the plugin's backend server. The `unauthPlugin` function will be used by N1 internally to revoke offline account access for plugins. Test Plan: manual for now Reviewers: bengotow, evan, juan Reviewed By: evan, juan Differential Revision: https://phab.nylas.com/D2440
This commit is contained in:
parent
c7a685630d
commit
2d51f92f17
1 changed files with 65 additions and 0 deletions
|
@ -362,4 +362,69 @@ class NylasAPI
|
||||||
AccountStore = require './stores/account-store'
|
AccountStore = require './stores/account-store'
|
||||||
AccountStore.tokenForAccountId(aid)
|
AccountStore.tokenForAccountId(aid)
|
||||||
|
|
||||||
|
# Returns a promise that will resolve if the user is successfully authed
|
||||||
|
# to the plugin backend, and will reject if the auth fails for any reason.
|
||||||
|
#
|
||||||
|
# Inside the promise, we:
|
||||||
|
# 1. Ask the API whether this plugin is authed to this account already, and resolve
|
||||||
|
# if true.
|
||||||
|
# 2. If not, we display a dialog to the user asking whether to auth this plugin.
|
||||||
|
# 3. If the user says yes to the dialog, then we send an auth request to the API to
|
||||||
|
# auth this plugin.
|
||||||
|
#
|
||||||
|
# The returned promise will reject on the failure of any of these 3 steps, namely:
|
||||||
|
# 1. The API request to check that the account is authed failed. This may mean
|
||||||
|
# that the plugin's Nylas Application is invalid, or that the Nylas API couldn't
|
||||||
|
# be reached.
|
||||||
|
# 2. The user declined the plugin auth prompt.
|
||||||
|
# 3. The API request to auth this account to the plugin failed. This may mean that
|
||||||
|
# the plugin server couldn't be reached or failed to respond properly when authing
|
||||||
|
# the account, or that the Nylas API couldn't be reached.
|
||||||
|
authPlugin: (plugin, account) ->
|
||||||
|
return @makeRequest({
|
||||||
|
returnsModel: false,
|
||||||
|
method: "GET",
|
||||||
|
accountId: account.id,
|
||||||
|
path: "/auth/plugin?client_id=#{plugin.appId}"
|
||||||
|
}).then( (result) =>
|
||||||
|
if result.authed
|
||||||
|
return Promise.resolve()
|
||||||
|
else
|
||||||
|
return @_requestPluginAuth(plugin.name, account).then( -> @makeRequest({
|
||||||
|
returnsModel: false,
|
||||||
|
method: "POST",
|
||||||
|
accountId: account.id,
|
||||||
|
path: "/auth/plugin",
|
||||||
|
body: JSON.stringify({client_id: plugin.appId}),
|
||||||
|
json: true
|
||||||
|
}))
|
||||||
|
)
|
||||||
|
|
||||||
|
_requestPluginAuth: (pluginName, account) ->
|
||||||
|
dialog = require('remote').require('dialog')
|
||||||
|
return new Promise( (resolve, reject) =>
|
||||||
|
dialog.showMessageBox({
|
||||||
|
title: "Plugin Offline Email Access",
|
||||||
|
message: "The N1 plugin #{pluginName} requests offline access to your email.",
|
||||||
|
detail: "The #{pluginName} plugin would like to be able to access your email \
|
||||||
|
account #{account.emailAddress} while you are offline. Only grant offline access to plugins you trust. \
|
||||||
|
You can review and revoke Offline Access for plugins at any time from Preferences > Plugins.",
|
||||||
|
buttons: ["Grant access","Cancel"],
|
||||||
|
type: 'info',
|
||||||
|
}, (result) =>
|
||||||
|
if result == 0
|
||||||
|
resolve()
|
||||||
|
else
|
||||||
|
reject()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
unauthPlugin: (plugin, account) ->
|
||||||
|
return @makeRequest({
|
||||||
|
returnsModel: false,
|
||||||
|
method: "DELETE",
|
||||||
|
accountId: account.id,
|
||||||
|
path: "/auth/plugin?client_id=#{plugin.appId}"
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = new NylasAPI()
|
module.exports = new NylasAPI()
|
||||||
|
|
Loading…
Reference in a new issue