Class: ForceUnspecified::App
- Inherits:
-
Object
- Object
- ForceUnspecified::App
- Defined in:
- lib/force_unspecified/app.rb
Instance Attribute Summary collapse
-
#request ⇒ Object
readonly
Returns the value of attribute request.
Class Method Summary collapse
Instance Method Summary collapse
- #call ⇒ Object
- #decode_saml_request ⇒ Object
- #encode_saml_request(string = saml_request()) ⇒ Object
- #index ⇒ Object
-
#initialize(env) ⇒ App
constructor
A new instance of App.
- #saml_request ⇒ Object
- #saml_request_original ⇒ Object
Constructor Details
#initialize(env) ⇒ App
Returns a new instance of App.
10 11 12 |
# File 'lib/force_unspecified/app.rb', line 10 def initialize(env) @request = Rack::Request.new(env) end |
Instance Attribute Details
#request ⇒ Object (readonly)
Returns the value of attribute request.
14 15 16 |
# File 'lib/force_unspecified/app.rb', line 14 def request @request end |
Class Method Details
.call(env) ⇒ Object
6 7 8 |
# File 'lib/force_unspecified/app.rb', line 6 def self.call(env) new(env).call end |
Instance Method Details
#call ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/force_unspecified/app.rb', line 16 def call next_hop = URI.decode_www_form_component(request.path.sub(%r{^/}, '')) if next_hop.empty? return index() end unless saml_request_original return [400, {'Content-Type' => 'text/plain'}, ["SAMLRequest is missing\n"]] end modified_saml_request = saml_request. gsub(/(['"])urn:oasis:names:tc:SAML:1.1:nameid-format:.+?(["'])/, '\1urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified\2') param = encode_saml_request(modified_saml_request) [302, {'Location' => "#{next_hop}?SAMLRequest=#{param}"}, ['']] end |
#decode_saml_request ⇒ Object
45 46 47 48 49 50 51 52 53 |
# File 'lib/force_unspecified/app.rb', line 45 def decode_saml_request return nil unless saml_request_original decoded = saml_request_original.unpack('m*')[0] begin Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(decoded) rescue decoded end end |
#encode_saml_request(string = saml_request()) ⇒ Object
55 56 57 |
# File 'lib/force_unspecified/app.rb', line 55 def encode_saml_request(string = saml_request()) URI.encode_www_form_component [Zlib::Deflate.deflate(string, 9)[2..-5]].pack('m*').gsub(/\r?\n/, '') end |
#index ⇒ Object
32 33 34 35 36 37 38 39 |
# File 'lib/force_unspecified/app.rb', line 32 def index [200, {'Content-Type' => 'text/plain'}, [<<-EOF]] https://github.com/sorah/force_unspecified Modifies received SAMLRequest to force 'unspecified' as a requested NameIDPolicy, and redirects to a SAML consumer URL. Usage: #{request.base_url}/https://login.example.org/saml?SAMLRequest=xxxxx EOF end |
#saml_request ⇒ Object
59 60 61 |
# File 'lib/force_unspecified/app.rb', line 59 def saml_request @saml_request ||= decode_saml_request end |
#saml_request_original ⇒ Object
41 42 43 |
# File 'lib/force_unspecified/app.rb', line 41 def saml_request_original request.params['SAMLRequest'] end |