mixlib-authentication 1.4.2 → 3.0.4

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
- SHA1:
3
- metadata.gz: e493785efc5cf2caf7d1134378fd613f35712f1f
4
- data.tar.gz: d855dabe2ebea778d9c37037e3f843c49acbecb9
2
+ SHA256:
3
+ metadata.gz: dfe9207033439727125b97e19e5d0f104f540545f8975fd09952e7d3c33d1912
4
+ data.tar.gz: a0105be8a06dc1a6cdbb7e87e86686873e561e714a6ba47c07fc1855ef4acc7a
5
5
  SHA512:
6
- metadata.gz: '09e094e344bc46528877b69bb015c5d2386ab57da7f7f62edbbeda81dd338fae31194736f56e947d935b0a36306dac06d148b0dbddf5d11cd3249e3cfba65571'
7
- data.tar.gz: 2f71c58ba5d85efbf1d00db61ca09abb57d0092d46e2f8d2fa578baf0c34d2e0ff86e36e1224b40e8d0e1ad8258ef717460dcb06385045d3c920f4cd5052a86b
6
+ metadata.gz: a04e5503e573c71382bc391fe3392419fc1480199a74c5ec757c83fa7dc3ba85cc6ffce01957ef0ada987ddc6e618572bcc8989e0c593ab7c9c055aa6d6d4af2
7
+ data.tar.gz: 410b2915042706210831ee5258fcb1e998251d289280c49d636dc93fcde357f219eb81ba6283de0fddd532a17ded913aa712db636a6fcb94c9c042b4631b543a
@@ -1,6 +1,6 @@
1
1
  #
2
- # Author:: Christopher Brown (<cb@opscode.com>)
3
- # Copyright:: Copyright (c) 2009 Opscode, Inc.
2
+ # Author:: Christopher Brown (<cb@chef.io>)
3
+ # Copyright:: Copyright (c) 2009-2018 Chef Software, Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,7 +18,7 @@
18
18
 
19
19
  module Mixlib
20
20
  module Authentication
21
- DEFAULT_SERVER_API_VERSION = "0"
21
+ DEFAULT_SERVER_API_VERSION = "0".freeze
22
22
 
23
23
  attr_accessor :logger
24
24
  module_function :logger, :logger=
@@ -1,6 +1,6 @@
1
1
  #
2
- # Author:: Christopher Brown (<cb@opscode.com>)
3
- # Copyright:: Copyright (c) 2009 Opscode, Inc.
2
+ # Author:: Christopher Brown (<cb@chef.io>)
3
+ # Copyright:: Copyright (c) 2009-2018 Chef Software, Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,6 +1,6 @@
1
1
  #
2
- # Author:: Daniel DeLeo (<dan@opscode.com>)
3
- # Copyright:: Copyright (c) 2010 Opscode, Inc.
2
+ # Author:: Daniel DeLeo (<dan@chef.io>)
3
+ # Copyright:: Copyright (c) 2010-2018 Chef Software, Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,7 +22,7 @@ module Mixlib
22
22
  module Authentication
23
23
  class HTTPAuthenticationRequest
24
24
 
25
- MANDATORY_HEADERS = [:x_ops_sign, :x_ops_userid, :x_ops_timestamp, :host, :x_ops_content_hash]
25
+ MANDATORY_HEADERS = %i{x_ops_sign x_ops_userid x_ops_timestamp host x_ops_content_hash}.freeze
26
26
 
27
27
  attr_reader :request
28
28
 
@@ -72,7 +72,7 @@ module Mixlib
72
72
  unless @request_signature
73
73
  @request_signature = headers.find_all { |h| h[0].to_s =~ /^x_ops_authorization_/ }
74
74
  .sort { |x, y| x.to_s[/\d+/].to_i <=> y.to_s[/\d+/].to_i }.map { |i| i[1] }.join("\n")
75
- Mixlib::Authentication::Log.debug "Reconstituted (user-supplied) request signature: #{@request_signature}"
75
+ Mixlib::Authentication::Log.trace "Reconstituted (user-supplied) request signature: #{@request_signature}"
76
76
  end
77
77
  @request_signature
78
78
  end
@@ -4,7 +4,7 @@ module Mixlib
4
4
 
5
5
  attr_accessor :level
