2016-05-11 13:45:10 +06:00
/* 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 .
*
*/
2016-05-15 00:31:02 +06:00
# define FORBIDDEN_SYMBOL_ALLOW_ALL
2016-05-11 13:45:10 +06:00
2016-05-11 20:24:53 +06:00
# include "backends/cloud/dropbox/dropboxstorage.h"
2016-05-17 01:19:49 +06:00
# include "backends/networking/curl/curljsonrequest.h"
2016-05-18 14:08:05 +06:00
# include "common/config-manager.h"
2016-05-11 13:45:10 +06:00
# include "common/debug.h"
2016-05-17 01:19:49 +06:00
# include "common/json.h"
2016-05-15 00:31:02 +06:00
# include <curl/curl.h>
2016-05-11 01:10:37 +06:00
2016-05-12 18:52:57 +06:00
namespace Cloud {
namespace Dropbox {
2016-05-11 01:10:37 +06:00
2016-05-18 14:08:05 +06:00
Common : : String DropboxStorage : : KEY ; //can't use ConfMan there yet, loading it on instance creation/auth
Common : : String DropboxStorage : : SECRET ; //TODO: hide these secrets somehow
static void printJsonCallback ( void * ptr ) {
Common : : JSONValue * json = ( Common : : JSONValue * ) ptr ;
if ( json ) {
debug ( " printJsonCallback: " ) ;
debug ( " %s " , json - > stringify ( true ) . c_str ( ) ) ;
delete json ;
} else {
debug ( " printJsonCallback: got NULL instead of JSON! " ) ;
}
}
static void saveAccessTokenCallback ( void * ptr ) {
2016-05-17 01:19:49 +06:00
Common : : JSONValue * json = ( Common : : JSONValue * ) ptr ;
if ( json ) {
2016-05-18 14:08:05 +06:00
debug ( " saveAccessTokenCallback: " ) ;
2016-05-17 01:19:49 +06:00
debug ( " %s " , json - > stringify ( true ) . c_str ( ) ) ;
2016-05-18 14:08:05 +06:00
Common : : JSONObject result = json - > asObject ( ) ;
if ( ! result . contains ( " access_token " ) | | ! result . contains ( " uid " ) ) {
warning ( " Bad response, no token/uid passed " ) ;
} else {
ConfMan . set ( " current_storage_type " , " Dropbox " , " cloud " ) ;
ConfMan . set ( " current_storage_access_token " , result . getVal ( " access_token " ) - > asString ( ) , " cloud " ) ;
ConfMan . set ( " current_storage_user_id " , result . getVal ( " uid " ) - > asString ( ) , " cloud " ) ;
ConfMan . removeKey ( " dropbox_code " , " cloud " ) ;
debug ( " Now please restart ScummVM to apply the changes. " ) ;
}
2016-05-17 01:19:49 +06:00
delete json ;
} else {
2016-05-18 14:08:05 +06:00
debug ( " saveAccessTokenCallback: got NULL instead of JSON! " ) ;
2016-05-17 01:19:49 +06:00
}
2016-05-15 00:31:02 +06:00
}
2016-05-18 14:08:05 +06:00
DropboxStorage : : DropboxStorage ( Common : : String accessToken , Common : : String userId ) : _token ( accessToken ) , _uid ( userId ) {
2016-05-15 00:31:02 +06:00
curl_global_init ( CURL_GLOBAL_ALL ) ;
}
DropboxStorage : : ~ DropboxStorage ( ) {
curl_global_cleanup ( ) ;
2016-05-11 01:10:37 +06:00
}
2016-05-11 20:24:53 +06:00
void DropboxStorage : : listDirectory ( Common : : String path ) {
2016-05-13 17:23:28 +06:00
startTimer ( 1000000 ) ; //in one second
2016-05-11 15:15:23 +06:00
}
2016-05-17 01:19:49 +06:00
void DropboxStorage : : syncSaves ( ) {
2016-05-18 14:08:05 +06:00
//not syncing, but already something:
printInfo ( ) ;
}
void DropboxStorage : : printInfo ( ) {
Networking : : CurlJsonRequest * request = new Networking : : CurlJsonRequest ( printJsonCallback , " https://api.dropboxapi.com/1/account/info " ) ;
request - > addHeader ( " Authorization: Bearer " + _token ) ;
addRequest ( request ) ;
}
DropboxStorage * DropboxStorage : : loadFromConfig ( ) {
KEY = ConfMan . get ( " DROPBOX_KEY " , " cloud " ) ;
SECRET = ConfMan . get ( " DROPBOX_SECRET " , " cloud " ) ;
if ( ! ConfMan . hasKey ( " current_storage_access_token " , " cloud " ) ) {
warning ( " No access_token found " ) ;
return 0 ;
}
if ( ! ConfMan . hasKey ( " current_storage_user_id " , " cloud " ) ) {
warning ( " No user_id found " ) ;
return 0 ;
}
Common : : String accessToken = ConfMan . get ( " current_storage_access_token " , " cloud " ) ;
Common : : String userId = ConfMan . get ( " current_storage_user_id " , " cloud " ) ;
return new DropboxStorage ( accessToken , userId ) ;
}
Common : : String DropboxStorage : : getAuthLink ( ) {
Common : : String url = " https://www.dropbox.com/1/oauth2/authorize " ;
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 ;
return url ;
}
DropboxStorage * DropboxStorage : : authThroughConsole ( ) {
if ( ! ConfMan . hasKey ( " DROPBOX_KEY " , " cloud " ) | | ! ConfMan . hasKey ( " DROPBOX_SECRET " , " cloud " ) ) {
warning ( " No Dropbox keys available, cannot do auth " ) ;
return 0 ;
}
KEY = ConfMan . get ( " DROPBOX_KEY " , " cloud " ) ;
SECRET = ConfMan . get ( " DROPBOX_SECRET " , " cloud " ) ;
if ( ConfMan . hasKey ( " dropbox_code " , " cloud " ) ) {
//phase 2: get access_token using specified code
return getAccessToken ( ConfMan . get ( " dropbox_code " , " cloud " ) ) ;
}
debug ( " Navigate to this URL and press \" Allow \" : " ) ;
debug ( " %s \n " , getAuthLink ( ) . c_str ( ) ) ;
debug ( " Then, add dropbox_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 " ) ;
return 0 ;
}
DropboxStorage * DropboxStorage : : getAccessToken ( Common : : String code ) {
Networking : : CurlJsonRequest * request = new Networking : : CurlJsonRequest ( saveAccessTokenCallback , " https://api.dropboxapi.com/1/oauth2/token " ) ;
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 " ) ;
//OK, that's not how I imagined that...
DropboxStorage * storage = new DropboxStorage ( " " , " " ) ;
storage - > addRequest ( request ) ;
return storage ;
2016-05-11 15:15:23 +06:00
}
2016-05-12 18:52:57 +06:00
} //end of namespace Dropbox
} //end of namespace Cloud