Merge "Reject any filter whose key contains non ascii character"

This commit is contained in:
Zuul 2018-07-03 14:42:54 +00:00 committed by Gerrit Code Review
commit 4bc1e5f6a3
2 changed files with 26 additions and 2 deletions
cinder
api
tests/unit/api

@ -405,6 +405,20 @@ def convert_filter_attributes(filters, resource):
def reject_invalid_filters(context, filters, resource,
enable_like_filter=False):
invalid_filters = []
for key in filters.copy().keys():
try:
# Only ASCII characters can be valid filter keys,
# in PY2/3, the key can be either unicode or string.
if isinstance(key, str):
key.encode('ascii')
else:
key.decode('ascii')
except (UnicodeEncodeError, UnicodeDecodeError):
raise webob.exc.HTTPBadRequest(
explanation=_('Filter keys can only contain '
'ASCII characters.'))
if context.is_admin and resource not in ['pool']:
# Allow all options except resource is pool
# pool API is only available for admin
@ -415,7 +429,6 @@ def reject_invalid_filters(context, filters, resource,
configured_filters = configured_filters[resource]
else:
configured_filters = []
invalid_filters = []
for key in filters.copy().keys():
if not enable_like_filter:
if key not in configured_filters:

@ -1,3 +1,4 @@
# encoding:utf-8
# Copyright 2010 OpenStack Foundation
# All Rights Reserved.
#
@ -401,7 +402,17 @@ class GeneralFiltersTest(test.TestCase):
'is_admin': True,
'result': {'pool': []},
'expected': None,
'resource': 'pool'})
'resource': 'pool'},
{'filters': {'中文': 'value1'},
'is_admin': True,
'result': None,
'expected': None,
'resource': None},
{'filters': {'中文': 'value1'},
'is_admin': False,
'result': {'fake_resource': []},
'expected': None,
'resource': 'fake_resource'})
@ddt.unpack
@mock.patch('cinder.api.common.get_enabled_resource_filters')
def test_reject_invalid_filters(self, mock_get, filters,