mixlib-authentication 1.4.2 → 3.0.4
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 +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
|