spid-es 0.0.20 → 0.0.25

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 2caedfbd88265d92cfa6adc54328ec47b57fd0f2
4
- data.tar.gz: 3c2598da343c443c0b09f9ef0dfcd7cf4e0fc376
2
+ SHA256:
3
+ metadata.gz: 0df53e9cf72fafa24ceafecf84eeecaeac2ad41ae3fde626427db9015ba066c6
4
+ data.tar.gz: 4df05a87667e7e38f788c8a80852290020853a576b9fdd64408adb0e7d84af19
5
5
  SHA512:
6
- metadata.gz: aa9c67a4667aaaa532215ab7c89dacad4fed11b13cbef4e9304eca85ac6cfe0b019e0d1e273b7920565224d8730351e85c3bf7d910dd6b64a628c0cccca6abc3
7
- data.tar.gz: 61c9e4351f6a108d1bfffd5f3978d4ec2ee3231b531e8be835bde36459892383e6ac3c588842e695a76d19a2e352ab9295f80a35fe31433a5f0ea43e1cbc4782
6
+ metadata.gz: c9443aeb32bbeb10038ba9acb6033617c9b2a0f2c5e759bddcb98d0252a41d19248776d2fb0fa2295f6572ecba6fc6eaeb6129ac564c86caed0b2aed929caa87
7
+ data.tar.gz: 1ae7d5cec32f6b0a8007c0c27bec008dec9d27c4f4fdd0e20c8d88922ebe32918eedae9260a377da55a304d7380b8073ca730ba4b3d9108c2bbf144f0e87b56a
@@ -31,14 +31,26 @@ module Spid
31
31
  def generate(settings)
32
32
  #meta_doc = REXML::Document.new
33
33
  meta_doc = Spid::XMLSecurityNew::Document.new
34
- root = meta_doc.add_element "md:EntityDescriptor", {
34
+ if settings.aggregato
35
+ root = meta_doc.add_element "md:EntityDescriptor", {
36
+ "xmlns:md" => "urn:oasis:names:tc:SAML:2.0:metadata",
37
+ "xmlns:xml" => "http://www.w3.org/XML/1998/namespace",
38
+ "xmlns:spid" => "https://spid.gov.it/saml-extensions",
39
+ }
40
+ else
41
+ root = meta_doc.add_element "md:EntityDescriptor", {
35
42
  "xmlns:md" => "urn:oasis:names:tc:SAML:2.0:metadata",
36
43
  "xmlns:xml" => "http://www.w3.org/XML/1998/namespace"
37
- }
44
+ }
45
+ end
46
+
38
47
  if settings.issuer != nil
39
48
  root.attributes["entityID"] = settings.issuer
40
49
  end
41
- uuid = "_" + UUID.new.generate
50
+ #Tolto per non far cambiare sempre il metadata
51
+ #uuid = "_" + UUID.new.generate
52
+ #genero l'id come hash dell'entityID
53
+ uuid = "_" + settings.issuer.hash
42
54
  self.uuid = uuid
43
55
  root.attributes["ID"] = uuid
44
56
 
@@ -119,6 +131,18 @@ module Spid
119
131
  }
120
132
  end
121
133
 
134
+ #Logout dei servizi esterni
135
+ unless settings.hash_assertion_consumer.blank?
136
+ settings.hash_assertion_consumer.each_pair{ |index, hash_service|
137
+ unless hash_service['logout'].blank?
138
+ sp_sso.add_element "md:SingleLogoutService", {
139
+ "Binding" => hash_service['logout']['binding'] || "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST",
140
+ "Location" => hash_service['logout']['location']
141
+ }
142
+ end
143
+ }
144
+ end
145
+
122
146
  name_identifier_formats = settings.name_identifier_format
123
147
  if name_identifier_formats != nil
124
148
  name_id = []
@@ -165,47 +189,30 @@ module Spid
165
189
  "xml:lang" => "it"
166
190
  }
167
191
  service_name.text = hash_service['testo']