6
6
 
7
- %i{debug info warn error fatal}.each do |method_name|
7
+ %i{trace debug info warn error fatal}.each do |method_name|
8
8
  class_eval(<<-METHOD_DEFN, __FILE__, __LINE__)
9
9
  def #{method_name}(msg=nil, &block)
10
10
  true
@@ -12,7 +12,7 @@ module Mixlib
12
12
  METHOD_DEFN
13
13
  end
14
14
 
15
- %i{debug? info? warn? error? fatal?}.each do |method_name|
15
+ %i{trace? debug? info? warn? error? fatal?}.each do |method_name|
16
16
  class_eval(<<-METHOD_DEFN, __FILE__, __LINE__)
17
17
  def #{method_name}
18
18
  false
@@ -1,7 +1,7 @@
1
1
  #
2
- # Author:: Christopher Brown (<cb@opscode.com>)
3
- # Author:: Christopher Walters (<cw@opscode.com>)
4
- # Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
2
+ # Author:: Christopher Brown (<cb@chef.io>)
3
+ # Author:: Christopher Walters (<cw@chef.io>)
4
+ # Copyright:: Copyright (c) 2009-2018 Chef Software, Inc.
5
5
  # License:: Apache License, Version 2.0
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -76,7 +76,7 @@ module Mixlib
76
76
  # X-Ops-Content-Hash:
77
77
  # X-Ops-Authorization-#{line_number}
78
78
  def authenticate_request(user_secret, time_skew = (15 * 60))
79
- Mixlib::Authentication.logger.debug "Initializing header auth : #{request.inspect}"
79
+ Mixlib::Authentication.logger.trace "Initializing header auth : #{request.inspect}"
80
80
 
81
81
  @user_secret = user_secret
82
82
  @allowed_time_skew = time_skew # in seconds
@@ -149,15 +149,15 @@ module Mixlib
149
149
  (request_decrypted_block == candidate_block)
150
150
  end
151
151
 
152
- # Keep the debug messages lined up so it's easy to scan them
153
- Mixlib::Authentication.logger.debug("Verifying request signature:")
154
- Mixlib::Authentication.logger.debug(" Expected Block is: '#{candidate_block}'")
155
- Mixlib::Authentication.logger.debug("Decrypted block is: '#{request_decrypted_block}'")
156
- Mixlib::Authentication.logger.debug("Signatures match? : '#{@valid_signature}'")
152
+ # Keep the trace messages lined up so it's easy to scan them
153
+ Mixlib::Authentication.logger.trace("Verifying request signature:")
154
+ Mixlib::Authentication.logger.trace(" Expected Block is: '#{candidate_block}'")
155
+ Mixlib::Authentication.logger.trace("Decrypted block is: '#{request_decrypted_block}'")
156
+ Mixlib::Authentication.logger.trace("Signatures match? : '#{@valid_signature}'")
157
157
 
158
158
  @valid_signature
159
159
  rescue => e
160
- Mixlib::Authentication.logger.debug("Failed to verify request signature: #{e.class.name}: #{e.message}")
160
+ Mixlib::Authentication.logger.trace("Failed to verify request signature: #{e.class.name}: #{e.message}")
161
161
  @valid_signature = false
162
162
  end
163
163
 
@@ -168,10 +168,10 @@ module Mixlib
168
168
  def verify_content_hash
169
169
  @valid_content_hash = (content_hash == hashed_body)
170
170
 
171
- # Keep the debug messages lined up so it's easy to scan them
172
- Mixlib::Authentication.logger.debug("Expected content hash is: '#{hashed_body}'")
173
- Mixlib::Authentication.logger.debug(" Request Content Hash is: '#{content_hash}'")
174
- Mixlib::Authentication.logger.debug(" Hashes match?: #{@valid_content_hash}")
171
+ # Keep the trace messages lined up so it's easy to scan them
172
+ Mixlib::Authentication.logger.trace("Expected content hash is: '#{hashed_body}'")
173
+ Mixlib::Authentication.logger.trace(" Request Content Hash is: '#{content_hash}'")
174
+ Mixlib::Authentication.logger.trace(" Hashes match?: #{@valid_content_hash}")
175
175
 
176
176
  @valid_content_hash
177
177
  end
