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 +5 -5
- data/lib/mixlib/authentication.rb +3 -3
- data/lib/mixlib/authentication/digester.rb +2 -2
- data/lib/mixlib/authentication/http_authentication_request.rb +4 -4
- data/lib/mixlib/authentication/null_logger.rb +2 -2
- data/lib/mixlib/authentication/signatureverification.rb +18 -18
- data/lib/mixlib/authentication/signedheaderauth.rb +116 -40
- data/lib/mixlib/authentication/version.rb +3 -2
- metadata +6 -87
- data/Gemfile +0 -7
- data/NOTICE +0 -7
- data/README.md +0 -23
- data/Rakefile +0 -18
- data/mixlib-authentication.gemspec +0 -22
- data/spec/mixlib/authentication/digester_spec.rb +0 -24
- data/spec/mixlib/authentication/http_authentication_request_spec.rb +0 -132
- data/spec/mixlib/authentication/mixlib_authentication_spec.rb +0 -596
- data/spec/mixlib/authentication/mixlib_log_missing_spec.rb +0 -55
- data/spec/spec_helper.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: dfe9207033439727125b97e19e5d0f104f540545f8975fd09952e7d3c33d1912
|
4
|
+
data.tar.gz: a0105be8a06dc1a6cdbb7e87e86686873e561e714a6ba47c07fc1855ef4acc7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a04e5503e573c71382bc391fe3392419fc1480199a74c5ec757c83fa7dc3ba85cc6ffce01957ef0ada987ddc6e618572bcc8989e0c593ab7c9c055aa6d6d4af2
|
7
|
+
data.tar.gz: 410b2915042706210831ee5258fcb1e998251d289280c49d636dc93fcde357f219eb81ba6283de0fddd532a17ded913aa712db636a6fcb94c9c042b4631b543a
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
|
-
# Author:: Christopher Brown (<cb@
|
3
|
-
# Copyright:: Copyright (c) 2009
|
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@
|
3
|
-
# Copyright:: Copyright (c) 2009
|
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@
|
3
|
-
# Copyright:: Copyright (c) 2010
|
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 =
|
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.
|
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@
|
3
|
-
# Author:: Christopher Walters (<cw@
|
4
|
-
# Copyright:: Copyright (c) 2009
|
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.
|
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
|
153
|
-
Mixlib::Authentication.logger.
|
154
|
-
Mixlib::Authentication.logger.
|
155
|
-
Mixlib::Authentication.logger.
|
156
|
-
Mixlib::Authentication.logger.
|
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.
|
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
|
172
|
-
Mixlib::Authentication.logger.
|
173
|
-
Mixlib::Authentication.logger.
|
174
|
-
Mixlib::Authentication.logger.
|
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
|
-
|
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.
|
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.
|
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.
|
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@
|
3
|
-
# Author:: Christopher Walters (<cw@
|
4
|
-
# Copyright:: Copyright (c) 2009
|
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
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
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
|
-
#
|
99
|
-
#
|
100
|
-
|
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(
|
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.
|
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.
|
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
|
-
#
|
248
|
-
|
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.
|
279
|
+
Mixlib::Authentication.logger.trace "String to sign: '#{string_to_sign}'"
|
251
280
|
case sign_version
|
252
281
|
when "1.3"
|
253
|
-
|
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
|
-
|
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
|
-
|
269
|
-
|
344
|
+
:timestamp, :user_id, :file, :proto_version,
|
345
|
+
:headers) do
|
270
346
|
|
271
|
-
|
347
|
+
include SignedHeaderAuth
|
272
348
|
|
273
|
-
|
274
|
-
|
275
|
-
|
349
|
+
def proto_version
|
350
|
+
(self[:proto_version] || SignedHeaderAuth::DEFAULT_PROTO_VERSION).to_s
|
351
|
+
end
|
276
352
|
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
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
|
-
#
|
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 = "
|
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:
|
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:
|
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
|
-
|
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: '
|
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
|
-
|
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
|