ares-ide
Version:
A browser-based code editor and UI designer for Enyo 2 projects
57 lines (53 loc) • 2.52 kB
text/coffeescript
# OAuth driver that uses a Cordova InAppBrowser to complete the flow.
class Dropbox.Drivers.Cordova extends Dropbox.Drivers.BrowserBase
# Sets up an OAuth driver for Cordova applications.
#
# @param {?Object} options one of the settings below; leave out the argument
# to use the current location for redirecting
# @option options {Boolean} rememberUser if true, the user's OAuth tokens are
# saved in localStorage; if you use this, you MUST provide a UI item that
# calls signOut() on Dropbox.Client, to let the user "log out" of the
# application
# @option options {String} scope embedded in the localStorage key that holds
# the authentication data; useful for having multiple OAuth tokens in a
# single application
constructor: (options) ->
@rememberUser = options?.rememberUser or false
@scope = options?.scope or 'default'
# Shows the authorization URL in a pop-up, waits for it to send a message.
doAuthorize: (authUrl, token, tokenSecret, callback) ->
browser = window.open authUrl, '_blank', 'location=yes'
promptPageLoaded = false
authHost = /^[^/]*\/\/[^/]*\//.exec(authUrl)[0]
onEvent = (event) ->
if event.url is authUrl and promptPageLoaded is false
# We get loadstop for the app authorization prompt page.
# On phones, we get a 2nd loadstop for the same authorization URL
# when the user clicks 'Allow'. On tablets, we get a different URL.
promptPageLoaded = true
return
if event.url and event.url.substring(0, authHost.length) isnt authHost
# The user clicked on the app URL. Wait until they come back.
promptPageLoaded = false
return
if event.type is 'exit' or promptPageLoaded
browser.removeEventListener 'loadstop', onEvent
browser.removeEventListener 'exit', onEvent
browser.close() unless event.type is 'exit'
callback()
browser.addEventListener 'loadstop', onEvent
browser.addEventListener 'exit', onEvent
# This driver does not use a redirect page.
url: -> null
# Discards tokens saved during the authentication process.
onAuthStateChange: (client, callback) ->
superCall = do => => super client, callback
@setStorageKey client
if client.authState is DropboxClient.RESET
@loadCredentials (credentials) =>
if credentials and credentials.authState # Incomplete authentication.
@forgetCredentials superCall
else
superCall()
else
superCall()