diff options
Diffstat (limited to 'Lib/configparser.py')
-rw-r--r-- | Lib/configparser.py | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/Lib/configparser.py b/Lib/configparser.py index 9ff52e03c2c..462af2f4abf 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -161,7 +161,7 @@ __all__ = ("NoSectionError", "DuplicateOptionError", "DuplicateSectionError", "InterpolationMissingOptionError", "InterpolationSyntaxError", "ParsingError", "MissingSectionHeaderError", "MultilineContinuationError", "UnnamedSectionDisabledError", - "ConfigParser", "RawConfigParser", + "InvalidWriteError", "ConfigParser", "RawConfigParser", "Interpolation", "BasicInterpolation", "ExtendedInterpolation", "SectionProxy", "ConverterMapping", "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH", "UNNAMED_SECTION") @@ -375,6 +375,14 @@ class _UnnamedSection: def __repr__(self): return "<UNNAMED_SECTION>" +class InvalidWriteError(Error): + """Raised when attempting to write data that the parser would read back differently. + ex: writing a key which begins with the section header pattern would read back as a + new section """ + + def __init__(self, msg=''): + Error.__init__(self, msg) + UNNAMED_SECTION = _UnnamedSection() @@ -973,6 +981,7 @@ class RawConfigParser(MutableMapping): if not unnamed: fp.write("[{}]\n".format(section_name)) for key, value in section_items: + self._validate_key_contents(key) value = self._interpolation.before_write(self, section_name, key, value) if value is not None or not self._allow_no_value: @@ -1210,6 +1219,14 @@ class RawConfigParser(MutableMapping): raise ValueError('Not a boolean: %s' % value) return self.BOOLEAN_STATES[value.lower()] + def _validate_key_contents(self, key): + """Raises an InvalidWriteError for any keys containing + delimiters or that match the section header pattern""" + if re.match(self.SECTCRE, key): + raise InvalidWriteError("Cannot write keys matching section pattern") + if any(delim in key for delim in self._delimiters): + raise InvalidWriteError("Cannot write key that contains delimiters") + def _validate_value_types(self, *, section="", option="", value=""): """Raises a TypeError for illegal non-string values. |