ruby-saml-for-portal 0.3.7 → 0.3.8

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/lib/onelogin/saml.rb CHANGED
@@ -2,4 +2,7 @@ require 'onelogin/saml/authrequest'
2
2
  require 'onelogin/saml/response'
3
3
  require 'onelogin/saml/settings'
4
4
  require 'onelogin/saml/logout_request'
5
+ require 'onelogin/saml/idp_logout_request'
6
+ require 'onelogin/saml/sp_logout_response'
7
+
5
8
 
@@ -13,15 +13,9 @@ module Onelogin::Saml
13
13
  "<saml:Issuer>#{settings.issuer}</saml:Issuer>" +
14
14
  "<samlp:NameIDPolicy Format=\"#{settings.name_identifier_format}\" AllowCreate=\"true\"/>" +
15
15
  "</samlp:AuthnRequest>"
16
-
17
- deflated_request = Zlib::Deflate.deflate(request, 9)[2..-5]
18
- base64_request = Base64.encode64(deflated_request)
19
- encoded_request = CGI.escape(base64_request)
20
- request_params = "SAMLRequest=" + encoded_request
21
-
16
+ request_params = XMLSecurity.request_params(request)
22
17
  request_params = XMLSecurity.sign_query(request_params, settings)
23
18
  settings.idp_sso_target_url + "?" + request_params
24
19
  end
25
-
26
20
  end
27
21
  end
@@ -0,0 +1,36 @@
1
+ require "xml_security"
2
+ require "time"
3
+
4
+
5
+ module Onelogin::Saml
6
+ class IdpLogoutRequest
7
+ attr_accessor :response, :document, :settings
8
+ def initialize(response)
9
+ self.response = response
10
+ self.document = XMLSecurity::SignedDocument.new(decode_request)
11
+ end
12
+
13
+ def issuer
14
+ document.elements["//saml2:Issuer"].text
15
+ end
16
+
17
+ def name_id
18
+ document.elements["//saml2:NameID"].text
19
+ end
20
+
21
+ def destination
22
+ document.elements["//saml2p:LogoutRequest"].attributes["Destination"]
23
+ end
24
+
25
+ def id
26
+ document.elements["//saml2p:LogoutRequest"].attributes["ID"]
27
+ end
28
+
29
+ private
30
+
31
+ def decode_request
32
+ XMLSecurity.decode_request(response)
33
+ end
34
+
35
+ end
36
+ end
@@ -15,12 +15,7 @@ module Onelogin::Saml
15
15
  "<saml2:NameID Format=\"urn:oasis:names:tc:SAML:2.0:nameid-format:transient\">#{name_id}</saml2:NameID>" +
16
16
  "<saml2p:SessionIndex>#{session_index}</saml2p:SessionIndex>" +
17
17
  "</saml2p:LogoutRequest>"
18
-
19
- deflated_request = Zlib::Deflate.deflate(request, 9)[2..-5]
20
- base64_request = Base64.encode64(deflated_request)
21
- encoded_request = CGI.escape(base64_request)
22
- request_params = "SAMLRequest=" + encoded_request
23
-
18
+ request_params = XMLSecurity.request_params(request)
24
19
  request_params = XMLSecurity.sign_query(request_params, settings)
25
20
  request_params << XMLSecurity.return_to(settings.return_to_url) unless settings.return_to_url.blank?
26
21
  settings.idp_slo_target_url + "?" + request_params
