google_drive-persistent_session 0.2.0 → 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
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.