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