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 +5 -5
- data/google_drive-persistent_session.gemspec +3 -3
- data/lib/google_drive/persistent_session/credential_storage.rb +2 -0
- data/lib/google_drive/persistent_session/file_store_ext.rb +2 -0
- data/lib/google_drive/persistent_session/persistent_session.rb +80 -17
- data/lib/google_drive/persistent_session/version.rb +1 -1
- data/lib/google_drive/persistent_session.rb +0 -1
- metadata +18 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0b5bdef8e2f0bd44da8d68b3a5ce2532ca972c8c3ddee6acbb328323b2dfd7c2
|
4
|
+
data.tar.gz: 7f4df6909ee4be4cf3fb68307d89ab34488b67f6918e89ced9aa3a99a040491e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 = ['
|
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 '
|
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,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
|
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
|
-
|
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
|
-
:
|
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.
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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)
|
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.
|
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:
|
11
|
+
date: 2022-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
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.
|
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.
|
26
|
+
version: 3.0.7
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: highline
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
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: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
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
|
-
-
|
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
|
-
|
121
|
-
|
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: []
|