forked from SAML-Toolkits/ruby-saml
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Some features from the PR SAML-Toolkits#197 (PR splitted)
* Comment the code * Remove spaces and format some lines * Remove unnecesary errors method
- Loading branch information
Showing
17 changed files
with
549 additions
and
119 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,91 +1,110 @@ | ||
module OneLogin | ||
module RubySaml | ||
# Wraps all attributes and provides means to query them for single or multiple values. | ||
# | ||
# For backwards compatibility Attributes#[] returns *first* value for the attribute. | ||
# Turn off compatibility to make it return all values as an array: | ||
# Attributes.single_value_compatibility = false | ||
|
||
# SAML2 Attributes. Parse the Attributes from the AttributeStatement of the SAML Response. | ||
# | ||
class Attributes | ||
include Enumerable | ||
|
||
attr_reader :attributes | ||
|
||
# By default Attributes#[] is backwards compatible and | ||
# returns only the first value for the attribute | ||
# Setting this to `false` returns all values for an attribute | ||
@@single_value_compatibility = true | ||
|
||
# Get current status of backwards compatibility mode. | ||
# @return [Boolean] Get current status of backwards compatibility mode. | ||
# | ||
def self.single_value_compatibility | ||
@@single_value_compatibility | ||
end | ||
|
||
# Sets the backwards compatibility mode on/off. | ||
# @param value [Boolean] | ||
# | ||
def self.single_value_compatibility=(value) | ||
@@single_value_compatibility = value | ||
end | ||
|
||
# Initialize Attributes collection, optionally taking a Hash of attribute names and values. | ||
# | ||
# The +attrs+ must be a Hash with attribute names as keys and **arrays** as values: | ||
# @param attrs [Hash] The +attrs+ must be a Hash with attribute names as keys and **arrays** as values: | ||
# Attributes.new({ | ||
# 'name' => ['value1', 'value2'], | ||
# 'mail' => ['value1'], | ||
# }) | ||
# | ||
def initialize(attrs = {}) | ||
@attributes = attrs | ||
end | ||
|
||
|
||
# Iterate over all attributes | ||
# | ||
def each | ||
attributes.each{|name, values| yield name, values} | ||
end | ||
|
||
|
||
# Test attribute presence by name | ||
# @param name [String] The attribute name to be checked | ||
# | ||
def include?(name) | ||
attributes.has_key?(canonize_name(name)) | ||
end | ||
|
||
# Return first value for an attribute | ||
# @param name [String] The attribute name | ||
# return [String] The value (First occurrence) | ||
# | ||
def single(name) | ||
attributes[canonize_name(name)].first if include?(name) | ||
end | ||
|
||
# Return all values for an attribute | ||
# @param name [String] The attribute name | ||
# return [Array] Values of the attribute | ||
# | ||
def multi(name) | ||
attributes[canonize_name(name)] | ||
end | ||
|
||
# By default returns first value for an attribute. | ||
# | ||
# Depending on the single value compatibility status this returns first value | ||
# Attributes.single_value_compatibility = true # Default | ||
# response.attributes['mail'] # => '[email protected]' | ||
# Retrieve attribute value(s) | ||
# @param name [String] The attribute name | ||
# @return [String|Array] Depending on the single value compatibility status this returns: | ||
# - First value if single_value_compatibility = true | ||
# response.attributes['mail'] # => '[email protected]' | ||
# - All values if single_value_compatibility = false | ||
# response.attributes['mail'] # => ['[email protected]','[email protected]'] | ||
# | ||
# Or all values: | ||
# Attributes.single_value_compatibility = false | ||
# response.attributes['mail'] # => ['[email protected]','[email protected]'] | ||
def [](name) | ||
self.class.single_value_compatibility ? single(canonize_name(name)) : multi(canonize_name(name)) | ||
end | ||
|
||
# Return all attributes as an array | ||
# @return [Array] Return all attributes as an array | ||
# | ||
def all | ||
attributes | ||
end | ||
|
||
# Set values for an attribute, overwriting all existing values | ||
# @param name [String] The attribute name | ||
# @param values [Array] The values | ||
# | ||
def set(name, values) | ||
attributes[canonize_name(name)] = values | ||
end | ||
alias_method :[]=, :set | ||
|
||
# Add new attribute or new value(s) to an existing attribute | ||
# @param name [String] The attribute name | ||
# @param values [Array] The values | ||
# | ||
def add(name, values = []) | ||
attributes[canonize_name(name)] ||= [] | ||
attributes[canonize_name(name)] += Array(values) | ||
end | ||
|
||
# Make comparable to another Attributes collection based on attributes | ||
# @param other [Attributes] An Attributes object to compare with | ||
# @return [Boolean] True if are contains the same attributes and values | ||
# | ||
def ==(other) | ||
if other.is_a?(Attributes) | ||
all == other.all | ||
|
@@ -97,13 +116,13 @@ def ==(other) | |
protected | ||
|
||
# stringifies all names so both 'email' and :email return the same result | ||
# @param name [String] The attribute name | ||
# @return [String] stringified name | ||
# | ||
def canonize_name(name) | ||
name.to_s | ||
end | ||
|
||
def attributes | ||
@attributes | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.