saml_tools 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- M2Q5NTdiZmZmM2FkZTAwNDE4MTg5OTczNWEyODA5ZDNmOTE5ZmMzOQ==
5
- data.tar.gz: !binary |-
6
- ZjE1NGRlYzdhMmQzZDg4N2ZiMTZlY2RkZGFjZWViMDNlOWJkOWI5Ng==
2
+ SHA1:
3
+ metadata.gz: cca6a06834de7176a2a91089e9fc3faf3bb67f86
4
+ data.tar.gz: a922aa5824ce9cf41cb5c044284559f61777aac4
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- ZjkwNjQyOTQxNTA4YjAwNmJjZDJjMzBiMTBhZGYxZWYzZDhmNzAzMmI0ZjZh
10
- NTNlNzY4ODM0MDZmNjg0MGRkOTdhMDIxYjEwYWRhNjUyMTBmZDRlMjNkNGM4
11
- NzQ2OThjZDcxN2NmNjVkZTM1MTFhNDZjMzk5OGIzN2RlOWI3ODE=
12
- data.tar.gz: !binary |-
13
- ZWY0OTc2Y2JiODhlYjIwYjdmY2Y2ZDhkM2Y4MjEzYThiMDAxY2YyNWNmODBl
14
- ZjVlNWMxZWVlOWM3NTc1YjZkNjM1ZmQyODQxNjE5YzQ4M2UxZTMzOTUxOWIw
15
- YWUwNjg2ZDk3MDNiNDg5NjFmMmRhYzA4Y2Y4NDVlNWYyNDI2MDI=
6
+ metadata.gz: 4d61deec4411bd06cabef1f18ba17a794888eece5581ac6dda4ab92d15c77d42f0a4c3d0917ffe6e63dab394bb20365ef966d6476394f3864d41168c53daa62c
7
+ data.tar.gz: 6ba8be4feae23224a20a9e4d5ad712a78f92ab326368959dba893a7980414a15c8a63052eabc466cc914ae26be1b823753744e35eefc70ae25b05e637b641929
@@ -1,6 +1,10 @@
1
1
  =SAML Tools
2
2
 
3
- Tools to simplify the creation, validation and sending of SAML objects
3
+ Tools to simplify the creation, validation and sending of SAML objects.
4
+
5
+ These tools are available as a gem:
6
+
7
+ gem 'saml_tools'
4
8
 
5
9
  == SamlTool::Certificate
6
10
  Version of OpenSSL::X509::Certificate that adds methods to simplify the retrieval
@@ -62,4 +66,19 @@ Compares documents with SAML schemas to test if they have a valid structure.
62
66
  == Further reading
63
67
 
64
68
  I've {blogged here}[http://undervale.co.uk/blog/?p=490] about some of highs and
65
- lows of building these tools.
69
+ lows of building these tools.
70
+
71
+ There is a demo app that I have been working with as I've developed these tools:
72
+
73
+ https://github.com/warwickshire/saml_tools_demo
74
+
75
+ This work has been greatly influenced by:
76
+
77
+ * https://github.com/onelogin/ruby-saml
78
+ * https://onelogin.zendesk.com/hc/en-us/articles/201175674-SAML-toolkit-for-Ruby-on-Rails
79
+ * http://samltool-j.appspot.com/saml_demo.jsp
80
+ * https://www.oasis-open.org/committees/documents.php?wg_abbrev=security
81
+ * http://en.wikipedia.org/wiki/SAML_2.0
82
+ * https://github.com/lawrencepit/ruby-saml-idp
83
+ * http://users.dcc.uchile.cl/~pcamacho/tutorial/web/xmlsec/xmlsec.html
84
+ * https://github.com/digidentity/libsaml
@@ -1,27 +1,28 @@
1
-
1
+ # Version of OpenSSL::X509::Certificate that adds methods to simplify the retrieval
2
+ # of data used in SAML responses.
2
3
  module SamlTool
3
4
  class Certificate < OpenSSL::X509::Certificate
4
-
5
+
5
6
  alias_method :serial_number, :serial
6
-
7
+
7
8
  def without_leading_and_trailing_labels
