From 9276aac8d20a28d89dfde37b5e543697959e3362 Mon Sep 17 00:00:00 2001 From: uzairr Date: Mon, 15 Jul 2019 20:35:10 +0500 Subject: [PATCH] Restrict grading endpoints in LMS Cuurently, grading endpoints in capa module are vulnerable as they are not restricted.To avoid it, changes have been made so that they are available only for logged-in users. LEARNER-3761 --- lms/djangoapps/courseware/module_render.py | 21 ++++++++++--------- .../courseware/tests/test_module_render.py | 20 ++++++++++++++++++ 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/lms/djangoapps/courseware/module_render.py b/lms/djangoapps/courseware/module_render.py index 4e1e114d8e9f..7100e52a8ea9 100644 --- a/lms/djangoapps/courseware/module_render.py +++ b/lms/djangoapps/courseware/module_render.py @@ -577,16 +577,17 @@ def handle_grade_event(block, event): """ Submit a grade for the block. """ - grades_signals.SCORE_PUBLISHED.send( - sender=None, - block=block, - user=user, - raw_earned=event['value'], - raw_possible=event['max_value'], - only_if_higher=event.get('only_if_higher'), - score_deleted=event.get('score_deleted'), - grader_response=event.get('grader_response') - ) + if not user.is_anonymous(): + grades_signals.SCORE_PUBLISHED.send( + sender=None, + block=block, + user=user, + raw_earned=event['value'], + raw_possible=event['max_value'], + only_if_higher=event.get('only_if_higher'), + score_deleted=event.get('score_deleted'), + grader_response=event.get('grader_response') + ) def handle_deprecated_progress_event(block, event): """ diff --git a/lms/djangoapps/courseware/tests/test_module_render.py b/lms/djangoapps/courseware/tests/test_module_render.py index 65f08d38d463..7bd8c571194c 100644 --- a/lms/djangoapps/courseware/tests/test_module_render.py +++ b/lms/djangoapps/courseware/tests/test_module_render.py @@ -906,6 +906,26 @@ def test_skip_handlers_for_masquerading_staff(self): with self.assertRaises(BlockCompletion.DoesNotExist): BlockCompletion.objects.get(block_key=block.scope_ids.usage_id) + @XBlock.register_temp_plugin(GradedStatelessXBlock, identifier='stateless_scorer') + @patch('lms.djangoapps.courseware.module_render.grades_signals.SCORE_PUBLISHED.send') + def test_anonymous_user_not_be_graded(self, mock_score_signal): + course = CourseFactory.create() + descriptor_kwargs = { + 'category': 'problem', + } + request = self.request_factory.get('/') + request.user = AnonymousUser() + descriptor = ItemFactory.create(**descriptor_kwargs) + + render.handle_xblock_callback( + request, + text_type(course.id), + quote_slashes(text_type(descriptor.location)), + 'xmodule_handler', + 'problem_check', + ) + self.assertFalse(mock_score_signal.called) + @ddt.ddt @patch.dict('django.conf.settings.FEATURES', {'ENABLE_XBLOCK_VIEW_ENDPOINT': True})