google_drive-persistent_session 0.1.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 83178b5a54bc6968c24af6877303713a6938b254
4
- data.tar.gz: 9ef742360e4f9f64c61ec9f104459df5808051ad
2
+ SHA256:
3
+ metadata.gz: 0b5bdef8e2f0bd44da8d68b3a5ce2532ca972c8c3ddee6acbb328323b2dfd7c2
4
+ data.tar.gz: 7f4df6909ee4be4cf3fb68307d89ab34488b67f6918e89ced9aa3a99a040491e
5
5
  SHA512:
6
- metadata.gz: ba764cee625d7d7f27a298ba6d4de614c3b234ad770f97dadfdbb55fb79d64326858e83ac657f4ad1a2f4665786dee0e03ff5648d00e9db13f002f067e95a95c
7
- data.tar.gz: 78650a9ee022c7df9629ba1f6993d5245cce387e697f2e82ee2dcdf96905352b82aae9c1eecf9080c57359349a79065dcd54b81d03f36626787aad8c128afe38
6
+ metadata.gz: 03bb11202767d968a0aff3fdef3aa6bda9568e2cdd193c9279f59e77e0e64b1f4cd67cfc11e95b2843a323f4226708efef2f0d829897f61ca2d1039cfe459ccf
7
+ data.tar.gz: 7433eedb639ccd7803a105570b918b59ad408b4a2f0f8fc1296ebbee9c21aecce63466ec2885231a247c0031111a22570b33f50ddf7a9d59d77ae425e7601481
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.name = 'google_drive-persistent_session'
8
8
  spec.version = GoogleDrive::PersistentSession::VERSION
9
9
  spec.authors = ['Genki Sugawara']
10
- spec.email = ['sgwr_dts@yahoo.co.jp']
10
+ spec.email = ['sugawara@winebarrel.jp']
11
11
  spec.summary = %q{Persist credential for google-drive-ruby.}
12
12
  spec.description = %q{Persist credential for google-drive-ruby.}
13
13
  spec.homepage = 'https://github.com/winebarrel/google_drive-persistent_session'
@@ -18,9 +18,9 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'google-api-client', '~> 0.8.0'
22
- spec.add_dependency 'google_drive', '~> 1.0'
21
+ spec.add_dependency 'google_drive', '>= 3.0.7'
23
22
  spec.add_dependency 'highline'
23
+ spec.add_dependency 'webrick'
24
24
  spec.add_development_dependency 'bundler'
25
25
  spec.add_development_dependency 'rake'
26
26
  end
@@ -1,3 +1,5 @@
1
+ require 'google/api_client/auth/storage'
2
+
1
3
  module GoogleDrive::CredentialStorage
2
4
  DEFAULE_FILE_STORE_PATH = '~/.google_drive-oauth2.json'
3
5
 
@@ -1,3 +1,5 @@
1
+ require 'google/api_client/auth/storages/file_store'
2
+
1
3
  class Google::APIClient::FileStore
2
4
  alias write_credentials_orig write_credentials
3
5
 
@@ -1,3 +1,7 @@
1
+ require 'securerandom'
2
+ require 'uri'
3
+ require 'webrick'
4
+
1
5
  class GoogleDrive::PersistentSession
2
6
  extend Forwardable
3
7
  include GoogleDrive::CredentialStorage
@@ -21,9 +25,7 @@ class GoogleDrive::PersistentSession
21
25
  store_credential unless credential_stored?
22
26
  credential = storage.authorize
23
27
 
24
- if !credential.access_token
25
- fetch_access_token(credential)
26
- elsif credential.expired?
28
+ if credential.expired?
27
29
  refresh(credential)
28
30
  end
29
31
 
@@ -37,27 +39,88 @@ class GoogleDrive::PersistentSession
37
39
  client_secret = ask('Enter CLIENT SECRET: ') {|q| q.echo = false }
38
40
  puts # line break
39
41
 
