Skip to content

Commit 85ca0c7

Browse files
committed
fix(account/templatetags): user_display did not escape
1 parent b8ba63c commit 85ca0c7

File tree

3 files changed

+29
-35
lines changed

3 files changed

+29
-35
lines changed

ChangeLog.rst

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
1-
Upcoming
2-
********
1+
0.38.0 (2018-10-03)
2+
*******************
3+
4+
Security notice
5+
---------------
6+
7+
The ``{% user_display user %}`` tag did not escape properly. Depending on the
8+
username validation rules, this could lead to XSS issues.
9+
310

411
Note worthy changes
5-
------------------------------
12+
-------------------
13+
14+
- New provider: Vimeo (OAuth2).
615

7-
- New translation: Basque.
16+
- New translations: Basque.
817

918

1019
0.37.1 (2018-08-27)

allauth/account/templatetags/account.py

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,8 @@
66
register = template.Library()
77

88

9-
class UserDisplayNode(template.Node):
10-
11-
def __init__(self, user, as_var=None):
12-
self.user_var = template.Variable(user)
13-
self.as_var = as_var
14-
15-
def render(self, context):
16-
user = self.user_var.resolve(context)
17-
18-
display = user_display(user)
19-
20-
if self.as_var:
21-
context[self.as_var] = display
22-
return ""
23-
return display
24-
25-
26-
@register.tag(name="user_display")
27-
def do_user_display(parser, token):
9+
@register.simple_tag(name='user_display')
10+
def user_display_tag(user):
2811
"""
2912
Example usage::
3013
@@ -38,15 +21,4 @@ def do_user_display(parser, token):
3821
{% endblocktrans %}
3922
4023
"""
41-
bits = token.split_contents()
42-
if len(bits) == 2:
43-
user = bits[1]
44-
as_var = None
45-
elif len(bits) == 4:
46-
user = bits[1]
47-
as_var = bits[3]
48-
else:
49-
raise template.TemplateSyntaxError(
50-
"'%s' takes either two or four arguments" % bits[0])
51-
52-
return UserDisplayNode(user, as_var)
24+
return user_display(user)

allauth/account/tests.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from django.core.exceptions import ValidationError
1313
from django.db import models
1414
from django.http import HttpResponseRedirect
15+
from django.template import Context, Template
1516
from django.test.client import Client, RequestFactory
1617
from django.test.utils import override_settings
1718
from django.urls import reverse
@@ -1126,6 +1127,18 @@ def test_username_case_preserved(self):
11261127
# TODO: Actually test something
11271128
filter_users_by_username('camelcase', 'foobar')
11281129

1130+
def test_user_display(self):
1131+
user = get_user_model()(username='john<br/>doe')
1132+
expected_name = 'john&lt;br/&gt;doe'
1133+
templates = [
1134+
'{% load account %}{% user_display user %}',
1135+
'{% load account %}{% user_display user as x %}{{ x }}'
1136+
]
1137+
for template in templates:
1138+
t = Template(template)
1139+
content = t.render(Context({'user': user}))
1140+
self.assertEqual(content, expected_name)
1141+
11291142

11301143
class ConfirmationViewTests(TestCase):
11311144
def _create_user(self, username='john', password='doe'):

0 commit comments

Comments
 (0)