Edgewall Software

Ticket #123: disable_python.patch

File disable_python.patch, 7.3 KB (added by fschwindt@…, 8 years ago)

disable python code blocks

  • genshi/template/base.py

     
    288288    """
    289289
    290290    def __init__(self, source, basedir=None, filename=None, loader=None,
    291                  encoding=None, lookup='lenient'):
     291                 encoding=None, lookup='lenient', disable_python=False):
    292292        """Initialize a template from either a string, a file-like object, or
    293293        an already parsed markup stream.
    294294       
     
    305305        :param encoding: the encoding of the `source`
    306306        :param lookup: the variable lookup mechanism; either "lenient" (the
    307307                       default), "strict", or a custom lookup class
     308        :param disable_python: whether to allow python code blocks
    308309        """
    309310        self.basedir = basedir
    310311        self.filename = filename
     
    314315            self.filepath = filename
    315316        self.loader = loader
    316317        self.lookup = lookup
     318        self.disable_python = disable_python
    317319
    318320        if isinstance(source, basestring):
    319321            source = StringIO(source)
  • genshi/template/tests/markup.py

     
    438438        finally:
    439439            shutil.rmtree(dirname)
    440440
     441    def test_disable_python_true(self):
     442        xml = ("""<?python
     443          title = "A Genshi Template"
     444          ?>
     445          <html xmlns:py="http://genshi.edgewall.org/">
     446            <head>
     447              <title py:content="title">This is replaced.</title>
     448            </head>
     449        </html>""")
     450        try:
     451            tmpl = MarkupTemplate(xml, filename='test.html',
     452                                  disable_python=True)
     453            self.fail('Expected SyntaxError')
     454        except TemplateSyntaxError, e:
     455            self.assertEqual('test.html', e.filename)
    441456
     457    def test_disable_python_false(self):
     458        xml = ("""<?python
     459          title = "A Genshi Template"
     460          ?>
     461          <html xmlns:py="http://genshi.edgewall.org/">
     462            <head>
     463              <title py:content="title">This is replaced.</title>
     464            </head>
     465        </html>""")
     466        try:
     467            tmpl = MarkupTemplate(xml, filename='test.html',
     468                                  disable_python=False)
     469        except TemplateSyntaxError, e:
     470            self.fail('Unexpected SyntaxError')
     471
    442472def suite():
    443473    suite = unittest.TestSuite()
    444474    suite.addTest(doctest.DocTestSuite(MarkupTemplate.__module__))
  • genshi/template/plugin.py

     
    6363            raise ConfigurationError('Unknown lookup errors mode "%s"' %
    6464                                     lookup_errors)
    6565
     66        disable_python = options.get('genshi.disable_python', False)
     67        if not isinstance(disable_python, bool):
     68            raise ConfigurationError('Invalid value for disable_python "%s"' %
     69                                     disable_python)
     70
    6671        self.loader = TemplateLoader(filter(None, search_path),
    6772                                     auto_reload=auto_reload,
    6873                                     max_cache_size=max_cache_size,
    6974                                     default_class=self.template_class,
    70                                      variable_lookup=lookup_errors)
     75                                     variable_lookup=lookup_errors,
     76                                     disable_python=disable_python)
    7177
    7278    def load_template(self, templatename, template_string=None):
    7379        """Find a template specified in python 'dot' notation, or load one from
  • genshi/template/markup.py

     
    6767                  ('strip', StripDirective)]
    6868
    6969    def __init__(self, source, basedir=None, filename=None, loader=None,
    70                  encoding=None, lookup='lenient'):
     70                 encoding=None, lookup='lenient', disable_python=False):
    7171        Template.__init__(self, source, basedir=basedir, filename=filename,
    72                           loader=loader, encoding=encoding, lookup=lookup)
     72                          loader=loader, encoding=encoding, lookup=lookup,
     73                          disable_python=disable_python)
    7374        # Make sure the include filter comes after the match filter
    7475        if loader:
    7576            self.filters.remove(self._include)
     
    185186                                              pos)]
    186187
    187188            elif kind is PI and data[0] == 'python':
     189                if self.disable_python:
     190                    raise TemplateSyntaxError('Python code block are '
     191                                              'disabled',
     192                                              self.filepath, *pos[1:])
    188193                try:
    189194                    # As Expat doesn't report whitespace between the PI target
    190195                    # and the data, we have to jump through some hoops here to
  • genshi/template/loader.py

     
    7373    """
    7474    def __init__(self, search_path=None, auto_reload=False,
    7575                 default_encoding=None, max_cache_size=25, default_class=None,
    76                  variable_lookup='lenient', callback=None):
     76                 variable_lookup='lenient', disable_python=False,
     77                 callback=None):
    7778        """Create the template laoder.
    7879       
    7980        :param search_path: a list of absolute path names that should be
     
    9091        :param variable_lookup: the variable lookup mechanism; either "lenient"
    9192                                (the default), "strict", or a custom lookup
    9293                                class
     94        :param disable_python: whether to allow python code blocks
    9395        :param callback: (optional) a callback function that is invoked after a
    9496                         template was initialized by this loader; the function
    9597                         is passed the template object as only argument. This
     
    108110        self.default_encoding = default_encoding
    109111        self.default_class = default_class or MarkupTemplate
    110112        self.variable_lookup = variable_lookup
     113        self.disable_python = disable_python
    111114        if callback is not None and not callable(callback):
    112115            raise TypeError('The "callback" parameter needs to be callable')
    113116        self.callback = callback
     
    200203                            dirname = ''
    201204                        tmpl = cls(fileobj, basedir=dirname, filename=filename,
    202205                                   loader=self, lookup=self.variable_lookup,
    203                                    encoding=encoding)
     206                                   encoding=encoding,
     207                                   disable_python=self.disable_python)
    204208                        if self.callback:
    205209                            self.callback(tmpl)
    206210                        self._cache[filename] = tmpl