summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrii Ostapenko <aostapenko@mirantis.com>2019-08-11 13:52:24 -0500
committerAndrii Ostapenko <aostapenko@mirantis.com>2020-01-28 18:11:03 -0600
commitcb7ddec38377c3c64288494c359e1e31ab13c60f (patch)
treebf7a19ba72980d0bef8381328b816e9b24ae13dd
parent6dde1bd48b246a11b58831a891f716040b41b7b1 (diff)
downloadglance_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.py28
-rw-r--r--glance_store/tests/etc/glance-swift.conf5
-rw-r--r--glance_store/tests/unit/test_swift_store_utils.py34
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)