@@ -203,7 +203,7 @@ module Mixlib
203
203
  # No file_param; we're running in Merb, or it's just not there..
204
204
  if file_param.nil?
205
205
  hash_param = request.params.values.find { |value| value.respond_to?(:has_key?) } # Hash responds to :has_key? .
206
- if !hash_param.nil?
206
+ unless hash_param.nil?
207
207
  file_param = hash_param.values.find { |value| value.respond_to?(:read) } # File/Tempfile responds to :read.
208
208
  end
209
209
  end
@@ -211,11 +211,11 @@ module Mixlib
211
211
  # Any file that's included in the request is hashed if it's there. Otherwise,
212
212
  # we hash the body.
213
213
  if file_param
214
- Mixlib::Authentication.logger.debug "Digesting file_param: '#{file_param.inspect}'"
214
+ Mixlib::Authentication.logger.trace "Digesting file_param: '#{file_param.inspect}'"
215
215
  @hashed_body = digester.hash_file(file_param, digest)
216
216
  else
217
217
  body = request.raw_post
218
- Mixlib::Authentication.logger.debug "Digesting body: '#{body}'"
218
+ Mixlib::Authentication.logger.trace "Digesting body: '#{body}'"
219
219
  @hashed_body = digester.hash_string(body, digest)
220
220
  end
221
221
  end
@@ -232,7 +232,7 @@ module Mixlib
232
232
  def timestamp_within_bounds?(time1, time2)
233
233
  time_diff = (time2 - time1).abs
234
234
  is_allowed = (time_diff < @allowed_time_skew)
235
- Mixlib::Authentication.logger.debug "Request time difference: #{time_diff}, within #{@allowed_time_skew} seconds? : #{!!is_allowed}"
235
+ Mixlib::Authentication.logger.trace "Request time difference: #{time_diff}, within #{@allowed_time_skew} seconds? : #{!!is_allowed}"
236
236
  is_allowed
237
237
  end
238
238
  end
@@ -1,7 +1,7 @@
1
1
  #
2
- # Author:: Christopher Brown (<cb@opscode.com>)
3
- # Author:: Christopher Walters (<cw@opscode.com>)
4
- # Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
2
+ # Author:: Christopher Brown (<cb@chef.io>)
3
+ # Author:: Christopher Walters (<cw@chef.io>)
4
+ # Copyright:: Copyright (c) 2009-2018 Chef Software, Inc.
5
5
  # License:: Apache License, Version 2.0
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,7 +34,7 @@ module Mixlib
34
34
  "1.0" => "sha1",
35
35
  "1.1" => "sha1",
36
36
  "1.3" => "sha256",
37
- }.freeze()
37
+ }.freeze
38
38
 
39
39
  # Use of SUPPORTED_ALGORITHMS and SUPPORTED_VERSIONS is deprecated. Use
40
40
  # ALGORITHM_FOR_VERSION instead
@@ -74,15 +74,14 @@ module Mixlib
74
74
  # * `:host`: The host part of the URI
75
75
  def self.signing_object(args = {})
76
76
  SigningObject.new(args[:http_method],
77
- args[:path],
78
- args[:body],
79
- args[:host],
80
- args[:timestamp],
81
- args[:user_id],
82
- args[:file],
83
- args[:proto_version],
84
- args[:headers]
85
- )
77
+ args[:path],
78
+ args[:body],
79
+ args[:host],
80
+ args[:timestamp],
81
+ args[:user_id],
82
+ args[:file],
83
+ args[:proto_version],
84
+ args[:headers])
86
85
  end
87
86
 
88
87
  def algorithm
@@ -95,9 +94,28 @@ module Mixlib
95
94
 
96
95
  # Build the canonicalized request based on the method, other headers, etc.
97
96
  # compute the signature from the request, using the looked-up user secret
