class SAML::Bindings::HTTPRedirect

Public Instance Methods

build_request(rack_response, endpoint, saml_request, relay_state=nil) click to toggle source
# File lib/saml/bindings/http_redirect.rb, line 9
def build_request(rack_response, endpoint, saml_request, relay_state=nil)
  unless relay_state.nil?
    raise ArgumentError.new("relay_state must not exceed 80 bytes") if relay_state.bytesize > 80
  end
  request = saml_request.to_xml.to_s
  deflated_saml_request = deflate(request)
  query = "SAMLRequest=#{deflated_saml_request}"
  query += "&RelayState=#{url_enc(relay_state)}" unless relay_state.nil?
  url = "#{endpoint.location}?#{query}"
  rack_response.redirect url
end
build_response(rack_request) click to toggle source
# File lib/saml/bindings/http_redirect.rb, line 21
def build_response(rack_request)
  xml_str = inflate(rack_request.params["SAMLResponse"])
  xml = Core::Document.new(xml_str).root
  Core::Response.from_xml(xml)
end

Private Instance Methods

base64_dec(str) click to toggle source
# File lib/saml/bindings/http_redirect.rb, line 58
def base64_dec(str)
  Base64.decode64(str)
end
base64_enc(str) click to toggle source
# File lib/saml/bindings/http_redirect.rb, line 54
def base64_enc(str)
  Base64.encode64(str)
end
compress(str) click to toggle source
# File lib/saml/bindings/http_redirect.rb, line 40
def compress(str)
  z = Zlib::Deflate.deflate(str, Zlib::BEST_COMPRESSION)
  # The SAML standard requires RFC1951 compliance. Zlib::Deflate
  # are RFC1950 compliant. By removing the 2 byte header and the
  # 4 byte tail (checksum), what's left is a deflate stream as
  # described in RFC1951.
  z[2..-5]
end
decompress(str) click to toggle source
# File lib/saml/bindings/http_redirect.rb, line 49
def decompress(str)
  z = Zlib::Inflate.new(-Zlib::MAX_WBITS) # Raw processing (no head or tail)
  z.inflate(str)
end
deflate(str) click to toggle source

Described in section 3.4.4.1

# File lib/saml/bindings/http_redirect.rb, line 30
def deflate(str)
  url_enc(base64_enc(compress(str)))
end
inflate(str) click to toggle source
# File lib/saml/bindings/http_redirect.rb, line 34
def inflate(str)
  # FIXME do we never need to URL.decode?
  decompress(base64_dec(str))
end
url_dec(str) click to toggle source
# File lib/saml/bindings/http_redirect.rb, line 66
def url_dec(str)
  CGI.unescape(str)
end
url_enc(str) click to toggle source
# File lib/saml/bindings/http_redirect.rb, line 62
def url_enc(str)
  CGI.escape(str)
end