Projet

Général

Profil

0001-allow-setting-session-durations-8887.patch

Benjamin Dauvergne, 04 décembre 2015 18:10

Télécharger (3,5 ko)

Voir les différences:

Subject: [PATCH 1/4] allow setting session durations (#8887)

 tests/test_sessions.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++
 wcs/qommon/sessions.py | 21 +++++++++++++++--
 2 files changed, 81 insertions(+), 2 deletions(-)
 create mode 100644 tests/test_sessions.py
tests/test_sessions.py
1
import os
2
import shutil
3
import time
4
import pytest
5

  
6
from quixote import cleanup
7

  
8
from wcs.qommon.ident.password_accounts import PasswordAccount
9

  
10
from utilities import create_temporary_pub, clean_temporary_pub, get_app, login
11

  
12
def setup_module():
13
    clean_temporary_pub()
14

  
15

  
16
def teardown_module():
17
    pass
18

  
19

  
20
@pytest.fixture(scope='function')
21
def pub(request):
22
    pub = create_temporary_pub()
23
    def fin():
24
        shutil.rmtree(pub.APP_DIR)
25
    request.addfinalizer(fin)
26
    pub.cfg['identification'] = {'methods': ['password']}
27
    pub.cfg['misc'] = {'charset': 'utf-8'}
28
    pub.cfg['language'] = {'language': 'en'}
29
    pub.write_cfg()
30
    return pub
31

  
32

  
33
@pytest.fixture
34
def user(pub):
35
    user = pub.user_class()
36
    user.email = 'foo@localhost'
37
    user.store()
38
    account = PasswordAccount(id='foo')
39
    account.set_password('foo')
40
    account.user_id = user.id
41
    account.store()
42
    return user
43

  
44

  
45
@pytest.fixture
46
def app(pub):
47
    return get_app(pub)
48

  
49

  
50
def test_session_max_age(pub, user, app):
51
    with file(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as cfg:
52
        cfg.write('''[options]
53
session_max_age: 1
54
''')
55
    pub.load_site_options()
56

  
57
    login(app, username='foo', password='foo')
58
    assert 'Logout' in app.get('/')
59
    time.sleep(0.5)
60
    assert 'Logout' in app.get('/')
61
    time.sleep(0.6)
62
    assert 'Logout' not in app.get('/')
wcs/qommon/sessions.py
84 84

  
85 85
    username = None # only set on password authentication
86 86

  
87
    def is_expired(self):
88
        duration = get_publisher().get_site_option('session_max_age')
89
        if duration is None:
90
            return False
91
        try:
92
            duration = int(duration)
93
        except ValueError:
94
            return False
95
        return (time.time() - self.get_access_time()) > duration
96

  
87 97
    def has_info(self):
88 98
        return self.name_identifier or self.after_url or \
89 99
            self.lasso_session_dump or self.message or \
......
248 258

  
249 259
    def __getitem__(self, session_id):
250 260
        try:
251
            return BasicSession.get(session_id)
261
            session = BasicSession.get(session_id)
262
            if session.is_expired():
263
                try:
264
                    session.remove_self()
265
                except OSError:
266
                    pass
267
                raise KeyError
268
            return session
252 269
        except KeyError:
253 270
            raise KeyError
254 271

  
255 272
    def get(self, session_id, default = None):
256 273
        try:
257
            return BasicSession.get(session_id)
274
            return self[session_id]
258 275
        except KeyError:
259 276
            return default
260 277
        except ValueError: # happens for "insecure string pickle"
261
-