[Python-checkins] python/dist/src/Lib ConfigParser.py,1.49,1.50

fdrake@users.sourceforge.net fdrake@users.sourceforge.net
Fri, 25 Oct 2002 14:52:03 -0700


Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv25460/Lib

Modified Files:
	ConfigParser.py 
Log Message:
Implement a safer and more predictable interpolation approach.
Closes SF bug #511737.


Index: ConfigParser.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/ConfigParser.py,v
retrieving revision 1.49
retrieving revision 1.50
diff -C2 -d -r1.49 -r1.50
*** ConfigParser.py	25 Oct 2002 20:41:30 -0000	1.49
--- ConfigParser.py	25 Oct 2002 21:52:00 -0000	1.50
***************
*** 539,540 ****
--- 539,588 ----
              raise InterpolationDepthError(option, section, rawval)
          return value
+ 
+ 
+ class SafeConfigParser(ConfigParser):
+ 
+     def _interpolate(self, section, option, rawval, vars):
+         # do the string interpolation
+         L = []
+         self._interpolate_some(option, L, rawval, section, vars, 1)
+         return ''.join(L)
+ 
+     _interpvar_match = re.compile(r"%\(([^)]+)\)s").match
+ 
+     def _interpolate_some(self, option, accum, rest, section, map, depth):
+         if depth > MAX_INTERPOLATION_DEPTH:
+             raise InterpolationDepthError(option, section, rest)
+         while rest:
+             p = rest.find("%")
+             if p < 0:
+                 accum.append(rest)
+                 return
+             if p > 0:
+                 accum.append(rest[:p])
+                 rest = rest[p:]
+             # p is no longer used
+             c = rest[1:2]
+             if c == "%":
+                 accum.append("%")
+                 rest = rest[2:]
+             elif c == "(":
+                 m = self._interpvar_match(rest)
+                 if m is None:
+                     raise InterpolationSyntaxError(
+                         "bad interpolation variable syntax at: %r" % rest)
+                 var = m.group(1)
+                 rest = rest[m.end():]
+                 try:
+                     v = map[var]
+                 except KeyError:
+                     raise InterpolationError(
+                         "no value found for %r" % var)
+                 if "%" in v:
+                     self._interpolate_some(option, accum, v,
+                                            section, map, depth + 1)
+                 else:
+                     accum.append(v)
+             else:
+                 raise InterpolationSyntaxError(
+                     "'%' must be followed by '%' or '('")