8
9
  to_s.lines.to_a[1..-2].join
9
10
  end
10
11
  alias_method :x509_certificate, :without_leading_and_trailing_labels
11
-
12
+
12
13
  def issuer_name
13
14
  @issuer_name ||= slash_list_to_comma_list(issuer)
14
15
  end
15
-
16
+
16
17
  def subject_name
17
18
  @subject_name ||= slash_list_to_comma_list(subject)
18
19
  end
19
-
20
+
20
21
  def slash_list_to_comma_list(string)
21
22
  string = string.to_s
22
23
  string = string[1..-1] if string[0] == '/'
23
24
  string.split('/').reverse.join(',')
24
25
  end
25
-
26
+
26
27
  end
27
28
  end
@@ -1,4 +1,4 @@
1
-
1
+ # Decodes base64 and unzips content.
2
2
  module SamlTool
3
3
  class Decoder
4
4
  attr_reader :saml
@@ -1,4 +1,4 @@
1
-
1
+ # Zips content and base64 encodes it.
2
2
  module SamlTool
3
3
  class Encoder
4
4
  attr_reader :saml
@@ -1,7 +1,16 @@
1
1
  require 'erb'
2
+
3
+ # Used to build SAML content from erb templates.
4
+ #
5
+ # output = SamlTool::ErbBuilder.build(
6
+ # template: '<foo><%= settings %></foo>',
7
+ # settings: 'bar'
8
+ # )
9
+ # output == '<foo>bar</foo>'
10
+ #
2
11
  module SamlTool
3
12
  class ErbBuilder
4
-
13
+
5
14
  attr_reader :args, :settings, :template
6
15
 
7
16
  def self.build(args)
@@ -1,4 +1,12 @@
1
-
1
+ # Wraps SAML documents and exposes data via methods
2
+ #
3
+ # output == '<foo>bar</foo>'
4
+ # reader = SamlTool::Reader.new(
5
+ # output,
6
+ # {foo: '//foo/text()'}
7
+ # )
8
+ # reader.foo == 'bar'
9
+ #
2
10
  module SamlTool
3
11
  class Reader
4
12
  attr_reader :saml, :config, :namespaces
@@ -23,12 +31,12 @@ module SamlTool
23
31
  instance_variable_set("@#{key}".to_sym, content)
24
32
  end
25
33
  end
26
-
34
+
27
35
  # A string with memory of the element that was the source of its content.
28
36
  # Typically, the source will be a Nokogiri::XML::NodeSet. So:
29
37
  # content --> text from an element.
30
38
  # content.source --> the Nokogiri NodeSet the text was extracted from.
31
- class Content < String
39
+ class Content < String
32
40
  attr_reader :source
33
41
  def initialize(source)
34
42
  @source = source
@@ -1,5 +1,16 @@
1
1
  require 'uri'
2
2
  require 'cgi'
3
+
4
+ # Used to construct redirection uris
5
+ #
6
+ # redirect = Redirect.uri(
7
+ # to: 'http://example.com',
8
+ # data: {
9
+ # foo: 'bar'
10
+ # }
11
+ # )
12
+ # redirect == "http://example.com?foo=bar"
13
+ #
3
14
  module SamlTool
4
15
 
5
16
  class Redirect
@@ -1,8 +1,11 @@
1
1
  require "openssl"
2
2
 
3
+ # A version of SamlTool::Reader tailored for handling SAML responses. It includes
4
+ # a valid? method that validates the SAML structure and checks the signature is
5
+ # correct.
3
6
  module SamlTool
4
7
  class ResponseReader < Reader
5
-
8
+
6
9
  # On creation, the keys for this hash will be converted into methods that
7
10
  # will return the text gathered at the xpath in the matching value.
8
11
  def default_config
@@ -17,9 +20,9 @@ module SamlTool
17
20
  signature_algorithm: '//ds:SignatureMethod/@Algorithm',
18
21
  signed_info: '//ds:SignedInfo'
19
22
  }
