diff options
author | Andrii Ostapenko <aostapenko@mirantis.com> | 2019-08-11 13:52:24 -0500 |
---|---|---|
committer | Andrii Ostapenko <aostapenko@mirantis.com> | 2020-01-28 18:11:03 -0600 |
commit | cb7ddec38377c3c64288494c359e1e31ab13c60f (patch) | |
tree | bf7a19ba72980d0bef8381328b816e9b24ae13dd | |
parent | 6dde1bd48b246a11b58831a891f716040b41b7b1 (diff) | |
download | glance_store-cb7ddec38377c3c64288494c359e1e31ab13c60f.tar.gz |
Restore quotes removal for swift config in Python3
ConfigParser does not remove quotes in Python3 that may break existing
configuration. This commit restores Python2 behavior and acts as
oslo.config StrOpt with quotes=True.
Closes-bug: #1839778
Related-bug: #1839772
Change-Id: I9e8e7e32b7abf1020081cc3b9fbdf7229403b7bf
-rw-r--r-- | glance_store/_drivers/swift/utils.py | 28 | ||||
-rw-r--r-- | glance_store/tests/etc/glance-swift.conf | 5 | ||||
-rw-r--r-- | glance_store/tests/unit/test_swift_store_utils.py | 34 |
3 files changed, 65 insertions, 2 deletions
diff --git a/glance_store/_drivers/swift/utils.py b/glance_store/_drivers/swift/utils.py index bbd8a4c..4a1d8be 100644 --- a/glance_store/_drivers/swift/utils.py +++ b/glance_store/_drivers/swift/utils.py @@ -105,9 +105,33 @@ _config_defaults = {'user_domain_id': 'default', 'project_domain_name': 'default'} if sys.version_info >= (3, 2): - CONFIG = configparser.ConfigParser(defaults=_config_defaults) + parser_class = configparser.ConfigParser else: - CONFIG = configparser.SafeConfigParser(defaults=_config_defaults) + parser_class = configparser.SafeConfigParser + + +class SwiftConfigParser(parser_class): + + def get(self, *args, **kwargs): + value = super(parser_class, self).get(*args, **kwargs) + return self._process_quotes(value) + + @staticmethod + def _process_quotes(value): + if value: + if value[0] in "\"'": + if len(value) == 1 or value[-1] != value[0]: + raise ValueError('Non-closed quote: %s' % + value) + value = value[1:-1] + return value + + +if sys.version_info >= (3,): + CONFIG = SwiftConfigParser(defaults=_config_defaults) +else: + CONFIG = parser_class(defaults=_config_defaults) + LOG = logging.getLogger(__name__) diff --git a/glance_store/tests/etc/glance-swift.conf b/glance_store/tests/etc/glance-swift.conf index c5af3dd..916d676 100644 --- a/glance_store/tests/etc/glance-swift.conf +++ b/glance_store/tests/etc/glance-swift.conf @@ -11,6 +11,11 @@ project_domain_id = default auth_version = 3 auth_address = http://example.com +[ref3] +user = "user3" +key = "key3" +auth_address = "http://example.com" + [store_2] user = tenant:user1 key = key1 diff --git a/glance_store/tests/unit/test_swift_store_utils.py b/glance_store/tests/unit/test_swift_store_utils.py index 6651a74..94079ae 100644 --- a/glance_store/tests/unit/test_swift_store_utils.py +++ b/glance_store/tests/unit/test_swift_store_utils.py @@ -85,3 +85,37 @@ class TestSwiftParams(base.StoreBaseTest): self.assertEqual('http://example.com', swift_params['ref2']['auth_address'] ) + + def test_swift_store_config_validates_quotes_removal(self): + swift_params = sutils.SwiftParams(self.conf).params + self.assertEqual('user3', + swift_params['ref3']['user'] + ) + self.assertEqual('key3', + swift_params['ref3']['key'] + ) + self.assertEqual('http://example.com', + swift_params['ref3']['auth_address'] + ) + + +class TestSwiftConfigParser(base.StoreBaseTest): + + def setUp(self): + super(TestSwiftConfigParser, self).setUp() + self.method = sutils.SwiftConfigParser._process_quotes + + def test_quotes_processor(self): + self.assertEqual('user', self.method('user')) + self.assertEqual('user', self.method('"user"')) + self.assertEqual("user", self.method("'user'")) + self.assertEqual("user'", self.method("user'")) + self.assertEqual('user"', self.method('user"')) + + def test_quotes_processor_negative(self): + negative_values = [ + '\'user"', '"user\'', '\'user', '"user\'', + "'user", '"user', '"', "'", + ] + for value in negative_values: + self.assertRaises(ValueError, self.method, value) |