168
- hash_service['array_campi'].each_with_index{ |attribute, index|
169
- attr_cons_service.add_element "md:RequestedAttribute", {
170
- "Name" => attribute
192
+ unless hash_service['description'].blank?
193
+ service_description = attr_cons_service.add_element "md:ServiceDescription", {
194
+ "xml:lang" => "it"
171
195
  }
172
- }
196
+ service_description.text = hash_service['description']
197
+ end
198
+
199
+ if hash_service['array_campi'].is_a?(Array)
200
+ hash_service['array_campi'].each_with_index{ |attribute, index|
201
+ attr_cons_service.add_element "md:RequestedAttribute", {
202
+ "Name" => attribute
203
+ }
204
+ }
205
+ else #hash
206
+ hash_service['array_campi'].each_pair{ |attribute, name_format|
207
+ attr_cons_service.add_element "md:RequestedAttribute", {
208
+ "Name" => attribute,
209
+ "NameFormat" => name_format
210
+ }
211
+ }
212
+ end
173
213
  }
174
214
 
175
215
 
176
-
177
-
178
- #Per EIDAS
179
- # #AttributeConsumingService
180
- # attr_cons_service = sp_sso.add_element "md:AttributeConsumingService", {
181
- # "index" => "99",
182
- # }
183
- # service_name
184
- # = attr_cons_service.add_element "md:ServiceName", {
185
- # "xml:lang" => "it"
186
- # }
187
- # service_name.text = "eIDAS Natural Person Minimum Attribute Set"
188
- # settings.requested_attribute.each_with_index{ |attribute, index|
189
- # attr_cons_service.add_element "md:RequestedAttribute", {
190
- # "Name" => attribute
191
- # }
192
- # }
193
-
194
- # #AttributeConsumingService
195
- # attr_cons_service = sp_sso.add_element "md:AttributeConsumingService", {
196
- # "index" => "100",
197
- # }
198
- # service_name = attr_cons_service.add_element "md:ServiceName", {
199
- # "xml:lang" => "it"
200
- # }
201
- # service_name.text = "eIDAS Natural Person Full Attribute Set"
202
- # settings.requested_attribute.each_with_index{ |attribute, index|
203
- # attr_cons_service.add_element "md:RequestedAttribute", {
204
- # "Name" => attribute
205
- # }
206
- # }
207
-
208
-
209
216
  end
210
217
  #organization
211
218
  organization = root.add_element "md:Organization"
@@ -216,12 +223,54 @@ module Spid
216
223
  org_display_name = organization.add_element "md:OrganizationDisplayName", {
217
224
  "xml:lang" => "it"
218
225
  }
219
- org_display_name.text = settings.organization['org_display_name']
226
+
227
+ org_display_name.text = settings.organization['org_display_name']+(settings.aggregato ? " tramite #{settings.hash_aggregatore['soggetto_aggregatore']}" : '')
220
228
  org_url = organization.add_element "md:OrganizationURL", {
221
229
  "xml:lang" => "it"
222
230
  }
223
231
  org_url.text = settings.organization['org_url']
224
232
 
