google_drive-persistent_session 0.2.0 → 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
2
  SHA256:
3
- metadata.gz: 9a1a8c546ac3cd9ba880dc7068a27e955eab85b790edbbfbde8b40e1a1cd9c4d
4
- data.tar.gz: 321e034033e5c35b3c7bb47e1ecdc31731fb5c5b8ed6e5a8594abe9d6da7598e
3
+ metadata.gz: 0b5bdef8e2f0bd44da8d68b3a5ce2532ca972c8c3ddee6acbb328323b2dfd7c2
4
+ data.tar.gz: 7f4df6909ee4be4cf3fb68307d89ab34488b67f6918e89ced9aa3a99a040491e
5
5
  SHA512:
6
- metadata.gz: 9b7f6a6dfa29a22a5617e29093e5131e27cf85fe4b6c44f3df3458bbd194e1d05c3a23fe69b9e2f54f3dbfb5f48d22b80902fd5211f8d91ef56d8da6e6375194
7
- data.tar.gz: a3c9cdcfdc3b5bb177c7c94e75e37ddad43ef9decb592c301f5ee2774205fd839874c4edfb8da37ac143956184ce5b6041322f05b64380fc3b6f371be5236ee8
6
+ metadata.gz: 03bb11202767d968a0aff3fdef3aa6bda9568e2cdd193c9279f59e77e0e64b1f4cd67cfc11e95b2843a323f4226708efef2f0d829897f61ca2d1039cfe459ccf
7
+ data.tar.gz: 7433eedb639ccd7803a105570b918b59ad408b4a2f0f8fc1296ebbee9c21aecce63466ec2885231a247c0031111a22570b33f50ddf7a9d59d77ae425e7601481
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency 'google_drive', '>= 3.0.7'
22
22
  spec.add_dependency 'highline'
23
+ spec.add_dependency 'webrick'
23
24
  spec.add_development_dependency 'bundler'
24
25
  spec.add_development_dependency 'rake'
25
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
@@ -35,6 +39,42 @@ class GoogleDrive::PersistentSession
35
39
  client_secret = ask('Enter CLIENT SECRET: ') {|q| q.echo = false }
36
40
  puts # line break
37
41
 
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 }
38
78
  credential = Google::Auth::UserRefreshCredentials.new(
39
79
  :client_id => client_id,
40
80
  :client_secret => client_secret,
@@ -42,18 +82,45 @@ class GoogleDrive::PersistentSession
42
82
  'https://www.googleapis.com/auth/drive',
43
83
  'https://spreadsheets.google.com/feeds/'
44
84
  ],
45
- :redirect_uri => 'urn:ietf:wg:oauth:2.0:oob',
85
+ :redirect_uri => "http://127.0.0.1:#{server.config[:Port]}",
46
86
  :grant_type => 'authorization_code'
47
87
  )
48
88
 
49
- fetch_access_token(credential)
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)
50
112
  storage.write_credentials(credential)
51
113
  end
52
114
 
53
- def fetch_access_token(credential)
54
- message = "1. Open this page:\n%s\n\n" % credential.authorization_uri
55
- message << "2. Enter the authorization code shown in the page: "
56
- 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
57
124
 
58
125
  credential.fetch_access_token!
59
126
  storage.write_credentials(credential)
@@ -1,5 +1,5 @@
1
1
  module GoogleDrive
2
2
  class PersistentSession
3
- VERSION = '0.2.0'
3
+ VERSION = '0.3.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google_drive-persistent_session
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-04 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
14
  name: google_drive
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: webrick
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -103,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
117
  - !ruby/object:Gem::Version
104
118
  version: '0'
105
119
  requirements: []
106
- rubygems_version: 3.1.4
120
+ rubygems_version: 3.3.7
107
121
  signing_key:
108
122
  specification_version: 4
109
123
  summary: Persist credential for google-drive-ruby.