@@ -0,0 +1,24 @@
1
+ require "base64"
2
+ require "uuid"
3
+ require "zlib"
4
+ require "cgi"
5
+
6
+
7
+ module Onelogin::Saml
8
+ class SpLogoutResponse
9
+ def create(request_id,settings)
10
+ uuid = "_" + UUID.new.generate
11
+ time = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
12
+ response = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
13
+ "<samlp:LogoutResponse xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\" Destination=\"#{settings.idp_slo_target_url}\" ID=\"#{uuid}\" InResponseTo=\"#{request_id}\" IssueInstant=\"#{time}\" Version=\"2.0\">" +
14
+ "<saml:Issuer xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">#{settings.issuer}</saml:Issuer>" +
15
+ "<samlp:Status>" +
16
+ "<samlp:StatusCode Value=\"urn:oasis:names:tc:SAML:2.0:status:Success\"/>" +
17
+ "</samlp:Status>" +
18
+ "</samlp:LogoutResponse>"
19
+ response_params = XMLSecurity.request_params(response, "SAMLResponse")
20
+ response_params = XMLSecurity.sign_query(response_params, settings)
21
+ settings.idp_slo_target_url + "?" + response_params
22
+ end
23
+ end
24
+ end
data/lib/xml_security.rb CHANGED
@@ -28,7 +28,7 @@ require "rexml/xpath"
28
28
  require "openssl"
29
29
  require "xmlcanonicalizer"
30
30
  require "digest/sha1"
31
- require 'rsa_ext'
31
+ require '../lib/rsa_ext.rb'
32
32
 
33
33
  module XMLSecurity
34
34
 
@@ -42,6 +42,30 @@ module XMLSecurity
42
42
  "&" + "returnTo=" + CGI.escape(uri_string)
43
43
  end
44
44
 
45
+ def self.validate_request(saml_request, sing_alg, signature, settings)
46
+ raise 'Signature must be rsa-sha1 based' unless sing_alg == "http://www.w3.org/2000/09/xmldsig#rsa-sha1"
47
+
48
+ # building query string
49
+ query = 'SAMLRequest' + '=' + CGI.escape(saml_request)
50
+ query = query + "&" + "SigAlg=" + CGI.escape(sing_alg)
51
+ signature = Base64.decode64(signature)
52
+ settings.idp_public_cert.public_key.verify(OpenSSL::Digest::SHA1.new, signature, query)
53
+ end
54
+
55
+ def self.decode_request(request)
56
+ request = Base64.decode64(request)
57
+ zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
58
+ buf = zstream.inflate(request)
59
+ zstream.finish
60
+ zstream.close
61
+ buf
62
+ end
63
+
64
+ def self.request_params(query,request_str = "SAMLRequest")
65
+ deflated_request = Zlib::Deflate.deflate(query, 9)[2..-5]
66
+ request_str + "=" + CGI.escape(Base64.encode64(deflated_request))
67
+ end
68
+
45
69
  class SignedDocument < REXML::Document
46
70
 
47
71
  def validate (idp_cert_fingerprint, logger = nil, private_key = nil)
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ruby-saml-for-portal}
8
- s.version = "0.3.7"
8
+ s.version = "0.3.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["OneLogin LLC"]
@@ -23,6 +23,8 @@ Gem::Specification.new do |s|
23
23
  "VERSION",
24
24
  "lib/onelogin/saml.rb",
25
25
  "lib/onelogin/saml/authrequest.rb",
26
+ "lib/onelogin/saml/idp_logout_request.rb",
27
+ "lib/onelogin/saml/sp_logout_response.rb",
26
28
  "lib/onelogin/saml/logout_request.rb",
27
29
  "lib/onelogin/saml/response.rb",
28
30
  "lib/onelogin/saml/settings.rb",
@@ -33,7 +35,10 @@ Gem::Specification.new do |s|
33
35
  "test/response.txt",
34
36
  "test/ruby-saml_test.rb",
35
37
  "test/test_helper.rb",
36
- "test/xml_security_test.rb"
38
+ "test/xml_security_test.rb",
39
+ "spec/idp_logout_request_spec.rb",
40
+ "spec/spec_helper.rb",
41
+ "spec/xml_security_spec.rb"
37
42
  ]