20
- end
21
-
22
- def initialize(saml, config = {}, namespaces = {})
23
+ end
24
+
25
+ def initialize(saml, config = {}, namespaces = {})
23
26
  super(
24
27
  saml,
25
28
  config.merge(default_config),
@@ -27,6 +30,21 @@ module SamlTool
27
30
  )
28
31
  end
29
32
 
33
+ def attribute_names
34
+ @attribute_names ||= saml.xpath("//saml:Attribute/@Name").collect(&:value)
35
+ end
36
+
37
+ # A hash with the attribute names as keys, and the matching attribute value content as values.
38
+ # Note that if the same Name is assigned to more than one attribute or an attribute contains more than
39
+ # one value, then the value for that key will be an array.
40
+ def attributes
41
+ @attributes ||= attribute_names.inject({}) do |hash, name|
42
+ attribute_values = saml.xpath("//saml:Attribute[@Name='#{name}']/saml:AttributeValue/text()")
43
+ hash[name] = attribute_values.length > 1 ? attribute_values.collect(&:to_s) : attribute_values.to_s
44
+ hash
45
+ end
46
+ end
47
+
30
48
  def valid?
31
49
  structurally_valid? && signature_verified? && digests_match?
32
50
  end
@@ -46,19 +64,19 @@ module SamlTool
46
64
  def digests_match?
47
65
  digest_hash == decoded_digest_value
48
66
  end
49
-
67
+
50
68
  def signatureless
51
69
  @signatureless ||= clone_saml_and_remove_signature
52
70
  end
53
-
71
+
54
72
  def certificate
55
73
  @certificate ||= OpenSSL::X509::Certificate.new(raw_cert)
56
74
  end
57
-
75
+
58
76
  def raw_cert
59
77
  @raw_cert ||= Base64.decode64(base64_cert)
60
78
  end
61
-
79
+
62
80
  def fingerprint
63
81
  @fingerprint ||= Digest::SHA1.hexdigest(certificate.to_der)
64
82
  end
@@ -66,7 +84,7 @@ module SamlTool
66
84
  def signature
67
85
  @signature ||= Base64.decode64(signature_value)
68
86
  end
69
-
87
+
70
88
  def canonicalization_algorithm
71
89
  case canonicalization_method
72
90
  when "http://www.w3.org/TR/2001/REC-xml-c14n-20010315" then Nokogiri::XML::XML_C14N_1_0
@@ -74,14 +92,14 @@ module SamlTool
74
92
  else Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0
75
93
  end
76
94
  end
77
-
95
+
78
96
  def hashed_element
79
97
  @hashed_element ||= signatureless.at_xpath("//*[@ID='#{reference_uri[1..-1]}']")
80
98
  end
81
-
99
+
82
100
  def canonicalized_hashed_element
83
101
  hashed_element.canonicalize(
84
- canonicalization_algorithm,
102
+ canonicalization_algorithm,
85
103
  inclusive_namespaces.split(' ')
86
104
  )
87
105
  end
@@ -96,7 +114,7 @@ module SamlTool
96
114
  def signed_info_element
97
115
  signed_info.source.first
98
116
  end
99
-
117
+
100
118
  def digest_algorithm_class
101
119
  @digest_algorithm_class ||= determine_algorithm_class(digest_algorithm)
102
120
  end
@@ -104,7 +122,7 @@ module SamlTool
104
122
  def signature_algorithm_class
105
123
  @signature_algorithm_class ||= determine_algorithm_class(signature_algorithm)
106
124
  end
107
-
125
+
108
126
  def determine_algorithm_class(method_text)
109
127
  case method_text.slice(/sha(\d+)\s*$/, 1)
110
128
  when '256' then OpenSSL::Digest::SHA256
@@ -114,11 +132,11 @@ module SamlTool
114
132
  OpenSSL::Digest::SHA1
115
133
  end
116
134
  end
117
-
135
+
118
136
  def digest_hash
119
137
  @digest_hash ||= digest_algorithm_class.digest(canonicalized_hashed_element)
120
138
  end
121
-
139
+
122
140
  def decoded_digest_value
123
141
  Base64.decode64(digest_value)
124
142
  end