40
- credential = Signet::OAuth2::Client.new(
42
+ # Use loopback IP address redirect option
43
+ # https://developers.google.com/identity/protocols/oauth2/native-app#redirect-uri_loopback
44
+ server = WEBrick::HTTPServer.new(Port: 0, AccessLog: [])
45
+ queue = Thread::SizedQueue.new(1)
46
+ health_token = SecureRandom.uuid
47
+ server.mount_proc('/') do |req, resp|
48
+ resp.content_type = 'text/plain'
49
+ if req.request_method != 'GET'
50
+ resp.status = 405
51
+ res.body = 'Method Not Allowed'
52
+ next
53
+ end
54
+
55
+ case req.path
56
+ when '/'
57
+ # redirect
58
+ params = URI.decode_www_form(req.query_string).to_h
59
+ if params.key?('code')
60
+ code = params.fetch('code')
61
+ resp.status = 200
62
+ resp.body = 'Successfully authorized. Back to console'
63
+ queue.push(code)
64
+ else
65
+ resp.status = 400
66
+ resp.body = 'Failed to authorize: code is missing'
67
+ queue.push(nil)
68
+ end
69
+ when '/health'
70
+ resp.status = 200
71
+ resp.body = health_token
72
+ else
73
+ resp.status = 404
74
+ resp.body = 'not found'
75
+ end
76
+ end
77
+ server_thread = Thread.start { server.start }
78
+ credential = Google::Auth::UserRefreshCredentials.new(
41
79
  :client_id => client_id,
42
80
  :client_secret => client_secret,
43
- :refresh_token => ''
81
+ :scope => [
82
+ 'https://www.googleapis.com/auth/drive',
83
+ 'https://spreadsheets.google.com/feeds/'
84
+ ],
85
+ :redirect_uri => "http://127.0.0.1:#{server.config[:Port]}",
86
+ :grant_type => 'authorization_code'
44
87
  )
45
88
 
89
+ server_launched = false
90
+ 60.times do |i|
91
+ begin
92
+ resp = Net::HTTP.get_response('127.0.0.1', '/health', server.config[:Port])
93
+ resp.value
94
+ if resp.body == health_token
95
+ server_launched = true
96
+ break
97
+ else
98
+ $stderr.puts " Server returned unknown response: #{resp.body}"
99
+ sleep 1
100
+ end
101
+ rescue => e
102
+ $stderr.puts " Waiting server launch: #{e.class}: #{e.message}"
103
+ sleep 1
104
+ end
105
+ end
106
+ unless server_launched
107
+ server.shutdown
108
+ server_thread.join
109
+ raise 'Failed to start HTTP server'
110
+ end
111
+ fetch_access_token(credential, queue, server, server_thread)
46
112
  storage.write_credentials(credential)
47
113
  end
48
114
 
49
- def fetch_access_token(credential)
50
- credential.scope = %w(
51
- https://www.googleapis.com/auth/drive
52
- https://spreadsheets.google.com/feeds/
53
- ).join(' ')
54
-
55
- credential.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
56
- credential.grant_type = 'authorization_code'
57
-
58
- message = "1. Open this page:\n%s\n\n" % credential.authorization_uri
59
- message << "2. Enter the authorization code shown in the page: "
60
- credential.code = ask(message)
115
+ def fetch_access_token(credential, queue, server, server_thread)
116
+ puts "Open this page in web browser: #{credential.authorization_uri}"
117
+ code = queue.pop
118
+ server.shutdown
119
+ server_thread.join
120
+ unless code
121
+ raise 'authorization failed'
122
+ end
123
+ credential.code = code
61
124
 
62
125
  credential.fetch_access_token!
63
126
  storage.write_credentials(credential)
@@ -1,5 +1,5 @@
1
1
  module GoogleDrive
2
2
  class PersistentSession
3
- VERSION = '0.1.3'
3
+ VERSION = '0.3.0'
4
4
  end
5
5
  end
@@ -1,6 +1,5 @@
1
1
  require 'fileutils'
2
2
  require 'forwardable'
3
- require 'google/api_client'
4
3
  require 'google_drive'
5
4
  require 'highline'
6
5
 
metadata CHANGED
@@ -1,45 +1,45 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google_drive-persistent_session
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-24 00:00:00.000000000 Z
11
+ date: 2022-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: google-api-client
14
+ name: google_drive
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.8.0
19
+ version: 3.0.7
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.8.0
26
+ version: 3.0.7
27
27
  - !ruby/object:Gem::Dependency
28
- name: google_drive
28
+ name: highline
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: highline
42
+ name: webrick
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -82,7 +82,7 @@ dependencies:
82
82
  version: '0'
83
83
  description: Persist credential for google-drive-ruby.
84
84
  email:
85
- - sgwr_dts@yahoo.co.jp
85
+ - sugawara@winebarrel.jp
86
86
  executables: []
87
87
  extensions: []
88
88
  extra_rdoc_files: []
@@ -102,7 +102,7 @@ homepage: https://github.com/winebarrel/google_drive-persistent_session
102
102
  licenses:
103
103
  - MIT
104
104
  metadata: {}
105
- post_install_message:
105
+ post_install_message:
106
106
  rdoc_options: []
107
107
  require_paths:
108
108
  - lib
@@ -117,9 +117,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
117
  - !ruby/object:Gem::Version
118
118
  version: '0'
119
119
  requirements: []
120
- rubyforge_project:
121
- rubygems_version: 2.4.5.1
122
- signing_key:
120
+ rubygems_version: 3.3.7
121
+ signing_key:
123
122
  specification_version: 4
124
123
  summary: Persist credential for google-drive-ruby.
125
124
  test_files: []