From 6ba0808c17b3ad626350dda72340accdc85e31e4 Mon Sep 17 00:00:00 2001 From: antelle Date: Sat, 4 Jun 2016 18:08:50 +0300 Subject: [PATCH] fix #176: logout from remote storages on disable --- app/scripts/comp/dropbox-link.js | 11 +++++++++++ app/scripts/storage/storage-base.js | 16 ++++++++++++++++ app/scripts/storage/storage-dropbox.js | 7 +++++++ app/scripts/storage/storage-gdrive.js | 7 +++++++ app/scripts/storage/storage-onedrive.js | 10 ++++++++++ .../views/settings/settings-general-view.js | 2 +- release-notes.md | 1 + 7 files changed, 53 insertions(+), 1 deletion(-) diff --git a/app/scripts/comp/dropbox-link.js b/app/scripts/comp/dropbox-link.js index 145cc5da..def2f54b 100644 --- a/app/scripts/comp/dropbox-link.js +++ b/app/scripts/comp/dropbox-link.js @@ -263,6 +263,17 @@ var DropboxLink = { this._getClient(function(err) { complete(err); }, overrideAppKey); }, + logout: function() { + if (this._dropboxClient) { + try { + this._dropboxClient.signOut(); + } catch (e) { + } finally { + this._dropboxClient.reset(); + } + } + }, + resetClient: function() { this._dropboxClient = null; }, diff --git a/app/scripts/storage/storage-base.js b/app/scripts/storage/storage-base.js index 05057578..15de71d3 100644 --- a/app/scripts/storage/storage-base.js +++ b/app/scripts/storage/storage-base.js @@ -37,6 +37,10 @@ _.extend(StorageBase.prototype, { return this; }, + setEnabled: function(enabled) { + this.enabled = enabled; + }, + _xhr: function(config) { var xhr = new XMLHttpRequest(); if (config.responseType) { @@ -186,6 +190,18 @@ _.extend(StorageBase.prototype, { this._oauthToken.expired = true; this.runtimeData.set(this.name + 'OAuthToken', this._oauthToken); this._oauthAuthorize(callback); + }, + + _oauthRevokeToken: function(url) { + var token = this.runtimeData.get(this.name + 'OAuthToken'); + if (token) { + this._xhr({ + url: url.replace('{token}', token.accessToken), + statuses: [200, 401] + }); + this.runtimeData.unset(this.name + 'OAuthToken'); + this._oauthToken = null; + } } }); diff --git a/app/scripts/storage/storage-dropbox.js b/app/scripts/storage/storage-dropbox.js index 1d74c4ec..730d16b8 100644 --- a/app/scripts/storage/storage-dropbox.js +++ b/app/scripts/storage/storage-dropbox.js @@ -223,6 +223,13 @@ var StorageDropbox = StorageBase.extend({ that.logger.debug('Removed', path, that.logger.ts(ts)); return callback && callback(err); }, _.noop); + }, + + setEnabled: function(enabled) { + if (!enabled) { + DropboxLink.logout(); + } + StorageBase.prototype.setEnabled.call(this, enabled); } }); diff --git a/app/scripts/storage/storage-gdrive.js b/app/scripts/storage/storage-gdrive.js index bcb1b4c3..448b4a81 100644 --- a/app/scripts/storage/storage-gdrive.js +++ b/app/scripts/storage/storage-gdrive.js @@ -180,6 +180,13 @@ var StorageGDrive = StorageBase.extend({ }); }, + setEnabled: function(enabled) { + if (!enabled) { + this._oauthRevokeToken('https://accounts.google.com/o/oauth2/revoke?token={token}'); + } + StorageBase.prototype.setEnabled.call(this, enabled); + }, + _getOAuthConfig: function() { var clientId = this.appSettings.get('gdriveClientId') || GDriveClientId; return { diff --git a/app/scripts/storage/storage-onedrive.js b/app/scripts/storage/storage-onedrive.js index 490efd03..a89b7011 100644 --- a/app/scripts/storage/storage-onedrive.js +++ b/app/scripts/storage/storage-onedrive.js @@ -197,6 +197,16 @@ var StorageOneDrive = StorageBase.extend({ }); }, + setEnabled: function(enabled) { + if (!enabled) { + var url = 'https://login.live.com/oauth20_logout.srf?client_id={client_id}&redirect_uri={url}' + .replace('{client_id}', this._getClientId()) + .replace('{url}', this._getOauthRedirectUrl()); + this._oauthRevokeToken(url); + } + StorageBase.prototype.setEnabled.call(this, enabled); + }, + _getClientId: function() { var clientId = this.appSettings.get('onedriveClientId'); if (!clientId) { diff --git a/app/scripts/views/settings/settings-general-view.js b/app/scripts/views/settings/settings-general-view.js index e67c49dd..52ae4244 100644 --- a/app/scripts/views/settings/settings-general-view.js +++ b/app/scripts/views/settings/settings-general-view.js @@ -264,7 +264,7 @@ var SettingsGeneralView = Backbone.View.extend({ changeStorageEnabled: function(e) { var storage = Storage[$(e.target).data('storage')]; if (storage) { - storage.enabled = e.target.checked; + storage.setEnabled(e.target.checked); AppSettingsModel.instance.set(storage.name, storage.enabled); this.$el.find('.settings__general-' + storage.name).toggleClass('hide', !e.target.checked); } diff --git a/release-notes.md b/release-notes.md index a882b202..3d79b88f 100644 --- a/release-notes.md +++ b/release-notes.md @@ -13,6 +13,7 @@ Auto-type, ui improvements `+` improved start page ux on mobile `+` option to show app logs `+` group info in entry details +`+` logout from remote storages on disable `*` don't check updates at startup `-` prevent second app instance on windows `-` fix drag-drop in Safari