diff --git a/common/test/acceptance/tests/lms/test_teams.py b/common/test/acceptance/tests/lms/test_teams.py
index db7ad3de81..40d6dc963d 100644
--- a/common/test/acceptance/tests/lms/test_teams.py
+++ b/common/test/acceptance/tests/lms/test_teams.py
@@ -8,9 +8,10 @@ import time
from dateutil.parser import parse
import ddt
from nose.plugins.attrib import attr
+from selenium.common.exceptions import TimeoutException
from uuid import uuid4
-from ..helpers import EventsTestMixin, UniqueCourseTest
+from ..helpers import get_modal_alert, EventsTestMixin, UniqueCourseTest
from ...fixtures import LMS_BASE_URL
from ...fixtures.course import CourseFixture
from ...fixtures.discussion import (
@@ -60,18 +61,23 @@ class TeamsTabBase(EventsTestMixin, UniqueCourseTest):
'language': 'aa',
'country': 'AF'
}
- response = self.course_fixture.session.post(
- LMS_BASE_URL + '/api/team/v0/teams/',
- data=json.dumps(team),
- headers=self.course_fixture.headers
- )
+ teams.append(self.post_team_data(team))
# Sadly, this sleep is necessary in order to ensure that
# sorting by last_activity_at works correctly when running
# in Jenkins.
time.sleep(time_between_creation)
- teams.append(json.loads(response.text))
return teams
+ def post_team_data(self, team_data):
+ """Given a JSON representation of a team, post it to the server."""
+ response = self.course_fixture.session.post(
+ LMS_BASE_URL + '/api/team/v0/teams/',
+ data=json.dumps(team_data),
+ headers=self.course_fixture.headers
+ )
+ self.assertEqual(response.status_code, 200)
+ return json.loads(response.text)
+
def create_membership(self, username, team_id):
"""Assign `username` to `team_id`."""
response = self.course_fixture.session.post(
@@ -838,6 +844,26 @@ class BrowseTeamsWithinTopicTest(TeamsTabBase):
with self.assert_events_match_during(self.only_team_events, expected_events=events):
self.browse_teams_page.visit()
+ def test_team_name_xss(self):
+ """
+ Scenario: Team names should be HTML-escaped on the teams page
+ Given I am enrolled in a course with teams enabled
+ When I visit the Teams page for a topic, with a team name containing JS code
+ Then I should not see any alerts
+ """
+ self.post_team_data({
+ 'course_id': self.course_id,
+ 'topic_id': self.topic['id'],
+ 'name': '',
+ 'description': 'Description',
+ 'language': 'aa',
+ 'country': 'AF'
+ })
+ with self.assertRaises(TimeoutException):
+ self.browser.get(self.browse_teams_page.url)
+ alert = get_modal_alert(self.browser)
+ alert.accept()
+
@attr('shard_5')
class TeamFormActions(TeamsTabBase):
diff --git a/lms/djangoapps/teams/static/teams/js/views/team_card.js b/lms/djangoapps/teams/static/teams/js/views/team_card.js
index b9561e0bef..770a112814 100644
--- a/lms/djangoapps/teams/static/teams/js/views/team_card.js
+++ b/lms/djangoapps/teams/static/teams/js/views/team_card.js
@@ -135,7 +135,7 @@
actionContent: function() {
return interpolate(
gettext('View %(span_start)s %(team_name)s %(span_end)s'),
- {span_start: '', team_name: this.teamModel().get('name'), span_end: ''},
+ {span_start: '', team_name: _.escape(this.teamModel().get('name')), span_end: ''},
true
);
},