google_drive-persistent_session 0.1.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []