mirror of https://github.com/vitalif/grive2
first version. can download files
commit
6fe956d22c
|
@ -0,0 +1,2 @@
|
|||
.kdev4
|
||||
grive.kdev4
|
|
@ -0,0 +1,12 @@
|
|||
project(grive)
|
||||
|
||||
add_executable( grive
|
||||
src/main.cc
|
||||
src/OAuth2.cc
|
||||
src/HTTP.cc
|
||||
src/Json.cc
|
||||
src/Drive.cc )
|
||||
|
||||
target_link_libraries( grive
|
||||
curl
|
||||
json )
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
grive: an GPL program to sync a local directory with Google Drive
|
||||
Copyright (C) 2012 Wan Wai Ho
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "Drive.hh"
|
||||
|
||||
#include "HTTP.hh"
|
||||
#include "Json.hh"
|
||||
#include "OAuth2.hh"
|
||||
|
||||
// for debugging only
|
||||
#include <iostream>
|
||||
|
||||
namespace gr {
|
||||
|
||||
Drive::Drive( OAuth2& auth ) :
|
||||
m_auth( auth )
|
||||
{
|
||||
m_http_hdr.push_back( "Authorization: Bearer " + m_auth.AccessToken() ) ;
|
||||
m_http_hdr.push_back( "GData-Version: 3.0" ) ;
|
||||
|
||||
Json resp( HttpGet( "https://docs.google.com/feeds/default/private/full?alt=json", m_http_hdr ) ) ;
|
||||
|
||||
/* Json::Object map = resp["feed"]["id"].As<Json::Object>() ;
|
||||
for ( Json::Object::iterator i = map.begin() ; i != map.end() ; ++i )
|
||||
{
|
||||
std::cout << i->first << "\t" << i->second.DataType() << std::endl ;
|
||||
}*/
|
||||
|
||||
Json::Array a = resp["feed"]["entry"].As<Json::Array>() ;
|
||||
for ( Json::Array::iterator i = a.begin() ; i != a.end() ; ++i )
|
||||
{
|
||||
DownloadEntry( *i ) ;
|
||||
}
|
||||
}
|
||||
|
||||
void Drive::DownloadEntry( const Json& entry )
|
||||
{
|
||||
Json::Object map = entry.As<Json::Object>() ;
|
||||
for ( Json::Object::iterator i = map.begin() ; i != map.end() ; ++i )
|
||||
{
|
||||
// std::cout << i->first << "\t" << i->second.DataType() << std::endl ;
|
||||
}
|
||||
|
||||
// only handle uploaded files
|
||||
if ( entry.Has( "docs$filename" ) )
|
||||
{
|
||||
// use title as the filename
|
||||
std::string filename = entry["docs$filename"]["$t"].As<std::string>() ;
|
||||
std::string url = entry["content"]["src"].As<std::string>() ;
|
||||
|
||||
std::cout << "downloading " << filename << " from " << url << std::endl ;
|
||||
|
||||
HttpGetFile( url, filename, m_http_hdr ) ;
|
||||
}
|
||||
}
|
||||
|
||||
} // end of namespace
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
grive: an GPL program to sync a local directory with Google Drive
|
||||
Copyright (C) 2012 Wan Wai Ho
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace gr {
|
||||
|
||||
class OAuth2 ;
|
||||
class Json ;
|
||||
|
||||
class Drive
|
||||
{
|
||||
public :
|
||||
Drive( OAuth2& auth ) ;
|
||||
|
||||
private :
|
||||
void DownloadEntry( const Json& entry ) ;
|
||||
|
||||
private :
|
||||
OAuth2& m_auth ;
|
||||
std::vector<std::string> m_http_hdr ;
|
||||
} ;
|
||||
|
||||
} // end of namespace
|
|
@ -0,0 +1,184 @@
|
|||
/*
|
||||
grive: an GPL program to sync a local directory with Google Drive
|
||||
Copyright (C) 2012 Wan Wai Ho
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "HTTP.hh"
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <cassert>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <streambuf>
|
||||
|
||||
namespace gr {
|
||||
|
||||
HttpException::HttpException( int curl_code, int http_code, const char *err_buf )
|
||||
: runtime_error( Format( curl_code, http_code, err_buf ) )
|
||||
{
|
||||
}
|
||||
|
||||
std::string HttpException::Format( int curl_code, int http_code, const char *err_buf )
|
||||
{
|
||||
std::ostringstream ss ;
|
||||
ss << "CURL code = " << curl_code << " HTTP code = " << http_code << " (" << err_buf << ")" ;
|
||||
return ss.str() ;
|
||||
}
|
||||
|
||||
// libcurl callback to append to a string
|
||||
std::size_t WriteCallback( char *data, size_t size, size_t nmemb, std::string *resp )
|
||||
{
|
||||
assert( resp != 0 ) ;
|
||||
assert( data != 0 ) ;
|
||||
|
||||
std::size_t count = size * nmemb ;
|
||||
resp->append( data, count ) ;
|
||||
return count ;
|
||||
}
|
||||
|
||||
// libcurl callback to write to a file
|
||||
std::size_t DownloadCallback( char *data, size_t size, size_t nmemb, std::streambuf *file )
|
||||
{
|
||||
assert( file != 0 ) ;
|
||||
assert( data != 0 ) ;
|
||||
|
||||
return file->sputn( data, size * nmemb ) ;
|
||||
}
|
||||
|
||||
CURL* InitCurl( const std::string& url, std::string *resp, const Headers& hdr )
|
||||
{
|
||||
CURL *curl = curl_easy_init();
|
||||
if ( curl == 0 )
|
||||
throw std::bad_alloc() ;
|
||||
|
||||
// set common options
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
|
||||
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
|
||||
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp ) ;
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
|
||||
// set headers
|
||||
struct curl_slist *curl_hdr = 0 ;
|
||||
for ( Headers::const_iterator i = hdr.begin() ; i != hdr.end() ; ++i )
|
||||
curl_hdr = curl_slist_append( curl_hdr, i->c_str() ) ;
|
||||
curl_easy_setopt( curl, CURLOPT_HTTPHEADER, curl_hdr ) ;
|
||||
|
||||
return curl ;
|
||||
}
|
||||
|
||||
void DoCurl( CURL *curl )
|
||||
{
|
||||
char error_buf[CURL_ERROR_SIZE] = {} ;
|
||||
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error_buf ) ;
|
||||
|
||||
CURLcode curl_code = curl_easy_perform(curl);
|
||||
|
||||
int http_code = 0;
|
||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
|
||||
|
||||
// clean up
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
if ( curl_code != CURLE_OK )
|
||||
{
|
||||
throw HttpException( curl_code, http_code, error_buf ) ;
|
||||
}
|
||||
else if (http_code >= 400 )
|
||||
{
|
||||
std::cout << "http error " << http_code << std::endl ;
|
||||
throw HttpException( curl_code, http_code, error_buf ) ;
|
||||
}
|
||||
}
|
||||
|
||||
std::string HttpGet( const std::string& url, const Headers& hdr )
|
||||
{
|
||||
std::string resp ;
|
||||
CURL *curl = InitCurl( url, &resp, hdr ) ;
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
|
||||
DoCurl( curl ) ;
|
||||
return resp;
|
||||
}
|
||||
|
||||
void HttpGetFile(
|
||||
const std::string& url,
|
||||
const std::string& filename,
|
||||
const Headers& hdr )
|
||||
{
|
||||
std::ofstream file( filename.c_str(), std::ios::binary | std::ios::out ) ;
|
||||
if ( !file )
|
||||
throw std::runtime_error( "cannot open file " + filename + " for writing" ) ;
|
||||
|
||||
CURL *curl = InitCurl( url, 0, hdr ) ;
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, DownloadCallback);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, file.rdbuf() ) ;
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
|
||||
DoCurl( curl ) ;
|
||||
}
|
||||
|
||||
std::string HttpPostData( const std::string& url, const std::string& data, const Headers& hdr )
|
||||
{
|
||||
std::string resp ;
|
||||
CURL *curl = InitCurl( url, &resp, hdr ) ;
|
||||
|
||||
std::string post_data = data ;
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_POST, 1);
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, &post_data[0] ) ;
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, post_data.size() ) ;
|
||||
|
||||
DoCurl( curl ) ;
|
||||
return resp;
|
||||
}
|
||||
|
||||
std::string HttpPostFile( const std::string& url, const std::string& filename, const Headers& hdr )
|
||||
{
|
||||
std::string resp ;
|
||||
return resp;
|
||||
}
|
||||
|
||||
std::string Escape( const std::string& str )
|
||||
{
|
||||
CURL *curl = curl_easy_init();
|
||||
|
||||
char *tmp = curl_easy_escape( curl, str.c_str(), str.size() ) ;
|
||||
std::string result = tmp ;
|
||||
curl_free( tmp ) ;
|
||||
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
return result ;
|
||||
}
|
||||
|
||||
std::string Unescape( const std::string& str )
|
||||
{
|
||||
CURL *curl = curl_easy_init();
|
||||
|
||||
int r ;
|
||||
char *tmp = curl_easy_unescape( curl, str.c_str(), str.size(), &r ) ;
|
||||
std::string result = tmp ;
|
||||
curl_free( tmp ) ;
|
||||
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
return result ;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
grive: an GPL program to sync a local directory with Google Drive
|
||||
Copyright (C) 2012 Wan Wai Ho
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
#include <vector>
|
||||
|
||||
namespace gr
|
||||
{
|
||||
typedef std::vector<std::string> Headers ;
|
||||
|
||||
std::string HttpGet( const std::string& url, const Headers& hdr = Headers() ) ;
|
||||
void HttpGetFile(
|
||||
const std::string& url,
|
||||
const std::string& filename,
|
||||
const Headers& hdr = Headers() ) ;
|
||||
|
||||
std::string HttpPostData(
|
||||
const std::string& url,
|
||||
const std::string& data,
|
||||
const Headers& hdr = Headers() ) ;
|
||||
std::string HttpPostFile(
|
||||
const std::string& url,
|
||||
const std::string& filename,
|
||||
const Headers& hdr = Headers() ) ;
|
||||
|
||||
std::string Escape( const std::string& str ) ;
|
||||
std::string Unescape( const std::string& str ) ;
|
||||
|
||||
class HttpException : public std::runtime_error
|
||||
{
|
||||
public :
|
||||
HttpException( int curl_code, int http_code, const char *err_buf ) ;
|
||||
|
||||
private :
|
||||
static std::string Format( int curl_code, int http_code, const char *err_buf ) ;
|
||||
} ;
|
||||
}
|
|
@ -0,0 +1,168 @@
|
|||
/*
|
||||
grive: an GPL program to sync a local directory with Google Drive
|
||||
Copyright (C) 2012 Wan Wai Ho
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "Json.hh"
|
||||
|
||||
#include <json/json_tokener.h>
|
||||
#include <json/linkhash.h>
|
||||
|
||||
#include <cassert>
|
||||
#include <ostream>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace gr {
|
||||
|
||||
Json::Json( const std::string& str ) :
|
||||
m_json( ::json_tokener_parse( str.c_str() ) )
|
||||
{
|
||||
if ( m_json == 0 )
|
||||
throw std::runtime_error( "json parse error" ) ;
|
||||
}
|
||||
|
||||
Json::Json( struct json_object *json ) :
|
||||
m_json( json )
|
||||
{
|
||||
assert( json != 0 ) ;
|
||||
::json_object_get( m_json ) ;
|
||||
}
|
||||
|
||||
Json::Json( const Json& rhs ) :
|
||||
m_json( rhs.m_json )
|
||||
{
|
||||
assert( m_json != 0 ) ;
|
||||
::json_object_get( m_json ) ;
|
||||
}
|
||||
|
||||
Json::~Json( )
|
||||
{
|
||||
assert( m_json != 0 ) ;
|
||||
::json_object_put( m_json ) ;
|
||||
}
|
||||
|
||||
Json& Json::operator=( const Json& rhs )
|
||||
{
|
||||
Json tmp( rhs ) ;
|
||||
Swap( tmp ) ;
|
||||
return *this ;
|
||||
}
|
||||
|
||||
void Json::Swap( Json& other )
|
||||
{
|
||||
assert( m_json != 0 ) ;
|
||||
assert( other.m_json != 0 ) ;
|
||||
std::swap( m_json, other.m_json ) ;
|
||||
}
|
||||
|
||||
Json Json::operator[]( const std::string& key ) const
|
||||
{
|
||||
assert( m_json != 0 ) ;
|
||||
|
||||
struct json_object *j = ::json_object_object_get( m_json, key.c_str() ) ;
|
||||
if ( j == 0 )
|
||||
throw std::runtime_error( "key: " + key + " is not found in object" ) ;
|
||||
|
||||
return Json( j ) ;
|
||||
}
|
||||
|
||||
bool Json::Has( const std::string& key ) const
|
||||
{
|
||||
assert( m_json != 0 ) ;
|
||||
return ::json_object_object_get( m_json, key.c_str() ) != 0 ;
|
||||
}
|
||||
|
||||
template <>
|
||||
std::string Json::As<std::string>() const
|
||||
{
|
||||
assert( m_json != 0 ) ;
|
||||
return ::json_object_get_string( m_json ) ;
|
||||
}
|
||||
|
||||
template <>
|
||||
bool Json::Is<std::string>() const
|
||||
{
|
||||
assert( m_json != 0 ) ;
|
||||
return ::json_object_is_type( m_json, json_type_string ) ;
|
||||
}
|
||||
|
||||
template <>
|
||||
int Json::As<int>() const
|
||||
{
|
||||
assert( m_json != 0 ) ;
|
||||
return ::json_object_get_int( m_json ) ;
|
||||
}
|
||||
|
||||
template <>
|
||||
bool Json::Is<int>() const
|
||||
{
|
||||
assert( m_json != 0 ) ;
|
||||
return ::json_object_is_type( m_json, json_type_int ) ;
|
||||
}
|
||||
|
||||
std::ostream& operator<<( std::ostream& os, const Json& json )
|
||||
{
|
||||
assert( json.m_json != 0 ) ;
|
||||
return os << ::json_object_to_json_string( json.m_json ) ;
|
||||
}
|
||||
|
||||
Json::Type Json::DataType() const
|
||||
{
|
||||
assert( m_json != 0 ) ;
|
||||
return static_cast<Type>( ::json_object_get_type( m_json ) ) ;
|
||||
}
|
||||
|
||||
template <>
|
||||
Json::Object Json::As<Json::Object>() const
|
||||
{
|
||||
Object result ;
|
||||
|
||||
json_object_object_foreach( m_json, key, val )
|
||||
{
|
||||
result.insert( Object::value_type( key, Json( val ) ) ) ;
|
||||
}
|
||||
|
||||
return result ;
|
||||
}
|
||||
|
||||
template <>
|
||||
bool Json::Is<Json::Object>() const
|
||||
{
|
||||
assert( m_json != 0 ) ;
|
||||
return ::json_object_is_type( m_json, json_type_object ) ;
|
||||
}
|
||||
|
||||
template <>
|
||||
Json::Array Json::As<Json::Array>() const
|
||||
{
|
||||
std::size_t count = ::json_object_array_length( m_json ) ;
|
||||
Array result ;
|
||||
|
||||
for ( std::size_t i = 0 ; i < count ; ++i )
|
||||
result.push_back( Json( ::json_object_array_get_idx( m_json, i ) ) ) ;
|
||||
|
||||
return result ;
|
||||
}
|
||||
|
||||
template <>
|
||||
bool Json::Is<Json::Array>() const
|
||||
{
|
||||
assert( m_json != 0 ) ;
|
||||
return ::json_object_is_type( m_json, json_type_array ) ;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
grive: an GPL program to sync a local directory with Google Drive
|
||||
Copyright (C) 2012 Wan Wai Ho
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
struct json_object ;
|
||||
|
||||
namespace gr {
|
||||
|
||||
class Json
|
||||
{
|
||||
public :
|
||||
typedef std::map<std::string, Json> Object ;
|
||||
typedef std::vector<Json> Array ;
|
||||
|
||||
public :
|
||||
Json( const std::string& str ) ;
|
||||
Json( const Json& rhs ) ;
|
||||
~Json( ) ;
|
||||
|
||||
Json operator[]( const std::string& key ) const ;
|
||||
Json& operator=( const Json& rhs ) ;
|
||||
|
||||
void Swap( Json& other ) ;
|
||||
|
||||
template <typename T>
|
||||
T As() const ;
|
||||
|
||||
template <typename T>
|
||||
bool Is() const ;
|
||||
|
||||
bool Has( const std::string& key ) const ;
|
||||
|
||||
friend std::ostream& operator<<( std::ostream& os, const Json& json ) ;
|
||||
|
||||
enum Type { null_type, bool_type, double_type, int_type, object_type, array_type, string_type } ;
|
||||
|
||||
Type DataType() const ;
|
||||
|
||||
private :
|
||||
Json( struct json_object *json ) ;
|
||||
|
||||
private :
|
||||
struct json_object *m_json ;
|
||||
} ;
|
||||
|
||||
}
|
|
@ -0,0 +1,100 @@
|
|||
/*
|
||||
grive: an GPL program to sync a local directory with Google Drive
|
||||
Copyright (C) 2012 Wan Wai Ho
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "OAuth2.hh"
|
||||
#include "HTTP.hh"
|
||||
#include "Json.hh"
|
||||
|
||||
// for debugging
|
||||
#include <iostream>
|
||||
|
||||
namespace gr {
|
||||
|
||||
const std::string token_url = "https://accounts.google.com/o/oauth2/token" ;
|
||||
const std::string client_id = "472848141496.apps.googleusercontent.com" ;
|
||||
const std::string client_secret = "hmBLwnBSU24Wombgjbffs6DS" ;
|
||||
|
||||
OAuth2::OAuth2( const std::string& refresh_code ) :
|
||||
m_refresh( refresh_code )
|
||||
{
|
||||
Refresh( ) ;
|
||||
}
|
||||
|
||||
OAuth2::OAuth2( )
|
||||
{
|
||||
}
|
||||
|
||||
void OAuth2::Auth( const std::string& auth_code )
|
||||
{
|
||||
std::string post =
|
||||
"code=" + auth_code +
|
||||
"&client_id=" + client_id +
|
||||
"&client_secret=" + client_secret +
|
||||
"&redirect_uri=" + "urn:ietf:wg:oauth:2.0:oob" +
|
||||
"&grant_type=authorization_code" ;
|
||||
|
||||
Json resp( HttpPostData( token_url, post ) ) ;
|
||||
m_access = resp["access_token"].As<std::string>() ;
|
||||
m_refresh = resp["refresh_token"].As<std::string>() ;
|
||||
}
|
||||
|
||||
std::string OAuth2::MakeAuthURL(
|
||||
const std::string& client_id,
|
||||
const std::string& state )
|
||||
{
|
||||
return "https://accounts.google.com/o/oauth2/auth"
|
||||
"?scope=" +
|
||||
Escape( "https://www.googleapis.com/auth/userinfo.email" ) + "+" +
|
||||
Escape( "https://www.googleapis.com/auth/userinfo.profile" ) + "+" +
|
||||
Escape( "https://docs.google.com/feeds/" ) + "+" +
|
||||
Escape( "https://docs.googleusercontent.com/" ) + "+" +
|
||||
Escape( "https://spreadsheets.google.com/feeds/" ) +
|
||||
"&redirect_uri=urn:ietf:wg:oauth:2.0:oob"
|
||||
"&response_type=code"
|
||||
"&client_id=" + client_id ;
|
||||
}
|
||||
|
||||
void OAuth2::Refresh( )
|
||||
{
|
||||
std::string post =
|
||||
"refresh_token=" + m_refresh +
|
||||
"&client_id=" + client_id +
|
||||
"&client_secret=" + client_secret +
|
||||
"&grant_type=refresh_token" ;
|
||||
|
||||
Json resp( HttpPostData( token_url, post ) ) ;
|
||||
m_access = resp["access_token"].As<std::string>() ;
|
||||
}
|
||||
|
||||
std::string OAuth2::RefreshToken( ) const
|
||||
{
|
||||
return m_refresh ;
|
||||
}
|
||||
|
||||
std::string OAuth2::AccessToken( ) const
|
||||
{
|
||||
return m_access ;
|
||||
}
|
||||
|
||||
std::string OAuth2::HttpHeader( ) const
|
||||
{
|
||||
return "Authorization: Bearer " + m_access ;
|
||||
}
|
||||
|
||||
} // end of namespace
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
grive: an GPL program to sync a local directory with Google Drive
|
||||
Copyright (C) 2012 Wan Wai Ho
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace gr {
|
||||
|
||||
class OAuth2
|
||||
{
|
||||
public :
|
||||
OAuth2( ) ;
|
||||
explicit OAuth2( const std::string& refresh_code ) ;
|
||||
|
||||
std::string Str() const ;
|
||||
|
||||
static std::string MakeAuthURL(
|
||||
const std::string& client_id,
|
||||
const std::string& state = std::string() ) ;
|
||||
|
||||
void Auth( const std::string& auth_code ) ;
|
||||
void Refresh( ) ;
|
||||
|
||||
std::string RefreshToken( ) const ;
|
||||
std::string AccessToken( ) const ;
|
||||
|
||||
// adding HTTP auth header
|
||||
std::string HttpHeader( ) const ;
|
||||
|
||||
private :
|
||||
std::string m_access ;
|
||||
std::string m_refresh ;
|
||||
} ;
|
||||
|
||||
} // end of namespace
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
grive: an GPL program to sync a local directory with Google Drive
|
||||
Copyright (C) 2012 Wan Wai Ho
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "OAuth2.hh"
|
||||
#include "Drive.hh"
|
||||
|
||||
#include <cstdlib>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
int main( int argc, char **argv )
|
||||
{
|
||||
using namespace gr ;
|
||||
|
||||
int c ;
|
||||
while ((c = getopt (argc, argv, "ac:")) != -1)
|
||||
{
|
||||
switch ( c )
|
||||
{
|
||||
case 'a' :
|
||||
{
|
||||
std::cout <<
|
||||
OAuth2::MakeAuthURL( "472848141496.apps.googleusercontent.com" ) << std::endl ;
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
case 'c' :
|
||||
{
|
||||
OAuth2 token ;
|
||||
token.Auth( optarg ) ;
|
||||
|
||||
// print the refresh token an exist
|
||||
std::cout << token.RefreshToken() << std::endl ;
|
||||
return 0 ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OAuth2 token( getenv( "GR_REFRESH_CODE" ) ) ;
|
||||
Drive drive( token ) ;
|
||||
|
||||
return 0 ;
|
||||
}
|
Loading…
Reference in New Issue