diff --git a/.ruby-version b/.ruby-version index 097a15a..5154b3f 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.6.2 +2.6 diff --git a/lib/rack-cas/saml_validation_response.rb b/lib/rack-cas/saml_validation_response.rb index b1f469e..566ff7f 100644 --- a/lib/rack-cas/saml_validation_response.rb +++ b/lib/rack-cas/saml_validation_response.rb @@ -15,7 +15,7 @@ def initialize(url, ticket) def user if success? - xml.at('//Response/Assertion/AuthenticationStatement/Subject/NameIdentifier').text + xml_text_at('//Response/Assertion/AuthenticationStatement/Subject/NameIdentifier') else raise AuthenticationFailure, failure_message end @@ -26,11 +26,14 @@ def extra_attributes raise AuthenticationFailure, failure_message unless success? - xml.at('//Response/Assertion/AttributeStatement').children.each do |node| + attribute_statement = xml.at('//Response/Assertion/AttributeStatement') + return unless attribute_statement + + attribute_statement.children.each do |node| key = node.at('@AttributeName') if key - values = node.xpath('AttributeValue').map { |n| n.text } + values = node.xpath('AttributeValue').map(&:text) values = values.first if values.size == 1 @@ -44,7 +47,7 @@ def extra_attributes protected def success? - @success ||= xml.at('//Response/Status/StatusCode/@Value').text =~ /saml1?p:Success/ + @success ||= xml_text_at('//Response/Status/StatusCode/@Value') =~ /saml1?p:Success/ end def authentication_failure @@ -53,7 +56,7 @@ def authentication_failure def failure_message if authentication_failure - xml.at('//Response/Status/StatusMessage').text.strip + xml_text_at('//Response/Status/StatusMessage').strip end end @@ -96,6 +99,13 @@ def xml @xml = Nokogiri::XML(response.body).remove_namespaces! end + def xml_text_at(path) + element = xml.at(path) + return unless element + + element.text + end + def ip_address require 'socket'