ruby-saml 1.12.4 → 1.18.1

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.
data/lib/xml_security.rb CHANGED
@@ -185,15 +185,13 @@ module XMLSecurity
185
185
  x509_cert_element.text = Base64.encode64(certificate.to_der).gsub(/\n/, "")
186
186
 
187
187
  # add the signature
188
- issuer_element = self.elements["//saml:Issuer"]
188
+ issuer_element = elements["//saml:Issuer"]
189
189
  if issuer_element
190
- self.root.insert_after issuer_element, signature_element
190
+ root.insert_after(issuer_element, signature_element)
191
+ elsif first_child = root.children[0]
192
+ root.insert_before(first_child, signature_element)
191
193
  else
192
- if sp_sso_descriptor = self.elements["/md:EntityDescriptor"]
193
- self.root.insert_before sp_sso_descriptor, signature_element
194
- else
195
- self.root.add_element(signature_element)
196
- end
194
+ root.add_element(signature_element)
197
195
  end
198
196
  end
199
197
 
@@ -205,7 +203,7 @@ module XMLSecurity
205
203
 
206
204
  def compute_digest(document, digest_algorithm)
207
205
  digest = digest_algorithm.digest(document)
208
- Base64.encode64(digest).strip!
206
+ Base64.encode64(digest).strip
209
207
  end
210
208
 
211
209
  end
@@ -218,12 +216,31 @@ module XMLSecurity
218
216
  def initialize(response, errors = [])
219
217
  super(response)
220
218
  @errors = errors
219
+ reset_elements
220
+ end
221
+
222
+ def reset_elements
223
+ @referenced_xml = nil
224
+ @cached_signed_info = nil
225
+ @signature = nil
226
+ @signature_algorithm = nil
227
+ @ref = nil
228
+ @processed = false
229
+ end
230
+
231
+ def processed
232
+ @processed
233
+ end
234
+
235
+ def referenced_xml
236
+ @referenced_xml
221
237
  end
222
238
 
223
239
  def signed_element_id
224
240
  @signed_element_id ||= extract_signed_element_id
225
241
  end
226
242
 
243
+ # Validates the referenced_xml, which is the signed part of the document
227
244
  def validate_document(idp_cert_fingerprint, soft = true, options = {})
228
245
  # get cert from response
