~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/util.py

  • Committer: William Grant
  • Date: 2011-03-24 23:02:29 UTC
  • mfrom: (441.1.7 xss-fix)
  • Revision ID: william.grant@canonical.com-20110324230229-zq85fy6aqvlyylbu
Improve escaping of filenames in revision views. Fixes a couple of XSS holes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
#
21
21
 
22
22
import base64
23
 
import cgi
24
23
import datetime
25
24
import logging
26
25
import re
214
213
# only do this if unicode turns out to be a problem
215
214
#_BADCHARS_RE = re.compile(ur'[\u007f-\uffff]')
216
215
 
 
216
# Can't be a dict; & needs to be done first.
 
217
html_entity_subs = [
 
218
    ("&", "&"),
 
219
    ('"', """),
 
220
    ("'", "'"), # ' is defined in XML, but not HTML.
 
221
    (">", ">"),
 
222
    ("<", "&lt;"),
 
223
    ]
 
224
 
 
225
 
 
226
def html_escape(s):
 
227
    """Transform dangerous (X)HTML characters into entities.
 
228
 
 
229
    Like cgi.escape, except also escaping " and '. This makes it safe to use
 
230
    in both attribute and element content.
 
231
 
 
232
    If you want to safely fill a format string with escaped values, use
 
233
    html_format instead
 
234
    """
 
235
    for char, repl in html_entity_subs:
 
236
        s = s.replace(char, repl)
 
237
    return s
 
238
 
 
239
 
 
240
def html_format(template, *args):
 
241
    """Safely format an HTML template string, escaping the arguments.
 
242
 
 
243
    The template string must not be user-controlled; it will not be escaped.
 
244
    """
 
245
    return template % tuple(html_escape(arg) for arg in args)
 
246
 
 
247
 
217
248
# FIXME: get rid of this method; use fixed_width() and avoid XML().
218
249
 
219
 
 
220
250
def html_clean(s):
221
251
    """
222
252
    clean up a string for html display.  expand any tabs, encode any html
223
253
    entities, and replace spaces with '&nbsp;'.  this is primarily for use
224
254
    in displaying monospace text.
225
255
    """
226
 
    s = cgi.escape(s.expandtabs())
 
256
    s = html_escape(s.expandtabs())
227
257
    s = s.replace(' ', '&nbsp;')
228
258
    return s
229
259
 
269
299
        except UnicodeDecodeError:
270
300
            s = s.decode('iso-8859-15')
271
301
 
272
 
    s = cgi.escape(s).expandtabs().replace(' ', NONBREAKING_SPACE)
 
302
    s = html_escape(s).expandtabs().replace(' ', NONBREAKING_SPACE)
273
303
 
274
304
    return HSC.clean(s).replace('\n', '<br/>')
275
305