98
- # ====Parameters
99
- # private_key<OpenSSL::PKey::RSA>:: user's RSA private key.
100
- def sign(private_key, sign_algorithm = algorithm, sign_version = proto_version)
97
+ #
98
+ # @param rsa_key [OpenSSL::PKey::RSA] User's RSA key. If `use_ssh_agent` is
99
+ # true, this must have the public key portion populated. If `use_ssh_agent`
100
+ # is false, this must have the private key portion populated.
101
+ # @param use_ssh_agent [Boolean] If true, use ssh-agent for request signing.
102
+ def sign(rsa_key, sign_algorithm = algorithm, sign_version = proto_version, **opts)
103
+ # Backwards compat stuff.
104
+ if sign_algorithm.is_a?(Hash)
105
+ # Was called like sign(key, sign_algorithm: 'foo', other: 'bar')
106
+ opts.update(sign_algorithm)
107
+ opts[:sign_algorithm] ||= algorithm
108
+ opts[:sign_version] ||= sign_version
109
+ else
110
+ # Was called like sign(key, 'foo', '1.3', other: 'bar')
111
+ Mixlib::Authentication.logger.warn("Using deprecated positional arguments for sign(), please update to keyword arguments (from #{caller[1][/^(.*:\d+):in /, 1]})") unless sign_algorithm == algorithm
112
+ opts[:sign_algorithm] ||= sign_algorithm
113
+ opts[:sign_version] ||= sign_version
114
+ end
115
+ sign_algorithm = opts[:sign_algorithm]
116
+ sign_version = opts[:sign_version]
117
+ use_ssh_agent = opts[:use_ssh_agent]
118
+
101
119
  digest = validate_sign_version_digest!(sign_algorithm, sign_version)
102
120
  # Our multiline hash for authorization will be encoded in multiple header
103
121
  # lines - X-Ops-Authorization-1, ... (starts at 1, not 0!)
@@ -108,14 +126,14 @@ module Mixlib
108
126
  "X-Ops-Content-Hash" => hashed_body(digest),
109
127
  }
110
128
 
111
- signature = Base64.encode64(do_sign(private_key, digest, sign_algorithm, sign_version)).chomp
129
+ signature = Base64.encode64(do_sign(rsa_key, digest, sign_algorithm, sign_version, use_ssh_agent)).chomp
112
130
  signature_lines = signature.split(/\n/)
113
131
  signature_lines.each_index do |idx|
114
132
  key = "X-Ops-Authorization-#{idx + 1}"
115
133
  header_hash[key] = signature_lines[idx]
116
134
  end
117
135
 
118
- Mixlib::Authentication.logger.debug "Header hash: #{header_hash.inspect}"
136
+ Mixlib::Authentication.logger.trace "Header hash: #{header_hash.inspect}"
119
137
 
120
138
  header_hash
121
139
  end
@@ -156,7 +174,7 @@ module Mixlib
156
174
  # ====Parameters
157
175
  #
158
176
  def canonical_path
159
- p = path.gsub(/\/+/, "/")
177
+ p = path.gsub(%r{/+}, "/")
160
178
  p.length > 1 ? p.chomp("/") : p
161
179
  end
162
180
 
@@ -172,6 +190,7 @@ module Mixlib
172
190
  else
173
191
  @hashed_body_digest = digest
174
192
  end
193
+
175
194
  # Hash the file object if it was passed in, otherwise hash based on
176
195
  # the body.
177
196
  # TODO: tim 2009-12-28: It'd be nice to just remove this special case,
@@ -236,7 +255,7 @@ module Mixlib
236
255
  memo[field_name.to_sym] = field_value.strip
237
256
  memo
238
257
  end
239
- Mixlib::Authentication.logger.debug "Parsed signing description: #{parts.inspect}"
258
+ Mixlib::Authentication.logger.trace "Parsed signing description: #{parts.inspect}"
240
259
  parts
241
260
  end
242
261
 
@@ -244,18 +263,75 @@ module Mixlib
244
263
  Mixlib::Authentication::Digester
245
264
  end
246
265
 
247
- # private
248
- def do_sign(private_key, digest, sign_algorithm, sign_version)
266
+ # Low-level RSA signature implementation used in {#sign}.
267
+ #
268
+ # @api private
269
+ # @param rsa_key [OpenSSL::PKey::RSA] User's RSA key. If `use_ssh_agent` is
270
+ # true, this must have the public key portion populated. If `use_ssh_agent`
271
+ # is false, this must have the private key portion populated.
272
+ # @param digest [Class] Sublcass of OpenSSL::Digest to use while signing.
273
+ # @param sign_algorithm [String] Hash algorithm to use while signing.
274
+ # @param sign_version [String] Version number of the signing protocol to use.
275
+ # @param use_ssh_agent [Boolean] If true, use ssh-agent for request signing.
276
+ # @return [String]
277
+ def do_sign(rsa_key, digest, sign_algorithm, sign_version, use_ssh_agent)
249
278
  string_to_sign = canonicalize_request(sign_algorithm, sign_version)
