google-api-client 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +4 -0
- data/lib/google/api_client.rb +70 -0
- data/lib/google/api_client/discovery/method.rb +5 -3
- data/lib/google/api_client/discovery/schema.rb +10 -6
- data/lib/google/api_client/errors.rb +5 -0
- data/lib/google/api_client/version.rb +1 -1
- data/tasks/gem.rake +2 -0
- data/tasks/git.rake +8 -3
- metadata +2 -2
data/CHANGELOG.md
CHANGED
data/lib/google/api_client.rb
CHANGED
@@ -401,6 +401,76 @@ module Google
|
|
401
401
|
end
|
402
402
|
end
|
403
403
|
|
404
|
+
##
|
405
|
+
# Verifies an ID token against a server certificate. Used to ensure that
|
406
|
+
# an ID token supplied by an untrusted client-side mechanism is valid.
|
407
|
+
# Raises an error if the token is invalid or missing.
|
408
|
+
def verify_id_token!
|
409
|
+
gem 'jwt', '~> 0.1.4'
|
410
|
+
require 'jwt'
|
411
|
+
require 'openssl'
|
412
|
+
@certificates ||= {}
|
413
|
+
if !self.authorization.respond_to?(:id_token)
|
414
|
+
raise ArgumentError, (
|
415
|
+
"Current authorization mechanism does not support ID tokens: " +
|
416
|
+
"#{self.authorization.class.to_s}"
|
417
|
+
)
|
418
|
+
elsif !self.authorization.id_token
|
419
|
+
raise ArgumentError, (
|
420
|
+
"Could not verify ID token, ID token missing. " +
|
421
|
+
"Scopes were: #{self.authorization.scope.inspect}"
|
422
|
+
)
|
423
|
+
else
|
424
|
+
check_cached_certs = lambda do
|
425
|
+
valid = false
|
426
|
+
for key, cert in @certificates
|
427
|
+
begin
|
428
|
+
self.authorization.decoded_id_token(cert.public_key)
|
429
|
+
valid = true
|
430
|
+
rescue JWT::DecodeError, Signet::UnsafeOperationError
|
431
|
+
# Expected exception. Ignore, ID token has not been validated.
|
432
|
+
end
|
433
|
+
end
|
434
|
+
valid
|
435
|
+
end
|
436
|
+
if check_cached_certs.call()
|
437
|
+
return true
|
438
|
+
end
|
439
|
+
request = self.generate_request(
|
440
|
+
:http_method => :get,
|
441
|
+
:uri => 'https://www.googleapis.com/oauth2/v1/certs',
|
442
|
+
:authenticated => false
|
443
|
+
)
|
444
|
+
response = self.transmit(:request => request)
|
445
|
+
if response.status >= 200 && response.status < 300
|
446
|
+
@certificates.merge!(
|
447
|
+
Hash[MultiJson.decode(response.body).map do |key, cert|
|
448
|
+
[key, OpenSSL::X509::Certificate.new(cert)]
|
449
|
+
end]
|
450
|
+
)
|
451
|
+
elsif response.status >= 400
|
452
|
+
case response.status
|
453
|
+
when 400...500
|
454
|
+
exception_type = ClientError
|
455
|
+
when 500...600
|
456
|
+
exception_type = ServerError
|
457
|
+
else
|
458
|
+
exception_type = TransmissionError
|
459
|
+
end
|
460
|
+
url = request.to_env(Faraday.default_connection)[:url]
|
461
|
+
raise exception_type,
|
462
|
+
"Could not retrieve certificates from: #{url}"
|
463
|
+
end
|
464
|
+
if check_cached_certs.call()
|
465
|
+
return true
|
466
|
+
else
|
467
|
+
raise InvalidIDTokenError,
|
468
|
+
"Could not verify ID token against any available certificate."
|
469
|
+
end
|
470
|
+
end
|
471
|
+
return nil
|
472
|
+
end
|
473
|
+
|
404
474
|
##
|
405
475
|
# Generates a request.
|
406
476
|
#
|
@@ -172,12 +172,14 @@ module Google
|
|
172
172
|
query_parameters = parameters.reject do |k, v|
|
173
173
|
template_variables.include?(k)
|
174
174
|
end
|
175
|
-
|
176
|
-
|
175
|
+
# encode all non-template parameters
|
176
|
+
params = ""
|
177
|
+
unless query_parameters.empty?
|
178
|
+
params = "?" + Addressable::URI.form_encode(query_parameters)
|
177
179
|
end
|
178
180
|
# Normalization is necessary because of undesirable percent-escaping
|
179
181
|
# during URI template expansion
|
180
|
-
return uri.normalize
|
182
|
+
return uri.normalize + params
|
181
183
|
end
|
182
184
|
|
183
185
|
##
|
@@ -74,22 +74,26 @@ module Google
|
|
74
74
|
Google::INFLECTOR.camelize(api.name)
|
75
75
|
api_version_string =
|
76
76
|
Google::INFLECTOR.camelize(api.version).gsub('.', '_')
|
77
|
-
|
77
|
+
# This is for compatibility with Ruby 1.8.7.
|
78
|
+
# TODO(bobaman) Remove this when we eventually stop supporting 1.8.7.
|
79
|
+
args = []
|
80
|
+
args << false if Class.method(:const_defined?).arity != 1
|
81
|
+
if Google::APIClient::Schema.const_defined?(api_name_string, *args)
|
78
82
|
api_name = Google::APIClient::Schema.const_get(
|
79
|
-
api_name_string,
|
83
|
+
api_name_string, *args
|
80
84
|
)
|
81
85
|
else
|
82
86
|
api_name = Google::APIClient::Schema.const_set(
|
83
87
|
api_name_string, Module.new
|
84
88
|
)
|
85
89
|
end
|
86
|
-
if api_name.const_defined?(api_version_string,
|
87
|
-
api_version = api_name.const_get(api_version_string,
|
90
|
+
if api_name.const_defined?(api_version_string, *args)
|
91
|
+
api_version = api_name.const_get(api_version_string, *args)
|
88
92
|
else
|
89
93
|
api_version = api_name.const_set(api_version_string, Module.new)
|
90
94
|
end
|
91
|
-
if api_version.const_defined?(schema_name,
|
92
|
-
schema_class = api_version.const_get(schema_name,
|
95
|
+
if api_version.const_defined?(schema_name, *args)
|
96
|
+
schema_class = api_version.const_get(schema_name, *args)
|
93
97
|
end
|
94
98
|
end
|
95
99
|
|
data/tasks/gem.rake
CHANGED
data/tasks/git.rake
CHANGED
@@ -3,9 +3,9 @@ namespace :git do
|
|
3
3
|
desc 'List tags from the Git repository'
|
4
4
|
task :list do
|
5
5
|
tags = `git tag -l`
|
6
|
-
tags.gsub!(
|
7
|
-
tags = tags.split(
|
8
|
-
puts tags.join(
|
6
|
+
tags.gsub!("\r", '')
|
7
|
+
tags = tags.split("\n").sort {|a, b| b <=> a }
|
8
|
+
puts tags.join("\n")
|
9
9
|
end
|
10
10
|
|
11
11
|
desc 'Create a new tag in the Git repository'
|
@@ -19,6 +19,11 @@ namespace :git do
|
|
19
19
|
v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
|
20
20
|
abort "Versions don't match #{v} vs #{PKG_VERSION}" if v != PKG_VERSION
|
21
21
|
|
22
|
+
git_status = `git status`
|
23
|
+
if git_status !~ /nothing to commit \(working directory clean\)/
|
24
|
+
abort "Working directory isn't clean."
|
25
|
+
end
|
26
|
+
|
22
27
|
tag = "#{PKG_NAME}-#{PKG_VERSION}"
|
23
28
|
msg = "Release #{PKG_NAME}-#{PKG_VERSION}"
|
24
29
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: google-api-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.4.
|
5
|
+
version: 0.4.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Bob Aman
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-02-
|
13
|
+
date: 2012-02-22 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: signet
|