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.

@@ -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
- cert = OpenSSL::X509::Certificate.new(cert)
43
- end
42
+ cert = OpenSSL::X509::Certificate.new(cert) if cert.is_a?(String)
43
+
44
+ cert.not_after < Time.now
45
+ end
44
46
 
45
- return cert.not_after < Time.now
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 Exception.new("Invalid ISO 8601 duration")
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 { |match| match ? sign * match.tr(',', '.').to_f : 0.0 }
70
-
71
- initial_datetime = Time.at(timestamp).utc.to_datetime
72
- final_datetime = initial_datetime.next_year(durYears)
73
- final_datetime = final_datetime.next_month(durMonths)
74
- final_datetime = final_datetime.next_day((7*durWeeks) + durDays)
75
- final_timestamp = final_datetime.to_time.utc.to_i + (durHours * 3600) + (durMinutes * 60) + durSeconds
76
- return final_timestamp
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'] = CGI.escape(params['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'] = CGI.escape(params['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'] = CGI.escape(params['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'] = CGI.escape(params['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 Identity provider public certtificate
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] The Encrypted element
231
- # @param private_key [OpenSSL::PKey::RSA] The Service provider 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 symetric key used to encrypt the text
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' ? "_#{@@uuid_generator.generate}" : "_#{SecureRandom.uuid}"
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,
@@ -1,5 +1,5 @@
1
1
  module OneLogin
2
2
  module RubySaml
3
- VERSION = '1.13.0'
3
+ VERSION = '1.17.0'
4
4
  end
5
5
  end
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::SHA1.new
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(sig_element, "//ds:Reference", {"ds"=>DSIG})
324
+ ref = REXML::XPath.first(signed_info_element, "./ds:Reference", {"ds"=>DSIG})
318
325
 
319
- hashed_element = document.at_xpath("//*[@ID=$id]", nil, { 'id' => extract_signed_element_id })
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
- ref,
323
- '//ds:CanonicalizationMethod',
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
- "//ds:DigestMethod",
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
- "//ds:DigestValue",
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
- "//ds:Transforms/ds:Transform",
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 = ["OneLogin LLC"]
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 for Ruby on Rails}
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/onelogin/ruby-saml}
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.2.0.0'
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.8.2')
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', '<= 1.10.0')
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.5')
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('coveralls')
51
- s.add_development_dependency('minitest', '~> 5.5')
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
- s.add_development_dependency('rake', '~> 10')
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
- s.add_development_dependency('timecop', '<= 0.6.0')
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.13.0
4
+ version: 1.17.0
5
5
  platform: ruby
6
6
  authors:
7
- - OneLogin LLC
8
- autorequire:
7
+ - SAML Toolkit
8
+ - Sixto Martin
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2021-09-06 00:00:00.000000000 Z
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.5
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.5
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: coveralls
43
+ name: simplecov
43
44
  requirement: !ruby/object:Gem::Requirement
44
45
  requirements:
45
- - - ">="
46
+ - - "<"
46
47
  - !ruby/object:Gem::Version
47
- version: '0'
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: '0'
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: '10'
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: '10'
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.6.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.6.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 for Ruby on Rails
168
- email: support@onelogin.com
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/onelogin/ruby-saml
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
- rubyforge_project:
241
- rubygems_version: 2.5.2.1
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: []