Skip to content

Commit 8eb6415

Browse files
corona10vstinner
authored andcommitted
[2.7] bpo-38243: Escape the server title of DocXMLRPCServer (GH-16447)
Escape the server title of DocXMLRPCServer.DocXMLRPCServer when rendering the document page as HTML.
1 parent 598f676 commit 8eb6415

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

‎Lib/DocXMLRPCServer.py‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@
2020
CGIXMLRPCRequestHandler,
2121
resolve_dotted_attribute)
2222

23+
24+
def _html_escape_quote(s):
25+
s = s.replace("&", "&") # Must be done first!
26+
s = s.replace("<", "&lt;")
27+
s = s.replace(">", "&gt;")
28+
s = s.replace('"', "&quot;")
29+
s = s.replace('\'', "&#x27;")
30+
return s
31+
32+
2333
class ServerHTMLDoc(pydoc.HTMLDoc):
2434
"""Class used to generate pydoc HTML document for a server"""
2535

@@ -210,7 +220,8 @@ def generate_html_documentation(self):
210220
methods
211221
)
212222

213-
return documenter.page(self.server_title, documentation)
223+
title = _html_escape_quote(self.server_title)
224+
return documenter.page(title, documentation)
214225

215226
class DocXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
216227
"""XML-RPC and documentation request handler class.

‎Lib/test/test_docxmlrpc.py‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from DocXMLRPCServer import DocXMLRPCServer
22
import httplib
3+
import re
34
import sys
45
from test import test_support
56
threading = test_support.import_module('threading')
@@ -176,6 +177,25 @@ def test_autolink_dotted_methods(self):
176177
self.assertIn("""Try&nbsp;self.<strong>add</strong>,&nbsp;too.""",
177178
response.read())
178179

180+
def test_server_title_escape(self):
181+
"""Test that the server title and documentation
182+
are escaped for HTML.
183+
"""
184+
self.serv.set_server_title('test_title<script>')
185+
self.serv.set_server_documentation('test_documentation<script>')
186+
self.assertEqual('test_title<script>', self.serv.server_title)
187+
self.assertEqual('test_documentation<script>',
188+
self.serv.server_documentation)
189+
190+
generated = self.serv.generate_html_documentation()
191+
title = re.search(r'<title>(.+?)</title>', generated).group()
192+
documentation = re.search(r'<p><tt>(.+?)</tt></p>', generated).group()
193+
self.assertEqual('<title>Python: test_title&lt;script&gt;</title>',
194+
title)
195+
self.assertEqual('<p><tt>test_documentation&lt;script&gt;</tt></p>',
196+
documentation)
197+
198+
179199
def test_main():
180200
test_support.run_unittest(DocXMLRPCHTTPGETServer)
181201

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Escape the server title of :class:`DocXMLRPCServer.DocXMLRPCServer`
2+
when rendering the document page as HTML.
3+
(Contributed by Dong-hee Na in :issue:`38243`.)

0 commit comments

Comments
 (0)