Browse Source

Add checking of variable names.

Jelmer Vernooij 13 years ago
parent
commit
ee6001bc00
2 changed files with 27 additions and 0 deletions
  1. 13 0
      dulwich/config.py
  2. 14 0
      dulwich/tests/test_config.py

+ 13 - 0
dulwich/config.py

@@ -137,6 +137,13 @@ def _escape_value(value):
     return value.replace("\\", "\\\\").replace("\n", "\\n").replace("\t", "\\t").replace("\"", "\\\"")
 
 
+def _check_variable_name(name):
+    for c in name:
+        if not c.isalnum() and c != '-':
+            return False
+    return True
+
+
 class ConfigFile(ConfigDict):
     """A Git configuration file, like .git/config or ~/.gitconfig.
     """
@@ -174,6 +181,8 @@ class ConfigFile(ConfigDict):
                     if section is None:
                         raise ValueError("setting %r without section" % line)
                     setting = setting.strip()
+                    if not _check_variable_name(setting):
+                        raise ValueError("invalid variable name %s" % setting)
                     if value.endswith("\\\n"):
                         value = value[:-2]
                         continuation = True
@@ -185,6 +194,8 @@ class ConfigFile(ConfigDict):
                         setting = None
                 else:
                     setting = line.strip()
+                    if not _check_variable_name(setting):
+                        raise ValueError("invalid variable name %s" % setting)
                     if section is None:
                         raise ValueError("setting %r without section" % line)
                     ret._values[section][setting] = ""
@@ -280,3 +291,5 @@ class StackedConfig(Config):
 
     def set(self, section, name, value):
         raise NotImplementedError(self.set)
+
+

+ 14 - 0
dulwich/tests/test_config.py

@@ -23,6 +23,7 @@ from dulwich.config import (
     ConfigDict,
     ConfigFile,
     StackedConfig,
+    _check_variable_name,
     _format_string,
     _escape_value,
     _parse_string,
@@ -173,3 +174,16 @@ class ParseStringTests(TestCase):
     def test_not_quoted(self):
         self.assertEquals('foo', _parse_string("foo"))
         self.assertEquals('foo bar', _parse_string("foo bar"))
+
+
+class CheckVariableNameTests(TestCase):
+
+    def test_invalid(self):
+        self.assertFalse(_check_variable_name("foo "))
+        self.assertFalse(_check_variable_name("bar,bar"))
+        self.assertFalse(_check_variable_name("bar.bar"))
+
+    def test_valid(self):
+        self.assertTrue(_check_variable_name("FOO"))
+        self.assertTrue(_check_variable_name("foo"))
+        self.assertTrue(_check_variable_name("foo-bar"))