250
- Mixlib::Authentication.logger.debug "String to sign: '#{string_to_sign}'"
279
+ Mixlib::Authentication.logger.trace "String to sign: '#{string_to_sign}'"
251
280
  case sign_version
252
281
  when "1.3"
253
- private_key.sign(digest.new, string_to_sign)
282
+ if use_ssh_agent
283
+ do_sign_ssh_agent(rsa_key, string_to_sign)
284
+ else
285
+ raise AuthenticationError, "RSA private key is required to sign requests, but a public key was provided" unless rsa_key.private?
286
+
287
+ rsa_key.sign(digest.new, string_to_sign)
288
+ end
254
289
  else
255
- private_key.private_encrypt(string_to_sign)
290
+ raise AuthenticationError, "Agent signing mode requires signing protocol version 1.3 or newer" if use_ssh_agent
291
+ raise AuthenticationError, "RSA private key is required to sign requests, but a public key was provided" unless rsa_key.private?
292
+
293
+ rsa_key.private_encrypt(string_to_sign)
256
294
  end
257
295
  end
258
296
 
297
+ # Low-level signing logic for using ssh-agent. This requires the user has
298
+ # already set up ssh-agent and used ssh-add to load in a (possibly encrypted)
299
+ # RSA private key. ssh-agent supports keys other than RSA, however they
300
+ # are not supported as Chef's protocol explicitly requires RSA keys/sigs.
301
+ #
302
+ # @api private
303
+ # @param rsa_key [OpenSSL::PKey::RSA] User's RSA public key.
304
+ # @param string_to_sign [String] String data to sign with the requested key.
305
+ # @return [String]
306
+ def do_sign_ssh_agent(rsa_key, string_to_sign)
307
+ # First try loading net-ssh as it is an optional dependency.
308
+ begin
309
+ require "net/ssh"
310
+ rescue LoadError => e
311
+ # ???: Since agent mode is explicitly enabled, should we even catch
312
+ # this in the first place? Might be cleaner to let the LoadError bubble.
313
+ raise AuthenticationError, "net-ssh gem is not available, unable to use ssh-agent signing: #{e.message}"
314
+ end
315
+
316
+ # Try to connect to ssh-agent.
317
+ begin
318
+ agent = Net::SSH::Authentication::Agent.connect
319
+ rescue Net::SSH::Authentication::AgentNotAvailable => e
320
+ raise AuthenticationError, "Could not connect to ssh-agent. Make sure the SSH_AUTH_SOCK environment variable is set and ssh-agent is running: #{e.message}"
321
+ end
322
+
323
+ begin
324
+ ssh2_signature = agent.sign(rsa_key.public_key, string_to_sign, Net::SSH::Authentication::Agent::SSH_AGENT_RSA_SHA2_256)
325
+ rescue Net::SSH::Authentication::AgentError => e
326
+ raise AuthenticationError, "Unable to sign request with ssh-agent. Make sure your key is loaded with ssh-add: #{e.class.name} #{e.message})"
327
+ end
328
+
329
+ # extract signature from SSH Agent response => skip first 20 bytes for RSA keys
330
+ # "\x00\x00\x00\frsa-sha2-256\x00\x00\x01\x00"
331
+ # (see http://api.libssh.org/rfc/PROTOCOL.agent for details)
332
+ ssh2_signature[20..-1]
333
+ end
334
+
259
335
  private :canonical_time, :canonical_path, :parse_signing_description, :digester, :canonicalize_user_id
260
336
 
261
337
  end
@@ -265,25 +341,25 @@ module Mixlib
265
341
  # generate a request signature. `SignedHeaderAuth.signing_object()`
266
342
  # provides a more convenient interface to the constructor.
267
343
  SigningObject = Struct.new(:http_method, :path, :body, :host,
268
- :timestamp, :user_id, :file, :proto_version,
269
- :headers) do
344
+ :timestamp, :user_id, :file, :proto_version,
345
+ :headers) do
270
346
 
