diff options
| author | Wichert Akkerman <wichert@wiggy.net> | 2011-01-19 17:04:54 +0100 |
|---|---|---|
| committer | Wichert Akkerman <wichert@wiggy.net> | 2011-01-19 17:04:54 +0100 |
| commit | 69869eee461afe127ff36ef6b81d518e9f9a25a0 (patch) | |
| tree | d08678893a01d150c013d1b6f5a4aead82e77453 | |
| parent | 17c4de891ad41c03c6e5e007f8100f02033b4555 (diff) | |
| download | pyramid-69869eee461afe127ff36ef6b81d518e9f9a25a0.tar.gz pyramid-69869eee461afe127ff36ef6b81d518e9f9a25a0.tar.bz2 pyramid-69869eee461afe127ff36ef6b81d518e9f9a25a0.zip | |
Validate tokens to prevent problems.
| -rw-r--r-- | pyramid/authentication.py | 8 | ||||
| -rw-r--r-- | pyramid/tests/test_authentication.py | 11 |
2 files changed, 19 insertions, 0 deletions
diff --git a/pyramid/authentication.py b/pyramid/authentication.py index b80429c72..24c8015e0 100644 --- a/pyramid/authentication.py +++ b/pyramid/authentication.py @@ -1,6 +1,7 @@ from codecs import utf_8_decode from codecs import utf_8_encode import datetime +import re import time from paste.auth import auth_tkt @@ -14,6 +15,9 @@ from pyramid.request import add_global_response_headers from pyramid.security import Authenticated from pyramid.security import Everyone + +VALID_TOKEN = re.compile(r"^[A-Za-z][A-Za-z0-9+_-]*$") + class CallbackAuthenticationPolicy(object): """ Abstract class """ def authenticated_userid(self, request): @@ -432,6 +436,10 @@ class AuthTktCookieHelper(object): userid = encoder(userid) user_data = 'userid_type:%s' % encoding + for token in tokens: + if not (isinstance(token, str) and VALID_TOKEN.match(token)): + raise ValueError("Invalid token %r", token) + ticket = self.auth_tkt.AuthTicket( self.secret, userid, diff --git a/pyramid/tests/test_authentication.py b/pyramid/tests/test_authentication.py index 5f30d0d22..136f9de39 100644 --- a/pyramid/tests/test_authentication.py +++ b/pyramid/tests/test_authentication.py @@ -584,6 +584,17 @@ class TestAuthTktCookieHelper(unittest.TestCase): self.assertEqual(result[2][0], 'Set-Cookie') self.failUnless("'tokens': ('foo', 'bar')" in result[2][1]) + def test_remember_non_string_token(self): + plugin = self._makeOne('secret') + request = self._makeRequest() + self.assertRaises(ValueError, plugin.remember, request, 'other', tokens=(u'foo',)) + + def test_remember_invalid_token_format(self): + plugin = self._makeOne('secret') + request = self._makeRequest() + self.assertRaises(ValueError, plugin.remember, request, 'other', tokens=('foo bar',)) + self.assertRaises(ValueError, plugin.remember, request, 'other', tokens=('1bar',)) + def test_forget(self): plugin = self._makeOne('secret') request = self._makeRequest() |
