add name_check to /info
Also removed a bunch of unnecessary unquotes. Just use path_info instead (it's already unquoted). Partial-Bug: #1670915 Change-Id: If1af43485b4708cab6c4b5d7f6f0a334d8752518
This commit is contained in:
parent
8b2f01a619
commit
cd39778824
@ -165,6 +165,11 @@ is a normal object and not a copy of the manifest. Instead it is a
|
||||
concatenation of all the segment objects. This means that you
|
||||
cannot copy objects larger than 5 GB.
|
||||
|
||||
Note that the provider may have limited the characters which are allowed
|
||||
in an object name. Any name limits are exposed under the ``name_check`` key
|
||||
in the ``/info`` discoverability response. Regardless of ``name_check``
|
||||
limitations, names must be URL quoted UTF-8.
|
||||
|
||||
To create custom metadata, use the
|
||||
``X-Object-Meta-name`` header, where ``name`` is the name of the metadata
|
||||
item.
|
||||
|
@ -40,10 +40,8 @@ The filter returns HTTPBadRequest if path is invalid.
|
||||
@author: eamonn-otoole
|
||||
'''
|
||||
|
||||
from six.moves.urllib.parse import unquote
|
||||
|
||||
import re
|
||||
from swift.common.utils import get_logger
|
||||
from swift.common.utils import get_logger, register_swift_info
|
||||
|
||||
from swift.common.swob import Request, HTTPBadRequest
|
||||
|
||||
@ -69,6 +67,15 @@ class NameCheckMiddleware(object):
|
||||
self.forbidden_regexp_compiled = None
|
||||
self.logger = get_logger(self.conf, log_route='name_check')
|
||||
|
||||
self.register_info()
|
||||
|
||||
def register_info(self):
|
||||
register_swift_info('name_check',
|
||||
forbidden_chars=self.forbidden_chars,
|
||||
maximum_length=self.maximum_length,
|
||||
forbidden_regexp=self.forbidden_regexp
|
||||
)
|
||||
|
||||
def check_character(self, req):
|
||||
'''
|
||||
Checks req.path for any forbidden characters
|
||||
@ -79,7 +86,7 @@ class NameCheckMiddleware(object):
|
||||
self.logger.debug("name_check: self.forbidden_chars %s" %
|
||||
self.forbidden_chars)
|
||||
|
||||
return any((c in unquote(req.path)) for c in self.forbidden_chars)
|
||||
return any((c in req.path_info) for c in self.forbidden_chars)
|
||||
|
||||
def check_length(self, req):
|
||||
'''
|
||||
@ -87,7 +94,7 @@ class NameCheckMiddleware(object):
|
||||
Returns True if the length exceeds the maximum
|
||||
Returns False if the length is <= the maximum
|
||||
'''
|
||||
length = len(unquote(req.path))
|
||||
length = len(req.path_info)
|
||||
return length > self.maximum_length
|
||||
|
||||
def check_regexp(self, req):
|
||||
@ -103,8 +110,7 @@ class NameCheckMiddleware(object):
|
||||
self.logger.debug("name_check: self.forbidden_regexp %s" %
|
||||
self.forbidden_regexp)
|
||||
|
||||
unquoted_path = unquote(req.path)
|
||||
match = self.forbidden_regexp_compiled.search(unquoted_path)
|
||||
match = self.forbidden_regexp_compiled.search(req.path_info)
|
||||
return (match is not None)
|
||||
|
||||
def __call__(self, env, start_response):
|
||||
|
@ -21,10 +21,12 @@ Created on February 29, 2012
|
||||
@author: eamonn-otoole
|
||||
'''
|
||||
|
||||
import numbers
|
||||
import unittest
|
||||
|
||||
from swift.common.swob import Request, Response
|
||||
from swift.common.middleware import name_check
|
||||
from swift.common import utils
|
||||
|
||||
MAX_LENGTH = 255
|
||||
FORBIDDEN_CHARS = '\'\"<>`'
|
||||
@ -116,5 +118,25 @@ class TestNameCheckMiddleware(unittest.TestCase):
|
||||
self.assertEqual(resp.body, 'OK')
|
||||
|
||||
|
||||
class TestSwiftInfo(unittest.TestCase):
|
||||
def setUp(self):
|
||||
utils._swift_info = {}
|
||||
utils._swift_admin_info = {}
|
||||
|
||||
def test_registered_defaults(self):
|
||||
name_check.filter_factory({})(FakeApp())
|
||||
swift_info = utils.get_swift_info()
|
||||
self.assertTrue('name_check' in swift_info)
|
||||
self.assertTrue(isinstance(
|
||||
swift_info['name_check'].get('maximum_length'),
|
||||
numbers.Integral))
|
||||
self.assertTrue(isinstance(
|
||||
swift_info['name_check'].get('forbidden_chars'),
|
||||
str))
|
||||
self.assertTrue(isinstance(
|
||||
swift_info['name_check'].get('forbidden_regexp'),
|
||||
str))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
Loading…
Reference in New Issue
Block a user