From e8669f693c6adbb33f515d9a4ce9d1079756e2e8 Mon Sep 17 00:00:00 2001 From: Alexander Tkachev Date: Tue, 16 Jul 2019 14:09:38 +0700 Subject: CLOUD: Update BaseStorage to expect no refresh_token While refreshing access_token, some cloud providers also pass a new refresh_token. Google Drive does not, and accepts the same refresh_token next time. These changes allow this to happen. --- backends/cloud/basestorage.cpp | 6 ++++-- backends/cloud/basestorage.h | 5 +++++ backends/cloud/box/boxstorage.cpp | 2 ++ backends/cloud/box/boxstorage.h | 2 ++ backends/cloud/dropbox/dropboxstorage.cpp | 2 ++ backends/cloud/dropbox/dropboxstorage.h | 2 ++ backends/cloud/googledrive/googledrivestorage.cpp | 2 ++ backends/cloud/googledrive/googledrivestorage.h | 2 ++ backends/cloud/onedrive/onedrivestorage.cpp | 2 ++ backends/cloud/onedrive/onedrivestorage.h | 2 ++ 10 files changed, 25 insertions(+), 2 deletions(-) (limited to 'backends/cloud') diff --git a/backends/cloud/basestorage.cpp b/backends/cloud/basestorage.cpp index 035098fb47..e856bbe3d7 100644 --- a/backends/cloud/basestorage.cpp +++ b/backends/cloud/basestorage.cpp @@ -101,7 +101,7 @@ void BaseStorage::codeFlowComplete(Networking::JsonResponse response) { return; } - debug(9, "%s", json->stringify(true).c_str()); // TODO: remove before commit + debug(9, "%s", json->stringify(true).c_str()); // TODO: remove when done testing against cloud.scummvm.org _token = oauth.getVal("access_token")->asString(); if (requiresRefreshToken) { _refreshToken = oauth.getVal("refresh_token")->asString(); @@ -188,7 +188,7 @@ void BaseStorage::tokenRefreshed(BoolCallback callback, Networking::JsonResponse } Common::JSONObject oauth = result.getVal("oauth")->asObject(); - bool requiresRefreshToken = needsRefreshToken(); // TODO: it seems Google Drive might not send new refresh token, and still accept old one + bool requiresRefreshToken = !canReuseRefreshToken(); if (!Networking::CurlJsonRequest::jsonContainsString(oauth, "access_token", "BaseStorage::tokenRefreshed") || !Networking::CurlJsonRequest::jsonContainsString(oauth, "refresh_token", "BaseStorage::tokenRefreshed", !requiresRefreshToken)) { warning("BaseStorage: bad response, no 'access_token' or 'refresh_token' attribute passed"); @@ -200,6 +200,8 @@ void BaseStorage::tokenRefreshed(BoolCallback callback, Networking::JsonResponse return; } + debug(9, "%s", json->stringify(true).c_str()); // TODO: remove when done testing against cloud.scummvm.org + _token = oauth.getVal("access_token")->asString(); if (requiresRefreshToken) { _refreshToken = oauth.getVal("refresh_token")->asString(); diff --git a/backends/cloud/basestorage.h b/backends/cloud/basestorage.h index 4b3b497d0d..243e7f4bcc 100644 --- a/backends/cloud/basestorage.h +++ b/backends/cloud/basestorage.h @@ -69,6 +69,11 @@ protected: */ virtual bool needsRefreshToken() = 0; + /** + * Return whether to expect new refresh_token on refresh. + */ + virtual bool canReuseRefreshToken() = 0; + private: void tokenRefreshed(BoolCallback callback, Networking::JsonResponse response); diff --git a/backends/cloud/box/boxstorage.cpp b/backends/cloud/box/boxstorage.cpp index 42e902902d..f76fa3ac23 100644 --- a/backends/cloud/box/boxstorage.cpp +++ b/backends/cloud/box/boxstorage.cpp @@ -57,6 +57,8 @@ uint32 BoxStorage::storageIndex() { return kStorageBoxId; } bool BoxStorage::needsRefreshToken() { return true; } +bool BoxStorage::canReuseRefreshToken() { return false; } + void BoxStorage::saveConfig(Common::String keyPrefix) { ConfMan.set(keyPrefix + "access_token", _token, ConfMan.kCloudDomain); ConfMan.set(keyPrefix + "refresh_token", _refreshToken, ConfMan.kCloudDomain); diff --git a/backends/cloud/box/boxstorage.h b/backends/cloud/box/boxstorage.h index a6ceb522ad..a8fd32c404 100644 --- a/backends/cloud/box/boxstorage.h +++ b/backends/cloud/box/boxstorage.h @@ -51,6 +51,8 @@ protected: virtual bool needsRefreshToken(); + virtual bool canReuseRefreshToken(); + public: /** This constructor uses OAuth code flow to get tokens. */ BoxStorage(Common::String code); diff --git a/backends/cloud/dropbox/dropboxstorage.cpp b/backends/cloud/dropbox/dropboxstorage.cpp index 8941dff94a..c12dec9968 100644 --- a/backends/cloud/dropbox/dropboxstorage.cpp +++ b/backends/cloud/dropbox/dropboxstorage.cpp @@ -54,6 +54,8 @@ uint32 DropboxStorage::storageIndex() { return kStorageDropboxId; } bool DropboxStorage::needsRefreshToken() { return false; } +bool DropboxStorage::canReuseRefreshToken() { return false; } + void DropboxStorage::saveConfig(Common::String keyPrefix) { ConfMan.set(keyPrefix + "access_token", _token, ConfMan.kCloudDomain); } diff --git a/backends/cloud/dropbox/dropboxstorage.h b/backends/cloud/dropbox/dropboxstorage.h index bd9f284f72..bca83d2b5a 100644 --- a/backends/cloud/dropbox/dropboxstorage.h +++ b/backends/cloud/dropbox/dropboxstorage.h @@ -47,6 +47,8 @@ protected: virtual bool needsRefreshToken(); + virtual bool canReuseRefreshToken(); + public: /** This constructor uses OAuth code flow to get tokens. */ DropboxStorage(Common::String code); diff --git a/backends/cloud/googledrive/googledrivestorage.cpp b/backends/cloud/googledrive/googledrivestorage.cpp index be81629cef..67d157748a 100644 --- a/backends/cloud/googledrive/googledrivestorage.cpp +++ b/backends/cloud/googledrive/googledrivestorage.cpp @@ -58,6 +58,8 @@ uint32 GoogleDriveStorage::storageIndex() { return kStorageGoogleDriveId; } bool GoogleDriveStorage::needsRefreshToken() { return true; } +bool GoogleDriveStorage::canReuseRefreshToken() { return true; } + void GoogleDriveStorage::saveConfig(Common::String keyPrefix) { ConfMan.set(keyPrefix + "access_token", _token, ConfMan.kCloudDomain); ConfMan.set(keyPrefix + "refresh_token", _refreshToken, ConfMan.kCloudDomain); diff --git a/backends/cloud/googledrive/googledrivestorage.h b/backends/cloud/googledrive/googledrivestorage.h index 730e8e20c3..21e027c4a7 100644 --- a/backends/cloud/googledrive/googledrivestorage.h +++ b/backends/cloud/googledrive/googledrivestorage.h @@ -54,6 +54,8 @@ protected: virtual bool needsRefreshToken(); + virtual bool canReuseRefreshToken(); + public: /** This constructor uses OAuth code flow to get tokens. */ GoogleDriveStorage(Common::String code); diff --git a/backends/cloud/onedrive/onedrivestorage.cpp b/backends/cloud/onedrive/onedrivestorage.cpp index 8a2a8a5dae..fbaa675085 100644 --- a/backends/cloud/onedrive/onedrivestorage.cpp +++ b/backends/cloud/onedrive/onedrivestorage.cpp @@ -57,6 +57,8 @@ uint32 OneDriveStorage::storageIndex() { return kStorageOneDriveId; } bool OneDriveStorage::needsRefreshToken() { return true; } +bool OneDriveStorage::canReuseRefreshToken() { return false; } + void OneDriveStorage::saveConfig(Common::String keyPrefix) { ConfMan.set(keyPrefix + "access_token", _token, ConfMan.kCloudDomain); ConfMan.set(keyPrefix + "refresh_token", _refreshToken, ConfMan.kCloudDomain); diff --git a/backends/cloud/onedrive/onedrivestorage.h b/backends/cloud/onedrive/onedrivestorage.h index 5059e0d5b0..4b18929d73 100644 --- a/backends/cloud/onedrive/onedrivestorage.h +++ b/backends/cloud/onedrive/onedrivestorage.h @@ -51,6 +51,8 @@ protected: virtual bool needsRefreshToken(); + virtual bool canReuseRefreshToken(); + public: /** This constructor uses OAuth code flow to get tokens. */ OneDriveStorage(Common::String code); -- cgit v1.2.3