Rebuilt the filter part
This commit is contained in:
@@ -28,24 +28,26 @@ from saml2.s_utils import factory
|
||||
from saml2.s_utils import assertion_factory
|
||||
from saml2.s_utils import do_attribute_statement
|
||||
|
||||
def _filter_values(vals, value=None, must=False):
|
||||
def _filter_values(vals, vlist=None, must=False):
|
||||
""" Removes values from *vals* that does not appear in vlist
|
||||
|
||||
:param val: The values that are to be filtered
|
||||
:param value: required or optional value
|
||||
:param vlist: required or optional value
|
||||
:param must: Whether the allowed values must appear
|
||||
:return: The set of values after filtering
|
||||
"""
|
||||
|
||||
if not value: # No value specified equals any value
|
||||
if not vlist: # No value specified equals any value
|
||||
return vals
|
||||
|
||||
res = None
|
||||
if isinstance(vlist, basestring):
|
||||
vlist = [vlist]
|
||||
|
||||
res = []
|
||||
|
||||
for val in vals:
|
||||
if val == value:
|
||||
res = val
|
||||
break
|
||||
for val in vlist:
|
||||
if val in vals:
|
||||
res.append(val)
|
||||
|
||||
if must:
|
||||
if res:
|
||||
@@ -54,95 +56,44 @@ def _filter_values(vals, value=None, must=False):
|
||||
raise MissingValue("Required attribute value missing")
|
||||
else:
|
||||
return res
|
||||
|
||||
# def _filter_values(vals, required=None, optional=None):
|
||||
# """ Removes values from *vals* that does not appear in *required*
|
||||
# or *optional*.
|
||||
#
|
||||
# :param val: The values that are to be filtered
|
||||
# :param required: The required values
|
||||
# :param optional: The optional values
|
||||
# :return: The set of values after filtering
|
||||
# """
|
||||
#
|
||||
# if not required and not optional:
|
||||
# return vals
|
||||
#
|
||||
# valr = []
|
||||
# valo = []
|
||||
# if required:
|
||||
# rvals = [v.text for v in required]
|
||||
# else:
|
||||
# rvals = []
|
||||
# if optional:
|
||||
# ovals = [v.text for v in optional]
|
||||
# else:
|
||||
# ovals = []
|
||||
# for val in vals:
|
||||
# if val in rvals:
|
||||
# valr.append(val)
|
||||
# elif val in ovals:
|
||||
# valo.append(val)
|
||||
#
|
||||
# valo.extend(valr)
|
||||
# if rvals:
|
||||
# if len(rvals) == len(valr):
|
||||
# return valo
|
||||
# else:
|
||||
# _ = set(rvals)
|
||||
# raise MissingValue("Required attribute value missing")
|
||||
# else:
|
||||
# return valo
|
||||
|
||||
# def _combine(required=None, optional=None):
|
||||
# res = {}
|
||||
# if not required:
|
||||
# required = []
|
||||
# if not optional:
|
||||
# optional = []
|
||||
# for attr in required:
|
||||
# part = None
|
||||
# for oat in optional:
|
||||
# if attr.name == oat.name:
|
||||
# part = (attr.attribute_value, oat.attribute_value)
|
||||
# break
|
||||
# if part:
|
||||
# res[(attr.name, attr.friendly_name)] = part
|
||||
# else:
|
||||
# res[(attr.name, attr.friendly_name)] = (attr.attribute_value, [])
|
||||
#
|
||||
# for oat in optional:
|
||||
# tag = (oat.name, oat.friendly_name)
|
||||
# if tag not in res:
|
||||
# res[tag] = ([], oat.attribute_value)
|
||||
#
|
||||
# return res
|
||||
|
||||
def filter_on_attributes(ava, required=None, optional=None):
|
||||
""" Filter
|
||||
:param required: list of RequestedAttribute instances
|
||||
"""
|
||||
res = {}
|
||||
|
||||
if required == None:
|
||||
required = []
|
||||
|
||||
for attr in required:
|
||||
if attr.friendly_name in ava:
|
||||
res[attr.friendly_name] = [_filter_values(ava[attr.friendly_name], attr.text, True)]
|
||||
elif req.name in ava:
|
||||
res[attr.name] = [_filter_values(ava[attr.name], attr.text, True)]
|
||||
values = [av.text for av in attr.attribute_value]
|
||||
res[attr.friendly_name] = _filter_values(ava[attr.friendly_name], values, True)
|
||||
elif attr.name in ava:
|
||||
values = [av.text for av in attr.attribute_value]
|
||||
res[attr.name] = _filter_values(ava[attr.name], values, True)
|
||||
else:
|
||||
print >> sys.stderr, ava.keys()
|
||||
raise MissingValue("Required attribute missing: '%s'" % (attr.friendly_name,))
|
||||
|
||||
if optional == None:
|
||||
optional = []
|
||||
|
||||
for attr in optional:
|
||||
if attr.friendly_name in ava:
|
||||
values = [av.text for av in attr.attribute_value]
|
||||
try:
|
||||
res[attr.friendly_name].append(_filter_values(ava[attr.friendly_name], attr.text))
|
||||
res[attr.friendly_name].extend(_filter_values(ava[attr.friendly_name], values))
|
||||
except KeyError:
|
||||
res[attr.friendly_name] = [_filter_values(ava[attr.friendly_name], attr.text)]
|
||||
res[attr.friendly_name] = _filter_values(ava[attr.friendly_name], values)
|
||||
elif attr.name in ava:
|
||||
values = [av.text for av in attr.attribute_value]
|
||||
try:
|
||||
res[attr.name].append(_filter_values(ava[attr.name], attr.text))
|
||||
res[attr.name].extend(_filter_values(ava[attr.name], values))
|
||||
except KeyError:
|
||||
res[attr.name] = [_filter_values(ava[attr.name], attr.text)]
|
||||
res[attr.name] = _filter_values(ava[attr.name], values)
|
||||
|
||||
return res
|
||||
|
||||
|
||||
Reference in New Issue
Block a user