rsaml 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +0 -0
- data/README +13 -0
- data/Rakefile +136 -0
- data/lib/rsaml.rb +57 -0
- data/lib/rsaml/action.rb +57 -0
- data/lib/rsaml/action_namespace.rb +63 -0
- data/lib/rsaml/advice.rb +34 -0
- data/lib/rsaml/assertion.rb +192 -0
- data/lib/rsaml/attribute.rb +76 -0
- data/lib/rsaml/audience.rb +19 -0
- data/lib/rsaml/authentication_context.rb +34 -0
- data/lib/rsaml/authn_context/README +1 -0
- data/lib/rsaml/authn_context/authentication_context_declaration.rb +42 -0
- data/lib/rsaml/authn_context/identification.rb +10 -0
- data/lib/rsaml/authn_context/physical_verification.rb +24 -0
- data/lib/rsaml/condition.rb +13 -0
- data/lib/rsaml/conditions.rb +107 -0
- data/lib/rsaml/encrypted.rb +12 -0
- data/lib/rsaml/errors.rb +16 -0
- data/lib/rsaml/evidence.rb +21 -0
- data/lib/rsaml/ext/string.rb +5 -0
- data/lib/rsaml/identifier.rb +9 -0
- data/lib/rsaml/identifier/base.rb +23 -0
- data/lib/rsaml/identifier/issuer.rb +28 -0
- data/lib/rsaml/identifier/name.rb +55 -0
- data/lib/rsaml/parser.rb +23 -0
- data/lib/rsaml/protocol.rb +21 -0
- data/lib/rsaml/protocol/artifact_resolve.rb +14 -0
- data/lib/rsaml/protocol/assertion_id_request.rb +18 -0
- data/lib/rsaml/protocol/authn_request.rb +91 -0
- data/lib/rsaml/protocol/idp_entry.rb +18 -0
- data/lib/rsaml/protocol/idp_list.rb +28 -0
- data/lib/rsaml/protocol/message.rb +65 -0
- data/lib/rsaml/protocol/name_id_policy.rb +31 -0
- data/lib/rsaml/protocol/query.rb +12 -0
- data/lib/rsaml/protocol/query/attribute_query.rb +56 -0
- data/lib/rsaml/protocol/query/authn_query.rb +30 -0
- data/lib/rsaml/protocol/query/authz_decision_query.rb +40 -0
- data/lib/rsaml/protocol/query/subject_query.rb +22 -0
- data/lib/rsaml/protocol/request.rb +27 -0
- data/lib/rsaml/protocol/requested_authn_context.rb +34 -0
- data/lib/rsaml/protocol/response.rb +56 -0
- data/lib/rsaml/protocol/scoping.rb +33 -0
- data/lib/rsaml/protocol/status.rb +38 -0
- data/lib/rsaml/protocol/status_code.rb +84 -0
- data/lib/rsaml/proxy_restriction.rb +30 -0
- data/lib/rsaml/statement.rb +10 -0
- data/lib/rsaml/statement/attribute_statement.rb +27 -0
- data/lib/rsaml/statement/authentication_statement.rb +57 -0
- data/lib/rsaml/statement/authorization_decision_statement.rb +53 -0
- data/lib/rsaml/statement/base.rb +9 -0
- data/lib/rsaml/subject.rb +37 -0
- data/lib/rsaml/subject_confirmation.rb +35 -0
- data/lib/rsaml/subject_confirmation_data.rb +55 -0
- data/lib/rsaml/subject_locality.rb +27 -0
- data/lib/rsaml/validatable.rb +21 -0
- data/lib/rsaml/version.rb +9 -0
- data/lib/xml_enc.rb +3 -0
- data/lib/xml_sig.rb +11 -0
- data/lib/xml_sig/canonicalization_method.rb +43 -0
- data/lib/xml_sig/key_info.rb +55 -0
- data/lib/xml_sig/reference.rb +57 -0
- data/lib/xml_sig/signature.rb +29 -0
- data/lib/xml_sig/signature_method.rb +20 -0
- data/lib/xml_sig/signed_info.rb +27 -0
- data/lib/xml_sig/transform.rb +37 -0
- data/test/action_namespace_test.rb +93 -0
- data/test/action_test.rb +51 -0
- data/test/advice_test.rb +25 -0
- data/test/assertion_test.rb +192 -0
- data/test/attribute_test.rb +60 -0
- data/test/authentication_context_test.rb +26 -0
- data/test/conditions_test.rb +84 -0
- data/test/evidence_test.rb +33 -0
- data/test/identifier_test.rb +22 -0
- data/test/issuer_test.rb +33 -0
- data/test/name_test.rb +33 -0
- data/test/parser_test.rb +32 -0
- data/test/protocol/assertion_id_request_test.rb +19 -0
- data/test/protocol/attribute_query_test.rb +30 -0
- data/test/protocol/authn_query_test.rb +20 -0
- data/test/protocol/authn_request_test.rb +56 -0
- data/test/protocol/authz_decision_query_test.rb +31 -0
- data/test/protocol/idp_list_test.rb +15 -0
- data/test/protocol/request_test.rb +66 -0
- data/test/protocol/response_test.rb +68 -0
- data/test/protocol/scoping_test.rb +20 -0
- data/test/protocol/status_code_test.rb +34 -0
- data/test/protocol/status_test.rb +16 -0
- data/test/proxy_restriction_test.rb +20 -0
- data/test/rsaml_test.rb +12 -0
- data/test/statement_test.rb +101 -0
- data/test/subject_locality_test.rb +27 -0
- data/test/subject_test.rb +44 -0
- data/test/test_helper.rb +16 -0
- data/test/xml_sig/canonicalization_test.rb +19 -0
- metadata +187 -0
@@ -0,0 +1,60 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class AttributeTest < Test::Unit::TestCase
|
4
|
+
context "an attribute" do
|
5
|
+
setup do
|
6
|
+
@attribute = Attribute.new('email')
|
7
|
+
end
|
8
|
+
should "should be valid" do
|
9
|
+
assert_nothing_raised do
|
10
|
+
@attribute.validate
|
11
|
+
end
|
12
|
+
end
|
13
|
+
should "should not be valid if name is nil" do
|
14
|
+
assert_raise ValidationError do
|
15
|
+
@attribute.name = nil
|
16
|
+
@attribute.validate
|
17
|
+
end
|
18
|
+
end
|
19
|
+
context "when producing xml" do
|
20
|
+
should "always include a name attribute" do
|
21
|
+
assert_match(/<saml:Attribute Name="email"><\/saml:Attribute>/, @attribute.to_xml)
|
22
|
+
end
|
23
|
+
should "optionally include a NameFormat attribute" do
|
24
|
+
@attribute.name_format = 'http://host/name_format/email'
|
25
|
+
assert_match(/NameFormat="#{@attribute.name_format}"/, @attribute.to_xml)
|
26
|
+
end
|
27
|
+
should "optionally include a FriendlyName attribute" do
|
28
|
+
@attribute.friendly_name = 'email'
|
29
|
+
assert_match(/FriendlyName="#{@attribute.friendly_name}"/, @attribute.to_xml)
|
30
|
+
end
|
31
|
+
should "optionally include a single attribute value child element" do
|
32
|
+
@attribute.values << 'someone@somewhere.com'
|
33
|
+
assert_match(/<saml:AttributeValue>someone@somewhere.com<\/saml:AttributeValue>/, @attribute.to_xml)
|
34
|
+
end
|
35
|
+
should "optionally include multiple attribute value child elements" do
|
36
|
+
@attribute.values << 'someone@somewhere.com'
|
37
|
+
@attribute.values << 'someone@somewhereelse.com'
|
38
|
+
assert_match('<saml:AttributeValue>someone@somewhere.com</saml:AttributeValue>', @attribute.to_xml)
|
39
|
+
assert_match('<saml:AttributeValue>someone@somewhereelse.com</saml:AttributeValue>', @attribute.to_xml)
|
40
|
+
end
|
41
|
+
should "optionally include extra XML attributes" do
|
42
|
+
@attribute.extra_xml_attributes['foo'] = 'bar'
|
43
|
+
assert_match(/foo="bar"/, @attribute.to_xml)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "an encrypted attribute" do
|
49
|
+
setup do
|
50
|
+
@encrypted_attribute = EncryptedAttribute.new
|
51
|
+
end
|
52
|
+
should_eventually "be valid" do
|
53
|
+
assert_nothing_raised do
|
54
|
+
@encrypted_attribute.validate
|
55
|
+
end
|
56
|
+
end
|
57
|
+
should_eventually "always include encrypted data"
|
58
|
+
should_eventually "optionally include encrypted keys"
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class AuthenticationContextTest < Test::Unit::TestCase
|
4
|
+
context "an authentication context" do
|
5
|
+
setup do
|
6
|
+
@authn_context = AuthenticationContext.new
|
7
|
+
end
|
8
|
+
context "when producing xml" do
|
9
|
+
should "optionally have a class reference" do
|
10
|
+
@authn_context.class_reference = 'http://example.com/class_ref'
|
11
|
+
assert_equal '<saml:AuthnContext><saml:AuthnContextClassRef>http://example.com/class_ref</saml:AuthnContextClassRef></saml:AuthnContext>', @authn_context.to_xml
|
12
|
+
end
|
13
|
+
should "optionally have a context declaration" do
|
14
|
+
@authn_context.context_declaration = 'example'
|
15
|
+
assert_equal '<saml:AuthnContext><saml:AuthnContextDecl>example</saml:AuthnContextDecl></saml:AuthnContext>', @authn_context.to_xml
|
16
|
+
end
|
17
|
+
should "optionally have a context declaration ref" do
|
18
|
+
@authn_context.context_declaration_ref = 'http://example.com/declaration_ref'
|
19
|
+
assert_equal '<saml:AuthnContext><saml:AuthnContextDeclRef>http://example.com/declaration_ref</saml:AuthnContextDeclRef></saml:AuthnContext>', @authn_context.to_xml
|
20
|
+
end
|
21
|
+
should_eventually "optionally have zero or more authenticating authority instances" do
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class ConditionsTest < Test::Unit::TestCase
|
4
|
+
context "an conditions collection" do
|
5
|
+
setup do
|
6
|
+
@conditions = Conditions.new
|
7
|
+
end
|
8
|
+
should "have 0 conditions by default" do
|
9
|
+
assert_equal 0, @conditions.conditions.length
|
10
|
+
assert_equal 0, @conditions.length
|
11
|
+
end
|
12
|
+
should "be valid with 0 conditions" do
|
13
|
+
assert_nothing_raised do
|
14
|
+
@conditions.assert
|
15
|
+
end
|
16
|
+
end
|
17
|
+
should "be cacheable" do
|
18
|
+
assert @conditions.cache?
|
19
|
+
end
|
20
|
+
should "be able to add a condition" do
|
21
|
+
@conditions << Condition.new
|
22
|
+
assert_equal 1, @conditions.length
|
23
|
+
end
|
24
|
+
|
25
|
+
context "when asserting" do
|
26
|
+
should "fail an assertion for NotBefore if that value is in the future" do
|
27
|
+
@conditions.not_before = Time.now + 1000
|
28
|
+
assert_raise(AssertionError) { @conditions.assert }
|
29
|
+
end
|
30
|
+
should "fail an assertion for NotOnOrAfter if that value is now" do
|
31
|
+
@conditions.not_on_or_after = Time.now
|
32
|
+
assert_raise(AssertionError) { @conditions.assert }
|
33
|
+
end
|
34
|
+
should "fail an assertion for NotOnOrAfter if that value is in the past" do
|
35
|
+
@conditions.not_on_or_after = Time.now - 1000
|
36
|
+
assert_raise(AssertionError) { @conditions.assert }
|
37
|
+
end
|
38
|
+
should "assert without error if NotBefore is in the past" do
|
39
|
+
@conditions.not_before = Time.now - 1000
|
40
|
+
assert_nothing_raised do
|
41
|
+
@conditions.assert
|
42
|
+
end
|
43
|
+
end
|
44
|
+
should "assert without error if NotOnOrAfter is in the future" do
|
45
|
+
@conditions.not_on_or_after = Time.now + 1000
|
46
|
+
assert_nothing_raised do
|
47
|
+
@conditions.assert
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when producing xml" do
|
53
|
+
setup do
|
54
|
+
@conditions = Conditions.new
|
55
|
+
end
|
56
|
+
should "optionally include NotBefore attribute" do
|
57
|
+
t = @conditions.not_before = Time.now
|
58
|
+
assert_equal %Q(<saml:Conditions NotBefore="#{t.xmlschema}"></saml:Conditions>), @conditions.to_xml
|
59
|
+
end
|
60
|
+
should "optionally include NotOnOrAfter attribute" do
|
61
|
+
t = @conditions.not_on_or_after = Time.now
|
62
|
+
assert_equal %Q(<saml:Conditions NotOnOrAfter="#{t.xmlschema}"></saml:Conditions>), @conditions.to_xml
|
63
|
+
end
|
64
|
+
should "optionally include conditions" do
|
65
|
+
@conditions << Condition.new
|
66
|
+
assert_equal "<saml:Conditions><saml:Condition/></saml:Conditions>", @conditions.to_xml
|
67
|
+
end
|
68
|
+
should "optionally include audience restriction" do
|
69
|
+
audience = Audience.new('http://example.org/audience_terms')
|
70
|
+
@conditions.audience_restrictions << audience
|
71
|
+
assert_equal "<saml:Conditions><saml:AudienceRestriction><saml:Audience>#{audience.uri}</saml:Audience></saml:AudienceRestriction></saml:Conditions>", @conditions.to_xml
|
72
|
+
end
|
73
|
+
should "optionally include a proxy restriction" do
|
74
|
+
proxy_restriction = ProxyRestriction.new
|
75
|
+
@conditions.proxy_restriction = proxy_restriction
|
76
|
+
assert_equal "<saml:Conditions><saml:ProxyRestriction></saml:ProxyRestriction></saml:Conditions>", @conditions.to_xml
|
77
|
+
end
|
78
|
+
should "optionally include a one time use" do
|
79
|
+
@conditions.one_time_use = true
|
80
|
+
assert_equal "<saml:Conditions><OneTimeUse/></saml:Conditions>", @conditions.to_xml
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class EvidenceTest < Test::Unit::TestCase
|
4
|
+
context "an evidence instance" do
|
5
|
+
setup do
|
6
|
+
@evidence = Evidence.new
|
7
|
+
end
|
8
|
+
should "not be valid unless at least one assertion is specified" do
|
9
|
+
assert_raise ValidationError do
|
10
|
+
@evidence.validate
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context "when producing xml" do
|
15
|
+
should "optionally include an assertion id ref" do
|
16
|
+
@evidence.assertions << AssertionIDRef.new('149369035468035')
|
17
|
+
assert_match(/<saml:Evidence><saml:AssertionIDRef>149369035468035<\/saml:AssertionIDRef><\/saml:Evidence>/, @evidence.to_xml)
|
18
|
+
end
|
19
|
+
should "optionally include an assertion uri ref" do
|
20
|
+
@evidence.assertions << AssertionURIRef.new('http://xyz.com/assertion/uri')
|
21
|
+
assert_equal(
|
22
|
+
'<saml:Evidence><saml:AssertionURIRef>http://xyz.com/assertion/uri</saml:AssertionURIRef></saml:Evidence>',
|
23
|
+
@evidence.to_xml
|
24
|
+
)
|
25
|
+
end
|
26
|
+
should "optionally include an assertion" do
|
27
|
+
@evidence.assertions << Assertion.new(Identifier::Issuer.new('example'))
|
28
|
+
assert_match(/<saml:Evidence><saml:Assertion /, @evidence.to_xml)
|
29
|
+
end
|
30
|
+
should_eventually "optionally include an encrypted assertion"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class IdentifierTest < Test::Unit::TestCase
|
4
|
+
context "an identifier" do
|
5
|
+
setup do
|
6
|
+
@identifier = Identifier::Base.new
|
7
|
+
end
|
8
|
+
context "when producing xml" do
|
9
|
+
should "always include value" do
|
10
|
+
assert_equal '<saml:BaseID></saml:BaseID>', @identifier.to_xml
|
11
|
+
end
|
12
|
+
should "optionally include a name qualifier" do
|
13
|
+
@identifier.name_qualifier = 'a_name_qualifier'
|
14
|
+
assert_equal '<saml:BaseID NameQualifier="a_name_qualifier"></saml:BaseID>', @identifier.to_xml
|
15
|
+
end
|
16
|
+
should "optionally include an service provider name qualifier" do
|
17
|
+
@identifier.sp_name_qualifier = 'an_sp_name_qualifier'
|
18
|
+
assert_equal '<saml:BaseID SPNameQualifier="an_sp_name_qualifier"></saml:BaseID>', @identifier.to_xml
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/test/issuer_test.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class IssuerTest < Test::Unit::TestCase
|
4
|
+
context "a name" do
|
5
|
+
setup do
|
6
|
+
@identifier = Identifier::Issuer.new('Some Issuer')
|
7
|
+
end
|
8
|
+
should "have a value" do
|
9
|
+
assert_equal 'Some Issuer', @identifier.value
|
10
|
+
end
|
11
|
+
should "have the entity format by default" do
|
12
|
+
assert_equal Identifier::Name.formats[:entity], @identifier.format
|
13
|
+
end
|
14
|
+
context "when producing xml" do
|
15
|
+
should "always include format and value" do
|
16
|
+
assert @identifier.to_xml.include? 'Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity"'
|
17
|
+
assert @identifier.to_xml.include? 'Some Issuer'
|
18
|
+
end
|
19
|
+
should "optionally include a name qualifier" do
|
20
|
+
@identifier.name_qualifier = 'a_name_qualifier'
|
21
|
+
assert @identifier.to_xml.include? 'NameQualifier="a_name_qualifier"'
|
22
|
+
end
|
23
|
+
should "optionally include an service provider name qualifier" do
|
24
|
+
@identifier.sp_name_qualifier = 'an_sp_name_qualifier'
|
25
|
+
assert_equal '<saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity" SPNameQualifier="an_sp_name_qualifier">Some Issuer</saml:Issuer>', @identifier.to_xml
|
26
|
+
end
|
27
|
+
should "optionally include an service provider provided id" do
|
28
|
+
@identifier.sp_provided_id = 'sp-x'
|
29
|
+
assert_equal '<saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity" SPProvidedID="sp-x">Some Issuer</saml:Issuer>', @identifier.to_xml
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/test/name_test.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class NameTest < Test::Unit::TestCase
|
4
|
+
context "a name" do
|
5
|
+
setup do
|
6
|
+
@name = Identifier::Name.new('example')
|
7
|
+
end
|
8
|
+
should "have a value" do
|
9
|
+
assert_equal 'example', @name.value
|
10
|
+
end
|
11
|
+
should "have the unspecified format by default" do
|
12
|
+
assert_equal Identifier::Name.formats[:unspecified], @name.format
|
13
|
+
end
|
14
|
+
context "when producing xml" do
|
15
|
+
should "always include format and value" do
|
16
|
+
assert @name.to_xml.include? 'Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"'
|
17
|
+
assert @name.to_xml.include? 'example'
|
18
|
+
end
|
19
|
+
should "optionally include a name qualifier" do
|
20
|
+
@name.name_qualifier = 'a_name_qualifier'
|
21
|
+
assert @name.to_xml.include? 'NameQualifier="a_name_qualifier"'
|
22
|
+
end
|
23
|
+
should "optionally include an service provider name qualifier" do
|
24
|
+
@name.sp_name_qualifier = 'an_sp_name_qualifier'
|
25
|
+
assert_equal '<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" SPNameQualifier="an_sp_name_qualifier">example</saml:NameID>', @name.to_xml
|
26
|
+
end
|
27
|
+
should "optionally include an service provider provided id" do
|
28
|
+
@name.sp_provided_id = 'sp-x'
|
29
|
+
assert_equal '<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" SPProvidedID="sp-x">example</saml:NameID>', @name.to_xml
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/test/parser_test.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class ParserTest < Test::Unit::TestCase
|
4
|
+
context "a parser" do
|
5
|
+
setup { @parser = Parser.new }
|
6
|
+
context "parsing an attribute query message" do
|
7
|
+
setup do
|
8
|
+
@attribute_query = @parser.parse(attribute_query_xml)
|
9
|
+
end
|
10
|
+
should "return an attribute query instance" do
|
11
|
+
assert @attribute_query.is_a?(Protocol::Query::AttributeQuery)
|
12
|
+
end
|
13
|
+
should "have 1 attribute" do
|
14
|
+
assert_equal 1, @attribute_query.attributes.length
|
15
|
+
end
|
16
|
+
should "have a subject of Anthony Eden" do
|
17
|
+
assert_equal 'Anthony Eden', @attribute_query.subject.identifier.value
|
18
|
+
end
|
19
|
+
should "have an attribute whose name is Name" do
|
20
|
+
assert_equal 'Name', @attribute_query.attributes.first.name
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def attribute_query_xml
|
26
|
+
@attribute_query_xml ||= begin
|
27
|
+
open(File.dirname(__FILE__) + '/sample_data/attribute_query.xml') do |f|
|
28
|
+
f.read
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class AssertionIdRequestTest < Test::Unit::TestCase
|
4
|
+
include RSAML::Protocol
|
5
|
+
context "an assertion id request instance" do
|
6
|
+
setup do
|
7
|
+
@request = AssertionIDRequest.new
|
8
|
+
@request.assertion_id_refs << AssertionIDRef.new('xyz')
|
9
|
+
end
|
10
|
+
context "when producing xml" do
|
11
|
+
should "output the samlp:AssertionIDRequest element" do
|
12
|
+
assert_match '<samlp:AssertionIDRequest>', @request.to_xml
|
13
|
+
end
|
14
|
+
should "include the assertion id ref children" do
|
15
|
+
assert_match '<saml:AssertionIDRef>xyz</saml:AssertionIDRef>', @request.to_xml
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class AttributeQueryTest < Test::Unit::TestCase
|
4
|
+
include RSAML::Protocol::Query
|
5
|
+
|
6
|
+
context "an attribute query" do
|
7
|
+
setup do
|
8
|
+
@query = AttributeQuery.new(Subject.new('example'))
|
9
|
+
end
|
10
|
+
context "with attributes" do
|
11
|
+
setup do
|
12
|
+
@query.attributes << Attribute.new('email')
|
13
|
+
end
|
14
|
+
should "be valid" do
|
15
|
+
assert_nothing_raised { @query.validate }
|
16
|
+
end
|
17
|
+
should "not allow duplicate attributes" do
|
18
|
+
@query.attributes << Attribute.new('email')
|
19
|
+
assert_raise ValidationError do
|
20
|
+
@query.validate
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
context "when producing xml" do
|
25
|
+
should "include a subject" do
|
26
|
+
assert_match('<saml:Subject>example</saml:Subject>', @query.to_xml)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class AuthnQueryTest < Test::Unit::TestCase
|
4
|
+
include RSAML::Protocol::Query
|
5
|
+
|
6
|
+
context "an authn query" do
|
7
|
+
setup do
|
8
|
+
@query = AuthnQuery.new(Subject.new('example'))
|
9
|
+
end
|
10
|
+
context "when producing xml" do
|
11
|
+
should "include a subject" do
|
12
|
+
assert_match('<saml:Subject>example</saml:Subject>', @query.to_xml)
|
13
|
+
end
|
14
|
+
should "optionally include a SessionIndex" do
|
15
|
+
@query.session_index = '123'
|
16
|
+
assert_match('<samlp:AuthnQuery SessionIndex="123"', @query.to_xml)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class AuthnRequestTest < Test::Unit::TestCase
|
4
|
+
include RSAML::Protocol
|
5
|
+
context "an authentication request instance" do
|
6
|
+
setup do
|
7
|
+
@request = AuthnRequest.new
|
8
|
+
end
|
9
|
+
should "be valid" do
|
10
|
+
assert_nothing_raised { @request.validate }
|
11
|
+
end
|
12
|
+
context "when producing xml" do
|
13
|
+
should "output the samlp:AuthnRequest element" do
|
14
|
+
assert_match '<samlp:AuthnRequest>', @request.to_xml
|
15
|
+
end
|
16
|
+
should "optionally include a subject child" do
|
17
|
+
@request.subject = Subject.new
|
18
|
+
assert_match '<saml:Subject></saml:Subject>', @request.to_xml
|
19
|
+
end
|
20
|
+
should "optionally include a name id policy child" do
|
21
|
+
name_id_policy = NameIdPolicy.new
|
22
|
+
name_id_policy.format = Identifier::Name.formats[:email_address]
|
23
|
+
@request.name_id_policy = name_id_policy
|
24
|
+
assert_match '<samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"', @request.to_xml
|
25
|
+
end
|
26
|
+
should "optionally include conditions" do
|
27
|
+
conditions = Conditions.new
|
28
|
+
@request.conditions = conditions
|
29
|
+
assert_match '<saml:Conditions', @request.to_xml
|
30
|
+
end
|
31
|
+
should_eventually "optionally include requested authn context" do
|
32
|
+
|
33
|
+
end
|
34
|
+
should "optionally include scoping" do
|
35
|
+
scoping = Scoping.new
|
36
|
+
@request.scoping = scoping
|
37
|
+
assert_match '<samlp:Scoping', @request.to_xml
|
38
|
+
end
|
39
|
+
should "optionally include force authn" do
|
40
|
+
@request.force_authn = true
|
41
|
+
assert_match '<samlp:AuthnRequest ForceAuthn="true"', @request.to_xml
|
42
|
+
end
|
43
|
+
should "optionally include passive flag" do
|
44
|
+
@request.is_passive = true
|
45
|
+
assert_match '<samlp:AuthnRequest IsPassive="true"', @request.to_xml
|
46
|
+
end
|
47
|
+
should "optionally include AssertionConsumerServiceURL" do
|
48
|
+
|
49
|
+
end
|
50
|
+
should "optionally include a provider name" do
|
51
|
+
@request.provider_name = 'example'
|
52
|
+
assert_match '<samlp:AuthnRequest ProviderName="example"', @request.to_xml
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|