233
+ #ContactPerson per sp aggregato
234
+ if settings.aggregato
235
+ contact_person_aggregatore = root.add_element "md:ContactPerson", {
236
+ "contactType" => "other",
237
+ "spid:entityType" => "spid:aggregator"
238
+ }
239
+ company = contact_person_aggregatore.add_element "md:Company"
240
+ company.text = settings.hash_aggregatore['soggetto_aggregatore']
241
+
242
+ extensions_aggregatore = contact_person_aggregatore.add_element "md:Extensions"
243
+ vat_number_aggregatore = extensions_aggregatore.add_element "spid:VATNumber"
244
+ vat_number_aggregatore.text = settings.hash_aggregatore['piva_aggregatore']
245
+
246
+ ipa_code_aggregatore = extensions_aggregatore.add_element "spid:IPACode"
247
+ ipa_code_aggregatore.text = settings.hash_aggregatore['cipa_aggregatore']
248
+
249
+ fiscal_code_aggregatore = extensions_aggregatore.add_element "spid:FiscalCode"
250
+ fiscal_code_aggregatore.text = settings.hash_aggregatore['cf_aggregatore']
251
+
252
+ contact_person_aggregato = root.add_element "md:ContactPerson", {
253
+ "contactType" => "other",
254
+ "spid:entityType" => "spid:aggregated"
255
+ }
256
+ company = contact_person_aggregato.add_element "md:Company"
257
+ company.text = settings.organization['org_name']
258
+
259
+ extensions_aggregato = contact_person_aggregato.add_element "md:Extensions"
260
+ unless settings.hash_aggregatore['soggetto_aggregato']['vat_number'].blank?
261
+ vat_number_aggregato = extensions_aggregato.add_element "spid:VATNumber"
262
+ vat_number_aggregato.text = settings.hash_aggregatore['soggetto_aggregato']['vat_number']
263
+ end
264
+ unless settings.hash_aggregatore['soggetto_aggregato']['ipa_code'].blank?
265
+ ipa_code_aggregato = extensions_aggregato.add_element "spid:IPACode"
266
+ ipa_code_aggregato.text = settings.hash_aggregatore['soggetto_aggregato']['ipa_code']
267
+ end
268
+ unless settings.hash_aggregatore['soggetto_aggregato']['fiscal_code'].blank?
269
+ fiscal_code_aggregato = extensions_aggregato.add_element "spid:FiscalCode"
270
+ fiscal_code_aggregato.text = settings.hash_aggregatore['soggetto_aggregato']['fiscal_code']
271
+ end
272
+ end
273
+
225
274
  #meta_doc << REXML::XMLDecl.new(version='1.0', encoding='UTF-8')
226
275
  meta_doc << REXML::XMLDecl.new("1.0", "UTF-8")
227
276
 
@@ -160,14 +160,19 @@ module Spid
160
160
  return (soft ? false : validation_error("Issuer of the Assertion not found or multiple."))
161
161
  end
162
162
 