38
43
  s.homepage = %q{http://github.com/onelogin/ruby-saml}
39
44
  s.rdoc_options = ["--charset=UTF-8"]
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'IdpLogoutRequest' do
4
+ before(:each) do
5
+ @name_id = '_979476a8229ec4f62d62b1353936e2f0'
6
+ @id ='_07d242b278bb0e4e9f27ddcd4f13cbad'
7
+ end
8
+ it "should be good" do
9
+ logout = Onelogin::Saml::IdpLogoutRequest.new('nZHNasMwEIRfxehuW5Jd/4jYoRACgbSHNu2hlyBZ60RgS64kp338Ok4DoYccetRqZucbdrH87rvgBNYpoytEIowC0I2RSh8q9LZbhwVa1gvH+44ObGsOZvQv8DmC88Hk1I5dvio0Ws0Md8oxzXtwzDfs9fFpy2iE2WCNN43pULCajEpzP6cdvR9YHEs4QWeGiYElGOO4m1NQsFlVaI9zSVMqaF4IgSGFsqW5lI1MW5I0gstJ5twIG+08175CFBMS4iKk5Y4QRhJGsigl+QcK3q8lJyL0W4nNZntb5X4T7hzYMz2qz/RuwrcYO8W/QGAS6dMhsmOs5BC7oxLCdOCPi/g265r8PO3erP6THKyN7bm/Lz9PlAzbWcq85dop0B7V+zIv0zzjBaUlNGmbUZlRQZKHpEwyoC2+4l4A69/nn+PXPw==')
10
+ logout.name_id.should == @name_id
11
+ logout.id.should == @id
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+
3
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'spec'))
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
6
+
7
+ require 'ruby-saml-for-portal'
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe "The XMLSecuriry module" do
4
+ before :each do
5
+ @str = "Hello, world!"
6
+ @encode_str = '80jNycnXUSjPL8pJUQQA'
7
+ @result = "&returnTo=Hello%2C+world%21"
8
+ @result_str = "&returnTo=Hello, wordl!"
9
+ end
10
+
11
+ it "should return string for logout redirect" do
12
+ XMLSecurity.return_to(@str).should == @result
13
+ end
14
+
15
+ it "should not return encode string" do
16
+ XMLSecurity.return_to(@str).should_not == @result_str
17
+ end
18
+
19
+ it "should decode string" do
20
+ XMLSecurity.decode_request(@encode_str).should == @str
21
+ end
22
+ end
data/test/response.txt CHANGED
@@ -1 +0,0 @@
1
- DQo8c2FtbHA6UmVzcG9uc2UgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgeG1sbnM6c2FtbHA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCIgSUQ9IkdPU0FNTFIxMjkwMTE3NDU3MTc5NCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIwMTAtMTEtMThUMjE6NTc6MzdaIiBEZXN0aW5hdGlvbj0ie3JlY2lwaWVudH0iPg0KICA8c2FtbHA6U3RhdHVzPg0KICAgIDxzYW1scDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz48L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgVmVyc2lvbj0iMi4wIiBJRD0icGZ4YTQ2NTc0ZGYtYjNiMC1hMDZhLTIzYzgtNjM2NDEzMTk4NzcyIiBJc3N1ZUluc3RhbnQ9IjIwMTAtMTEtMThUMjE6NTc6MzdaIj4NCiAgICA8c2FtbDpJc3N1ZXI+aHR0cHM6Ly9hcHAub25lbG9naW4uY29tL3NhbWwvbWV0YWRhdGEvMTM1OTA8L3NhbWw6SXNzdWVyPg0KICAgIDxkczpTaWduYXR1cmUgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPg0KICAgICAgPGRzOlNpZ25lZEluZm8+DQogICAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+DQogICAgICAgIDxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiLz4NCiAgICAgICAgPGRzOlJlZmVyZW5jZSBVUkk9IiNwZnhhNDY1NzRkZi1iM2IwLWEwNmEtMjNjOC02MzY0MTMxOTg3NzIiPg0KICAgICAgICAgIDxkczpUcmFuc2Zvcm1zPg0KICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+DQogICAgICAgICAgICA8ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+DQogICAgICAgICAgPC9kczpUcmFuc2Zvcm1zPg0KICAgICAgICAgIDxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPg0KICAgICAgICAgIDxkczpEaWdlc3RWYWx1ZT5wSlE3TVMvZWs0S1JSV0dtdi9INDNSZUhZTXM9PC9kczpEaWdlc3RWYWx1ZT4NCiAgICAgICAgPC9kczpSZWZlcmVuY2U+DQogICAgICA8L2RzOlNpZ25lZEluZm8+DQogICAgICA8ZHM6U2lnbmF0dXJlVmFsdWU+eWl2ZUtjUGREcHVETmo2c2hyUTNBQndyL2NBM0NyeUQycGhHL3hMWnN6S1d4VTUvbWxhS3Q4ZXdiWk9kS0t2dE9zMnBIQnk1RHVhM2s5NEFGK3p4R3llbDVnT293bW95WEpyK0FPcitrUE8wdmxpMVY4bzNoUFBVWndSZ1NYNlE5cFMxQ3FRZ2hLaUVhc1J5eWxxcUpVYVBZem1Pek9FOC9YbE1rd2lXbU8wPTwvZHM6U2lnbmF0dXJlVmFsdWU+DQogICAgICA8ZHM6S2V5SW5mbz4NCiAgICAgICAgPGRzOlg1MDlEYXRhPg0KICAgICAgICAgIDxkczpYNTA5Q2VydGlmaWNhdGU+TUlJQnJUQ0NBYUdnQXdJQkFnSUJBVEFEQmdFQU1HY3hDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SVXdFd1lEVlFRSERBeFRZVzUwWVNCTmIyNXBZMkV4RVRBUEJnTlZCQW9NQ0U5dVpVeHZaMmx1TVJrd0Z3WURWUVFEREJCaGNIQXViMjVsYkc5bmFXNHVZMjl0TUI0WERURXdNRE13T1RBNU5UZzBOVm9YRFRFMU1ETXdPVEE1TlRnME5Wb3daekVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnTUNrTmhiR2xtYjNKdWFXRXhGVEFUQmdOVkJBY01ERk5oYm5SaElFMXZibWxqWVRFUk1BOEdBMVVFQ2d3SVQyNWxURzluYVc0eEdUQVhCZ05WQkFNTUVHRndjQzV2Ym1Wc2IyZHBiaTVqYjIwd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFPalN1MWZqUHk4ZDV3NFF5TDEremQ0aEl3MU1ra2ZmNFdZL1RMRzhPWmtVNVlUU1dtbUhQRDVrdllINXVvWFMvNnFRODFxWHBSMndWOENUb3daSlVMZzA5ZGRSZFJuOFFzcWoxRnlPQzVzbEUzeTJiWjJvRnVhNzJvZi80OWZwdWpuRlQ2S25RNjFDQk1xbERvVFFxT1Q2MnZHSjhuUDZNWld2QTZzeHF1ZDVBZ01CQUFFd0F3WUJBQU1CQUE9PTwvZHM6WDUwOUNlcnRpZmljYXRlPg0KICAgICAgICA8L2RzOlg1MDlEYXRhPg0KICAgICAgPC9kczpLZXlJbmZvPg0KICAgIDwvZHM6U2lnbmF0dXJlPg0KICAgIDxzYW1sOlN1YmplY3Q+DQogICAgICA8c2FtbDpOYW1lSUQgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjE6bmFtZWlkLWZvcm1hdDplbWFpbEFkZHJlc3MiPnN1cHBvcnRAb25lbG9naW4uY29tPC9zYW1sOk5hbWVJRD4NCiAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4NCiAgICAgICAgPHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyMDEwLTExLTE4VDIyOjAyOjM3WiIgUmVjaXBpZW50PSJ7cmVjaXBpZW50fSIvPjwvc2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uPg0KICAgIDwvc2FtbDpTdWJqZWN0Pg0KICAgIDxzYW1sOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDEwLTExLTE4VDIxOjUyOjM3WiIgTm90T25PckFmdGVyPSIyMDEwLTExLTE4VDIyOjAyOjM3WiI+DQogICAgICA8c2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgICAgICA8c2FtbDpBdWRpZW5jZT57YXVkaWVuY2V9PC9zYW1sOkF1ZGllbmNlPg0KICAgICAgPC9zYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+DQogICAgPC9zYW1sOkNvbmRpdGlvbnM+DQogICAgPHNhbWw6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDEwLTExLTE4VDIxOjU3OjM3WiIgU2Vzc2lvbk5vdE9uT3JBZnRlcj0iMjAxMC0xMS0xOVQyMTo1NzozN1oiIFNlc3Npb25JbmRleD0iXzUzMWMzMmQyODNiZGZmN2UwNGU0ODdiY2RiYzRkZDhkIj4NCiAgICAgIDxzYW1sOkF1dGhuQ29udGV4dD4NCiAgICAgICAgPHNhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6UGFzc3dvcmQ8L3NhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+DQogICAgICA8L3NhbWw6QXV0aG5Db250ZXh0Pg0KICAgIDwvc2FtbDpBdXRoblN0YXRlbWVudD4NCiAgICA8c2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0idWlkIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5kZW1vPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJhbm90aGVyX3ZhbHVlIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj52YWx1ZTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+DQo=
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-saml-for-portal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.7
4
+ version: 0.3.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-03-08 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: xmlcanonicalizer
16
- requirement: &20721940 !ruby/object:Gem::Requirement
16
+ requirement: &18808620 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.1.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *20721940
24
+ version_requirements: *18808620
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: uuid
27
- requirement: &20721320 !ruby/object:Gem::Requirement
27
+ requirement: &18808140 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.3.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *20721320
35
+ version_requirements: *18808140
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: systemu
38
- requirement: &20720720 !ruby/object:Gem::Requirement
38
+ requirement: &18807660 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.2.0
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *20720720
46
+ version_requirements: *18807660
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rsa
49
- requirement: &20720140 !ruby/object:Gem::Requirement
49
+ requirement: &18807180 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.1.4
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *20720140
57
+ version_requirements: *18807180
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: shoulda
60
- requirement: &20719540 !ruby/object:Gem::Requirement
60
+ requirement: &18806700 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *20719540
68
+ version_requirements: *18806700
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: mocha
71
- requirement: &20718940 !ruby/object:Gem::Requirement
71
+ requirement: &18806220 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *20718940
79
+ version_requirements: *18806220
80
80
  description: SAML toolkit for Ruby on Rails
81
81
  email: support@onelogin.com
82
82
  executables: []
@@ -91,6 +91,8 @@ files:
91
91
  - VERSION
92
92
  - lib/onelogin/saml.rb
93
93
  - lib/onelogin/saml/authrequest.rb
94
+ - lib/onelogin/saml/idp_logout_request.rb
95
+ - lib/onelogin/saml/sp_logout_response.rb
94
96
  - lib/onelogin/saml/logout_request.rb
95
97
  - lib/onelogin/saml/response.rb
96
98
  - lib/onelogin/saml/settings.rb
@@ -102,6 +104,9 @@ files:
102
104
  - test/ruby-saml_test.rb
103
105
  - test/test_helper.rb
104
106
  - test/xml_security_test.rb
107
+ - spec/idp_logout_request_spec.rb
108
+ - spec/spec_helper.rb
109
+ - spec/xml_security_spec.rb
105
110
  homepage: http://github.com/onelogin/ruby-saml
106
111
  licenses: []
107
112
  post_install_message: