ruby-saml 1.13.0 → 1.17.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []