spid 0.11.0 → 0.12.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8d65f97b5bd606942de9c2bba4a7fe60fadb90de3bf8526d8c80bec3a2ce29ff
4
- data.tar.gz: 72d85f52db6688edb9f90f3176af9889b15052b8bc7a45b3eee1c61e269cb825
3
+ metadata.gz: bc64c3b3b469b3e5e031547db6c09e359902aa6c15b3d37b3426e7549ecc2ebd
4
+ data.tar.gz: 02e57b8f55b111ec4c0ed1074c023e816077df9e687897f0acb1ad58d0b2b3d8
5
5
  SHA512:
6
- metadata.gz: 7c0ed6e05c1b45a9a395ea4f4c41c6b45279adc712546bd167ed17a0a3dfba4f28367b287394c22078e95abe561253903153e253a1a967ac4adcf669393a0448
7
- data.tar.gz: a8f863472e7f5dcd85abbdb514b3aa8509ac42d7eab1c76eac53aa5eab9af5ae4bef44d159855a0d4cdb609f085a58d878299390243cfde3bb9d9754d96ed316
6
+ metadata.gz: 9d2c88ef7f6a5ddaab7ba1e35b6e93c7fea274db9a1fddeaa066d070ec5a49fee3457ef882ced3303b5a5f55aeecdecf5cddccb5ecaf198049b2e770c0c23f91
7
+ data.tar.gz: 3ba760f88fc7e765d4d71e6381753859d0fe84731bd606cffc884f083db0a83e9d367694a3c38716101a227e96171117989eae91acbe9d378b225aeef54b1396
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.12.0] - 2018-08-27
6
+ ### Added
7
+ - AttributeConsumingService management
8
+
5
9
  ## [0.11.0] - 2018-08-23
6
10
  ### Changed
7
11
  - Use custom Saml2 library instead of ruby-saml gem
@@ -93,7 +97,8 @@
93
97
  - Coveralls Integration
94
98
  - Rubygems version badge in README
95
99
 
96
- [Unreleased]: https://github.com/italia/spid-ruby/compare/v0.11.0...HEAD
100
+ [Unreleased]: https://github.com/italia/spid-ruby/compare/v0.12.0...HEAD
101
+ [0.12.0]: https://github.com/italia/spid-ruby/compare/v0.11.0...v0.12.0
97
102
  [0.11.0]: https://github.com/italia/spid-ruby/compare/v0.10.0...v0.11.0
98
103
  [0.10.0]: https://github.com/italia/spid-ruby/compare/v0.9.0...v0.10.0
99
104
  [0.9.0]: https://github.com/italia/spid-ruby/compare/v0.8.0...v0.9.0
@@ -14,6 +14,8 @@ module Spid # :nodoc:
14
14
  class UnknownAuthnContextError < StandardError; end
15
15
  class UnknownDigestMethodError < StandardError; end
16
16
  class UnknownSignatureMethodError < StandardError; end
17
+ class UnknownAttributeFieldError < StandardError; end
18
+ class MissingAttributeServicesError < StandardError; end
17
19
 
18
20
  EXACT_COMPARISON = :exact
19
21
  MINIMUM_COMPARISON = :minimum
@@ -69,6 +71,26 @@ module Spid # :nodoc:
69
71
  L3
70
72
  ].freeze
71
73
 
74
+ ATTRIBUTES_MAP = {
75
+ spid_code: "spidCode",
76
+ name: "name",
77
+ family_name: "familyName",
78
+ place_of_birth: "placeOfBirth",
79
+ date_of_birth: "dateOfBirth",
80
+ gender: "gender",
81
+ company_name: "companyName",
82
+ registered_office: "registeredOffice",
83
+ fiscal_number: "fiscalNumber",
84
+ iva_code: "ivaCode",
85
+ id_card: "idCard",
86
+ mobile_phone: "mobilePhone",
87
+ email: "email",
88
+ address: "address",
89
+ digital_address: "digitalAddress"
90
+ }.freeze
91
+
92
+ ATTRIBUTES = ATTRIBUTES_MAP.keys.freeze
93
+
72
94
  class << self
73
95
  attr_writer :configuration
74
96
  end
@@ -13,14 +13,14 @@ module Spid
13
13
  attr_accessor :signature_method
14
14
  attr_accessor :private_key
15
15
  attr_accessor :certificate
16
- attr_accessor :attribute_service_name
17
16
  attr_accessor :default_relay_state_path
