Tres Seaver
2012-03-19 0b4b05504892e97b4ed6efd1f5fe371b700ed94d
Coverage for repoze.who._auth_tkt.AuthTkt.
1 files added
1 files modified
132 ■■■■■ changed files
repoze/who/_auth_tkt.py 13 ●●●●● patch | view | raw | blame | history
repoze/who/tests/test__auth_tkt.py 119 ●●●●● patch | view | raw | blame | history
repoze/who/_auth_tkt.py
@@ -39,6 +39,7 @@
from hashlib import md5
import time as time_mod
from repoze.who._compat import encodestring
from repoze.who._compat import get_cookies
from repoze.who._compat import SimpleCookie
from repoze.who._compat import STRING_TYPES
@@ -112,7 +113,8 @@
    def cookie(self):
        c = SimpleCookie()
        c_val = self.cookie_value().encode('base64').strip().replace('\n', '')
        c_val = encodestring(self.cookie_value())
        c_val = c_val.strip().replace('\n', '')
        c[self.cookie_name] = c_val
        c[self.cookie_name]['path'] = '/'
        if self.secure:
@@ -246,13 +248,14 @@
    This also adds two functions to the request:
    ``environ['paste.auth_tkt.set_user'](userid, tokens='', user_data='')``
    ``environ['repoze.who._auth_tkt.set_user'](userid, tokens='',
                                               user_data='')``
        This sets a cookie that logs the user in.  ``tokens`` is a
        string (comma-separated groups) or a list of strings.
        ``user_data`` is a string for your own use.
    ``environ['paste.auth_tkt.logout_user']()``
    ``environ['repoze.who._auth_tkt.logout_user']()``
        Logs out the user.
    """
@@ -312,8 +315,8 @@
        def logout_user():
            set_cookies.extend(self.logout_user_cookie(environ))
        environ['paste.auth_tkt.set_user'] = set_user
        environ['paste.auth_tkt.logout_user'] = logout_user
        environ['repoze.who._auth_tkt.set_user'] = set_user
        environ['repoze.who._auth_tkt.logout_user'] = logout_user
        if self.logout_path and environ.get('PATH_INFO') == self.logout_path:
            logout_user()
repoze/who/tests/test__auth_tkt.py
New file
@@ -0,0 +1,119 @@
import unittest
class AuthTicketTests(unittest.TestCase):
    def _getTargetClass(self):
        from .._auth_tkt import AuthTicket
        return AuthTicket
    def _makeOne(self, *args, **kw):
        return self._getTargetClass()(*args, **kw)
    def test_ctor_defaults(self):
        from .. import _auth_tkt
        with _Monkey(_auth_tkt, time_mod=_Timemod):
            tkt = self._makeOne('SEEKRIT', 'USERID', '1.2.3.4')
        self.assertEqual(tkt.secret, 'SEEKRIT')
        self.assertEqual(tkt.userid, 'USERID')
        self.assertEqual(tkt.ip, '1.2.3.4')
        self.assertEqual(tkt.tokens, '')
        self.assertEqual(tkt.user_data, '')
        self.assertEqual(tkt.time, _WHEN)
        self.assertEqual(tkt.cookie_name, 'auth_tkt')
        self.assertEqual(tkt.secure, False)
    def test_ctor_explicit(self):
        tkt = self._makeOne('SEEKRIT', 'USERID', '1.2.3.4', tokens=('a', 'b'),
                            user_data='DATA', time=_WHEN,
                            cookie_name='oatmeal', secure=True)
        self.assertEqual(tkt.secret, 'SEEKRIT')
        self.assertEqual(tkt.userid, 'USERID')
        self.assertEqual(tkt.ip, '1.2.3.4')
        self.assertEqual(tkt.tokens, 'a,b')
        self.assertEqual(tkt.user_data, 'DATA')
        self.assertEqual(tkt.time, _WHEN)
        self.assertEqual(tkt.cookie_name, 'oatmeal')
        self.assertEqual(tkt.secure, True)
    def test_digest(self):
        from .._auth_tkt import calculate_digest
        tkt = self._makeOne('SEEKRIT', 'USERID', '1.2.3.4', tokens=('a', 'b'),
                            user_data='DATA', time=_WHEN,
                            cookie_name='oatmeal', secure=True)
        digest = calculate_digest('1.2.3.4', _WHEN, 'SEEKRIT', 'USERID',
                                  'a,b', 'DATA')
        self.assertEqual(tkt.digest(), digest)
    def test_cookie_value_wo_tokens_or_userdata(self):
        from .._auth_tkt import calculate_digest
        tkt = self._makeOne('SEEKRIT', 'USERID', '1.2.3.4', time=_WHEN)
        digest = calculate_digest('1.2.3.4', _WHEN, 'SEEKRIT', 'USERID', '', '')
        self.assertEqual(tkt.cookie_value(),
                         '%s%08xUSERID!' % (digest, _WHEN))
    def test_cookie_value_w_tokens_and_userdata(self):
        from .._auth_tkt import calculate_digest
        tkt = self._makeOne('SEEKRIT', 'USERID', '1.2.3.4', tokens=('a', 'b'),
                            user_data='DATA', time=_WHEN)
        digest = calculate_digest('1.2.3.4', _WHEN, 'SEEKRIT', 'USERID',
                                  'a,b', 'DATA')
        self.assertEqual(tkt.cookie_value(),
                         '%s%08xUSERID!a,b!DATA' % (digest, _WHEN))
    def test_cookie_not_secure_wo_tokens_or_userdata(self):
        from .._auth_tkt import calculate_digest
        from .._compat import encodestring
        tkt = self._makeOne('SEEKRIT', 'USERID', '1.2.3.4', time=_WHEN,
                            cookie_name='oatmeal')
        digest = calculate_digest('1.2.3.4', _WHEN, 'SEEKRIT', 'USERID', '', '')
        cookie = tkt.cookie()
        self.assertEqual(cookie['oatmeal'].value,
                         encodestring('%s%08xUSERID!' % (digest, _WHEN)
                                     ).strip())
        self.assertEqual(cookie['oatmeal']['path'], '/')
        self.assertEqual(cookie['oatmeal']['secure'], '')
    def test_cookie_secure_w_tokens_and_userdata(self):
        from .._auth_tkt import calculate_digest
        from .._compat import encodestring
        tkt = self._makeOne('SEEKRIT', 'USERID', '1.2.3.4', tokens=('a', 'b'),
                            user_data='DATA', time=_WHEN,
                            cookie_name='oatmeal', secure=True)
        digest = calculate_digest('1.2.3.4', _WHEN, 'SEEKRIT', 'USERID',
                                  'a,b', 'DATA')
        cookie = tkt.cookie()
        self.assertEqual(cookie['oatmeal'].value,
                         encodestring('%s%08xUSERID!a,b!DATA' % (digest, _WHEN)
                                     ).strip())
        self.assertEqual(cookie['oatmeal']['path'], '/')
        self.assertEqual(cookie['oatmeal']['secure'], 'true')
_WHEN = 1234567
class _Timemod(object):
    @staticmethod
    def time():
        return _WHEN
class _Monkey(object):
    def __init__(self, module, **replacements):
        self.module = module
        self.orig = {}
        self.replacements = replacements
    def __enter__(self):
        for k, v in self.replacements.items():
            orig = getattr(self.module, k, self)
            if orig is not self:
                self.orig[k] = orig
            setattr(self.module, k, v)
    def __exit__(self, *exc_info):
        for k, v in self.replacements.items():
            if k in self.orig:
                setattr(self.module, k, self.orig[k])
            else: #pragma NO COVERSGE
                delattr(self.module, k)