diff options
-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) |