18
17
  attr_accessor :acs_binding
19
18
  attr_accessor :slo_binding
19
+ attr_accessor :attribute_services
20
20
 
21
21
  def initialize
22
22
  @idp_metadata_dir_path = "idp_metadata"
23
- @attribute_service_name = nil
23
+ @attribute_services = []
24
24
  init_endpoint
25
25
  init_bindings
26
26
  init_dig_sig_methods
@@ -60,7 +60,7 @@ module Spid
60
60
  slo_binding: slo_binding, metadata_path: metadata_path,
61
61
  private_key: private_key, certificate: certificate,
62
62
  digest_method: digest_method, signature_method: signature_method,
63
- attribute_service_name: attribute_service_name, host: hostname
63
+ attribute_services: attribute_services, host: hostname
64
64
  )
65
65
  end
66
66
  end
@@ -37,7 +37,8 @@ module Spid
37
37
  def sso_url
38
38
  Spid::Sso::Request.new(
39
39
  idp_name: idp_name,
40
- relay_state: relay_state
40
+ relay_state: relay_state,
41
+ attribute_index: attribute_consuming_service_index
41
42
  ).url
42
43
  end
43
44
 
@@ -57,6 +58,10 @@ module Spid
57
58
  def idp_name
58
59
  request.params["idp_name"]
59
60
  end
61
+
62
+ def attribute_consuming_service_index
63
+ request.params["attribute_index"] || "0"
64
+ end
60
65
  end
61
66
  end
62
67
  end
@@ -43,7 +43,8 @@ module Spid
43
43
  "Version" => "2.0",
44
44
  "IssueInstant" => issue_instant,
45
45
  "Destination" => settings.idp_sso_target_url,
46
- "AssertionConsumerServiceIndex" => settings.acs_index
46
+ "AssertionConsumerServiceIndex" => settings.acs_index,
47
+ "AttributeConsumingServiceIndex" => settings.attribute_index
47
48
  }
48
49
  attributes["ForceAuthn"] = true if settings.force_authn?
49
50
  attributes
@@ -15,7 +15,7 @@ module Spid
15
15
  attr_reader :certificate
16
16
  attr_reader :digest_method
17
17
  attr_reader :signature_method
18
- attr_reader :attribute_service_name
18
+ attr_reader :attribute_services
19
19
 
20
20
  # rubocop:disable Metrics/ParameterLists
21
21
  # rubocop:disable Metrics/MethodLength
@@ -30,7 +30,7 @@ module Spid
30
30
  certificate:,
31
31
  digest_method:,
32
32
  signature_method:,
33
- attribute_service_name:
33
+ attribute_services:
34
34
  )
35
35
  @host = host
36
36
  @acs_path = acs_path
@@ -42,7 +42,8 @@ module Spid
42
42
  @certificate = certificate
43
43
  @digest_method = digest_method
44
44
  @signature_method = signature_method
45
- @attribute_service_name = attribute_service_name
45
+ @attribute_services = attribute_services
46
+ validate_digest_methods
46
47
  validate_attributes
47
48
  end
48
49
  # rubocop:enable Metrics/MethodLength
@@ -63,6 +64,24 @@ module Spid
63
64
  private
64
65
 
65
66
  def validate_attributes
67
+ if attribute_services.empty?
68
+ raise MissingAttributeServicesError,
69
+ "Provide at least one attribute service"
70
+ elsif attribute_services.any? { |as| !validate_attribute_service(as) }
71
+ raise UnknownAttributeFieldError,
72
+ "Provided attribute in services are not valid:" \
73
+ " use only fields in #{ATTRIBUTES.join(', ')}"
74
+ end
75
+ end
76
+
77
+ def validate_attribute_service(attribute_service)
78
+ return false unless attribute_service.key?(:name)
79
+ return false unless attribute_service.key?(:fields)
80
+ not_valid_fields = attribute_service[:fields] - ATTRIBUTES
81
+ not_valid_fields.empty?
82
+ end
83
+
84
+ def validate_digest_methods
66
85
  if !DIGEST_METHODS.include?(digest_method)
67
86
  raise UnknownDigestMethodError,
68
87
  "Provided digest method is not valid:" \
@@ -8,9 +8,16 @@ module Spid
8
8
  attr_reader :identity_provider
9
9
  attr_reader :service_provider
10
10
  attr_reader :authn_context
