summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2014-12-11 08:31:03 -0500
committerTim Graham <timograham@gmail.com>2015-01-13 13:03:06 -0500
commitbaf2542c4f502d8f5adc3704eb22ca237d50aee1 (patch)
tree660e5573bbf616ba23ece50c7e7d4f0a098e8b1e /tests
parenta3bebfdc34686622b91e7f3154390ca2058957f9 (diff)
Fixed DoS possibility in ModelMultipleChoiceField.
This is a security fix. Disclosure following shortly. Thanks Keryn Knight for the report and initial patch.
Diffstat (limited to 'tests')
-rw-r--r--tests/model_forms/tests.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/tests/model_forms/tests.py b/tests/model_forms/tests.py
index 4ff900e1b2..4bb7c47eb2 100644
--- a/tests/model_forms/tests.py
+++ b/tests/model_forms/tests.py
@@ -1635,6 +1635,27 @@ class ModelMultipleChoiceFieldTests(TestCase):
with self.assertNumQueries(1):
template.render(Context({'field': field}))
+ def test_show_hidden_initial_changed_queries_efficiently(self):
+ class WriterForm(forms.Form):
+ persons = forms.ModelMultipleChoiceField(
+ show_hidden_initial=True, queryset=Writer.objects.all())
+
+ writers = (Writer.objects.create(name=str(x)) for x in range(0, 50))
+ writer_pks = tuple(x.pk for x in writers)
+ form = WriterForm(data={'initial-persons': writer_pks})
+ with self.assertNumQueries(1):
+ self.assertTrue(form.has_changed())
+
+ def test_clean_does_deduplicate_values(self):
+ class WriterForm(forms.Form):
+ persons = forms.ModelMultipleChoiceField(queryset=Writer.objects.all())
+
+ person1 = Writer.objects.create(name="Person 1")
+ form = WriterForm(data={})
+ queryset = form.fields['persons'].clean([str(person1.pk)] * 50)
+ sql, params = queryset.query.sql_with_params()
+ self.assertEqual(len(params), 1)
+
class ModelOneToOneFieldTests(TestCase):
def test_modelform_onetoonefield(self):