Skip to content

Commit 79250e1

Browse files
committed
Disable rst raw and include directives.
reStructuredText has some directives that can include files or pass raw html to the output. Create new property so user can enable raw or include directives if desired. See: https://docutils.sourceforge.io/docs/howto/security.html for details.
1 parent 171c916 commit 79250e1

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

roundup/cgi/templating.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,7 +1455,10 @@ class StringHTMLProperty(HTMLProperty):
14551455
)''', re.X | re.I)
14561456
protocol_re = re.compile('^(ht|f)tp(s?)://', re.I)
14571457

1458-
1458+
# disable rst directives that have security implications
1459+
rst_defaults = {'file_insertion_enabled': 0,
1460+
'raw_enabled': 0,
1461+
'_disable_config': 1}
14591462

14601463
def _hyper_repl(self, match):
14611464
if match.group('url'):
@@ -1619,7 +1622,8 @@ def rst(self, hyperlink=1):
16191622
s = self.plain(escape=0, hyperlink=0)
16201623
if hyperlink:
16211624
s = self.hyper_re.sub(self._hyper_repl_rst, s)
1622-
return u2s(ReStructuredText(s, writer_name="html")["html_body"])
1625+
return u2s(ReStructuredText(s, writer_name="html",
1626+
settings_overrides=self.rst_defaults)["html_body"])
16231627

16241628
def markdown(self, hyperlink=1):
16251629
""" Render the value of the property as markdown.

test/test_templating.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,41 @@ def test_string_rst_installed(self):
264264

265265
def test_string_rst(self):
266266
p = StringHTMLProperty(self.client, 'test', '1', None, 'test', u2s(u'A string with [email protected] *embedded* \u00df'))
267+
268+
# test case to make sure include directive is disabled
269+
q = StringHTMLProperty(self.client, 'test', '1', None, 'test', u2s(u'\n\n.. include:: XyZrMt.html\n\n<badtag>\n\n'))
270+
q_result=u'''<div class="document">
271+
<div class="system-message">
272+
<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">&lt;string&gt;</tt>, line 3)</p>
273+
<p>&quot;include&quot; directive disabled.</p>
274+
<pre class="literal-block">
275+
.. include:: XyZrMt.html
276+
277+
</pre>
278+
</div>
279+
<p>&lt;badtag&gt;</p>
280+
</div>
281+
'''
282+
283+
# test case to make sure raw directive is disabled
284+
r = StringHTMLProperty(self.client, 'test', '1', None, 'test', u2s(u'\n\n.. raw:: html\n\n <badtag>\n\n'))
285+
r_result='''<div class="document">
286+
<div class="system-message">
287+
<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">&lt;string&gt;</tt>, line 3)</p>
288+
<p>&quot;raw&quot; directive disabled.</p>
289+
<pre class="literal-block">
290+
.. raw:: html
291+
292+
&lt;badtag&gt;
293+
294+
</pre>
295+
</div>
296+
</div>
297+
'''
267298
if ReStructuredText:
268299
self.assertEqual(p.rst(), u2s(u'<div class="document">\n<p>A string with <a class="reference external" href="mailto:cmeerw&#64;example.com">cmeerw&#64;example.com</a> <em>embedded</em> \u00df</p>\n</div>\n'))
300+
self.assertEqual(q.rst(), u2s(q_result))
301+
self.assertEqual(r.rst(), u2s(r_result))
269302
else:
270303
self.assertEqual(p.rst(), u2s(u'A string with <a href="mailto:[email protected]">[email protected]</a> *embedded* \u00df'))
271304

0 commit comments

Comments
 (0)