11
-
12
- def initialize(identity_provider:, service_provider:, authn_context: nil)
11
+ attr_reader :attribute_index
12
+
13
+ def initialize(
14
+ identity_provider:,
15
+ service_provider:,
16
+ attribute_index: nil,
17
+ authn_context: nil
18
+ )
13
19
  @authn_context = authn_context || Spid::L1
20
+ @attribute_index = attribute_index
14
21
  unless AUTHN_CONTEXTS.include?(@authn_context)
15
22
  raise Spid::UnknownAuthnContextError,
16
23
  "Provided authn_context '#{@authn_context}' is not valid:" \
@@ -53,6 +60,10 @@ module Spid
53
60
  service_provider.slo_binding
54
61
  end
55
62
 
63
+ def sp_attribute_services
64
+ service_provider.attribute_services
65
+ end
66
+
56
67
  def private_key
57
68
  service_provider.private_key
58
69
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Spid
4
4
  module Saml2
5
+ # rubocop:disable Metrics/ClassLength
5
6
  class SPMetadata # :nodoc:
6
7
  attr_reader :document
7
8
  attr_reader :settings
@@ -37,6 +38,8 @@ module Spid
37
38
  }
38
39
  end
39
40
 
41
+ # rubocop:disable Metrics/MethodLength
42
+ # rubocop:disable Metrics/AbcSize
40
43
  def sp_sso_descriptor
41
44
  @sp_sso_descriptor ||=
42
45
  begin
@@ -45,9 +48,41 @@ module Spid
45
48
  element.add_element key_descriptor
46
49
  element.add_element ac_service
47
50
  element.add_element slo_service
51
+ settings.sp_attribute_services.each.with_index do |service, index|
52
+ name = service[:name]
53
+ fields = service[:fields]
54
+ element.add_element attribute_consuming_service(
55
+ index, name, fields
56
+ )
57
+ end
48
58
  element
49
59
  end
50
60
  end
61
+ # rubocop:enable Metrics/AbcSize
62
+ # rubocop:enable Metrics/MethodLength
63
+
64
+ def attribute_consuming_service(index, name, fields)
65
+ element = REXML::Element.new("md:AttributeConsumingService")
66
+ element.add_attributes("index" => index)
67
+ element.add_element service_name(name)
68
+ fields.each do |field|
69
+ element.add_element requested_attribute(field)
70
+ end
71
+ element
72
+ end
73
+
74
+ def service_name(name)
75
+ element = REXML::Element.new("md:ServiceName")
76
+ element.add_attributes("xml:lang" => "it")
77
+ element.text = name
78
+ element
79
+ end
80
+
81
+ def requested_attribute(name)
82
+ element = REXML::Element.new("md:RequestedAttribute")
83
+ element.add_attributes("Name" => ATTRIBUTES_MAP[name])
84
+ element
85
+ end
51
86
 
52
87
  def sp_sso_descriptor_attributes
53
88
  @sp_sso_descriptor_attributes ||= {
@@ -100,5 +135,6 @@ module Spid
100
135
  end
101
136
  end
102
137
  end
138
+ # rubocop:enable Metrics/ClassLength
103
139
  end
104
140
  end
@@ -5,17 +5,20 @@ module Spid
5
5
  class Request # :nodoc:
6
6
  attr_reader :idp_name
7
7
  attr_reader :relay_state
8
+ attr_reader :attribute_index
8
9
  attr_reader :authn_context
9
10
  attr_reader :authn_context_comparison
10
11
 
11
12
  def initialize(
12
13
  idp_name:,
14
+ attribute_index:,
13
15
  relay_state: nil,
14
16
  authn_context: nil
15
17
  )
16
18
  @idp_name = idp_name
17
19
  @relay_state = relay_state
18
20
  @authn_context = authn_context || Spid::L1
21
+ @attribute_index = attribute_index
19
22
  @relay_state =
20
23
  begin
21
24
  relay_state || Spid.configuration.default_relay_state_path
@@ -53,7 +56,8 @@ module Spid
53
56
  @settings ||= Spid::Saml2::Settings.new(
54
57
  identity_provider: identity_provider,
55
58
  service_provider: service_provider,
56
- authn_context: authn_context
59
+ authn_context: authn_context,
60
+ attribute_index: attribute_index
57
61
  )
58
62
  end
59
63
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Spid
4
- VERSION = "0.11.0"
4
+ VERSION = "0.12.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Librera
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-23 00:00:00.000000000 Z
11
+ date: 2018-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport