Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #17693. Input validation and tests for base36 conversion utils.…

… Thanks Keryn Knight for the report.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17525 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 6072e108e2738dbde7c2ad976a45745551859a20 1 parent 41256d2
Paul McMillan PaulMcMillan authored
2  django/utils/http.py
View
@@ -171,6 +171,8 @@ def int_to_base36(i):
"""
digits = "0123456789abcdefghijklmnopqrstuvwxyz"
factor = 0
+ if (i < 0) or (i > sys.maxint):
+ raise ValueError("Base36 conversion input too large or incorrect type.")
# Find starting factor
while True:
factor += 1
2  docs/ref/utils.txt
View
@@ -444,7 +444,7 @@ Atom1Feed
.. function:: int_to_base36(i)
- Converts an integer to a base 36 string.
+ Converts a positive integer less than sys.maxint to a base 36 string.
``django.utils.safestring``
===========================
24 tests/regressiontests/utils/http.py
View
@@ -1,3 +1,5 @@
+import sys
+
from django.utils import http
from django.utils import unittest
from django.utils.datastructures import MultiValueDict
@@ -98,3 +100,25 @@ def no_content_response_with_unsafe_content_type():
utils.fix_IE_for_vary(ie_request, response)
self.assertFalse('Vary' in response)
+ def test_base36(self):
+ # reciprocity works
+ for n in [0, 1, 1000, 1000000, sys.maxint]:
+ self.assertEqual(n, http.base36_to_int(http.int_to_base36(n)))
+
+ # bad input
+ for n in [-1, sys.maxint+1, '1', 'foo', {1:2}, (1,2,3)]:
+ self.assertRaises(ValueError, http.int_to_base36, n)
+
+ for n in ['#', ' ']:
+ self.assertRaises(ValueError, http.base36_to_int, n)
+
+ for n in [123, {1:2}, (1,2,3)]:
+ self.assertRaises(TypeError, http.base36_to_int, n)
+
+ # non-integer input
+ self.assertRaises(TypeError, http.int_to_base36, 3.141)
+
+ # more explicit output testing
+ for n, b36 in [(0,'0'), (1,'1'), (42,'16'), (818469960,'django')]:
+ self.assertEqual(http.int_to_base36(n), b36)
+ self.assertEqual(http.base36_to_int(b36), n)
Please sign in to comment.
Something went wrong with that request. Please try again.