163
- nodes = issuer_response_nodes + issuer_assertion_nodes
163
+ issuer_response_nodes.each{ |iss|
164
+ #controllo: L'attributo Format di Issuer deve essere presente con il valore urn:oasis:names:tc:SAML:2.0:nameid-format:entity
165
+ return (soft ? false : validation_error("Elemento Issuer non ha formato corretto ")) if !iss.attributes['Format'].nil? && iss.attributes['Format'] != 'urn:oasis:names:tc:SAML:2.0:nameid-format:entity'
164
166
 
165
- nodes.each{ |iss|
167
+ }
168
+
169
+ issuer_assertion_nodes.each{ |iss|
166
170
  #controllo: L'attributo Format di Issuer deve essere presente con il valore urn:oasis:names:tc:SAML:2.0:nameid-format:entity
167
171
  return (soft ? false : validation_error("Elemento Issuer non ha formato corretto ")) if iss.attributes['Format'] != 'urn:oasis:names:tc:SAML:2.0:nameid-format:entity'
168
172
 
169
173
  }
170
174
 
175
+ nodes = issuer_response_nodes + issuer_assertion_nodes
171
176
 
172
177
  nodes.map { |node| Utils.element_text(node) }.compact.uniq
173
178
  end
@@ -175,7 +180,6 @@ module Spid
175
180
 
176
181
 
177
182
 
178
-
179
183
  def response_to_id
180
184
  node = REXML::XPath.first(document, "/p:Response", { "p" => PROTOCOL })
181
185
  return node.attributes["InResponseTo"] unless node.blank?
@@ -264,6 +268,8 @@ module Spid
264
268
  return false if validate_destination(soft) == false
265
269
  #validazione status
266
270
  return false if validate_status(soft) == false
271
+ #validazione inresponseto
272
+ return false if validate_presence_inresponseto(soft) == false
267
273
  #validazione issuer
268
274
  return false if validate_issuer(soft) == false
269
275
  #validazioni varie su asserzioni
@@ -308,6 +314,11 @@ module Spid
308
314
  end
309
315
  end
310
316
 
317
+ def validate_presence_inresponseto(soft=true)
318
+ response_to_id_value = response_to_id
319
+ return (soft ? false : validation_error("InResponseTo non specificato o mancante")) if response_to_id_value.blank?
320
+ end
321
+
311
322
 
312
323
 
313
324
  #validate status e status code
@@ -340,16 +351,16 @@ module Spid
340
351
  end
341
352
 
342
353
  def version_assertion(document)
343
- assertion_nodes = xpath_from_signed_assertion()
344
- @version_assertion = "2.0"
345
- #ciclo sui nodi delle asserzioni, se uno ha una versione diversa da 2.0 ritorno nil
346
- unless assertion_nodes.blank?
347
- assertion_nodes.each{ |ass_node|
348
- return nil if ass_node.attributes['Version'] != "2.0"
349
- }
350
- end
351
- @version_assertion
352
- end
354
+ assertion_nodes = xpath_from_signed_assertion()
355
+ @version_assertion = "2.0"
356
+ #ciclo sui nodi delle asserzioni, se uno ha una versione diversa da 2.0 ritorno nil
357
+ unless assertion_nodes.blank?
358
+ assertion_nodes.each{ |ass_node|
359
+ return nil if ass_node.attributes['Version'] != "2.0"
360
+ }
361
+ end
362
+ @version_assertion
363
+ end
353
364
 
354
365
  def validate_version(soft = true)
355
366
  unless version(self.document) == "2.0"
@@ -360,12 +371,12 @@ module Spid
360
371
  end
361
372
 
362
373
  def validate_version_assertion(soft = true)
363
- unless version_assertion(self.document) == "2.0"
364
- #return append_error("Unsupported SAML version")
365
- return soft ? false : validation_error("Unsupported SAML Assertion version")
366
- end
367
- true
368
- end
374
+ unless version_assertion(self.document) == "2.0"
375
+ #return append_error("Unsupported SAML version")
376
+ return soft ? false : validation_error("Unsupported SAML Assertion version")
377
+ end
378
+ true
379
+ end
369
380
 
370
381
  def validate_signed_elements(soft = true)
371
382
  signature_nodes = REXML::XPath.match(decrypted_document.nil? ? document : decrypted_document,"//ds:Signature",{"ds"=>DSIG})
@@ -10,7 +10,7 @@ module Spid
10
10
  attr_accessor :name_identifier_value, :name_identifier_format
11
11
  attr_accessor :sessionindex, :issuer, :destination_service_url, :authn_context, :requester_identificator
12
12
  attr_accessor :single_logout_service_url, :single_logout_service_binding, :single_logout_destination
13
- attr_accessor :skip_validation
13
+ attr_accessor :skip_validation, :aggregato, :hash_aggregatore
14
14
 
15
15
  def initialize(config = {})
16
16
  config.each do |k,v|
@@ -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.20'
5
+ s.version = '0.0.25'
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.20
4
+ version: 0.0.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabiano Pavan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-15 00:00:00.000000000 Z
11
+ date: 2020-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: canonix
@@ -73,7 +73,6 @@ extensions: []
73
73
  extra_rdoc_files: []
74
74
  files:
75
75
  - ".document"
76
- - ".travis.yml"
77
76
  - Gemfile
78
77
  - LICENSE
79
78
  - README.md
@@ -141,8 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
140
  - !ruby/object:Gem::Version
142
141
  version: '0'
143
142
  requirements: []
144
- rubyforge_project:
145
- rubygems_version: 2.2.2
143
+ rubygems_version: 3.0.8
146
144
  signing_key:
147
145
  specification_version: 4
148
146
  summary: SAML Ruby Tookit Spid
@@ -1,5 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 1.8.7
4
- - 1.9.3
5
- - ree