@@ -128,18 +146,18 @@ module SamlTool
128
146
  cloned_saml.xpath('//ds:Signature', namespaces).remove
129
147
  return SamlTool::SAML(cloned_saml.to_s)
130
148
  end
131
-
149
+
132
150
  def default_namespaces
133
151
  {
134
152
  ds: dsig,
135
153
  ec: c14m
136
154
  }
137
155
  end
138
-
156
+
139
157
  def c14m
140
158
  'http://www.w3.org/2001/10/xml-exc-c14n#'
141
159
  end
142
-
160
+
143
161
  def dsig
144
162
  'http://www.w3.org/2000/09/xmldsig#'
145
163
  end
@@ -1,11 +1,12 @@
1
-
1
+ # Version of OpenSSL::PKey::RSA that adds methods to simplify the retrieval
2
+ # of data used in SAML responses.
2
3
  module SamlTool
3
4
  class RsaKey < OpenSSL::PKey::RSA
4
-
5
+
5
6
  def modulus
6
7
  Base64.encode64(n.to_s(2))
7
8
  end
8
-
9
+
9
10
  def exponent
10
11
  Base64.encode64(e.to_s(2))
11
12
  end
@@ -7,24 +7,24 @@ module SamlTool
7
7
  SAML::Document.parse(thing, url, encoding, options, &block)
8
8
  end
9
9
  end
10
-
10
+
11
11
  # A wrapper for Nokogiri::XML, that applies defaults that are appropriate for SAML
12
12
  module SAML
13
-
13
+
14
14
  class ParseOptions < Nokogiri::XML::ParseOptions
15
15
  DEFAULT_SAML = STRICT
16
16
  end
17
-
17
+
18
18
  class Document < Nokogiri::XML::Document
19
19
  def self.parse string_or_io, url = nil, encoding = nil, options = ParseOptions::DEFAULT_SAML, &block
20
20
  super
21
21
  end
22
22
  end
23
-
23
+
24
24
  # Parse XML. Convenience method for Nokogiri::XML::Document.parse
25
25
  def self.parse thing, url = nil, encoding = nil, options = ParseOptions::DEFAULT_SAML, &block
26
26
  Document.parse(thing, url, encoding, options, &block)
27
27
  end
28
-
28
+
29
29
  end
30
30
  end
@@ -1,5 +1,6 @@
1
1
  require 'securerandom'
2
2
  require 'time'
3
+ # Packages up settings so that they can be more easily passed to other objects.
3
4
  module SamlTool
4
5
  class Settings < Hashie::Mash
5
6
 
@@ -10,12 +11,12 @@ module SamlTool
10
11
  def issue_instance
11
12
  fetch :issue_instance, auto_issue_instance
12
13
  end
13
-
14
+
14
15
  private
15
16
  def auto_uuid
16
17
  @auto_uuid ||= ('_' + SecureRandom.uuid)
17
18
  end
18
-
19
+
19
20
  def auto_issue_instance
20
21
  @auto_issue_instance ||= Time.now.utc.iso8601
21
22
  end
@@ -1,10 +1,11 @@
1
+ # Compares documents with SAML schemas to test if they have a valid structure.
1
2
  module SamlTool
2
3
  class Validator
3
4
  attr_reader :saml
4
5
  def initialize(saml)
5
6
  @saml = saml
6
7
  end
7
-
8
+
8
9
  def valid?
9
10
  validate
10
11
  errors.empty?
@@ -1,8 +1,10 @@
1
1
  module SamlTool
2
- VERSION = '0.0.1'
2
+ VERSION = '0.1.0'
3
3
  end
4
4
 
5
5
  # History
6
6
  # =======
7
7
  #
8
+ # 0.1.0 - Adds facility to retrieve SAML attributes as a hash via ResponseReader
9
+ #
8
10
  # 0.0.1 - First build
