Skip to content

Commit 1642bd1

Browse files
author
Ana Martinez
committed
Merge pull request #13 from zendesk/amartinez/name_id_options
Add support to get an array of name_id_options
2 parents 224f966 + 9b94e34 commit 1642bd1

File tree

4 files changed

+36
-13
lines changed

4 files changed

+36
-13
lines changed

lib/samlr/assertion.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,11 @@ def attributes
4848
end
4949

5050
def name_id
51-
@name_id ||= assertion.at("./saml:Subject/saml:NameID", NS_MAP).text
51+
@name_id ||= name_id_node.text
52+
end
53+
54+
def name_id_options
55+
@name_id_options ||= Hash[name_id_node.attributes.map{|k,v| [k, v.value]}]
5256
end
5357

5458
def conditions
@@ -57,6 +61,10 @@ def conditions
5761

5862
private
5963

64+
def name_id_node
65+
@name_id_node ||= assertion.at("./saml:Subject/saml:NameID", NS_MAP)
66+
end
67+
6068
def assertion
6169
@assertion ||= document.at(location, NS_MAP)
6270
end

lib/samlr/response.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module Samlr
77
class Response
88
extend Forwardable
99

10-
def_delegators :assertion, :name_id, :attributes
10+
def_delegators :assertion, :name_id, :attributes, :name_id_options
1111
attr_reader :document, :options
1212

1313
def initialize(data, options)

lib/samlr/tools/response_builder.rb

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,18 @@ module Tools
99
module ResponseBuilder
1010

1111
def self.build(options = {})
12-
issue_instant = options[:issue_instant] || Samlr::Tools::Timestamp.stamp
13-
response_id = options[:response_id] || Samlr::Tools.uuid
14-
assertion_id = options[:assertion_id] || Samlr::Tools.uuid
15-
status_code = options[:status_code] || "urn:oasis:names:tc:SAML:2.0:status:Success"
16-
name_id_format = options[:name_id_format] || EMAIL_FORMAT
17-
subject_conf_m = options[:subject_conf_m] || "urn:oasis:names:tc:SAML:2.0:cm:bearer"
18-
version = options[:version] || "2.0"
19-
auth_context = options[:auth_context] || "urn:oasis:names:tc:SAML:2.0:ac:classes:Password"
20-
issuer = options[:issuer] || "ResponseBuilder IdP"
21-
attributes = options[:attributes] || {}
12+
issue_instant = options[:issue_instant] || Samlr::Tools::Timestamp.stamp
13+
response_id = options[:response_id] || Samlr::Tools.uuid
14+
assertion_id = options[:assertion_id] || Samlr::Tools.uuid
15+
status_code = options[:status_code] || "urn:oasis:names:tc:SAML:2.0:status:Success"
16+
name_id_format = options[:name_id_format] || EMAIL_FORMAT
17+
subject_conf_m = options[:subject_conf_m] || "urn:oasis:names:tc:SAML:2.0:cm:bearer"
18+
version = options[:version] || "2.0"
19+
auth_context = options[:auth_context] || "urn:oasis:names:tc:SAML:2.0:ac:classes:Password"
20+
issuer = options[:issuer] || "ResponseBuilder IdP"
21+
attributes = options[:attributes] || {}
22+
name_qualifier = options[:name_qualifier]
23+
sp_name_qualifier = options[:sp_name_qualifier]
2224

2325
# Mandatory for responses
2426
destination = options.fetch(:destination)
@@ -49,7 +51,11 @@ def self.build(options = {})
4951
xml["saml"].Issuer(issuer)
5052

5153
xml["saml"].Subject do
52-
xml["saml"].NameID(name_id, "Format" => name_id_format)
54+
name_id_options = { "Format" => name_id_format}
55+
name_id_options.merge!("NameQualifier" => name_qualifier) unless name_qualifier.nil?
56+
name_id_options.merge!("SPNameQualifier" => sp_name_qualifier) unless sp_name_qualifier.nil?
57+
58+
xml["saml"].NameID(name_id, name_id_options)
5359

5460
xml["saml"].SubjectConfirmation("Method" => subject_conf_m) do
5561
xml["saml"].SubjectConfirmationData("InResponseTo" => in_response_to, "NotOnOrAfter" => not_on_or_after, "Recipient" => destination)

test/unit/test_assertion.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,15 @@
2828
end
2929
end
3030

31+
describe "#name_id_options" do
32+
subject { fixed_saml_response(:name_qualifier => 'portal-happyservice-idp', :sp_name_qualifier => 'happyservice.zendesk.com').assertion }
33+
34+
it "returns the options for the NameID element" do
35+
expected = {"Format"=>"urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", "NameQualifier"=>"portal-happyservice-idp", "SPNameQualifier"=>"happyservice.zendesk.com"}
36+
assert_equal expected, subject.name_id_options
37+
end
38+
end
39+
3140
describe "#verify!" do
3241
let(:condition) do
3342
Class.new do

0 commit comments

Comments
 (0)