ruby-saml 1.13.0 → 1.17.0
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.
Potentially problematic release.
This version of ruby-saml might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/.github/FUNDING.yml +3 -0
- data/.github/workflows/test.yml +67 -3
- data/CHANGELOG.md +31 -1
- data/LICENSE +2 -1
- data/README.md +141 -40
- data/UPGRADING.md +1 -1
- data/lib/onelogin/ruby-saml/authrequest.rb +8 -9
- data/lib/onelogin/ruby-saml/idp_metadata_parser.rb +3 -3
- data/lib/onelogin/ruby-saml/logoutrequest.rb +7 -7
- data/lib/onelogin/ruby-saml/logoutresponse.rb +1 -1
- data/lib/onelogin/ruby-saml/metadata.rb +21 -25
- data/lib/onelogin/ruby-saml/response.rb +25 -20
- data/lib/onelogin/ruby-saml/saml_message.rb +2 -3
- data/lib/onelogin/ruby-saml/settings.rb +137 -42
- data/lib/onelogin/ruby-saml/slo_logoutrequest.rb +39 -33
- data/lib/onelogin/ruby-saml/slo_logoutresponse.rb +8 -8
- data/lib/onelogin/ruby-saml/utils.rb +96 -26
- data/lib/onelogin/ruby-saml/version.rb +1 -1
- data/lib/xml_security.rb +22 -9
- data/ruby-saml.gemspec +41 -13
- metadata +50 -40
@@ -32,17 +32,26 @@ module OneLogin
|
|
32
32
|
(\d+)W # 8: Weeks
|
33
33
|
)
|
34
34
|
$)x.freeze
|
35
|
+
UUID_PREFIX = '_'
|
35
36
|
|
36
|
-
# Checks if the x509 cert provided is expired
|
37
|
-
#
|
38
|
-
# @param cert [Certificate] The x509 certificate
|
37
|
+
# Checks if the x509 cert provided is expired.
|
39
38
|
#
|
39
|
+
# @param cert [OpenSSL::X509::Certificate|String] The x509 certificate.
|
40
|
+
# @return [true|false] Whether the certificate is expired.
|
40
41
|
def self.is_cert_expired(cert)
|
41
|
-
if cert.is_a?(String)
|
42
|
-
|
43
|
-
|
42
|
+
cert = OpenSSL::X509::Certificate.new(cert) if cert.is_a?(String)
|
43
|
+
|
44
|
+
cert.not_after < Time.now
|
45
|
+
end
|
44
46
|
|
45
|
-
|
47
|
+
# Checks if the x509 cert provided has both started and has not expired.
|
48
|
+
#
|
49
|
+
# @param cert [OpenSSL::X509::Certificate|String] The x509 certificate.
|
50
|
+
# @return [true|false] Whether the certificate is currently active.
|
51
|
+
def self.is_cert_active(cert)
|
52
|
+
cert = OpenSSL::X509::Certificate.new(cert) if cert.is_a?(String)
|
53
|
+
now = Time.now
|
54
|
+
cert.not_before <= now && cert.not_after >= now
|
46
55
|
end
|
47
56
|
|
48
57
|
# Interprets a ISO8601 duration value relative to a given timestamp.
|
@@ -60,20 +69,26 @@ module OneLogin
|
|
60
69
|
matches = duration.match(DURATION_FORMAT)
|
61
70
|
|
62
71
|
if matches.nil?
|
63
|
-
raise
|
72
|
+
raise StandardError.new("Invalid ISO 8601 duration")
|
64
73
|
end
|
65
74
|
|
66
75
|
sign = matches[1] == '-' ? -1 : 1
|
67
76
|
|
68
77
|
durYears, durMonths, durDays, durHours, durMinutes, durSeconds, durWeeks =
|
69
|
-
matches[2..8].map
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
78
|
+
matches[2..8].map do |match|
|
79
|
+
if match
|
80
|
+
match = match.tr(',', '.').gsub(/\.0*\z/, '')
|
81
|
+
sign * (match.include?('.') ? match.to_f : match.to_i)
|
82
|
+
else
|
83
|
+
0
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
datetime = Time.at(timestamp).utc.to_datetime
|
88
|
+
datetime = datetime.next_year(durYears)
|
89
|
+
datetime = datetime.next_month(durMonths)
|
90
|
+
datetime = datetime.next_day((7*durWeeks) + durDays)
|
91
|
+
datetime.to_time.utc.to_i + (durHours * 3600) + (durMinutes * 60) + durSeconds
|
77
92
|
end
|
78
93
|
|
79
94
|
# Return a properly formatted x509 certificate
|
@@ -127,6 +142,28 @@ module OneLogin
|
|
127
142
|
"-----BEGIN #{key_label}-----\n#{key}\n-----END #{key_label}-----"
|
128
143
|
end
|
129
144
|
|
145
|
+
# Given a certificate string, return an OpenSSL::X509::Certificate object.
|
146
|
+
#
|
147
|
+
# @param cert [String] The original certificate
|
148
|
+
# @return [OpenSSL::X509::Certificate] The certificate object
|
149
|
+
#
|
150
|
+
def self.build_cert_object(cert)
|
151
|
+
return nil if cert.nil? || cert.empty?
|
152
|
+
|
153
|
+
OpenSSL::X509::Certificate.new(format_cert(cert))
|
154
|
+
end
|
155
|
+
|
156
|
+
# Given a private key string, return an OpenSSL::PKey::RSA object.
|
157
|
+
#
|
158
|
+
# @param cert [String] The original private key
|
159
|
+
# @return [OpenSSL::PKey::RSA] The private key object
|
160
|
+
#
|
161
|
+
def self.build_private_key_object(private_key)
|
162
|
+
return nil if private_key.nil? || private_key.empty?
|
163
|
+
|
164
|
+
OpenSSL::PKey::RSA.new(format_private_key(private_key))
|
165
|
+
end
|
166
|
+
|
130
167
|
# Build the Query String signature that will be used in the HTTP-Redirect binding
|
131
168
|
# to generate the Signature
|
132
169
|
# @param params [Hash] Parameters to build the Query String
|
@@ -166,30 +203,39 @@ module OneLogin
|
|
166
203
|
#
|
167
204
|
# @param rawparams [Hash] Raw GET Parameters
|
168
205
|
# @param params [Hash] GET Parameters
|
206
|
+
# @param lowercase_url_encoding [bool] Lowercase URL Encoding (For ADFS urlencode compatiblity)
|
169
207
|
# @return [Hash] New raw parameters
|
170
208
|
#
|
171
|
-
def self.prepare_raw_get_params(rawparams, params)
|
209
|
+
def self.prepare_raw_get_params(rawparams, params, lowercase_url_encoding=false)
|
172
210
|
rawparams ||= {}
|
173
211
|
|
174
212
|
if rawparams['SAMLRequest'].nil? && !params['SAMLRequest'].nil?
|
175
|
-
rawparams['SAMLRequest'] =
|
213
|
+
rawparams['SAMLRequest'] = escape_request_param(params['SAMLRequest'], lowercase_url_encoding)
|
176
214
|
end
|
177
215
|
if rawparams['SAMLResponse'].nil? && !params['SAMLResponse'].nil?
|
178
|
-
rawparams['SAMLResponse'] =
|
216
|
+
rawparams['SAMLResponse'] = escape_request_param(params['SAMLResponse'], lowercase_url_encoding)
|
179
217
|
end
|
180
218
|
if rawparams['RelayState'].nil? && !params['RelayState'].nil?
|
181
|
-
rawparams['RelayState'] =
|
219
|
+
rawparams['RelayState'] = escape_request_param(params['RelayState'], lowercase_url_encoding)
|
182
220
|
end
|
183
221
|
if rawparams['SigAlg'].nil? && !params['SigAlg'].nil?
|
184
|
-
rawparams['SigAlg'] =
|
222
|
+
rawparams['SigAlg'] = escape_request_param(params['SigAlg'], lowercase_url_encoding)
|
185
223
|
end
|
186
224
|
|
187
225
|
rawparams
|
188
226
|
end
|
189
227
|
|
228
|
+
def self.escape_request_param(param, lowercase_url_encoding)
|
229
|
+
CGI.escape(param).tap do |escaped|
|
230
|
+
next unless lowercase_url_encoding
|
231
|
+
|
232
|
+
escaped.gsub!(/%[A-Fa-f0-9]{2}/) { |match| match.downcase }
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
190
236
|
# Validate the Signature parameter sent on the HTTP-Redirect binding
|
191
237
|
# @param params [Hash] Parameters to be used in the validation process
|
192
|
-
# @option params [OpenSSL::X509::Certificate] cert The
|
238
|
+
# @option params [OpenSSL::X509::Certificate] cert The IDP public certificate
|
193
239
|
# @option params [String] sig_alg The SigAlg parameter
|
194
240
|
# @option params [String] signature The Signature parameter (base64 encoded)
|
195
241
|
# @option params [String] query_string The full GET Query String to be compared
|
@@ -226,9 +272,29 @@ module OneLogin
|
|
226
272
|
error_msg
|
227
273
|
end
|
228
274
|
|
275
|
+
# Obtains the decrypted string from an Encrypted node element in XML,
|
276
|
+
# given multiple private keys to try.
|
277
|
+
# @param encrypted_node [REXML::Element] The Encrypted element
|
278
|
+
# @param private_keys [Array<OpenSSL::PKey::RSA>] The Service provider private key
|
279
|
+
# @return [String] The decrypted data
|
280
|
+
def self.decrypt_multi(encrypted_node, private_keys)
|
281
|
+
raise ArgumentError.new('private_keys must be specified') if !private_keys || private_keys.empty?
|
282
|
+
|
283
|
+
error = nil
|
284
|
+
private_keys.each do |key|
|
285
|
+
begin
|
286
|
+
return decrypt_data(encrypted_node, key)
|
287
|
+
rescue OpenSSL::PKey::PKeyError => e
|
288
|
+
error ||= e
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
raise(error) if error
|
293
|
+
end
|
294
|
+
|
229
295
|
# Obtains the decrypted string from an Encrypted node element in XML
|
230
|
-
# @param encrypted_node [REXML::Element]
|
231
|
-
# @param private_key
|
296
|
+
# @param encrypted_node [REXML::Element] The Encrypted element
|
297
|
+
# @param private_key [OpenSSL::PKey::RSA] The Service provider private key
|
232
298
|
# @return [String] The decrypted data
|
233
299
|
def self.decrypt_data(encrypted_node, private_key)
|
234
300
|
encrypt_data = REXML::XPath.first(
|
@@ -292,7 +358,7 @@ module OneLogin
|
|
292
358
|
|
293
359
|
# Obtains the deciphered text
|
294
360
|
# @param cipher_text [String] The ciphered text
|
295
|
-
# @param symmetric_key [String] The
|
361
|
+
# @param symmetric_key [String] The symmetric key used to encrypt the text
|
296
362
|
# @param algorithm [String] The encrypted algorithm
|
297
363
|
# @return [String] The deciphered text
|
298
364
|
def self.retrieve_plaintext(cipher_text, symmetric_key, algorithm)
|
@@ -333,8 +399,12 @@ module OneLogin
|
|
333
399
|
end
|
334
400
|
end
|
335
401
|
|
402
|
+
def self.set_prefix(value)
|
403
|
+
UUID_PREFIX.replace value
|
404
|
+
end
|
405
|
+
|
336
406
|
def self.uuid
|
337
|
-
RUBY_VERSION < '1.9' ? "
|
407
|
+
"#{UUID_PREFIX}" + (RUBY_VERSION < '1.9' ? "#{@@uuid_generator.generate}" : "#{SecureRandom.uuid}")
|
338
408
|
end
|
339
409
|
|
340
410
|
# Given two strings, attempt to match them as URIs using Rails' parse method. If they can be parsed,
|
data/lib/xml_security.rb
CHANGED
@@ -177,7 +177,7 @@ module XMLSecurity
|
|
177
177
|
|
178
178
|
def compute_digest(document, digest_algorithm)
|
179
179
|
digest = digest_algorithm.digest(document)
|
180
|
-
Base64.encode64(digest).strip
|
180
|
+
Base64.encode64(digest).strip
|
181
181
|
end
|
182
182
|
|
183
183
|
end
|
@@ -216,7 +216,7 @@ module XMLSecurity
|
|
216
216
|
if options[:fingerprint_alg]
|
217
217
|
fingerprint_alg = XMLSecurity::BaseDocument.new.algorithm(options[:fingerprint_alg]).new
|
218
218
|
else
|
219
|
-
fingerprint_alg = OpenSSL::Digest
|
219
|
+
fingerprint_alg = OpenSSL::Digest.new('SHA1')
|
220
220
|
end
|
221
221
|
fingerprint = fingerprint_alg.hexdigest(cert.to_der)
|
222
222
|
|
@@ -310,17 +310,30 @@ module XMLSecurity
|
|
310
310
|
canon_string = noko_signed_info_element.canonicalize(canon_algorithm)
|
311
311
|
noko_sig_element.remove
|
312
312
|
|
313
|
+
# get signed info
|
314
|
+
signed_info_element = REXML::XPath.first(
|
315
|
+
sig_element,
|
316
|
+
"./ds:SignedInfo",
|
317
|
+
{ "ds" => DSIG }
|
318
|
+
)
|
319
|
+
|
313
320
|
# get inclusive namespaces
|
314
321
|
inclusive_namespaces = extract_inclusive_namespaces
|
315
322
|
|
316
323
|
# check digests
|
317
|
-
ref = REXML::XPath.first(
|
324
|
+
ref = REXML::XPath.first(signed_info_element, "./ds:Reference", {"ds"=>DSIG})
|
318
325
|
|
319
|
-
|
326
|
+
reference_nodes = document.xpath("//*[@ID=$id]", nil, { 'id' => extract_signed_element_id })
|
327
|
+
|
328
|
+
if reference_nodes.length > 1 # ensures no elements with same ID to prevent signature wrapping attack.
|
329
|
+
return append_error("Digest mismatch. Duplicated ID found", soft)
|
330
|
+
end
|
331
|
+
|
332
|
+
hashed_element = reference_nodes[0]
|
320
333
|
|
321
334
|
canon_algorithm = canon_algorithm REXML::XPath.first(
|
322
|
-
|
323
|
-
'
|
335
|
+
signed_info_element,
|
336
|
+
'./ds:CanonicalizationMethod',
|
324
337
|
{ "ds" => DSIG }
|
325
338
|
)
|
326
339
|
|
@@ -330,13 +343,13 @@ module XMLSecurity
|
|
330
343
|
|
331
344
|
digest_algorithm = algorithm(REXML::XPath.first(
|
332
345
|
ref,
|
333
|
-
"
|
346
|
+
"./ds:DigestMethod",
|
334
347
|
{ "ds" => DSIG }
|
335
348
|
))
|
336
349
|
hash = digest_algorithm.digest(canon_hashed_element)
|
337
350
|
encoded_digest_value = REXML::XPath.first(
|
338
351
|
ref,
|
339
|
-
"
|
352
|
+
"./ds:DigestValue",
|
340
353
|
{ "ds" => DSIG }
|
341
354
|
)
|
342
355
|
digest_value = Base64.decode64(OneLogin::RubySaml::Utils.element_text(encoded_digest_value))
|
@@ -362,7 +375,7 @@ module XMLSecurity
|
|
362
375
|
def process_transforms(ref, canon_algorithm)
|
363
376
|
transforms = REXML::XPath.match(
|
364
377
|
ref,
|
365
|
-
"
|
378
|
+
"./ds:Transforms/ds:Transform",
|
366
379
|
{ "ds" => DSIG }
|
367
380
|
)
|
368
381
|
|
data/ruby-saml.gemspec
CHANGED
@@ -6,17 +6,17 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.version = OneLogin::RubySaml::VERSION
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
|
-
s.authors = ["
|
9
|
+
s.authors = ["SAML Toolkit", "Sixto Martin"]
|
10
|
+
s.email = ['contact@iamdigitalservices.com', 'sixto.martin.garcia@gmail.com']
|
10
11
|
s.date = Time.now.strftime("%Y-%m-%d")
|
11
|
-
s.description = %q{SAML toolkit
|
12
|
-
s.email = %q{support@onelogin.com}
|
12
|
+
s.description = %q{SAML Ruby toolkit. Add SAML support to your Ruby software using this library}
|
13
13
|
s.license = 'MIT'
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"LICENSE",
|
16
16
|
"README.md"
|
17
17
|
]
|
18
18
|
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
19
|
-
s.homepage = %q{https://github.com/
|
19
|
+
s.homepage = %q{https://github.com/saml-toolkits/ruby-saml}
|
20
20
|
s.rdoc_options = ["--charset=UTF-8"]
|
21
21
|
s.require_paths = ["lib"]
|
22
22
|
s.rubygems_version = %q{1.3.7}
|
@@ -27,12 +27,18 @@ Gem::Specification.new do |s|
|
|
27
27
|
# Nokogiri's version dependent on the Ruby version, even though we would
|
28
28
|
# have liked to constrain Ruby 1.8.7 to install only the 1.5.x versions.
|
29
29
|
if defined?(JRUBY_VERSION)
|
30
|
-
if JRUBY_VERSION < '9.
|
30
|
+
if JRUBY_VERSION < '9.1.7.0'
|
31
31
|
s.add_runtime_dependency('nokogiri', '>= 1.8.2', '<= 1.8.5')
|
32
32
|
s.add_runtime_dependency('jruby-openssl', '>= 0.9.8')
|
33
33
|
s.add_runtime_dependency('json', '< 2.3.0')
|
34
|
+
elsif JRUBY_VERSION < '9.2.0.0'
|
35
|
+
s.add_runtime_dependency('nokogiri', '>= 1.9.1', '< 1.10.0')
|
36
|
+
elsif JRUBY_VERSION < '9.3.2.0'
|
37
|
+
s.add_runtime_dependency('nokogiri', '>= 1.11.4')
|
38
|
+
s.add_runtime_dependency('rexml')
|
34
39
|
else
|
35
|
-
s.add_runtime_dependency('nokogiri', '>= 1.
|
40
|
+
s.add_runtime_dependency('nokogiri', '>= 1.13.10')
|
41
|
+
s.add_runtime_dependency('rexml')
|
36
42
|
end
|
37
43
|
elsif RUBY_VERSION < '1.9'
|
38
44
|
s.add_runtime_dependency('uuid')
|
@@ -41,20 +47,42 @@ Gem::Specification.new do |s|
|
|
41
47
|
s.add_runtime_dependency('nokogiri', '>= 1.5.10', '<= 1.6.8.1')
|
42
48
|
s.add_runtime_dependency('json', '< 2.3.0')
|
43
49
|
elsif RUBY_VERSION < '2.3'
|
44
|
-
s.add_runtime_dependency('nokogiri', '>= 1.9.1', '
|
50
|
+
s.add_runtime_dependency('nokogiri', '>= 1.9.1', '< 1.10.0')
|
51
|
+
elsif RUBY_VERSION < '2.5'
|
52
|
+
s.add_runtime_dependency('nokogiri', '>= 1.10.10', '< 1.11.0')
|
53
|
+
s.add_runtime_dependency('rexml')
|
54
|
+
elsif RUBY_VERSION < '2.6'
|
55
|
+
s.add_runtime_dependency('nokogiri', '>= 1.11.4')
|
56
|
+
s.add_runtime_dependency('rexml')
|
45
57
|
else
|
46
|
-
s.add_runtime_dependency('nokogiri', '>= 1.10
|
58
|
+
s.add_runtime_dependency('nokogiri', '>= 1.13.10')
|
47
59
|
s.add_runtime_dependency('rexml')
|
48
60
|
end
|
49
61
|
|
50
|
-
s.add_development_dependency('
|
51
|
-
|
62
|
+
s.add_development_dependency('simplecov', '<0.22.0')
|
63
|
+
if RUBY_VERSION < '2.4.1'
|
64
|
+
s.add_development_dependency('simplecov-lcov', '<0.8.0')
|
65
|
+
else
|
66
|
+
s.add_development_dependency('simplecov-lcov', '>0.7.0')
|
67
|
+
end
|
68
|
+
|
69
|
+
s.add_development_dependency('minitest', '~> 5.5', '<5.19.0')
|
52
70
|
s.add_development_dependency('mocha', '~> 0.14')
|
53
|
-
|
71
|
+
|
72
|
+
if RUBY_VERSION < '2.0'
|
73
|
+
s.add_development_dependency('rake', '~> 10')
|
74
|
+
else
|
75
|
+
s.add_development_dependency('rake', '>= 12.3.3')
|
76
|
+
end
|
77
|
+
|
54
78
|
s.add_development_dependency('shoulda', '~> 2.11')
|
55
|
-
s.add_development_dependency('simplecov')
|
56
79
|
s.add_development_dependency('systemu', '~> 2')
|
57
|
-
|
80
|
+
|
81
|
+
if RUBY_VERSION < '2.1'
|
82
|
+
s.add_development_dependency('timecop', '<= 0.6.0')
|
83
|
+
else
|
84
|
+
s.add_development_dependency('timecop', '~> 0.9')
|
85
|
+
end
|
58
86
|
|
59
87
|
if defined?(JRUBY_VERSION)
|
60
88
|
# All recent versions of JRuby play well with pry
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-saml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
8
|
-
|
7
|
+
- SAML Toolkit
|
8
|
+
- Sixto Martin
|
9
|
+
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2024-09-10 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: nokogiri
|
@@ -16,14 +17,14 @@ dependencies:
|
|
16
17
|
requirements:
|
17
18
|
- - ">="
|
18
19
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.10
|
20
|
+
version: 1.13.10
|
20
21
|
type: :runtime
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
25
|
- - ">="
|
25
26
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.10
|
27
|
+
version: 1.13.10
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
29
|
name: rexml
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -39,19 +40,33 @@ dependencies:
|
|
39
40
|
- !ruby/object:Gem::Version
|
40
41
|
version: '0'
|
41
42
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
43
|
+
name: simplecov
|
43
44
|
requirement: !ruby/object:Gem::Requirement
|
44
45
|
requirements:
|
45
|
-
- - "
|
46
|
+
- - "<"
|
46
47
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
48
|
+
version: 0.22.0
|
48
49
|
type: :development
|
49
50
|
prerelease: false
|
50
51
|
version_requirements: !ruby/object:Gem::Requirement
|
51
52
|
requirements:
|
52
|
-
- - "
|
53
|
+
- - "<"
|
53
54
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
+
version: 0.22.0
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: simplecov-lcov
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.7.0
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.7.0
|
55
70
|
- !ruby/object:Gem::Dependency
|
56
71
|
name: minitest
|
57
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,6 +74,9 @@ dependencies:
|
|
59
74
|
- - "~>"
|
60
75
|
- !ruby/object:Gem::Version
|
61
76
|
version: '5.5'
|
77
|
+
- - "<"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 5.19.0
|
62
80
|
type: :development
|
63
81
|
prerelease: false
|
64
82
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -66,6 +84,9 @@ dependencies:
|
|
66
84
|
- - "~>"
|
67
85
|
- !ruby/object:Gem::Version
|
68
86
|
version: '5.5'
|
87
|
+
- - "<"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 5.19.0
|
69
90
|
- !ruby/object:Gem::Dependency
|
70
91
|
name: mocha
|
71
92
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,16 +105,16 @@ dependencies:
|
|
84
105
|
name: rake
|
85
106
|
requirement: !ruby/object:Gem::Requirement
|
86
107
|
requirements:
|
87
|
-
- - "
|
108
|
+
- - ">="
|
88
109
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
110
|
+
version: 12.3.3
|
90
111
|
type: :development
|
91
112
|
prerelease: false
|
92
113
|
version_requirements: !ruby/object:Gem::Requirement
|
93
114
|
requirements:
|
94
|
-
- - "
|
115
|
+
- - ">="
|
95
116
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
117
|
+
version: 12.3.3
|
97
118
|
- !ruby/object:Gem::Dependency
|
98
119
|
name: shoulda
|
99
120
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,20 +129,6 @@ dependencies:
|
|
108
129
|
- - "~>"
|
109
130
|
- !ruby/object:Gem::Version
|
110
131
|
version: '2.11'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: simplecov
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
132
|
- !ruby/object:Gem::Dependency
|
126
133
|
name: systemu
|
127
134
|
requirement: !ruby/object:Gem::Requirement
|
@@ -140,16 +147,16 @@ dependencies:
|
|
140
147
|
name: timecop
|
141
148
|
requirement: !ruby/object:Gem::Requirement
|
142
149
|
requirements:
|
143
|
-
- - "
|
150
|
+
- - "~>"
|
144
151
|
- !ruby/object:Gem::Version
|
145
|
-
version: 0.
|
152
|
+
version: '0.9'
|
146
153
|
type: :development
|
147
154
|
prerelease: false
|
148
155
|
version_requirements: !ruby/object:Gem::Requirement
|
149
156
|
requirements:
|
150
|
-
- - "
|
157
|
+
- - "~>"
|
151
158
|
- !ruby/object:Gem::Version
|
152
|
-
version: 0.
|
159
|
+
version: '0.9'
|
153
160
|
- !ruby/object:Gem::Dependency
|
154
161
|
name: pry-byebug
|
155
162
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,8 +171,11 @@ dependencies:
|
|
164
171
|
- - ">="
|
165
172
|
- !ruby/object:Gem::Version
|
166
173
|
version: '0'
|
167
|
-
description: SAML toolkit
|
168
|
-
|
174
|
+
description: SAML Ruby toolkit. Add SAML support to your Ruby software using this
|
175
|
+
library
|
176
|
+
email:
|
177
|
+
- contact@iamdigitalservices.com
|
178
|
+
- sixto.martin.garcia@gmail.com
|
169
179
|
executables: []
|
170
180
|
extensions: []
|
171
181
|
extra_rdoc_files:
|
@@ -173,6 +183,7 @@ extra_rdoc_files:
|
|
173
183
|
- README.md
|
174
184
|
files:
|
175
185
|
- ".document"
|
186
|
+
- ".github/FUNDING.yml"
|
176
187
|
- ".github/workflows/test.yml"
|
177
188
|
- ".gitignore"
|
178
189
|
- CHANGELOG.md
|
@@ -217,11 +228,11 @@ files:
|
|
217
228
|
- lib/schemas/xmldsig-core-schema.xsd
|
218
229
|
- lib/xml_security.rb
|
219
230
|
- ruby-saml.gemspec
|
220
|
-
homepage: https://github.com/
|
231
|
+
homepage: https://github.com/saml-toolkits/ruby-saml
|
221
232
|
licenses:
|
222
233
|
- MIT
|
223
234
|
metadata: {}
|
224
|
-
post_install_message:
|
235
|
+
post_install_message:
|
225
236
|
rdoc_options:
|
226
237
|
- "--charset=UTF-8"
|
227
238
|
require_paths:
|
@@ -237,9 +248,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
237
248
|
- !ruby/object:Gem::Version
|
238
249
|
version: '0'
|
239
250
|
requirements: []
|
240
|
-
|
241
|
-
|
242
|
-
signing_key:
|
251
|
+
rubygems_version: 3.5.18
|
252
|
+
signing_key:
|
243
253
|
specification_version: 4
|
244
254
|
summary: SAML Ruby Tookit
|
245
255
|
test_files: []
|