server/test/unittest_session.py
author Aurelien Campeas <aurelien.campeas@logilab.fr>
Tue, 28 Jan 2014 15:27:59 +0100
branchstable
changeset 9981 7099bbd685aa
parent 9411 6aec72169ee1
child 9478 2d7521881d3d
permissions -rw-r--r--
[hooks/security] allow edition of attributes with permissive permissions If an attribute has more permissive security rules than the entity type itself, we should be green and not deny action because of an early global entity permission check (with the more restrictive rules). Only if one attribute with the entity-level permission rules is edited will the global check be performed. Note: * the "if action == 'delete'" check at the entry of check_entity_attributes is a guard for a condition currently not happening in cubicweb itself (but application hooks could conceivably call this function with a 'delete' action) Closes #3489895.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8554
6e5d8512b07d [repo cleanup] drop code moved to querier by 7e264ce34cd4
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8542
diff changeset
     1
# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5197
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
7364
aff846ce1050 missing future import
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7350
diff changeset
    18
5193
c9671feff5e2 [session] no way for queries from an InternalSession to be a dbapi query
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
    19
from cubicweb.devtools.testlib import CubicWebTC
8846
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    20
from cubicweb.server.session import HOOKS_ALLOW_ALL, HOOKS_DENY_ALL
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    21
5193
c9671feff5e2 [session] no way for queries from an InternalSession to be a dbapi query
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
    22
class InternalSessionTC(CubicWebTC):
c9671feff5e2 [session] no way for queries from an InternalSession to be a dbapi query
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
    23
    def test_dbapi_query(self):
c9671feff5e2 [session] no way for queries from an InternalSession to be a dbapi query
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
    24
        session = self.repo.internal_session()
c9671feff5e2 [session] no way for queries from an InternalSession to be a dbapi query
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
    25
        self.assertFalse(session.running_dbapi_query)
5197
98dc05495e3e [test] properly close session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5193
diff changeset
    26
        session.close()
5193
c9671feff5e2 [session] no way for queries from an InternalSession to be a dbapi query
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4212
diff changeset
    27
9240
6356adcb652c [server] Make internal sessions not reset 'safe'-ness on first commit
Julien Cristau <julien.cristau@logilab.fr>
parents: 8846
diff changeset
    28
    def test_integrity_hooks(self):
6356adcb652c [server] Make internal sessions not reset 'safe'-ness on first commit
Julien Cristau <julien.cristau@logilab.fr>
parents: 8846
diff changeset
    29
        with self.repo.internal_session() as session:
6356adcb652c [server] Make internal sessions not reset 'safe'-ness on first commit
Julien Cristau <julien.cristau@logilab.fr>
parents: 8846
diff changeset
    30
            self.assertEqual(HOOKS_ALLOW_ALL, session.hooks_mode)
9411
6aec72169ee1 Disable security hooks for internal sessions
Julien Cristau <julien.cristau@logilab.fr>
parents: 9240
diff changeset
    31
            self.assertEqual(set(('integrity', 'security')), session.disabled_hook_categories)
9240
6356adcb652c [server] Make internal sessions not reset 'safe'-ness on first commit
Julien Cristau <julien.cristau@logilab.fr>
parents: 8846
diff changeset
    32
            self.assertEqual(set(), session.enabled_hook_categories)
6356adcb652c [server] Make internal sessions not reset 'safe'-ness on first commit
Julien Cristau <julien.cristau@logilab.fr>
parents: 8846
diff changeset
    33
            session.commit()
6356adcb652c [server] Make internal sessions not reset 'safe'-ness on first commit
Julien Cristau <julien.cristau@logilab.fr>
parents: 8846
diff changeset
    34
            self.assertEqual(HOOKS_ALLOW_ALL, session.hooks_mode)
9411
6aec72169ee1 Disable security hooks for internal sessions
Julien Cristau <julien.cristau@logilab.fr>
parents: 9240
diff changeset
    35
            self.assertEqual(set(('integrity', 'security')), session.disabled_hook_categories)
