Skip to content

Commit

Permalink
Fix urlize_quoted_links tag to avoid double escaping in autoescape …
Browse files Browse the repository at this point in the history
…mode
  • Loading branch information
zyv committed Dec 14, 2018
1 parent be68c52 commit 343ce4a
Showing 1 changed file with 13 additions and 13 deletions.
26 changes: 13 additions & 13 deletions rest_framework/templatetags/rest_framework.py
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,12 @@ def trim_url(x, limit=trim_url_limit):
return limit is not None and (len(x) > limit and ('%s...' % x[:max(0, limit - 3)])) or x

safe_input = isinstance(text, SafeData)

# Unfortunately, Django built-in cannot be used here, because escaping
# is to be performed on words, which have been forcibly coerced to text
def conditional_escape(text):
return escape(text) if autoescape and not safe_input else text

words = word_split_re.split(force_text(text))
for i, word in enumerate(words):
if '.' in word or '@' in word or ':' in word:
Expand Down Expand Up @@ -376,21 +382,15 @@ def trim_url(x, limit=trim_url_limit):
# Make link.
if url:
trimmed = trim_url(middle)
if autoescape and not safe_input:
lead, trail = escape(lead), escape(trail)
url, trimmed = escape(url), escape(trimmed)
lead, trail = conditional_escape(lead), conditional_escape(trail)
url, trimmed = conditional_escape(url), conditional_escape(trimmed)
middle = '<a href="%s"%s>%s</a>' % (url, nofollow_attr, trimmed)
words[i] = mark_safe('%s%s%s' % (lead, middle, trail))
words[i] = '%s%s%s' % (lead, middle, trail)
else:
if safe_input:
words[i] = mark_safe(word)
elif autoescape:
words[i] = escape(word)
elif safe_input:
words[i] = mark_safe(word)
elif autoescape:
words[i] = escape(word)
return ''.join(words)
words[i] = conditional_escape(word)
else:
words[i] = conditional_escape(word)
return mark_safe(''.join(words))


@register.filter
Expand Down

0 comments on commit 343ce4a

Please sign in to comment.