aboutsummaryrefslogtreecommitdiff
path: root/backends/cloud/onedrive/onedrivestorage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/cloud/onedrive/onedrivestorage.cpp')
-rw-r--r--backends/cloud/onedrive/onedrivestorage.cpp151
1 files changed, 151 insertions, 0 deletions
diff --git a/backends/cloud/onedrive/onedrivestorage.cpp b/backends/cloud/onedrive/onedrivestorage.cpp
new file mode 100644
index 0000000000..b632c74580
--- /dev/null
+++ b/backends/cloud/onedrive/onedrivestorage.cpp
@@ -0,0 +1,151 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+
+#include "backends/cloud/onedrive/onedrivestorage.h"
+#include "backends/networking/curl/connectionmanager.h"
+#include "backends/networking/curl/curljsonrequest.h"
+#include "common/config-manager.h"
+#include "common/debug.h"
+#include "common/json.h"
+#include <curl/curl.h>
+#include <common/file.h>
+#include "common/system.h"
+#include "common/cloudmanager.h"
+
+namespace Cloud {
+namespace OneDrive {
+
+Common::String OneDriveStorage::KEY; //can't use ConfMan there yet, loading it on instance creation/auth
+Common::String OneDriveStorage::SECRET; //TODO: hide these secrets somehow
+
+static void saveAccessTokenCallback(void *ptr) {
+ Common::JSONValue *json = (Common::JSONValue *)ptr;
+ if (json) {
+ debug("saveAccessTokenCallback:");
+ debug("%s", json->stringify(true).c_str());
+
+ //TODO: do something about refresh token
+ Common::JSONObject result = json->asObject();
+ if (!result.contains("access_token") || !result.contains("user_id")) {
+ warning("Bad response, no token/user_id passed");
+ } else {
+ OneDriveStorage::addStorage(result.getVal("access_token")->asString(), result.getVal("user_id")->asString());
+ ConfMan.removeKey("onedrive_code", "cloud");
+ debug("Done! You can use OneDrive now! Look:");
+ g_system->getCloudManager()->syncSaves();
+ }
+
+ delete json;
+ } else {
+ debug("saveAccessTokenCallback: got NULL instead of JSON!");
+ }
+}
+
+OneDriveStorage::OneDriveStorage(Common::String accessToken, Common::String userId): _token(accessToken), _uid(userId) {
+ curl_global_init(CURL_GLOBAL_ALL);
+}
+
+OneDriveStorage::~OneDriveStorage() {
+ curl_global_cleanup();
+}
+
+void OneDriveStorage::saveConfig(Common::String keyPrefix) {
+ ConfMan.set(keyPrefix + "type", "OneDrive", "cloud");
+ ConfMan.set(keyPrefix + "access_token", _token, "cloud");
+ ConfMan.set(keyPrefix + "user_id", _uid, "cloud");
+}
+
+void OneDriveStorage::syncSaves(BoolCallback callback) {
+ //this is not the real syncSaves() implementation
+}
+
+void OneDriveStorage::addStorage(Common::String token, Common::String uid) {
+ Storage *storage = new OneDriveStorage(token, uid);
+ g_system->getCloudManager()->addStorage(storage);
+}
+
+OneDriveStorage *OneDriveStorage::loadFromConfig(Common::String keyPrefix) {
+ KEY = ConfMan.get("ONEDRIVE_KEY", "cloud");
+ SECRET = ConfMan.get("ONEDRIVE_SECRET", "cloud");
+
+ if (!ConfMan.hasKey(keyPrefix + "access_token", "cloud")) {
+ warning("No access_token found");
+ return 0;
+ }
+
+ if (!ConfMan.hasKey(keyPrefix + "user_id", "cloud")) {
+ warning("No user_id found");
+ return 0;
+ }
+
+ Common::String accessToken = ConfMan.get(keyPrefix + "access_token", "cloud");
+ Common::String userId = ConfMan.get(keyPrefix + "user_id", "cloud");
+ return new OneDriveStorage(accessToken, userId);
+}
+
+Common::String OneDriveStorage::getAuthLink() {
+ Common::String url = "https://login.live.com/oauth20_authorize.srf";
+ url += "?response_type=code";
+ url += "&redirect_uri=http://localhost:12345/"; //that's for copy-pasting
+ //url += "&redirect_uri=http%3A%2F%2Flocalhost%3A12345%2F"; //that's "http://localhost:12345/" for automatic opening
+ url += "&client_id=" + KEY;
+ url += "&scope=onedrive.appfolder"; //TODO
+ return url;
+}
+
+void OneDriveStorage::authThroughConsole() {
+ if (!ConfMan.hasKey("ONEDRIVE_KEY", "cloud") || !ConfMan.hasKey("ONEDRIVE_SECRET", "cloud")) {
+ warning("No OneDrive keys available, cannot do auth");
+ return;
+ }
+
+ KEY = ConfMan.get("ONEDRIVE_KEY", "cloud");
+ SECRET = ConfMan.get("ONEDRIVE_SECRET", "cloud");
+
+ if (ConfMan.hasKey("onedrive_code", "cloud")) {
+ //phase 2: get access_token using specified code
+ getAccessToken(ConfMan.get("onedrive_code", "cloud"));
+ return;
+ }
+
+ debug("Navigate to this URL and press \"Allow\":");
+ debug("%s\n", getAuthLink().c_str());
+ debug("Then, add onedrive_code key in [cloud] section of configuration file. You should copy the <code> value from URL and put it as value for that key.\n");
+ debug("Navigate to this URL to get more information on ScummVM's configuration files:");
+ debug("http://wiki.scummvm.org/index.php/User_Manual/Configuring_ScummVM#Using_the_configuration_file_to_configure_ScummVM\n");
+}
+
+void OneDriveStorage::getAccessToken(Common::String code) {
+ Common::BaseCallback<> *callback = new Common::GlobalFunctionCallback(saveAccessTokenCallback);
+ Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(callback, "https://login.live.com/oauth20_token.srf");
+ //Content-Type: application/x-www-form-urlencoded
+ request->addPostField("code=" + code);
+ request->addPostField("grant_type=authorization_code");
+ request->addPostField("client_id=" + KEY);
+ request->addPostField("client_secret=" + SECRET);
+ request->addPostField("&redirect_uri=http%3A%2F%2Flocalhost%3A12345%2F");
+ ConnMan.addRequest(request);
+}
+
+} //end of namespace OneDrive
+} //end of namespace Cloud