Rebuilt the filter part

This commit is contained in:
Roland Hedberg
2010-08-03 22:20:16 +02:00
parent f7f107c8ca
commit 50ef664cf9

View File

@@ -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