@@ -0,0 +1,30 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <samlp:Response xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
3
+ xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
4
+ ID="GOSAMLR12901174571794"
5
+ Version="2.0"
6
+ IssueInstant="issue_instance"
7
+ Destination="{recipient}">
8
+ <saml:Assertion xmlns:xs="http://www.w3.org/2001/XMLSchema"
9
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10
+ Version="2.0"
11
+ ID="GOSAMLR12901174571794">
12
+ <saml:AttributeStatement>
13
+ <saml:Attribute Name="One">
14
+ <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
15
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
16
+ xsi:type="xs:string">1</saml:AttributeValue>
17
+ </saml:Attribute>
18
+ <saml:Attribute Name="Two">
19
+ <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
20
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
21
+ xsi:type="xs:string">2</saml:AttributeValue>
22
+ </saml:Attribute>
23
+ <saml:Attribute Name="Three">
24
+ <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
25
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
26
+ xsi:type="xs:string">3</saml:AttributeValue>
27
+ </saml:Attribute>
28
+ </saml:AttributeStatement>
29
+ </saml:Assertion>
30
+ </samlp:Response>
@@ -5,7 +5,7 @@ require 'minitest/autorun'
5
5
  require 'saml_tool'
6
6
 
7
7
  class Minitest::Test
8
-
8
+
9
9
  def valid_xml
10
10
  '<foo>bar</foo>'
11
11
  end
@@ -21,25 +21,29 @@ class Minitest::Test
21
21
  def request_saml_erb
22
22
  contents_of 'files/request.saml.erb'
23
23
  end
24
-
24
+
25
25
  def response_xml
26
26
  contents_of 'files/response.xml'
27
27
  end
28
-
28
+
29
29
  def open_saml_request
30
30
  contents_of 'files/open_saml_response.xml'
31
31
  end
32
-
32
+
33
+ def response_simple_attributes
34
+ contents_of 'files/response_simple_attributes.xml'
35
+ end
36
+
33
37
  def x509_certificate
34
38
  @x509_certificate ||= OpenSSL::PKCS12.new(
35
- contents_of('files/usercert.p12'),
39
+ contents_of('files/usercert.p12'),
36
40
  'hello'
37
41
  ).certificate
38
42
  end
39
-
43
+
40
44
  def open_ssl_rsa_key
41
45
  @open_ssl_rsa_key ||= OpenSSL::PKey::RSA.new(
42
- contents_of('files/userkey.pem'),
46
+ contents_of('files/userkey.pem'),
43
47
  'hello'
44
48
  )
45
49
  end
@@ -2,85 +2,85 @@ require_relative '../../test_helper'
2
2
 
3
3
  module SamlTool
4
4
  class ResponseReaderTest < Minitest::Test
5
-
5
+
6
6
  def test_saml
7
7
  assert_kind_of SAML::Document, response_document.saml
8
8
  end
9
-
9
+
10
10
  def test_signatureless
11
11
  assert_kind_of SAML::Document, response_document.signatureless
12
12
  expected = response_document.saml.clone
13
13
  expected.xpath('//ds:Signature', { 'ds' => dsig }).remove
14
14
  assert_equal expected.to_s, response_document.signatureless.to_s
15
15
  end
16
-
16
+
17
17
  def test_signatureless_does_not_impact_saml
18
18
  response_document.signatureless
19
19
  assert response_document.saml.to_s != response_document.signatureless.to_s, 'Changes made in forming signatureless should not also happen to saml'
20
20
  end
21
-
21
+
22
22
  def test_base64_cert
23
23
  base64_cert = response_document_saml.xpath('//ds:X509Certificate/text()', { 'ds' => dsig })
24
24
  assert_equal base64_cert.to_s, response_document.base64_cert
25
25
  end
26
-
26
+
27
27
  def test_certificate
28
28
  assert_kind_of OpenSSL::X509::Certificate, response_document.certificate
29
29
  end
30
-
30
+
31
31
  def test_fingerprint
32
32
  expected = Digest::SHA1.hexdigest(response_document.certificate.to_der)
33
33
  assert_equal expected, response_document.fingerprint
34
34
  end
35
-
35
+
36
36
  def test_canonicalization_method
37
37
  expected = response_document_saml.xpath('//ds:CanonicalizationMethod/@Algorithm', { 'ds' => dsig })
