Skip to content

Commit

Permalink
[1.0.X] Fixed #10034: the formtools security hash function is now fri…
Browse files Browse the repository at this point in the history
…endlier to browsers that submit leading/trailing whitespace in form fields. Backport of [10752] from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10754 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
jacobian committed May 12, 2009
1 parent 5e20f14 commit 08577ab
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
21 changes: 20 additions & 1 deletion django/contrib/formtools/tests.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import unittest
from django import forms
from django.contrib.formtools import preview, wizard
from django.contrib.formtools import preview, wizard, utils
from django import http
from django.test import TestCase

Expand Down Expand Up @@ -101,6 +102,24 @@ def test_bool_submit(self):
response = self.client.post('/test1/', self.test_data)
self.assertEqual(response.content, success_string)

class SecurityHashTests(unittest.TestCase):

def test_textfield_hash(self):
"""
Regression test for #10034: the hash generation function should ignore
leading/trailing whitespace so as to be friendly to broken browsers that
submit it (usually in textareas).
"""
class TestForm(forms.Form):
name = forms.CharField()
bio = forms.CharField()

f1 = TestForm({'name': 'joe', 'bio': 'Nothing notable.'})
f2 = TestForm({'name': ' joe', 'bio': 'Nothing notable. '})
hash1 = utils.security_hash(None, f1)
hash2 = utils.security_hash(None, f2)
self.assertEqual(hash1, hash2)

#
# FormWizard tests
#
Expand Down
7 changes: 6 additions & 1 deletion django/contrib/formtools/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,12 @@ def security_hash(request, form, *args):
hash of that.
"""

data = [(bf.name, bf.field.clean(bf.data) or '') for bf in form]
data = []
for bf in form:
value = bf.field.clean(bf.data) or ''
if isinstance(value, basestring):
value = value.strip()
data.append((bf.name, value))
data.extend(args)
data.append(settings.SECRET_KEY)

Expand Down

0 comments on commit 08577ab

Please sign in to comment.