229
246
  cert_element = REXML::XPath.first(
@@ -244,7 +261,7 @@ module XMLSecurity
244
261
  if options[:fingerprint_alg]
245
262
  fingerprint_alg = XMLSecurity::BaseDocument.new.algorithm(options[:fingerprint_alg]).new
246
263
  else
247
- fingerprint_alg = OpenSSL::Digest::SHA1.new
264
+ fingerprint_alg = OpenSSL::Digest.new('SHA1')
248
265
  end
249
266
  fingerprint = fingerprint_alg.hexdigest(cert.to_der)
250
267
 
@@ -252,6 +269,7 @@ module XMLSecurity
252
269
  if fingerprint != idp_cert_fingerprint.gsub(/[^a-zA-Z0-9]/,"").downcase
253
270
  return append_error("Fingerprint mismatch", soft)
254
271
  end
272
+ base64_cert = Base64.encode64(cert.to_der)
255
273
  else
256
274
  if options[:cert]
257
275
  base64_cert = Base64.encode64(options[:cert].to_pem)
@@ -263,12 +281,10 @@ module XMLSecurity
263
281
  end
264
282
  end
265
283
  end
266
- check_malformed_doc = true
267
- check_malformed_doc = options[:check_malformed_doc] if options.key?(:check_malformed_doc)
268
- validate_signature(base64_cert, soft, check_malformed_doc)
284
+ validate_signature(base64_cert, soft)
269
285
  end
270
286
 
271
- def validate_document_with_cert(idp_cert, soft = true, check_malformed_doc = true)
287
+ def validate_document_with_cert(idp_cert, soft = true)
272
288
  # get cert from response
273
289
  cert_element = REXML::XPath.first(
274
290
  self,
@@ -289,16 +305,18 @@ module XMLSecurity
289
305
  if idp_cert.to_pem != cert.to_pem
290
306
  return append_error("Certificate of the Signature element does not match provided certificate", soft)
291
307
  end
292
- else
293
- base64_cert = Base64.encode64(idp_cert.to_pem)
294
308
  end
295
- validate_signature(base64_cert, true, check_malformed_doc)
309
+
310
+ encoded_idp_cert = Base64.encode64(idp_cert.to_pem)
311
+ validate_signature(encoded_idp_cert, true)
296
312
  end
297
313
 
298
- def validate_signature(base64_cert, soft = true, check_malformed_doc = true)
314
+ def cache_referenced_xml(soft, check_malformed_doc = true)
315
+ reset_elements
316
+ @processed = true
299
317
 
300
318
  begin
301
- document = XMLSecurity::BaseDocument.safe_load_xml(self, check_malformed_doc)
319
+ nokogiri_document = XMLSecurity::BaseDocument.safe_load_xml(self, check_malformed_doc)
302
320
  rescue StandardError => error
303
321
  @errors << error.message
304
322
  return false if soft
@@ -315,13 +333,15 @@ module XMLSecurity
315
333
  {"ds"=>DSIG}
316
334
  )
317
335
 
336
+ return if sig_element.nil?
337
+
318
338
  # signature method
319
339
  sig_alg_value = REXML::XPath.first(
320
340
  sig_element,
321
341
  "./ds:SignedInfo/ds:SignatureMethod",
322
342
  {"ds"=>DSIG}
323
343
  )
324
- signature_algorithm = algorithm(sig_alg_value)
344
+ @signature_algorithm = algorithm(sig_alg_value)
325
345
 
326
346
  # get signature
327
347
  base64_signature = REXML::XPath.first(
@@ -329,7 +349,11 @@ module XMLSecurity
329
349
  "./ds:SignatureValue",
330
350
  {"ds" => DSIG}
331
351
  )
332
- signature = Base64.decode64(OneLogin::RubySaml::Utils.element_text(base64_signature))
352
+
353
+ return if base64_signature.nil?
354
+
355
+ base64_signature_text = OneLogin::RubySaml::Utils.element_text(base64_signature)
356
+ @signature = base64_signature_text.nil? ? nil : Base64.decode64(base64_signature_text)
333
357
 
334
358
  # canonicalization method
335
359
  canon_algorithm = canon_algorithm REXML::XPath.first(
@@ -338,66 +362,75 @@ module XMLSecurity
338
362
  'ds' => DSIG
339
363
  )
340
364
 
341
- noko_sig_element = document.at_xpath('//ds:Signature', 'ds' => DSIG)
365
+ noko_sig_element = nokogiri_document.at_xpath('//ds:Signature', 'ds' => DSIG)
342
366
  noko_signed_info_element = noko_sig_element.at_xpath('./ds:SignedInfo', 'ds' => DSIG)
343
367
 
344
- canon_string = noko_signed_info_element.canonicalize(canon_algorithm)
345
- noko_sig_element.remove
368
+ @cached_signed_info = noko_signed_info_element.canonicalize(canon_algorithm)
346
369
 
347
- # get signed info
348
- signed_info_element = REXML::XPath.first(
349
- sig_element,
350
- "./ds:SignedInfo",
351
- { "ds" => DSIG }
352
- )
370
+ ### Now get the @referenced_xml to use?
371
+ rexml_signed_info = REXML::Document.new(@cached_signed_info.to_s).root
372
+
373
+ noko_sig_element.remove
353
374
 
354
375
  # get inclusive namespaces
355
376
  inclusive_namespaces = extract_inclusive_namespaces
356
377
 
357
378
  # check digests
358
- ref = REXML::XPath.first(signed_info_element, "./ds:Reference", {"ds"=>DSIG})
359
-
360
- reference_nodes = document.xpath("//*[@ID=$id]", nil, { 'id' => extract_signed_element_id })
379
+ @ref = REXML::XPath.first(rexml_signed_info, "./ds:Reference", {"ds"=>DSIG})
380
+ return if @ref.nil?
361
381
 
362
- if reference_nodes.length > 1 # ensures no elements with same ID to prevent signature wrapping attack.
363
- return append_error("Duplicated IDs found", soft)
364
- end
382
+ reference_nodes = nokogiri_document.xpath("//*[@ID=$id]", nil, { 'id' => extract_signed_element_id })
365
383
 
366
384
  hashed_element = reference_nodes[0]
385
+ return if hashed_element.nil?
367
386
 
368
387
  canon_algorithm = canon_algorithm REXML::XPath.first(
369
- signed_info_element,
388
+ rexml_signed_info,
370
389
  './ds:CanonicalizationMethod',
371
390
  { "ds" => DSIG }
372
391
  )
373
392
 
374
- canon_algorithm = process_transforms(ref, canon_algorithm)
393
+ canon_algorithm = process_transforms(@ref, canon_algorithm)
375
394
 
376
- canon_hashed_element = hashed_element.canonicalize(canon_algorithm, inclusive_namespaces)
395
+ @referenced_xml = hashed_element.canonicalize(canon_algorithm, inclusive_namespaces)
396
+ end
397
+
398
+ def validate_signature(base64_cert, soft = true)
399
+ if !@processed
400
+ cache_referenced_xml(soft)
401
+ end
402
+
403
+ return append_error("No Signature Algorithm Method found", soft) if @signature_algorithm.nil?
404
+ return append_error("No Signature node found", soft) if @signature.nil?
405
+ return append_error("No canonized SignedInfo ", soft) if @cached_signed_info.nil?
406
+ return append_error("No Reference node found", soft) if @ref.nil?
407
+ return append_error("No referenced XML", soft) if @referenced_xml.nil?
408
+
409
+ # get certificate object
410
+ cert_text = Base64.decode64(base64_cert)
411
+ cert = OpenSSL::X509::Certificate.new(cert_text)
377
412
 
378
413
  digest_algorithm = algorithm(REXML::XPath.first(
379
- ref,
414
+ @ref,
380
415
  "./ds:DigestMethod",
381
416
  { "ds" => DSIG }
382
417
  ))
383
- hash = digest_algorithm.digest(canon_hashed_element)
418
+ hash = digest_algorithm.digest(@referenced_xml)
384
419
  encoded_digest_value = REXML::XPath.first(
385
- ref,
420
+ @ref,
386
421
  "./ds:DigestValue",
387
422
  { "ds" => DSIG }
388
423
  )
389
- digest_value = Base64.decode64(OneLogin::RubySaml::Utils.element_text(encoded_digest_value))
424
+ encoded_digest_value_text = OneLogin::RubySaml::Utils.element_text(encoded_digest_value)
425
+ digest_value = encoded_digest_value_text.nil? ? nil : Base64.decode64(encoded_digest_value_text)
390
426
 
391
- unless digests_match?(hash, digest_value)
427
+ # Compare the computed "hash" with the "signed" hash
428
+ unless hash && hash == digest_value
392
429
  return append_error("Digest mismatch", soft)
393
430
  end
394
431
 
395
- # get certificate object
396
- cert_text = Base64.decode64(base64_cert)
397
- cert = OpenSSL::X509::Certificate.new(cert_text)
398
-
399
432
  # verify signature
400
- unless cert.public_key.verify(signature_algorithm.new, signature, canon_string)
433
+ unless cert.public_key.verify(@signature_algorithm.new, @signature, @cached_signed_info)
401
434
  return append_error("Key validation error", soft)
402
435
  end
403
436
 
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,28 +47,48 @@ 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
 
62
+ if RUBY_VERSION >= '3.4.0'
63
+ s.add_runtime_dependency("logger")
64
+ s.add_runtime_dependency("base64")
65
+ s.add_runtime_dependency('mutex_m')
66
+ end
67
+
50
68
  s.add_development_dependency('simplecov', '<0.22.0')
51
69
  if RUBY_VERSION < '2.4.1'
52
70
  s.add_development_dependency('simplecov-lcov', '<0.8.0')
53
- s.add_development_dependency('term-ansicolor', '1.2.2')
54
- s.add_development_dependency('mime-types', '<3.6.0')
55
71
  else
56
72
  s.add_development_dependency('simplecov-lcov', '>0.7.0')
57
73
  end
58
74
 
59
- s.add_development_dependency('coveralls')
60
- s.add_development_dependency('minitest', '~> 5.5')
75
+ s.add_development_dependency('minitest', '~> 5.5', '<5.19.0')
61
76
  s.add_development_dependency('mocha', '~> 0.14')
62
- s.add_development_dependency('rake', '~> 10')
77
+
78
+ if RUBY_VERSION < '2.0'
79
+ s.add_development_dependency('rake', '~> 10')
80
+ else
81
+ s.add_development_dependency('rake', '>= 12.3.3')
82
+ end
83
+
63
84
  s.add_development_dependency('shoulda', '~> 2.11')
64
85
  s.add_development_dependency('systemu', '~> 2')
65
- s.add_development_dependency('timecop', '<= 0.6.0')
86
+
87
+ if RUBY_VERSION < '2.1'
88
+ s.add_development_dependency('timecop', '<= 0.6.0')
89
+ else
90
+ s.add_development_dependency('timecop', '~> 0.9')
91
+ end
66
92
 
67
93
  if defined?(JRUBY_VERSION)
68
94
  # 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.12.4
4
+ version: 1.18.1
5
5
  platform: ruby
6
6
  authors:
7
- - OneLogin LLC
7
+ - SAML Toolkit
8
+ - Sixto Martin
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2025-03-12 00:00:00.000000000 Z
12
+ date: 2025-07-29 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
@@ -66,20 +67,6 @@ dependencies:
66
67
  - - ">"
67
68
  - !ruby/object:Gem::Version
68
69
  version: 0.7.0
69
- - !ruby/object:Gem::Dependency
70
- name: coveralls
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
70
  - !ruby/object:Gem::Dependency
84
71
  name: minitest
85
72
  requirement: !ruby/object:Gem::Requirement
@@ -87,6 +74,9 @@ dependencies:
87
74
  - - "~>"
88
75
  - !ruby/object:Gem::Version
89
76
  version: '5.5'
77
+ - - "<"
78
+ - !ruby/object:Gem::Version
79
+ version: 5.19.0
90
80
  type: :development
91
81
  prerelease: false
92
82
  version_requirements: !ruby/object:Gem::Requirement
@@ -94,6 +84,9 @@ dependencies:
94
84
  - - "~>"
95
85
  - !ruby/object:Gem::Version
96
86
  version: '5.5'
87
+ - - "<"
88
+ - !ruby/object:Gem::Version
89
+ version: 5.19.0
97
90
  - !ruby/object:Gem::Dependency
98
91
  name: mocha
99
92
  requirement: !ruby/object:Gem::Requirement
@@ -112,16 +105,16 @@ dependencies:
112
105
  name: rake
113
106
  requirement: !ruby/object:Gem::Requirement
114
107
  requirements:
115
- - - "~>"
108
+ - - ">="
116
109
  - !ruby/object:Gem::Version
117
- version: '10'
110
+ version: 12.3.3
118
111
  type: :development
119
112
  prerelease: false
120
113
  version_requirements: !ruby/object:Gem::Requirement
121
114
  requirements:
122
- - - "~>"
115
+ - - ">="
123
116
  - !ruby/object:Gem::Version
124
- version: '10'
117
+ version: 12.3.3
125
118
  - !ruby/object:Gem::Dependency
126
119
  name: shoulda
127
120
  requirement: !ruby/object:Gem::Requirement
@@ -154,16 +147,16 @@ dependencies:
154
147
  name: timecop
155
148
  requirement: !ruby/object:Gem::Requirement
156
149
  requirements:
157
- - - "<="
150
+ - - "~>"
158
151
  - !ruby/object:Gem::Version
159
- version: 0.6.0
152
+ version: '0.9'
160
153
  type: :development
161
154
  prerelease: false
162
155
  version_requirements: !ruby/object:Gem::Requirement
163
156
  requirements:
164
- - - "<="
157
+ - - "~>"
165
158
  - !ruby/object:Gem::Version
166
- version: 0.6.0
159
+ version: '0.9'
167
160
  - !ruby/object:Gem::Dependency
168
161
  name: pry-byebug
169
162
  requirement: !ruby/object:Gem::Requirement
@@ -178,8 +171,11 @@ dependencies:
178
171
  - - ">="
179
172
  - !ruby/object:Gem::Version
180
173
  version: '0'
181
- description: SAML toolkit for Ruby on Rails
182
- 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
183
179
  executables: []
184
180
  extensions: []
185
181
  extra_rdoc_files:
@@ -187,14 +183,15 @@ extra_rdoc_files:
187
183
  - README.md
188
184
  files:
189
185
  - ".document"
186
+ - ".github/FUNDING.yml"
190
187
  - ".github/workflows/test.yml"
191
188
  - ".gitignore"
192
- - ".travis.yml"
189
+ - CHANGELOG.md
193
190
  - Gemfile
194
191
  - LICENSE
195
192
  - README.md
196
193
  - Rakefile
197
- - changelog.md
194
+ - UPGRADING.md
198
195
  - gemfiles/nokogiri-1.5.gemfile
199
196
  - lib/onelogin/ruby-saml.rb
200
197
  - lib/onelogin/ruby-saml/attribute_service.rb
@@ -231,7 +228,7 @@ files:
231
228
  - lib/schemas/xmldsig-core-schema.xsd
232
229
  - lib/xml_security.rb
233
230
  - ruby-saml.gemspec
234
- homepage: https://github.com/onelogin/ruby-saml
231
+ homepage: https://github.com/saml-toolkits/ruby-saml
235
232
  licenses:
236
233
  - MIT
237
234
  metadata: {}
data/.travis.yml DELETED
@@ -1,48 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 1.9.3
4
- - 2.0.0
5
- - 2.1.10
6
- - 2.2.10
7
- - 2.3.8
8
- - 2.4.6
9
- - 2.5.8
10
- - 2.6.6
11
- - 2.7.2
12
- - 3.0.0
13
- - jruby-1.7.27
14
- - jruby-9.1.17.0
15
- - jruby-9.2.13.0
16
- gemfile:
17
- - Gemfile
18
- - gemfiles/nokogiri-1.5.gemfile
19
- before_install:
20
- - gem update bundler
21
- matrix:
22
- exclude:
23
- - rvm: jruby-1.7.27
24
- gemfile: gemfiles/nokogiri-1.5.gemfile
25
- - rvm: jruby-9.1.17.0
26
- gemfile: gemfiles/nokogiri-1.5.gemfile
27
- - rvm: jruby-9.2.13.0
28
- gemfile: gemfiles/nokogiri-1.5.gemfile
29
- - rvm: 2.1.5
30
- gemfile: gemfiles/nokogiri-1.5.gemfile
31
- - rvm: 2.1.10
32
- gemfile: gemfiles/nokogiri-1.5.gemfile
33
- - rvm: 2.2.10
34
- gemfile: gemfiles/nokogiri-1.5.gemfile
35
- - rvm: 2.3.8
36
- gemfile: gemfiles/nokogiri-1.5.gemfile
37
- - rvm: 2.4.6
38
- gemfile: gemfiles/nokogiri-1.5.gemfile
39
- - rvm: 2.5.8
40
- gemfile: gemfiles/nokogiri-1.5.gemfile
41
- - rvm: 2.6.6
42
- gemfile: gemfiles/nokogiri-1.5.gemfile
43
- - rvm: 2.7.2
44
- gemfile: gemfiles/nokogiri-1.5.gemfile
45
- - rvm: 3.0.0
46
- gemfile: gemfiles/nokogiri-1.5.gemfile
47
- env:
48
- - JRUBY_OPTS="--debug"