9240
6356adcb652c [server] Make internal sessions not reset 'safe'-ness on first commit
Julien Cristau <julien.cristau@logilab.fr>
parents: 8846
diff changeset
    36
            self.assertEqual(set(), session.enabled_hook_categories)
7350
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    37
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    38
class SessionTC(CubicWebTC):
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    39
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    40
    def test_hooks_control(self):
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    41
        session = self.session
8846
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    42
        self.assertEqual(HOOKS_ALLOW_ALL, session.hooks_mode)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    43
        self.assertEqual(set(), session.disabled_hook_categories)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    44
        self.assertEqual(set(), session.enabled_hook_categories)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    45
        self.assertEqual(1, len(session._txs))
8561
77ea3eed9946 [session] promote usage of [deny|all]_all_hooks_but session methods rather than hooks_control context manager directly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8554
diff changeset
    46
        with session.deny_all_hooks_but('metadata'):
8846
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    47
            self.assertEqual(HOOKS_DENY_ALL, session.hooks_mode)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    48
            self.assertEqual(set(), session.disabled_hook_categories)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    49
            self.assertEqual(set(('metadata',)), session.enabled_hook_categories)
7350
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    50
            session.commit()
8846
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    51
            self.assertEqual(HOOKS_DENY_ALL, session.hooks_mode)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    52
            self.assertEqual(set(), session.disabled_hook_categories)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    53
            self.assertEqual(set(('metadata',)), session.enabled_hook_categories)
7350
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    54
            session.rollback()
8846
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    55
            self.assertEqual(HOOKS_DENY_ALL, session.hooks_mode)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    56
            self.assertEqual(set(), session.disabled_hook_categories)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    57
            self.assertEqual(set(('metadata',)), session.enabled_hook_categories)
8561
77ea3eed9946 [session] promote usage of [deny|all]_all_hooks_but session methods rather than hooks_control context manager directly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8554
diff changeset
    58
            with session.allow_all_hooks_but('integrity'):
8846
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    59
                self.assertEqual(HOOKS_ALLOW_ALL, session.hooks_mode)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    60
                self.assertEqual(set(('integrity',)), session.disabled_hook_categories)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    61
                self.assertEqual(set(('metadata',)), session.enabled_hook_categories) # not changed in such case
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    62
            self.assertEqual(HOOKS_DENY_ALL, session.hooks_mode)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    63
            self.assertEqual(set(), session.disabled_hook_categories)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    64
            self.assertEqual(set(('metadata',)), session.enabled_hook_categories)
7350
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    65
        # leaving context manager with no transaction running should reset the
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7364
diff changeset
    66
        # transaction local storage (and associated cnxset)
8846
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    67
        self.assertEqual({}, session._txs)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    68
        self.assertEqual(None, session.cnxset)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    69
        self.assertEqual(HOOKS_ALLOW_ALL, session.hooks_mode, session.HOOKS_ALLOW_ALL)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    70
        self.assertEqual(set(), session.disabled_hook_categories)
f31e2d6f1b53 [test] use the right order in some assertEqual
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8771
diff changeset
    71
        self.assertEqual(set(), session.enabled_hook_categories)
7350
c2452cd57026 [session] enhance session's transaction storage handling to fix cases where commit/rollback is done while in the context of hooks_control/security_enabled managers. Closes #1412648: commit or rollback during postcreate reset hooks control state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    72
7730
8d0edec31aaf [querier] we should not insert None but skip the line when some unknown eid is detected (closes #1892491)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7398
diff changeset
    73
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    74
if __name__ == '__main__':
8561
77ea3eed9946 [session] promote usage of [deny|all]_all_hooks_but session methods rather than hooks_control context manager directly
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8554
diff changeset
    75
    from logilab.common.testlib import unittest_main
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    76
    unittest_main()