38
38
  assert_equal expected.to_s, response_document.canonicalization_method
39
39
  end
40
-
40
+
41
41
  def test_canonicalization_algorithm
42
42
  expected = Nokogiri::XML::XML_C14N_1_0
43
43
  assert_equal expected, response_document.canonicalization_algorithm
44
44
  end
45
-
45
+
46
46
  def test_reference_uri
47
47
  expected = response_document_saml.xpath('//ds:Reference/@URI', { 'ds' => dsig })
48
48
  assert_equal expected.to_s, response_document.reference_uri
49
49
  end
50
-
50
+
51
51
  def test_inclusive_namespaces
52
52
  assert_equal "", response_document.inclusive_namespaces
53
53
  end
54
-
54
+
55
55
  def test_inclusive_namespaces_when_they_exist_in_saml
56
56
  document = ResponseReader.new(open_saml_request)
57
57
  assert_equal 'xs', document.inclusive_namespaces
58
58
  end
59
-
59
+
60
60
  def test_hashed_element
61
61
  remove_signature_from_assertion
62
62
  assert_equal assertion.to_s, response_document.hashed_element.to_s
63
63
  end
64
-
64
+
65
65
  def test_canonicalized_hashed_element
66
66
  remove_signature_from_assertion
67
67
  expected = assertion.canonicalize(Nokogiri::XML::XML_C14N_1_0, [])
68
68
  assert_equal expected, response_document.canonicalized_hashed_element
69
69
  end
70
-
70
+
71
71
  def test_digest_algorithm
72
72
  assert_equal 'http://www.w3.org/2000/09/xmldsig#sha1', response_document.digest_algorithm
73
73
  end
74
-
74
+
75
75
  def test_digest_algorithm_class
76
76
  assert_equal OpenSSL::Digest::SHA1, response_document.digest_algorithm_class
77
77
  end
78
-
78
+
79
79
  def test_digest_hash
80
80
  expected = OpenSSL::Digest::SHA1.digest(response_document.canonicalized_hashed_element)
81
81
  assert_equal expected, response_document.digest_hash
82
82
  end
83
-
83
+
84
84
  def test_digest_hash_matches_digest_value
85
85
  assert_equal response_document.digest_hash, response_document.decoded_digest_value
86
86
  end
@@ -112,6 +112,22 @@ module SamlTool
112
112
  assert_equal true, response_document.structurally_valid?
113
113
  end
114
114
 
115
+ def test_attribute_names
116
+ with_simple_attributes
117
+ assert_equal %w{One Two Three}, response_document.attribute_names
118
+ end
119
+
120
+ def test_attributes
121
+ with_simple_attributes
122
+ expected = {'One' => '1', 'Two' => '2', 'Three' => '3'}
123
+ assert_equal expected, response_document.attributes
124
+ end
125
+
126
+ def test_attributes_with_complicated_structure
127
+ expected = {"uid"=>"demo", "another_value"=>["value1", "value2"], "role"=>["role1", "role2"]}
128
+ assert_equal expected, response_document.attributes
129
+ end
130
+
115
131
  def test_valid
116
132
  assert_equal true, response_document.valid?
117
133
  end
@@ -119,26 +135,30 @@ module SamlTool
119
135
  def response_document
120
136
  @response_document ||= ResponseReader.new(response_xml)
121
137
  end
122
-
138
+
139
+ def with_simple_attributes
140
+ @response_document = ResponseReader.new(response_simple_attributes)
141
+ end
142
+
123
143
  def assertion
124
144
  @assertion ||= response_document_saml.at_xpath('//saml:Assertion')
125
145
  end
126
-
146
+
127
147
  def remove_signature_from_assertion
128
148
  assertion.xpath('//ds:Signature', { 'ds' => dsig }).remove
129
149
  end
130
-
150
+
131
151
  def response_document_saml
132
152
  @response_document_saml ||= SamlTool::SAML(response_xml)
133
153
  end
134
-
154
+
135
155
  def c14m
136
156
  'http://www.w3.org/2001/10/xml-exc-c14n#'
137
157
  end
138
-
158
+
139
159
  def dsig