271
- include SignedHeaderAuth
347
+ include SignedHeaderAuth
272
348
 
273
- def proto_version
274
- (self[:proto_version] || SignedHeaderAuth::DEFAULT_PROTO_VERSION).to_s
275
- end
349
+ def proto_version
350
+ (self[:proto_version] || SignedHeaderAuth::DEFAULT_PROTO_VERSION).to_s
351
+ end
276
352
 
277
- def server_api_version
278
- key = (self[:headers] || {}).keys.select do |k|
279
- k.casecmp("x-ops-server-api-version") == 0
280
- end.first
281
- if key
282
- self[:headers][key]
283
- else
284
- DEFAULT_SERVER_API_VERSION
353
+ def server_api_version
354
+ key = (self[:headers] || {}).keys.select do |k|
355
+ k.casecmp("x-ops-server-api-version") == 0
356
+ end.first
357
+ if key
358
+ self[:headers][key]
359
+ else
360
+ DEFAULT_SERVER_API_VERSION
361
+ end
285
362
  end
286
363
  end
287
- end
288
364
  end
289
365
  end
@@ -1,4 +1,5 @@
1
- # Copyright:: Copyright (c) 2010-2015 Chef Software, Inc.
1
+ #
2
+ # Copyright:: Copyright (c) 2010-2019, Chef Software Inc.
2
3
  # License:: Apache License, Version 2.0
3
4
  #
4
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,6 +16,6 @@
15
16
 
16
17
  module Mixlib
17
18
  module Authentication
18
- VERSION = "1.4.2"
19
+ VERSION = "3.0.4".freeze
19
20
  end
20
21
  end
metadata CHANGED
@@ -1,96 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mixlib-authentication
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.2
4
+ version: 3.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chef Software, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-17 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rspec-core
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '3.2'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '3.2'
27
- - !ruby/object:Gem::Dependency
28
- name: rspec-expectations
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '3.2'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '3.2'
41
- - !ruby/object:Gem::Dependency
42
- name: rspec-mocks
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '3.2'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '3.2'
55
- - !ruby/object:Gem::Dependency
56
- name: chefstyle
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: rake
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '11'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '11'
11
+ date: 2019-10-31 00:00:00.000000000 Z
12
+ dependencies: []
83
13
  description: Mixes in simple per-request authentication
84
14
  email: info@chef.io
85
15
  executables: []
86
16
  extensions: []
87
17
  extra_rdoc_files: []
88
18
  files:
89
- - Gemfile
90
19
  - LICENSE
91
- - NOTICE
92
- - README.md
93
- - Rakefile
94
20
  - lib/mixlib/authentication.rb
95
21
  - lib/mixlib/authentication/digester.rb
96
22
  - lib/mixlib/authentication/http_authentication_request.rb
@@ -98,13 +24,7 @@ files:
98
24
  - lib/mixlib/authentication/signatureverification.rb
99
25
  - lib/mixlib/authentication/signedheaderauth.rb
100
26
  - lib/mixlib/authentication/version.rb
101
- - mixlib-authentication.gemspec
102
- - spec/mixlib/authentication/digester_spec.rb
103
- - spec/mixlib/authentication/http_authentication_request_spec.rb
104
- - spec/mixlib/authentication/mixlib_authentication_spec.rb
105
- - spec/mixlib/authentication/mixlib_log_missing_spec.rb
106
- - spec/spec_helper.rb
107
- homepage: https://www.chef.io
27
+ homepage: https://github.com/chef/mixlib-authentication
108
28
  licenses:
109
29
  - Apache-2.0
110
30
  metadata: {}
@@ -116,15 +36,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
36
  requirements:
117
37
  - - ">="
118
38
  - !ruby/object:Gem::Version
119
- version: '0'
39
+ version: '2.4'
120
40
  required_rubygems_version: !ruby/object:Gem::Requirement
121
41
  requirements:
122
42
  - - ">="
123
43
  - !ruby/object:Gem::Version
124
44
  version: '0'
125
45
  requirements: []
126
- rubyforge_project:
127
- rubygems_version: 2.6.11
46
+ rubygems_version: 3.0.3
128
47
  signing_key:
129
48
  specification_version: 4
130
49
  summary: Mixes in simple per-request authentication