spid-es 0.0.44 → 0.0.49
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 +4 -4
- data/lib/spid/ruby-saml/metadata.rb +30 -23
- data/lib/spid/ruby-saml/response.rb +22 -11
- data/lib/spid/xml_security_new.rb +6 -2
- data/spid-es.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 96b349fe25c4614fc0d793c64c10716be3c9594b08e8d73ff5c421c637ef3816
|
4
|
+
data.tar.gz: a959dbd5b0e47021ebfa2cd07c3d4642ff68b7477f4b2cf7d248c3487d7f4364
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a3bdf6a060e53b2e07e6376b59eb843be93366369f29ffd04cf28e89781b4be827003f9569286884e38b7183dbde805510ebd857d7528374cde8748aaac66a3
|
7
|
+
data.tar.gz: 1ffa3ab7753b1559bd6492165e6a3319e16d7b26b12afb644ee7a4bcd11dc4e83e91ebc22d3429b4d23347e2a60c5f611e4eac3a89933ce4a392319a81368683
|
@@ -21,6 +21,8 @@ module Spid
|
|
21
21
|
|
22
22
|
attr_accessor :uuid
|
23
23
|
|
24
|
+
@@cache = {}
|
25
|
+
|
24
26
|
def initialize(settings=nil)
|
25
27
|
if settings
|
26
28
|
@settings = settings
|
@@ -153,13 +155,11 @@ module Spid
|
|
153
155
|
end
|
154
156
|
|
155
157
|
if settings.assertion_consumer_service_url
|
156
|
-
|
157
158
|
#ciclo e creo i vari tag AssertionConsumerService
|
158
159
|
settings.hash_assertion_consumer.each_pair{ |index, hash_service|
|
159
|
-
|
160
160
|
sp_sso.add_element "md:AssertionConsumerService", {
|
161
161
|
"Binding" => settings.assertion_consumer_service_binding,
|
162
|
-
"Location" =>
|
162
|
+
"Location" => hash_service['url_consumer'],
|
163
163
|
"isDefault" => hash_service['default'],
|
164
164
|
"index" => index
|
165
165
|
}
|
@@ -392,7 +392,6 @@ module Spid
|
|
392
392
|
end
|
393
393
|
|
394
394
|
meta_doc = get_idp_metadata
|
395
|
-
|
396
395
|
return nil unless meta_doc
|
397
396
|
# first try GET (REDIRECT)
|
398
397
|
sso_element = REXML::XPath.first(meta_doc, "/EntityDescriptor/IDPSSODescriptor/#{service}[@Binding='#{HTTP_GET}']")
|
@@ -449,20 +448,26 @@ module Spid
|
|
449
448
|
# returns a REXML document of the metadata
|
450
449
|
def get_idp_metadata
|
451
450
|
return false if @settings.idp_metadata.nil?
|
452
|
-
|
453
451
|
# Look up the metdata in cache first
|
454
452
|
id = Digest::MD5.hexdigest(@settings.idp_metadata)
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
#
|
459
|
-
|
460
|
-
|
453
|
+
unless @@cache[id].blank?
|
454
|
+
Logging.debug "IdP metadata cache used for #{@settings.idp_metadata}"
|
455
|
+
doc_noko = @@cache[id]
|
456
|
+
else #save in cache
|
457
|
+
response = fetch(@settings.idp_metadata)
|
458
|
+
#meta_text = response.body
|
459
|
+
#testo_response = meta_text.sub!(' xmlns:xml="http://www.w3.org/XML/1998/namespace"', '') da errori
|
460
|
+
#uso nokogiri per cercare il certificato, uso la funzione che rimuove tutti i namespace
|
461
|
+
doc_noko = Nokogiri::XML(response.body.gsub(/\n/, "").gsub(/\t/, "")) #modifica per poste
|
462
|
+
doc_noko.remove_namespaces!
|
463
|
+
#save
|
464
|
+
@@cache[id] = doc_noko
|
465
|
+
end
|
461
466
|
extract_certificate(doc_noko)
|
462
467
|
doc_rexml = REXML::Document.new(doc_noko.to_xml)
|
463
|
-
|
464
468
|
return doc_rexml
|
465
469
|
|
470
|
+
|
466
471
|
# USE OF CACHE WITH CERTIFICATE
|
467
472
|
# lookup = @cache.read(id)
|
468
473
|
# if lookup != nil
|
@@ -504,18 +509,20 @@ module Spid
|
|
504
509
|
#ricerco il certificato con nokogiri
|
505
510
|
# pull out the x509 tag
|
506
511
|
x509 = meta_doc.xpath("//EntityDescriptor//IDPSSODescriptor//KeyDescriptor//KeyInfo//X509Data//X509Certificate")
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
#
|
514
|
-
|
515
|
-
|
516
|
-
|
512
|
+
if !x509.nil?
|
513
|
+
if x509.length > 1
|
514
|
+
@settings.idp_cert = []
|
515
|
+
x509.children.each{|child_cert|
|
516
|
+
@settings.idp_cert << child_cert.to_s.gsub(/\n/, "").gsub(/\t/, "")
|
517
|
+
}
|
518
|
+
else #un array con un campo
|
519
|
+
@settings.idp_cert = [x509.children[0].to_s.gsub(/\n/, "").gsub(/\t/, "")]
|
520
|
+
end
|
521
|
+
else #se nil uso il certificato in keyinfo, non dovrebbe mai accadere
|
522
|
+
x509 = meta_doc.xpath("//EntityDescriptor//Signature//KeyInfo//X509Data//X509Certificate")
|
517
523
|
end
|
518
|
-
|
524
|
+
#se ci sono n certificati ritorno array
|
525
|
+
@settings.idp_cert
|
519
526
|
end
|
520
527
|
|
521
528
|
# construct the parameter list on the URL and return
|
@@ -514,11 +514,12 @@ module Spid
|
|
514
514
|
|
515
515
|
return true if settings.assertion_consumer_service_url.nil? || settings.assertion_consumer_service_url.empty?
|
516
516
|
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
517
|
+
#DA-RIPRISTINARE!
|
518
|
+
# unless Spid::Saml::Utils.uri_match?(destination, settings.assertion_consumer_service_url)
|
519
|
+
# # error_msg = "The response was received at #{destination} instead of #{settings.assertion_consumer_service_url}"
|
520
|
+
# # return append_error(error_msg)
|
521
|
+
# return soft ? false : validation_error("The response was received at #{destination} instead of #{settings.assertion_consumer_service_url}")
|
522
|
+
# end
|
522
523
|
|
523
524
|
true
|
524
525
|
end
|
@@ -615,15 +616,25 @@ module Spid
|
|
615
616
|
|
616
617
|
def get_fingerprint
|
617
618
|
idp_metadata = Spid::Saml::Metadata.new(settings).get_idp_metadata
|
618
|
-
|
619
619
|
if settings.idp_cert
|
620
|
-
|
621
|
-
|
622
|
-
|
620
|
+
#controllo se ho n certificati
|
621
|
+
if settings.idp_cert.length > 1
|
622
|
+
array_fingerprint = []
|
623
|
+
settings.idp_cert.each{|cert_metadata_ipd|
|
624
|
+
cert_text = Base64.decode64(cert_metadata_ipd)
|
625
|
+
cert = OpenSSL::X509::Certificate.new(cert_text)
|
626
|
+
array_fingerprint << Digest::SHA2.hexdigest(cert.to_der).upcase.scan(/../).join(":")
|
627
|
+
}
|
628
|
+
return array_fingerprint
|
629
|
+
else
|
630
|
+
cert_text = Base64.decode64(settings.idp_cert[0])
|
631
|
+
cert = OpenSSL::X509::Certificate.new(cert_text)
|
632
|
+
return [Digest::SHA2.hexdigest(cert.to_der).upcase.scan(/../).join(":")]
|
633
|
+
end
|
634
|
+
|
623
635
|
else
|
624
|
-
settings.idp_cert_fingerprint
|
636
|
+
return [settings.idp_cert_fingerprint]
|
625
637
|
end
|
626
|
-
|
627
638
|
end
|
628
639
|
|
629
640
|
def validate_conditions(soft = true)
|
@@ -200,7 +200,7 @@ module Spid
|
|
200
200
|
def signed_element_id
|
201
201
|
@signed_element_id ||= extract_signed_element_id
|
202
202
|
end
|
203
|
-
|
203
|
+
#idp_cert_fingerprint e' un array di fingerprint
|
204
204
|
def validate_document(idp_cert_fingerprint, soft = true, options = {})
|
205
205
|
# get cert from response
|
206
206
|
cert_element = REXML::XPath.first(
|
@@ -226,7 +226,11 @@ module Spid
|
|
226
226
|
fingerprint = fingerprint_alg.hexdigest(cert.to_der)
|
227
227
|
|
228
228
|
# check cert matches registered idp cert
|
229
|
-
|
229
|
+
trovato = false
|
230
|
+
idp_cert_fingerprint.each{|fingerprint_from_idp|
|
231
|
+
trovato = true if fingerprint_from_idp.gsub(/[^a-zA-Z0-9]/,"").downcase == fingerprint
|
232
|
+
}
|
233
|
+
if !trovato
|
230
234
|
@errors << "Fingerprint mismatch"
|
231
235
|
return append_error("Fingerprint mismatch", soft)
|
232
236
|
end
|
data/spid-es.gemspec
CHANGED
@@ -2,7 +2,7 @@ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'spid-es'
|
5
|
-
s.version = '0.0.
|
5
|
+
s.version = '0.0.49'
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Fabiano Pavan"]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spid-es
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.49
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fabiano Pavan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: canonix
|