-
Notifications
You must be signed in to change notification settings - Fork 20
/
assertion.rb
67 lines (54 loc) · 1.53 KB
/
assertion.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# frozen_string_literal: true
require "saml2/conditions"
module SAML2
class Assertion < Message
attr_writer :statements, :subject
def initialize
super
@statements = []
@conditions = Conditions.new
end
def from_xml(node)
super
@statements = nil
remove_instance_variable(:@conditions)
end
# @return [Subject, nil]
def subject
if xml && !instance_variable_defined?(:@subject)
@subject = Subject.from_xml(xml.at_xpath("saml:Subject", Namespaces::ALL))
end
@subject
end
# @return [Conditions]
def conditions
if !instance_variable_defined?(:@conditions) && xml
@conditions = Conditions.from_xml(xml.at_xpath("saml:Conditions", Namespaces::ALL))
end
@conditions
end
# @return [Array<AuthnStatement]
def authn_statements
statements.select { |s| s.is_a?(AuthnStatement) }
end
# @return [Array<AttributeStatement>]
def attribute_statements
statements.select { |s| s.is_a?(AttributeStatement) }
end
# @return [Array<AuthnStatement, AttributeStatement>]
def statements
@statements ||= load_object_array(xml, "saml:AuthnStatement|saml:AttributeStatement")
end
# (see Base#build)
def build(builder)
builder["saml"].Assertion(
"xmlns:saml" => Namespaces::SAML
) do |assertion|
super(assertion)
subject.build(assertion)
conditions&.build(assertion)
statements.each { |stmt| stmt.build(assertion) }
end
end
end
end