Skip to content

Commit 4efc841

Browse files
committed
Merge pull request #7 from zendesk/sdavidovitz/saml_logout
WIP -- LogoutRequest support
2 parents b6fe753 + 0f60d87 commit 4efc841

File tree

6 files changed

+101
-0
lines changed

6 files changed

+101
-0
lines changed

lib/samlr.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,4 @@ def try(method)
4949
require "samlr/signature"
5050
require "samlr/response"
5151
require "samlr/request"
52+
require "samlr/logout_request"

lib/samlr/logout_request.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module Samlr
2+
class LogoutRequest < Request
3+
def body
4+
@body ||= Samlr::Tools::LogoutRequestBuilder.build(options)
5+
end
6+
end
7+
end

lib/samlr/tools.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
require "samlr/tools/request_builder"
1010
require "samlr/tools/response_builder"
1111
require "samlr/tools/metadata_builder"
12+
require "samlr/tools/logout_request_builder"
1213

1314
module Samlr
1415
module Tools
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require "nokogiri"
2+
3+
module Samlr
4+
module Tools
5+
# Use this for building the SAML logout request XML
6+
module LogoutRequestBuilder
7+
def self.build(options = {})
8+
name_id_format = options[:name_id_format] || EMAIL_FORMAT
9+
10+
# Mandatory
11+
name_id = options.fetch(:name_id)
12+
issuer = options.fetch(:issuer)
13+
14+
builder = Nokogiri::XML::Builder.new do |xml|
15+
xml.LogoutRequest("xmlns:samlp" => NS_MAP["samlp"], "xmlns:saml" => NS_MAP["saml"], "ID" => Samlr::Tools.uuid, "IssueInstant" => Samlr::Tools::Timestamp.stamp, "Version" => "2.0") do
16+
xml.doc.root.namespace = xml.doc.root.namespace_definitions.find { |ns| ns.prefix == "samlp" }
17+
18+
xml["saml"].Issuer(issuer)
19+
xml["saml"].NameID(name_id, "Format" => name_id_format)
20+
end
21+
end
22+
23+
builder.to_xml(COMPACT)
24+
end
25+
end
26+
end
27+
end

test/unit/test_logout_request.rb

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
require File.expand_path("test/test_helper")
2+
3+
describe Samlr::LogoutRequest do
4+
before do
5+
@request = Samlr::LogoutRequest.new(
6+
:issuer => "https://sp.example.com/saml2",
7+
:name_id => "[email protected]"
8+
)
9+
end
10+
11+
describe "#body" do
12+
it "should return the generated XML" do
13+
document = Nokogiri::XML(@request.body) { |c| c.strict }
14+
assert document.at("/samlp:LogoutRequest", Samlr::NS_MAP)
15+
end
16+
17+
it "should delegate the building to the LogoutRequestBuilder" do
18+
Samlr::Tools::LogoutRequestBuilder.stub(:build, "hello") do
19+
assert_match "hello", @request.body
20+
end
21+
end
22+
end
23+
24+
describe "#param" do
25+
it "returns the encoded body" do
26+
@request.stub(:body, "hello") do
27+
assert_equal Samlr::Tools.encode("hello"), @request.param
28+
end
29+
end
30+
end
31+
32+
describe "#url" do
33+
it "returns a valid URL" do
34+
@request.stub(:param, "hello") do
35+
assert_equal("https://foo.com/?SAMLRequest=hello&foo=bar", @request.url("https://foo.com/", :foo => "bar"))
36+
end
37+
end
38+
end
39+
end
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
require File.expand_path("test/test_helper")
2+
3+
describe Samlr::Tools::LogoutRequestBuilder do
4+
describe "#build" do
5+
before do
6+
@xml = Samlr::Tools::LogoutRequestBuilder.build(
7+
:issuer => "https://sp.example.com/saml2",
8+
:name_id => "[email protected]"
9+
)
10+
11+
@doc = Nokogiri::XML(@xml) { |c| c.strict }
12+
end
13+
14+
it "generates a request document" do
15+
assert_equal "LogoutRequest", @doc.root.name
16+
17+
issuer = @doc.root.at("./saml:Issuer", Samlr::NS_MAP)
18+
assert_equal "https://sp.example.com/saml2", issuer.text
19+
end
20+
21+
it "validates against schemas" do
22+
result = Samlr::Tools.validate(:document => @xml)
23+
assert result
24+
end
25+
end
26+
end

0 commit comments

Comments
 (0)