140
160
  'http://www.w3.org/2000/09/xmldsig#'
141
161
  end
142
-
162
+
143
163
  end
144
164
  end
metadata CHANGED
@@ -1,77 +1,77 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saml_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Nichols
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-19 00:00:00.000000000 Z
11
+ date: 2016-09-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: hashie
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: xmldsig
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: minitest
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '5.1'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '5.1'
69
- description: ! ' SAML 2.0 is an XML-based protocol that uses security tokens containing
69
+ description: " SAML 2.0 is an XML-based protocol that uses security tokens containing
70
70
  assertions to pass information about a principal (usually an end user) between a
71
71
  SAML authority, that is, an identity provider, and a SAML consumer, that is, a service
72
72
  provider. SAML 2.0 enables web-based authentication and authorization scenarios
73
73
  including cross-domain single sign-on (SSO), which helps reduce the administrative
74
- overhead of distributing multiple authentication tokens to the user.'
74
+ overhead of distributing multiple authentication tokens to the user."
75
75
  email:
76
76
  - rob@undervale.co.uk
77
77
  executables: []
@@ -104,6 +104,7 @@ files:
104
104
  - test/files/open_saml_response.xml
105
105
  - test/files/request.saml.erb
106
106
  - test/files/response.xml
107
+ - test/files/response_simple_attributes.xml
107
108
  - test/files/response_template.xml
108
109
  - test/files/usercert.p12
109
110
  - test/files/userkey.pem
@@ -130,39 +131,40 @@ require_paths:
130
131
  - lib
131
132
  required_ruby_version: !ruby/object:Gem::Requirement
132
133
  requirements:
133
- - - ! '>='
134
+ - - ">="
134
135
  - !ruby/object:Gem::Version
135
136
  version: '0'
136
137
  required_rubygems_version: !ruby/object:Gem::Requirement
137
138
  requirements:
138
- - - ! '>='
139
+ - - ">="
139
140
  - !ruby/object:Gem::Version
140
141
  version: '0'
141
142
  requirements: []
142
143
  rubyforge_project:
143
- rubygems_version: 2.2.2
144
+ rubygems_version: 2.5.1
144
145
  signing_key:
145
146
  specification_version: 4
146
147
  summary: Tools to simplify the creation, validation and sending of SAML objects
147
148
  test_files:
148
149
  - test/files/TEST_FILES.rdoc
149
- - test/files/response.xml
150
- - test/files/valid_saml_request.xml
151
150
  - test/files/open_saml_response.xml
152
- - test/files/response_template.xml
151
+ - test/files/response_simple_attributes.xml
153
152
  - test/files/usercert.p12
154
- - test/files/request.saml.erb
155
- - test/files/cacert.pem
156
153
  - test/files/userkey.pem
157
- - test/units/saml_tool/validator_test.rb
158
- - test/units/saml_tool/reader_test.rb
154
+ - test/files/cacert.pem
155
+ - test/files/valid_saml_request.xml
156
+ - test/files/response_template.xml
157
+ - test/files/request.saml.erb
158
+ - test/files/response.xml
159
159
  - test/units/saml_tool/response_reader_test.rb
160
- - test/units/saml_tool/saml_test.rb
161
160
  - test/units/saml_tool/erb_builder_test.rb
162
- - test/units/saml_tool/redirect_test.rb
163
- - test/units/saml_tool/rsa_key_test.rb
164
- - test/units/saml_tool/certificate_test.rb
161
+ - test/units/saml_tool/saml_test.rb
165
162
  - test/units/saml_tool/encoder_test.rb
166
- - test/units/saml_tool/decoder_test.rb
163
+ - test/units/saml_tool/reader_test.rb
164
+ - test/units/saml_tool/certificate_test.rb
165
+ - test/units/saml_tool/validator_test.rb
166
+ - test/units/saml_tool/redirect_test.rb
167
167
  - test/units/saml_tool/settings_test.rb
168
+ - test/units/saml_tool/decoder_test.rb
169
+ - test/units/saml_tool/rsa_key_test.rb
168
170
  - test/test_helper.rb