information_card 0.1.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.
- data/CHANGELOG +2 -0
- data/LICENSE +27 -0
- data/README +45 -0
- data/Rakefile +35 -0
- data/lib/information_card.rb +10 -0
- data/lib/information_card/certificate_util.rb +17 -0
- data/lib/information_card/claim_types.rb +43 -0
- data/lib/information_card/config.rb +52 -0
- data/lib/information_card/decrypter.rb +53 -0
- data/lib/information_card/identity_token.rb +23 -0
- data/lib/information_card/invalid_token.rb +8 -0
- data/lib/information_card/namespaces.rb +7 -0
- data/lib/information_card/processor.rb +15 -0
- data/lib/information_card/saml_token.rb +212 -0
- data/lib/information_card/xml_canonicalizer.rb +95 -0
- data/test/certificate_util_test.rb +21 -0
- data/test/claim_types_test.rb +39 -0
- data/test/decrypter_test.rb +12 -0
- data/test/fixtures/certificates/test.crt +14 -0
- data/test/fixtures/certificates/test.key +15 -0
- data/test/fixtures/encrypted_information_cards/jack_deer.xml +1 -0
- data/test/fixtures/encrypted_information_cards/john_smith.xml +1 -0
- data/test/fixtures/saml_tokens/jack_deer.xml +1 -0
- data/test/fixtures/saml_tokens/john_smith.xml +1 -0
- data/test/processor_test.rb +34 -0
- data/test/saml_token_test.rb +165 -0
- data/test/test_helper.rb +73 -0
- data/test/xml_canonicalizer_test.rb +188 -0
- metadata +78 -0
@@ -0,0 +1,188 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class XmlCanonicalizerTest < Test::Unit::TestCase
|
4
|
+
include InformationCard
|
5
|
+
|
6
|
+
INPUT_SAML_ASSERTION =
|
7
|
+
%(<saml:Assertion AssertionID="uuid:324e84c9-29bc-46a5-8775-3efdc6af7312"
|
8
|
+
IssueInstant="2007-04-12T22:44:02.734Z"
|
9
|
+
xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
|
10
|
+
MinorVersion="1"
|
11
|
+
Issuer="http://schemas.xmlsoap.org/ws/2005/05/identity/issuer/self"
|
12
|
+
MajorVersion="1">
|
13
|
+
<saml:Conditions NotBefore="2007-04-12T22:44:02.734Z" NotOnOrAfter="2007-04-12T23:44:02.734Z">
|
14
|
+
<saml:AudienceRestrictionCondition>
|
15
|
+
<saml:Audience>https://informationcardruby.com/</saml:Audience>
|
16
|
+
</saml:AudienceRestrictionCondition>
|
17
|
+
</saml:Conditions>
|
18
|
+
<saml:AttributeStatement>
|
19
|
+
<saml:Subject>
|
20
|
+
<saml:SubjectConfirmation>
|
21
|
+
<saml:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</saml:ConfirmationMethod>
|
22
|
+
</saml:SubjectConfirmation>
|
23
|
+
</saml:Subject>
|
24
|
+
<saml:Attribute AttributeName="givenname" AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
|
25
|
+
<saml:AttributeValue>John</saml:AttributeValue>
|
26
|
+
</saml:Attribute>
|
27
|
+
<saml:Attribute AttributeName="surname" AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
|
28
|
+
<saml:AttributeValue>Smith</saml:AttributeValue>
|
29
|
+
</saml:Attribute>
|
30
|
+
<saml:Attribute AttributeName="emailaddress" AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
|
31
|
+
<saml:AttributeValue>jsmith@email.com</saml:AttributeValue>
|
32
|
+
</saml:Attribute>
|
33
|
+
<saml:Attribute AttributeName="privatepersonalidentifier" AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
|
34
|
+
<saml:AttributeValue>wA+KnezOWCMKX6LmVzSVF9b1im1iZaUVShLA2d+IZtg=</saml:AttributeValue>
|
35
|
+
</saml:Attribute>
|
36
|
+
</saml:AttributeStatement>
|
37
|
+
</saml:Assertion>
|
38
|
+
)
|
39
|
+
|
40
|
+
CANONICALIZED_SAML_ASSERTION =
|
41
|
+
%(<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" AssertionID="uuid:324e84c9-29bc-46a5-8775-3efdc6af7312" IssueInstant="2007-04-12T22:44:02.734Z" Issuer="http://schemas.xmlsoap.org/ws/2005/05/identity/issuer/self" MajorVersion="1" MinorVersion="1">
|
42
|
+
<saml:Conditions NotBefore="2007-04-12T22:44:02.734Z" NotOnOrAfter="2007-04-12T23:44:02.734Z">
|
43
|
+
<saml:AudienceRestrictionCondition>
|
44
|
+
<saml:Audience>https://informationcardruby.com/</saml:Audience>
|
45
|
+
</saml:AudienceRestrictionCondition>
|
46
|
+
</saml:Conditions>
|
47
|
+
<saml:AttributeStatement>
|
48
|
+
<saml:Subject>
|
49
|
+
<saml:SubjectConfirmation>
|
50
|
+
<saml:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</saml:ConfirmationMethod>
|
51
|
+
</saml:SubjectConfirmation>
|
52
|
+
</saml:Subject>
|
53
|
+
<saml:Attribute AttributeName="givenname" AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
|
54
|
+
<saml:AttributeValue>John</saml:AttributeValue>
|
55
|
+
</saml:Attribute>
|
56
|
+
<saml:Attribute AttributeName="surname" AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
|
57
|
+
<saml:AttributeValue>Smith</saml:AttributeValue>
|
58
|
+
</saml:Attribute>
|
59
|
+
<saml:Attribute AttributeName="emailaddress" AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
|
60
|
+
<saml:AttributeValue>jsmith@email.com</saml:AttributeValue>
|
61
|
+
</saml:Attribute>
|
62
|
+
<saml:Attribute AttributeName="privatepersonalidentifier" AttributeNamespace="http://schemas.xmlsoap.org/ws/2005/05/identity/claims">
|
63
|
+
<saml:AttributeValue>wA+KnezOWCMKX6LmVzSVF9b1im1iZaUVShLA2d+IZtg=</saml:AttributeValue>
|
64
|
+
</saml:Attribute>
|
65
|
+
</saml:AttributeStatement>
|
66
|
+
</saml:Assertion>)
|
67
|
+
|
68
|
+
|
69
|
+
def setup
|
70
|
+
@canonicalizer = XmlCanonicalizer.new
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_should_canonicalize_full_saml_assertion_as_element
|
74
|
+
signed_doc = REXML::Document.new(INPUT_SAML_ASSERTION)
|
75
|
+
signed_element = REXML::XPath.first(signed_doc, "saml:Assertion")
|
76
|
+
assert_equal CANONICALIZED_SAML_ASSERTION, @canonicalizer.canonicalize(signed_element)
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_should_canonicalize_full_saml_assertion_as_document
|
80
|
+
assert_xml CANONICALIZED_SAML_ASSERTION, INPUT_SAML_ASSERTION
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_should_convert_line_breaks
|
84
|
+
input = "<person>\n<name>John</name>\r\n<age>25</age>\r</person>"
|
85
|
+
expected = "<person>\n<name>John</name>\n<age>25</age>\n</person>"
|
86
|
+
assert_xml(expected, input)
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_should_normalize_white_space_between_attribute_values
|
90
|
+
input = "<person first=\"Dr. \t\tBob\" last=\"Smit\th\" phone=\"\t555\t 1234\"></person>"
|
91
|
+
expected = %(<person first="Dr. Bob" last="Smit h" phone="555 1234"></person>)
|
92
|
+
assert_xml(expected, input)
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_should_preserve_quote_within_node_text
|
96
|
+
input = "<person>Mr Bob's Wild Adventure</person>"
|
97
|
+
expected = "<person>Mr Bob's Wild Adventure</person>"
|
98
|
+
assert_xml(expected, input)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_should_preserve_quote_and_normalize_white_space_within_node_text
|
102
|
+
input = "<person>Mr Bob' s Wild Adventure</person>"
|
103
|
+
expected = "<person>Mr Bob' s Wild Adventure</person>"
|
104
|
+
assert_xml(expected, input)
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_should_double_quote_attribute_values
|
108
|
+
input = "<product id='1234' name=\"turbine\" xlmns='http://namespace'></product>"
|
109
|
+
expected = %(<product id="1234" name="turbine" xlmns="http://namespace"></product>)
|
110
|
+
assert_xml(expected, input)
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_should_replace_special_character_quote_in_attribute_values
|
114
|
+
input = "<person first='John Smith \"JS\"'></person>"
|
115
|
+
expected = %(<person first="John Smith "JS""></person>)
|
116
|
+
assert_xml(expected, input)
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_should_replace_special_character_amp_in_attribute_values
|
120
|
+
input = "<product company=\"Smith & Smith\"></product>"
|
121
|
+
expected = %(<product company="Smith & Smith"></product>)
|
122
|
+
assert_xml(expected, input)
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_should_replace_special_character_less_than_in_attribute_values
|
126
|
+
input = "<product description=\"< 10 pounds\"></product>"
|
127
|
+
expected = %(<product description="< 10 pounds"></product>)
|
128
|
+
assert_xml(expected, input)
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_should_resolv_entity_references
|
132
|
+
input = %(<?xml version="1.0"?><!DOCTYPE person [<!ENTITY comment "This is a person.">]><person><notes>&comment;</notes></person>)
|
133
|
+
expected = %(<person><notes>This is a person.</notes></person>)
|
134
|
+
assert_xml(expected, input)
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_should_remove_xml_and_dtd_declarations
|
138
|
+
input = %(<?xml version="1.0"?><!DOCTYPE person [<!ATTLIST person name CDATA "None"><!ENTITY comment "This is a person.">]><person name="Bob"></person>)
|
139
|
+
expected = %(<person name="Bob"></person>)
|
140
|
+
assert_xml(expected, input)
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_should_remove_white_space_outside_the_outer_most_element
|
144
|
+
input = %( <person name="Bob"></person>)
|
145
|
+
expected = %(<person name="Bob"></person>)
|
146
|
+
assert_xml(expected, input)
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_should_normalize_white_space_in_start_and_end_elements
|
150
|
+
input = %(<person first = "bob" id="1234" last="smith" ></person >)
|
151
|
+
expected = %(<person first="bob" id="1234" last="smith"></person>)
|
152
|
+
assert_xml(expected, input)
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_should_normalize_white_space_in_start_and_end_elements_when_no_attributes_exist
|
156
|
+
input = %(<person ><name >Bob</name ></person >)
|
157
|
+
expected = %(<person><name>Bob</name></person>)
|
158
|
+
assert_xml(expected, input)
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_should_expand_empty_elements
|
162
|
+
input = %(<person/>)
|
163
|
+
expected = %(<person></person>)
|
164
|
+
assert_xml(expected, input)
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_should_expand_empty_elements_with_attributes
|
168
|
+
input = %(<person id="1234"/>)
|
169
|
+
expected = %(<person id="1234"></person>)
|
170
|
+
assert_xml(expected, input)
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_should_remove_unnecessary_namespace_declarations
|
174
|
+
input = %(<person xmlns="http://www.mynamespace.com/person"><id>123</id><name xmlns="http://www.mynamespace.com/person">John</name></person>)
|
175
|
+
expected = %(<person xmlns="http://www.mynamespace.com/person"><id>123</id><name>John</name></person>)
|
176
|
+
assert_xml(expected, input)
|
177
|
+
end
|
178
|
+
|
179
|
+
def test_should_order_namespace_declarations_and_attributes
|
180
|
+
input = %(<person last="Smith" first="John" xmlns="http://www.mynamespace.com/person"></person>)
|
181
|
+
expected = %(<person xmlns="http://www.mynamespace.com/person" first="John" last="Smith"></person>)
|
182
|
+
assert_xml(expected, input)
|
183
|
+
end
|
184
|
+
|
185
|
+
def assert_xml(expected, input)
|
186
|
+
assert_equal expected, @canonicalizer.canonicalize(REXML::Document.new(input))
|
187
|
+
end
|
188
|
+
end
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.1
|
3
|
+
specification_version: 1
|
4
|
+
name: information_card
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.1.0
|
7
|
+
date: 2007-06-19 00:00:00 -06:00
|
8
|
+
summary: A library for processing information cards
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: informationcard-users@rubyforge.org
|
12
|
+
homepage: http://informationcardruby.com
|
13
|
+
rubyforge_project:
|
14
|
+
description:
|
15
|
+
autorequire: information_card
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Joe Poon, Jason Sallis
|
31
|
+
files:
|
32
|
+
- lib/information_card
|
33
|
+
- lib/information_card.rb
|
34
|
+
- lib/information_card/certificate_util.rb
|
35
|
+
- lib/information_card/claim_types.rb
|
36
|
+
- lib/information_card/config.rb
|
37
|
+
- lib/information_card/decrypter.rb
|
38
|
+
- lib/information_card/identity_token.rb
|
39
|
+
- lib/information_card/invalid_token.rb
|
40
|
+
- lib/information_card/namespaces.rb
|
41
|
+
- lib/information_card/processor.rb
|
42
|
+
- lib/information_card/saml_token.rb
|
43
|
+
- lib/information_card/xml_canonicalizer.rb
|
44
|
+
- test/certificate_util_test.rb
|
45
|
+
- test/claim_types_test.rb
|
46
|
+
- test/decrypter_test.rb
|
47
|
+
- test/fixtures
|
48
|
+
- test/processor_test.rb
|
49
|
+
- test/saml_token_test.rb
|
50
|
+
- test/test_helper.rb
|
51
|
+
- test/xml_canonicalizer_test.rb
|
52
|
+
- test/fixtures/certificates
|
53
|
+
- test/fixtures/encrypted_information_cards
|
54
|
+
- test/fixtures/saml_tokens
|
55
|
+
- test/fixtures/certificates/test.crt
|
56
|
+
- test/fixtures/certificates/test.key
|
57
|
+
- test/fixtures/encrypted_information_cards/jack_deer.xml
|
58
|
+
- test/fixtures/encrypted_information_cards/john_smith.xml
|
59
|
+
- test/fixtures/saml_tokens/jack_deer.xml
|
60
|
+
- test/fixtures/saml_tokens/john_smith.xml
|
61
|
+
- Rakefile
|
62
|
+
- LICENSE
|
63
|
+
- CHANGELOG
|
64
|
+
- README
|
65
|
+
test_files: []
|
66
|
+
|
67
|
+
rdoc_options: []
|
68
|
+
|
69
|
+
extra_rdoc_files:
|
70
|
+
- README
|
71
|
+
executables: []
|
72
|
+
|
73
|
+
extensions: []
|
74
|
+
|
75
|
+
requirements: []
|
76
|
+
|
77
|
+
dependencies: []
|
78
|
+
|