mirror of https://github.com/vitalif/grive2
Merge branch 'master' into master
commit
2ae61ab1e6
|
@ -3,13 +3,24 @@ cmake_minimum_required(VERSION 2.8)
|
|||
include(GNUInstallDirs)
|
||||
|
||||
# Grive version. remember to update it for every new release!
|
||||
set( GRIVE_VERSION "0.5.2-dev" )
|
||||
set( GRIVE_VERSION "0.5.2-dev" CACHE STRING "Grive version" )
|
||||
message(WARNING "Version to build: ${GRIVE_VERSION}")
|
||||
|
||||
# common compile options
|
||||
add_definitions( -DVERSION="${GRIVE_VERSION}" )
|
||||
add_definitions( -D_FILE_OFFSET_BITS=64 -std=c++0x )
|
||||
if ( APPLE )
|
||||
add_definitions( -Doff64_t=off_t )
|
||||
endif ( APPLE )
|
||||
|
||||
find_program(
|
||||
HAVE_SYSTEMD systemd
|
||||
PATHS /lib/systemd /usr/lib/systemd
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
if ( HAVE_SYSTEMD )
|
||||
add_subdirectory( systemd )
|
||||
endif( HAVE_SYSTEMD )
|
||||
|
||||
add_subdirectory( systemd )
|
||||
add_subdirectory( libgrive )
|
||||
add_subdirectory( grive )
|
||||
|
43
README.md
43
README.md
|
@ -106,9 +106,36 @@ your folder. They need to be added explicitly to your Google Drive: go to the
|
|||
Google Drive website, right click on the file or folder and chose 'Add to My
|
||||
Drive'.
|
||||
|
||||
## Custom client id and secret
|
||||
### Different OAuth2 client to workaround over quota and google approval issues
|
||||
|
||||
You can specify them with --id and --secret arguments or edit them at grive/src/main.cpp and rebuild.
|
||||
Google recently started to restrict access for unapproved applications:
|
||||
https://developers.google.com/drive/api/v3/about-auth?hl=ru
|
||||
|
||||
Grive2 is currently awaiting approval but it seems it will take forever.
|
||||
Also even if they approve it the default Client ID supplied with grive may
|
||||
exceed quota and grive will then fail to sync.
|
||||
|
||||
You can supply your own OAuth2 client credentials to work around these problems
|
||||
by following these steps:
|
||||
|
||||
1. Go to https://console.developers.google.com/apis/api/drive.googleapis.com
|
||||
2. Choose a project (you might need to create one first)
|
||||
3. Go to https://console.developers.google.com/apis/library/drive.googleapis.com and
|
||||
"Enable" the Google Drive APIs
|
||||
4. Go to https://console.cloud.google.com/apis/credentials and click "Create credentials > Help me choose"
|
||||
5. In the "Find out what credentials you need" dialog, choose:
|
||||
- Which API are you using: "Google Drive API"
|
||||
- Where will you be calling the API from: "Other UI (...CLI...)"
|
||||
- What data will you be accessing: "User Data"
|
||||
6. In the next steps create a client id (name doesn't matter) and
|
||||
setup the consent screen (defaults are ok, no need for any URLs)
|
||||
7. The needed "Client ID" and "Client Secret" are either in the shown download
|
||||
or can later found by clicking on the created credential on
|
||||
https://console.developers.google.com/apis/credentials/
|
||||
8. When you change client ID/secret in an existing Grive folder you must first delete
|
||||
the old `.grive` configuration file.
|
||||
9. Call `grive -a --id <client_id> --secret <client_secret>` and follow the steps
|
||||
to authenticate the OAuth2 client to allow it to access your drive folder.
|
||||
|
||||
## Installation
|
||||
|
||||
|
@ -133,13 +160,13 @@ There are also some optional dependencies:
|
|||
On a Debian/Ubuntu/Linux Mint machine just run the following command to install all
|
||||
these packages:
|
||||
|
||||
sudo apt-get install git cmake build-essential libgcrypt11-dev libyajl-dev \
|
||||
sudo apt-get install git cmake build-essential libgcrypt20-dev libyajl-dev \
|
||||
libboost-all-dev libcurl4-openssl-dev libexpat1-dev libcppunit-dev binutils-dev \
|
||||
debhelper zlib1g-dev dpkg-dev pkg-config
|
||||
|
||||
Fedora:
|
||||
|
||||
sudo dnf install git cmake libgcrypt-devel gcc-c++ libstdc++ yajl-devel boost libcurl-devel expat-devel binutils zlib
|
||||
sudo dnf install git cmake libgcrypt-devel gcc-c++ libstdc++ yajl-devel boost-devel libcurl-devel expat-devel binutils zlib
|
||||
|
||||
|
||||
FreeBSD:
|
||||
|
@ -163,6 +190,14 @@ Grive uses cmake to build. Basic install sequence is
|
|||
make -j4
|
||||
sudo make install
|
||||
|
||||
Alternativly you can define your own client_id and client_secret during build
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
cmake .. "-DAPP_ID:STRING=<client_id>" "-DAPP_SECRET:STRING=<client_secret>"
|
||||
make -j4
|
||||
sudo make install
|
||||
|
||||
## Version History
|
||||
|
||||
### Grive2 v0.5.2-dev
|
||||
|
|
|
@ -20,6 +20,17 @@ target_link_libraries( grive_executable
|
|||
grive
|
||||
)
|
||||
|
||||
set(DEFAULT_APP_ID "615557989097-i93d4d1ojpen0m0dso18ldr6orjkidgf.apps.googleusercontent.com")
|
||||
set(DEFAULT_APP_SECRET "xiM8Apu_WuRRdheNelJcNtOD")
|
||||
set(APP_ID ${DEFAULT_APP_ID} CACHE STRING "Application Id")
|
||||
set(APP_SECRET ${DEFAULT_APP_SECRET} CACHE STRING "Application Secret")
|
||||
|
||||
target_compile_definitions ( grive_executable
|
||||
PRIVATE
|
||||
-DAPP_ID="${APP_ID}"
|
||||
-DAPP_SECRET="${APP_SECRET}"
|
||||
)
|
||||
|
||||
set_target_properties( grive_executable
|
||||
PROPERTIES OUTPUT_NAME grive
|
||||
)
|
||||
|
|
|
@ -46,8 +46,8 @@
|
|||
#include <iostream>
|
||||
#include <unistd.h>
|
||||
|
||||
const std::string default_id = "615557989097-i93d4d1ojpen0m0dso18ldr6orjkidgf.apps.googleusercontent.com" ;
|
||||
const std::string default_secret = "xiM8Apu_WuRRdheNelJcNtOD" ;
|
||||
const std::string default_id = APP_ID ;
|
||||
const std::string default_secret = APP_SECRET ;
|
||||
|
||||
using namespace gr ;
|
||||
namespace po = boost::program_options;
|
||||
|
@ -113,6 +113,7 @@ int Main( int argc, char **argv )
|
|||
( "auth,a", "Request authorization token" )
|
||||
( "id,i", po::value<std::string>(), "Authentication ID")
|
||||
( "secret,e", po::value<std::string>(), "Authentication secret")
|
||||
( "print-url", "Only print url for request")
|
||||
( "path,p", po::value<std::string>(), "Path to working copy root")
|
||||
( "dir,s", po::value<std::string>(), "Single subdirectory to sync")
|
||||
( "verbose,V", "Verbose mode. Enable more messages than normal.")
|
||||
|
@ -174,23 +175,23 @@ int Main( int argc, char **argv )
|
|||
http->SetProgressReporter( pb.get() );
|
||||
}
|
||||
|
||||
std::string id = default_id;
|
||||
std::string secret = default_secret;
|
||||
|
||||
if( vm.count( "id" ) )
|
||||
{
|
||||
id = vm["id"].as<std::string>();
|
||||
}
|
||||
|
||||
if( vm.count( "secret" ) )
|
||||
{
|
||||
secret = vm["secret"].as<std::string>();
|
||||
}
|
||||
|
||||
if ( vm.count( "auth" ) )
|
||||
{
|
||||
std::string id = vm.count( "id" ) > 0
|
||||
? vm["id"].as<std::string>()
|
||||
: default_id ;
|
||||
std::string secret = vm.count( "secret" ) > 0
|
||||
? vm["secret"].as<std::string>()
|
||||
: default_secret ;
|
||||
|
||||
OAuth2 token( http.get(), id, secret ) ;
|
||||
|
||||
if ( vm.count("print-url") )
|
||||
{
|
||||
std::cout << token.MakeAuthURL() << std::endl ;
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
std::cout
|
||||
<< "-----------------------\n"
|
||||
<< "Please go to this URL and get an authentication code:\n\n"
|
||||
|
@ -206,14 +207,20 @@ int Main( int argc, char **argv )
|
|||
token.Auth( code ) ;
|
||||
|
||||
// save to config
|
||||
config.Set( "id", Val( id ) ) ;
|
||||
config.Set( "secret", Val( secret ) ) ;
|
||||
config.Set( "refresh_token", Val( token.RefreshToken() ) ) ;
|
||||
config.Save() ;
|
||||
}
|
||||
|
||||
std::string refresh_token ;
|
||||
std::string id ;
|
||||
std::string secret ;
|
||||
try
|
||||
{
|
||||
refresh_token = config.Get("refresh_token").Str() ;
|
||||
id = config.Get("id").Str() ;
|
||||
secret = config.Get("secret").Str() ;
|
||||
}
|
||||
catch ( Exception& e )
|
||||
{
|
||||
|
|
|
@ -30,6 +30,10 @@ Feed::Feed( const std::string &url ):
|
|||
{
|
||||
}
|
||||
|
||||
Feed::~Feed()
|
||||
{
|
||||
}
|
||||
|
||||
Feed::iterator Feed::begin() const
|
||||
{
|
||||
return m_entries.begin() ;
|
||||
|
|
|
@ -41,6 +41,7 @@ public :
|
|||
public :
|
||||
Feed( const std::string& url );
|
||||
virtual bool GetNext( http::Agent *http ) = 0 ;
|
||||
virtual ~Feed() = 0 ;
|
||||
iterator begin() const ;
|
||||
iterator end() const ;
|
||||
|
||||
|
|
|
@ -118,13 +118,20 @@ void SymbolInfo::BacktraceInfo::Callback( bfd *abfd, asection *section,
|
|||
if ((section->flags & SEC_ALLOC) == 0)
|
||||
return ;
|
||||
|
||||
bfd_vma vma = bfd_get_section_vma(abfd, section);
|
||||
// bfd_get_section_vma works up to 7b1cfbcf1a27951fb1b3a212995075dd6fdf985b,
|
||||
// removed in 7c13bc8c91abf291f0206b6608b31955c5ea70d8 (binutils 2.33.1 or so)
|
||||
// so it's substituted by its implementation to avoid checking for binutils
|
||||
// version (which at least on Debian SID it's not that easy because the
|
||||
// version.h is not included with the official package)
|
||||
bfd_vma vma = section->vma;
|
||||
|
||||
unsigned long address = (unsigned long)(info->m_addr);
|
||||
if ( address < vma )
|
||||
return;
|
||||
|
||||
bfd_size_type size = bfd_section_size(abfd, section);
|
||||
// bfd_section_size changed between the two objects described above,
|
||||
// same rationale applies
|
||||
bfd_size_type size = section->size;
|
||||
if ( address > (vma + size))
|
||||
return ;
|
||||
|
||||
|
|
|
@ -36,6 +36,10 @@ Feed2::Feed2( const std::string& url ):
|
|||
{
|
||||
}
|
||||
|
||||
Feed2::~Feed2()
|
||||
{
|
||||
}
|
||||
|
||||
bool Feed2::GetNext( http::Agent *http )
|
||||
{
|
||||
if ( m_next.empty() )
|
||||
|
|
|
@ -31,6 +31,7 @@ class Feed2: public Feed
|
|||
{
|
||||
public :
|
||||
Feed2( const std::string& url ) ;
|
||||
~Feed2() ;
|
||||
bool GetNext( http::Agent *http ) ;
|
||||
} ;
|
||||
|
||||
|
|
|
@ -38,6 +38,10 @@ const std::string default_root_folder = ".";
|
|||
|
||||
Config::Config( const po::variables_map& vm )
|
||||
{
|
||||
if ( vm.count( "id" ) > 0 )
|
||||
m_cmd.Add( "id", Val( vm["id"].as<std::string>() ) ) ;
|
||||
if ( vm.count( "secret" ) > 0 )
|
||||
m_cmd.Add( "secret", Val( vm["secret"].as<std::string>() ) ) ;
|
||||
m_cmd.Add( "new-rev", Val(vm.count("new-rev") > 0) ) ;
|
||||
m_cmd.Add( "force", Val(vm.count("force") > 0 ) ) ;
|
||||
m_cmd.Add( "path", Val(vm.count("path") > 0
|
||||
|
|
Loading…
Reference in New Issue