server/test/unittest_security.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Thu, 13 Feb 2014 13:58:28 +0100
changeset 9954 79d34ba48612
parent 9782 95e8fa2c8da8
child 9990 c84ad981fc4a
permissions -rw-r--r--
[CWEP002] refactor rql read security checking Split 'check_read_perms' into 'check_relations_perms' which checks relations 'read' permissions and 'get_local_checks' which build dictionary of local security checks (rql expression) for variables. This allows to check relations 'read' permissions earlier in the process and so to prepare insertion of the rql rewriter: we want to check permissions of the computed relation, not permissions of relations introduced by the associated rule, to conform to the CWEP. Related to #3546717
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
     1
# copyright 2003-2014 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: 5419
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: 5419
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: 5419
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: 5419
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: 5419
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: 5419
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: 5419
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: 5419
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: 5419
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: 5419
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: 5419
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: 5419
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: 5419
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: 5419
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: 5419
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5886
00a78298d30d cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    18
"""functional tests for server'security"""
00a78298d30d cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    19
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    20
from logilab.common.testlib import unittest_main
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
    21
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2608
diff changeset
    22
from cubicweb.devtools.testlib import CubicWebTC
8546
3d2038d6f20d [sources/native] automatically update passwords using deprecated hashes on login
Julien Cristau <julien.cristau@logilab.fr>
parents: 8488
diff changeset
    23
from cubicweb import Unauthorized, ValidationError, QueryError, Binary
8452
1ad42383a9ec [rql security] fix rql bug when using yams inheritance and read permissions (closes #2410156)
Florent Cayré <florent.cayre@logilab.fr>
parents: 8075
diff changeset
    24
from cubicweb.schema import ERQLExpression
9954
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    25
from cubicweb.server.querier import get_local_checks, check_relations_read_access
8546
3d2038d6f20d [sources/native] automatically update passwords using deprecated hashes on login
Julien Cristau <julien.cristau@logilab.fr>
parents: 8488
diff changeset
    26
from cubicweb.server.utils import _CRYPTO_CTX
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    27
8452
1ad42383a9ec [rql security] fix rql bug when using yams inheritance and read permissions (closes #2410156)
Florent Cayré <florent.cayre@logilab.fr>
parents: 8075
diff changeset
    28
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2608
diff changeset
    29
class BaseSecurityTC(CubicWebTC):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    30
7072
bcf96f2a4c5d [test] properly close connections
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6410
diff changeset
    31
    def setup_database(self):
bcf96f2a4c5d [test] properly close connections
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6410
diff changeset
    32
        super(BaseSecurityTC, self).setup_database()
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    33
        with self.admin_access.client_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    34
            self.create_user(cnx, 'iaminusersgrouponly')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    35
            hash = _CRYPTO_CTX.encrypt('oldpassword', scheme='des_crypt')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    36
            self.create_user(cnx, 'oldpassword', password=Binary(hash))
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
    37
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
class LowLevelSecurityFunctionTC(BaseSecurityTC):
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
    39
9954
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    40
    def test_check_relation_read_access(self):
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    41
        rql = u'Personne U WHERE U nom "managers"'
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    42
        rqlst = self.repo.vreg.rqlhelper.parse(rql).children[0]
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    43
        nom = self.repo.schema['Personne'].rdef('nom')
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    44
        with self.temporary_permissions((nom, {'read': ('users', 'managers')})):
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    45
            with self.admin_access.repo_cnx() as cnx:
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    46
                self.repo.vreg.solutions(cnx, rqlst, None)
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    47
                check_relations_read_access(cnx, rqlst, {})
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    48
            with self.new_access('anon').repo_cnx() as cnx:
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    49
                self.assertRaises(Unauthorized,
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    50
                                  check_relations_read_access,
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    51
                                  cnx, rqlst, {})
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    52
                self.assertRaises(Unauthorized, cnx.execute, rql)
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    53
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    54
    def test_get_local_checks(self):
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    55
        rql = u'Personne U WHERE U nom "managers"'
3252
c0e10da6f1cf tests update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
    56
        rqlst = self.repo.vreg.rqlhelper.parse(rql).children[0]
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
    57
        with self.temporary_permissions(Personne={'read': ('users', 'managers')}):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    58
            with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    59
                self.repo.vreg.solutions(cnx, rqlst, None)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    60
                solution = rqlst.solutions[0]
9954
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    61
                localchecks = get_local_checks(cnx, rqlst, solution)
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    62
                self.assertEqual({}, localchecks)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    63
            with self.new_access('anon').repo_cnx() as cnx:
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
    64
                self.assertRaises(Unauthorized,
9954
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    65
                                  get_local_checks,
79d34ba48612 [CWEP002] refactor rql read security checking
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9782
diff changeset
    66
                                  cnx, rqlst, solution)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    67
                self.assertRaises(Unauthorized, cnx.execute, rql)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
    68
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
    def test_upassword_not_selectable(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    70
        with self.admin_access.repo_cnx() as cnx:
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
    71
            self.assertRaises(Unauthorized,
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    72
                              cnx.execute, 'Any X,P WHERE X is CWUser, X upassword P')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    73
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    74
            self.assertRaises(Unauthorized,
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    75
                              cnx.execute, 'Any X,P WHERE X is CWUser, X upassword P')
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
    76
8546
3d2038d6f20d [sources/native] automatically update passwords using deprecated hashes on login
Julien Cristau <julien.cristau@logilab.fr>
parents: 8488
diff changeset
    77
    def test_update_password(self):
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
    78
        """Ensure that if a user's password is stored with a deprecated hash,
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
    79
        it will be updated on next login
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
    80
        """
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    81
        with self.repo.internal_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    82
            oldhash = str(cnx.system_sql("SELECT cw_upassword FROM cw_CWUser "
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    83
                                         "WHERE cw_login = 'oldpassword'").fetchone()[0])
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    84
            self.repo.close(self.repo.connect('oldpassword', password='oldpassword'))
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    85
            newhash = str(cnx.system_sql("SELECT cw_upassword FROM cw_CWUser "
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    86
                                         "WHERE cw_login = 'oldpassword'").fetchone()[0])
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    87
            self.assertNotEqual(oldhash, newhash)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    88
            self.assertTrue(newhash.startswith('$6$'))
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    89
            self.repo.close(self.repo.connect('oldpassword', password='oldpassword'))
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    90
            self.assertEqual(newhash,
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    91
                             str(cnx.system_sql("SELECT cw_upassword FROM cw_CWUser WHERE "
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    92
                                                "cw_login = 'oldpassword'").fetchone()[0]))
8546
3d2038d6f20d [sources/native] automatically update passwords using deprecated hashes on login
Julien Cristau <julien.cristau@logilab.fr>
parents: 8488
diff changeset
    93
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
    94
5888
3ee80d487f11 [security] fix read rql expression insertion: we should not insert rql expr on variables only referenced in neged relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5886
diff changeset
    95
class SecurityRewritingTC(BaseSecurityTC):
3ee80d487f11 [security] fix read rql expression insertion: we should not insert rql expr on variables only referenced in neged relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5886
diff changeset
    96
    def hijack_source_execute(self):
3ee80d487f11 [security] fix read rql expression insertion: we should not insert rql expr on variables only referenced in neged relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5886
diff changeset
    97
        def syntax_tree_search(*args, **kwargs):
3ee80d487f11 [security] fix read rql expression insertion: we should not insert rql expr on variables only referenced in neged relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5886
diff changeset
    98
            self.query = (args, kwargs)
3ee80d487f11 [security] fix read rql expression insertion: we should not insert rql expr on variables only referenced in neged relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5886
diff changeset
    99
            return []
3ee80d487f11 [security] fix read rql expression insertion: we should not insert rql expr on variables only referenced in neged relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5886
diff changeset
   100
        self.repo.system_source.syntax_tree_search = syntax_tree_search
3ee80d487f11 [security] fix read rql expression insertion: we should not insert rql expr on variables only referenced in neged relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5886
diff changeset
   101
3ee80d487f11 [security] fix read rql expression insertion: we should not insert rql expr on variables only referenced in neged relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5886
diff changeset
   102
    def tearDown(self):
3ee80d487f11 [security] fix read rql expression insertion: we should not insert rql expr on variables only referenced in neged relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5886
diff changeset
   103
        self.repo.system_source.__dict__.pop('syntax_tree_search', None)
7072
bcf96f2a4c5d [test] properly close connections
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6410
diff changeset
   104
        super(SecurityRewritingTC, self).tearDown()
5888
3ee80d487f11 [security] fix read rql expression insertion: we should not insert rql expr on variables only referenced in neged relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5886
diff changeset
   105
3ee80d487f11 [security] fix read rql expression insertion: we should not insert rql expr on variables only referenced in neged relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5886
diff changeset
   106
    def test_not_relation_read_security(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   107
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   108
            self.hijack_source_execute()
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   109
            cnx.execute('Any U WHERE NOT A todo_by U, A is Affaire')
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   110
            self.assertEqual(self.query[0][1].as_string(),
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   111
                              'Any U WHERE NOT EXISTS(A todo_by U), A is Affaire')
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   112
            cnx.execute('Any U WHERE NOT EXISTS(A todo_by U), A is Affaire')
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   113
            self.assertEqual(self.query[0][1].as_string(),
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   114
                              'Any U WHERE NOT EXISTS(A todo_by U), A is Affaire')
5888
3ee80d487f11 [security] fix read rql expression insertion: we should not insert rql expr on variables only referenced in neged relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5886
diff changeset
   115
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   116
class SecurityTC(BaseSecurityTC):
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   117
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   118
    def setUp(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   119
        super(SecurityTC, self).setUp()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   120
        # implicitly test manager can add some entities
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   121
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   122
            cnx.execute("INSERT Affaire X: X sujet 'cool'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   123
            cnx.execute("INSERT Societe X: X nom 'logilab'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   124
            cnx.execute("INSERT Personne X: X nom 'bidule'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   125
            cnx.execute('INSERT CWGroup X: X name "staff"')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   126
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   127
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   128
    def test_insert_security(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   129
        with self.new_access('anon').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   130
            cnx.execute("INSERT Personne X: X nom 'bidule'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   131
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   132
            self.assertEqual(cnx.execute('Personne X').rowcount, 1)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   133
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   134
    def test_insert_rql_permission(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   135
        # test user can only add une affaire related to a societe he owns
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   136
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   137
            cnx.execute("INSERT Affaire X: X sujet 'cool'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   138
            self.assertRaises(Unauthorized, cnx.commit)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   139
        # test nothing has actually been inserted
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   140
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   141
            self.assertEqual(cnx.execute('Affaire X').rowcount, 1)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   142
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   143
            cnx.execute("INSERT Affaire X: X sujet 'cool'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   144
            cnx.execute("INSERT Societe X: X nom 'chouette'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   145
            cnx.execute("SET A concerne S WHERE A sujet 'cool', S nom 'chouette'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   146
            cnx.commit()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   147
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   148
    def test_update_security_1(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   149
        with self.new_access('anon').repo_cnx() as cnx:
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   150
            # local security check
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   151
            cnx.execute( "SET X nom 'bidulechouette' WHERE X is Personne")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   152
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   153
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   154
            self.assertEqual(cnx.execute('Personne X WHERE X nom "bidulechouette"').rowcount, 0)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   155
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   156
    def test_update_security_2(self):
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   157
        with self.temporary_permissions(Personne={'read': ('users', 'managers'),
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   158
                                                  'add': ('guests', 'users', 'managers')}):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   159
            with self.new_access('anon').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   160
                self.assertRaises(Unauthorized, cnx.execute,
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   161
                                  "SET X nom 'bidulechouette' WHERE X is Personne")
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   162
        # test nothing has actually been inserted
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   163
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   164
            self.assertEqual(cnx.execute('Personne X WHERE X nom "bidulechouette"').rowcount, 0)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   165
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   166
    def test_update_security_3(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   167
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   168
            cnx.execute("INSERT Personne X: X nom 'biduuule'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   169
            cnx.execute("INSERT Societe X: X nom 'looogilab'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   170
            cnx.execute("SET X travaille S WHERE X nom 'biduuule', S nom 'looogilab'")
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   171
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   172
    def test_update_rql_permission(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   173
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   174
            cnx.execute("SET A concerne S WHERE A is Affaire, S is Societe")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   175
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   176
        # test user can only update une affaire related to a societe he owns
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   177
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   178
            cnx.execute("SET X sujet 'pascool' WHERE X is Affaire")
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   179
            # this won't actually do anything since the selection query won't return anything
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   180
            cnx.commit()
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   181
            # to actually get Unauthorized exception, try to update an entity we can read
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   182
            cnx.execute("SET X nom 'toto' WHERE X is Societe")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   183
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   184
            cnx.execute("INSERT Affaire X: X sujet 'pascool'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   185
            cnx.execute("INSERT Societe X: X nom 'chouette'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   186
            cnx.execute("SET A concerne S WHERE A sujet 'pascool', S nom 'chouette'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   187
            cnx.execute("SET X sujet 'habahsicestcool' WHERE X sujet 'pascool'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   188
            cnx.commit()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   189
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   190
    def test_delete_security(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   191
        # FIXME: sample below fails because we don't detect "owner" can't delete
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   192
        # user anyway, and since no user with login == 'bidule' exists, no
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   193
        # exception is raised
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   194
        #user._groups = {'guests':1}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   195
        #self.assertRaises(Unauthorized,
1398
5fe84a5f7035 rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents: 389
diff changeset
   196
        #                  self.o.execute, user, "DELETE CWUser X WHERE X login 'bidule'")
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   197
        # check local security
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   198
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   199
            self.assertRaises(Unauthorized, cnx.execute, "DELETE CWGroup Y WHERE Y name 'staff'")
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   200
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   201
    def test_delete_rql_permission(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   202
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   203
            cnx.execute("SET A concerne S WHERE A is Affaire, S is Societe")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   204
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   205
        # test user can only dele une affaire related to a societe he owns
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   206
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   207
            # this won't actually do anything since the selection query won't return anything
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   208
            cnx.execute("DELETE Affaire X")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   209
            cnx.commit()
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   210
            # to actually get Unauthorized exception, try to delete an entity we can read
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   211
            self.assertRaises(Unauthorized, cnx.execute, "DELETE Societe S")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   212
            self.assertRaises(QueryError, cnx.commit) # can't commit anymore
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   213
            cnx.rollback()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   214
            cnx.execute("INSERT Affaire X: X sujet 'pascool'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   215
            cnx.execute("INSERT Societe X: X nom 'chouette'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   216
            cnx.execute("SET A concerne S WHERE A sujet 'pascool', S nom 'chouette'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   217
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   218
##         # this one should fail since it will try to delete two affaires, one authorized
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   219
##         # and the other not
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   220
##         self.assertRaises(Unauthorized, cnx.execute, "DELETE Affaire X")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   221
            cnx.execute("DELETE Affaire X WHERE X sujet 'pascool'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   222
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   223
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   224
    def test_insert_relation_rql_permission(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   225
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   226
            cnx.execute("SET A concerne S WHERE A is Affaire, S is Societe")
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   227
            # should raise Unauthorized since user don't own S though this won't
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   228
            # actually do anything since the selection query won't return
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   229
            # anything
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   230
            cnx.commit()
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   231
            # to actually get Unauthorized exception, try to insert a relation
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   232
            # were we can read both entities
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   233
            rset = cnx.execute('Personne P')
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   234
            self.assertEqual(len(rset), 1)
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   235
            ent = rset.get_entity(0, 0)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   236
            self.assertFalse(cnx.execute('Any P,S WHERE P travaille S,P is Personne, S is Societe'))
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   237
            self.assertRaises(Unauthorized, ent.cw_check_perm, 'update')
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   238
            self.assertRaises(Unauthorized,
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   239
                              cnx.execute, "SET P travaille S WHERE P is Personne, S is Societe")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   240
            self.assertRaises(QueryError, cnx.commit) # can't commit anymore
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   241
            cnx.rollback()
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   242
            # test nothing has actually been inserted:
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   243
            self.assertFalse(cnx.execute('Any P,S WHERE P travaille S,P is Personne, S is Societe'))
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   244
            cnx.execute("INSERT Societe X: X nom 'chouette'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   245
            cnx.execute("SET A concerne S WHERE A is Affaire, S nom 'chouette'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   246
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   247
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   248
    def test_delete_relation_rql_permission(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   249
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   250
            cnx.execute("SET A concerne S WHERE A is Affaire, S is Societe")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   251
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   252
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   253
            # this won't actually do anything since the selection query won't return anything
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   254
            cnx.execute("DELETE A concerne S")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   255
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   256
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   257
            # to actually get Unauthorized exception, try to delete a relation we can read
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   258
            eid = cnx.execute("INSERT Affaire X: X sujet 'pascool'")[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   259
            cnx.execute('SET X owned_by U WHERE X eid %(x)s, U login "iaminusersgrouponly"',
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   260
                         {'x': eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   261
            cnx.execute("SET A concerne S WHERE A sujet 'pascool', S is Societe")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   262
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   263
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   264
            self.assertRaises(Unauthorized, cnx.execute, "DELETE A concerne S")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   265
            self.assertRaises(QueryError, cnx.commit) # can't commit anymore
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   266
            cnx.rollback()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   267
            cnx.execute("INSERT Societe X: X nom 'chouette'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   268
            cnx.execute("SET A concerne S WHERE A is Affaire, S nom 'chouette'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   269
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   270
            cnx.execute("DELETE A concerne S WHERE S nom 'chouette'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   271
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   272
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   273
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   274
    def test_user_can_change_its_upassword(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   275
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   276
            ueid = self.create_user(cnx, 'user').eid
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   277
        with self.new_access('user').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   278
            cnx.execute('SET X upassword %(passwd)s WHERE X eid %(x)s',
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   279
                       {'x': ueid, 'passwd': 'newpwd'})
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   280
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   281
        self.repo.close(self.repo.connect('user', password='newpwd'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   282
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   283
    def test_user_cant_change_other_upassword(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   284
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   285
            ueid = self.create_user(cnx, 'otheruser').eid
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   286
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   287
            cnx.execute('SET X upassword %(passwd)s WHERE X eid %(x)s',
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   288
                       {'x': ueid, 'passwd': 'newpwd'})
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   289
            self.assertRaises(Unauthorized, cnx.commit)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   290
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   291
    # read security test
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   292
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   293
    def test_read_base(self):
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   294
        with self.temporary_permissions(Personne={'read': ('users', 'managers')}):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   295
            with self.new_access('anon').repo_cnx() as cnx:
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   296
                self.assertRaises(Unauthorized,
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   297
                                  cnx.execute, 'Personne U where U nom "managers"')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   298
321
247947250382 fix security bug w/ query using 'NOT X eid 123'
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   299
    def test_read_erqlexpr_base(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   300
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   301
            eid = cnx.execute("INSERT Affaire X: X sujet 'cool'")[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   302
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   303
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   304
            rset = cnx.execute('Affaire X')
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   305
            self.assertEqual(rset.rows, [])
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   306
            self.assertRaises(Unauthorized, cnx.execute, 'Any X WHERE X eid %(x)s', {'x': eid})
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   307
            # cache test
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   308
            self.assertRaises(Unauthorized, cnx.execute, 'Any X WHERE X eid %(x)s', {'x': eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   309
            aff2 = cnx.execute("INSERT Affaire X: X sujet 'cool'")[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   310
            soc1 = cnx.execute("INSERT Societe X: X nom 'chouette'")[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   311
            cnx.execute("SET A concerne S WHERE A is Affaire, S is Societe")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   312
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   313
            rset = cnx.execute('Any X WHERE X eid %(x)s', {'x': aff2})
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   314
            self.assertEqual(rset.rows, [[aff2]])
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   315
            # more cache test w/ NOT eid
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   316
            rset = cnx.execute('Affaire X WHERE NOT X eid %(x)s', {'x': eid})
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   317
            self.assertEqual(rset.rows, [[aff2]])
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   318
            rset = cnx.execute('Affaire X WHERE NOT X eid %(x)s', {'x': aff2})
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   319
            self.assertEqual(rset.rows, [])
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   320
            # test can't update an attribute of an entity that can't be readen
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   321
            self.assertRaises(Unauthorized, cnx.execute,
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   322
                              'SET X sujet "hacked" WHERE X eid %(x)s', {'x': eid})
4765
c33d12865641 more tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4711
diff changeset
   323
c33d12865641 more tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4711
diff changeset
   324
c33d12865641 more tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4711
diff changeset
   325
    def test_entity_created_in_transaction(self):
c33d12865641 more tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4711
diff changeset
   326
        affschema = self.schema['Affaire']
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   327
        with self.temporary_permissions(Affaire={'read': affschema.permissions['add']}):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   328
            with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   329
                aff2 = cnx.execute("INSERT Affaire X: X sujet 'cool'")[0][0]
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   330
                # entity created in transaction are readable *by eid*
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   331
                self.assertTrue(cnx.execute('Any X WHERE X eid %(x)s', {'x':aff2}))
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   332
                # XXX would be nice if it worked
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   333
                rset = cnx.execute("Affaire X WHERE X sujet 'cool'")
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   334
                self.assertEqual(len(rset), 0)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   335
                self.assertRaises(Unauthorized, cnx.commit)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   336
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   337
    def test_read_erqlexpr_has_text1(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   338
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   339
            aff1 = cnx.execute("INSERT Affaire X: X sujet 'cool'")[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   340
            card1 = cnx.execute("INSERT Card X: X title 'cool'")[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   341
            cnx.execute('SET X owned_by U WHERE X eid %(x)s, U login "iaminusersgrouponly"',
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   342
                        {'x': card1})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   343
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   344
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   345
            aff2 = cnx.execute("INSERT Affaire X: X sujet 'cool'")[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   346
            soc1 = cnx.execute("INSERT Societe X: X nom 'chouette'")[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   347
            cnx.execute("SET A concerne S WHERE A eid %(a)s, S eid %(s)s", {'a': aff2, 's': soc1})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   348
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   349
            self.assertRaises(Unauthorized, cnx.execute, 'Any X WHERE X eid %(x)s', {'x':aff1})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   350
            self.assertTrue(cnx.execute('Any X WHERE X eid %(x)s', {'x':aff2}))
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   351
            self.assertTrue(cnx.execute('Any X WHERE X eid %(x)s', {'x':card1}))
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   352
            rset = cnx.execute("Any X WHERE X has_text 'cool'")
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   353
            self.assertEqual(sorted(eid for eid, in rset.rows),
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   354
                              [card1, aff2])
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   355
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   356
    def test_read_erqlexpr_has_text2(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   357
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   358
            cnx.execute("INSERT Personne X: X nom 'bidule'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   359
            cnx.execute("INSERT Societe X: X nom 'bidule'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   360
            cnx.commit()
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   361
        with self.temporary_permissions(Personne={'read': ('managers',)}):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   362
            with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   363
                rset = cnx.execute('Any N WHERE N has_text "bidule"')
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   364
                self.assertEqual(len(rset.rows), 1, rset.rows)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   365
                rset = cnx.execute('Any N WITH N BEING (Any N WHERE N has_text "bidule")')
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   366
                self.assertEqual(len(rset.rows), 1, rset.rows)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   367
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   368
    def test_read_erqlexpr_optional_rel(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   369
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   370
            cnx.execute("INSERT Personne X: X nom 'bidule'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   371
            cnx.execute("INSERT Societe X: X nom 'bidule'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   372
            cnx.commit()
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   373
        with self.temporary_permissions(Personne={'read': ('managers',)}):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   374
            with self.new_access('anon').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   375
                rset = cnx.execute('Any N,U WHERE N has_text "bidule", N owned_by U?')
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   376
                self.assertEqual(len(rset.rows), 1, rset.rows)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   377
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   378
    def test_read_erqlexpr_aggregat(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   379
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   380
            cnx.execute("INSERT Affaire X: X sujet 'cool'")[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   381
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   382
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   383
            rset = cnx.execute('Any COUNT(X) WHERE X is Affaire')
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   384
            self.assertEqual(rset.rows, [[0]])
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   385
            aff2 = cnx.execute("INSERT Affaire X: X sujet 'cool'")[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   386
            soc1 = cnx.execute("INSERT Societe X: X nom 'chouette'")[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   387
            cnx.execute("SET A concerne S WHERE A is Affaire, S is Societe")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   388
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   389
            rset = cnx.execute('Any COUNT(X) WHERE X is Affaire')
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   390
            self.assertEqual(rset.rows, [[1]])
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   391
            rset = cnx.execute('Any ETN, COUNT(X) GROUPBY ETN WHERE X is ET, ET name ETN')
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   392
            values = dict(rset)
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   393
            self.assertEqual(values['Affaire'], 1)
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   394
            self.assertEqual(values['Societe'], 2)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   395
            rset = cnx.execute('Any ETN, COUNT(X) GROUPBY ETN WHERE X is ET, ET name ETN '
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   396
                              'WITH X BEING ((Affaire X) UNION (Societe X))')
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   397
            self.assertEqual(len(rset), 2)
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   398
            values = dict(rset)
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   399
            self.assertEqual(values['Affaire'], 1)
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   400
            self.assertEqual(values['Societe'], 2)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   401
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   402
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   403
    def test_attribute_security(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   404
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   405
            # only managers should be able to edit the 'test' attribute of Personne entities
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   406
            eid = cnx.execute("INSERT Personne X: X nom 'bidule', "
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   407
                               "X web 'http://www.debian.org', X test TRUE")[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   408
            cnx.execute('SET X test FALSE WHERE X eid %(x)s', {'x': eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   409
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   410
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   411
            cnx.execute("INSERT Personne X: X nom 'bidule', "
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   412
                       "X web 'http://www.debian.org', X test TRUE")
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   413
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   414
            cnx.execute("INSERT Personne X: X nom 'bidule', "
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   415
                       "X web 'http://www.debian.org', X test FALSE")
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   416
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   417
            eid = cnx.execute("INSERT Personne X: X nom 'bidule', "
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   418
                             "X web 'http://www.debian.org'")[0][0]
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   419
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   420
            cnx.execute('SET X test FALSE WHERE X eid %(x)s', {'x': eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   421
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   422
            cnx.execute('SET X test TRUE WHERE X eid %(x)s', {'x': eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   423
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   424
            cnx.execute('SET X web "http://www.logilab.org" WHERE X eid %(x)s', {'x': eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   425
            cnx.commit()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   426
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   427
    def test_attribute_security_rqlexpr(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   428
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   429
            # Note.para attribute editable by managers or if the note is in "todo" state
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   430
            note = cnx.execute("INSERT Note X: X para 'bidule'").get_entity(0, 0)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   431
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   432
            note.cw_adapt_to('IWorkflowable').fire_transition('markasdone')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   433
            cnx.execute('SET X para "truc" WHERE X eid %(x)s', {'x': note.eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   434
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   435
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   436
            cnx.execute("SET X para 'chouette' WHERE X eid %(x)s", {'x': note.eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   437
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   438
            note2 = cnx.execute("INSERT Note X: X para 'bidule'").get_entity(0, 0)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   439
            cnx.commit()
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   440
            note2.cw_adapt_to('IWorkflowable').fire_transition('markasdone')
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   441
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   442
            self.assertEqual(len(cnx.execute('Any X WHERE X in_state S, S name "todo", X eid %(x)s',
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   443
                                            {'x': note2.eid})),
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   444
                              0)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   445
            cnx.execute("SET X para 'chouette' WHERE X eid %(x)s", {'x': note2.eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   446
            self.assertRaises(Unauthorized, cnx.commit)
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   447
            note2.cw_adapt_to('IWorkflowable').fire_transition('redoit')
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   448
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   449
            cnx.execute("SET X para 'chouette' WHERE X eid %(x)s", {'x': note2.eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   450
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   451
            cnx.execute("INSERT Note X: X something 'A'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   452
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   453
            cnx.execute("INSERT Note X: X para 'zogzog', X something 'A'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   454
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   455
            note = cnx.execute("INSERT Note X").get_entity(0,0)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   456
            cnx.commit()
9395
96dba2efd16d [hooks/security] provide attribute "add" permission
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8694
diff changeset
   457
            note.cw_set(something=u'B')
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   458
            cnx.commit()
9395
96dba2efd16d [hooks/security] provide attribute "add" permission
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8694
diff changeset
   459
            note.cw_set(something=None, para=u'zogzog')
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   460
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   461
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   462
    def test_attribute_read_security(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   463
        # anon not allowed to see users'login, but they can see users
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   464
        login_rdef = self.repo.schema['CWUser'].rdef('login')
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   465
        with self.temporary_permissions((login_rdef, {'read': ('users', 'managers')}),
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   466
                                        CWUser={'read': ('guests', 'users', 'managers')}):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   467
            with self.new_access('anon').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   468
                rset = cnx.execute('CWUser X')
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   469
                self.assertTrue(rset)
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   470
                x = rset.get_entity(0, 0)
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   471
                self.assertEqual(x.login, None)
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   472
                self.assertTrue(x.creation_date)
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   473
                x = rset.get_entity(1, 0)
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   474
                x.complete()
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   475
                self.assertEqual(x.login, None)
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   476
                self.assertTrue(x.creation_date)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   477
8452
1ad42383a9ec [rql security] fix rql bug when using yams inheritance and read permissions (closes #2410156)
Florent Cayré <florent.cayre@logilab.fr>
parents: 8075
diff changeset
   478
    def test_yams_inheritance_and_security_bug(self):
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   479
        with self.temporary_permissions(Division={'read': ('managers',
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   480
                                                           ERQLExpression('X owned_by U'))}):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   481
            with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   482
                querier = cnx.repo.querier
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   483
                rqlst = querier.parse('Any X WHERE X is_instance_of Societe')
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   484
                querier.solutions(cnx, rqlst, {})
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   485
                querier._annotate(rqlst)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   486
                plan = querier.plan_factory(rqlst, {}, cnx)
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   487
                plan.preprocess(rqlst)
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   488
                self.assertEqual(
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   489
                    rqlst.as_string(),
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   490
                    '(Any X WHERE X is IN(SubDivision, Societe)) UNION '
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   491
                    '(Any X WHERE X is Division, EXISTS(X owned_by %(B)s))')
8452
1ad42383a9ec [rql security] fix rql bug when using yams inheritance and read permissions (closes #2410156)
Florent Cayré <florent.cayre@logilab.fr>
parents: 8075
diff changeset
   492
1ad42383a9ec [rql security] fix rql bug when using yams inheritance and read permissions (closes #2410156)
Florent Cayré <florent.cayre@logilab.fr>
parents: 8075
diff changeset
   493
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   494
class BaseSchemaSecurityTC(BaseSecurityTC):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   495
    """tests related to the base schema permission configuration"""
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   496
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   497
    def test_user_can_delete_object_he_created(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   498
        # even if some other user have changed object'state
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   499
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   500
            # due to security test, affaire has to concerne a societe the user owns
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   501
            cnx.execute('INSERT Societe X: X nom "ARCTIA"')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   502
            cnx.execute('INSERT Affaire X: X ref "ARCT01", X concerne S WHERE S nom "ARCTIA"')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   503
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   504
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   505
            affaire = cnx.execute('Any X WHERE X ref "ARCT01"').get_entity(0, 0)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   506
            affaire.cw_adapt_to('IWorkflowable').fire_transition('abort')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   507
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   508
            self.assertEqual(len(cnx.execute('TrInfo X WHERE X wf_info_for A, A ref "ARCT01"')),
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   509
                             1)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   510
            self.assertEqual(len(cnx.execute('TrInfo X WHERE X wf_info_for A, A ref "ARCT01",'
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   511
                                              'X owned_by U, U login "admin"')),
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   512
                             1) # TrInfo at the above state change
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   513
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   514
            cnx.execute('DELETE Affaire X WHERE X ref "ARCT01"')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   515
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   516
            self.assertFalse(cnx.execute('Affaire X'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   517
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   518
    def test_users_and_groups_non_readable_by_guests(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   519
        with self.repo.internal_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   520
            admineid = cnx.execute('CWUser U WHERE U login "admin"').rows[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   521
        with self.new_access('anon').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   522
            anon = cnx.user
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   523
            # anonymous user can only read itself
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   524
            rset = cnx.execute('Any L WHERE X owned_by U, U login L')
8624
7e415f457155 [test] swap order in assert of `test_users_and_groups_non_readable_by_guests`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8546
diff changeset
   525
            self.assertEqual([['anon']], rset.rows)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   526
            rset = cnx.execute('CWUser X')
8624
7e415f457155 [test] swap order in assert of `test_users_and_groups_non_readable_by_guests`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8546
diff changeset
   527
            self.assertEqual([[anon.eid]], rset.rows)
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   528
            # anonymous user can read groups (necessary to check allowed transitions for instance)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   529
            self.assert_(cnx.execute('CWGroup X'))
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   530
            # should only be able to read the anonymous user, not another one
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   531
            self.assertRaises(Unauthorized,
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   532
                              cnx.execute, 'CWUser X WHERE X eid %(x)s', {'x': admineid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   533
            rset = cnx.execute('CWUser X WHERE X eid %(x)s', {'x': anon.eid})
8624
7e415f457155 [test] swap order in assert of `test_users_and_groups_non_readable_by_guests`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8546
diff changeset
   534
            self.assertEqual([[anon.eid]], rset.rows)
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   535
            # but can't modify it
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   536
            cnx.execute('SET X login "toto" WHERE X eid %(x)s', {'x': anon.eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   537
            self.assertRaises(Unauthorized, cnx.commit)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   538
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   539
    def test_in_group_relation(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   540
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   541
            rql = u"DELETE U in_group G WHERE U login 'admin'"
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   542
            self.assertRaises(Unauthorized, cnx.execute, rql)
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   543
            rql = u"SET U in_group G WHERE U login 'admin', G name 'users'"
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   544
            self.assertRaises(Unauthorized, cnx.execute, rql)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   545
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   546
    def test_owned_by(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   547
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   548
            cnx.execute("INSERT Personne X: X nom 'bidule'")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   549
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   550
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   551
            rql = u"SET X owned_by U WHERE U login 'iaminusersgrouponly', X is Personne"
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   552
            self.assertRaises(Unauthorized, cnx.execute, rql)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   553
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   554
    def test_bookmarked_by_guests_security(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   555
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   556
            beid1 = cnx.execute('INSERT Bookmark B: B path "?vid=manage", B title "manage"')[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   557
            beid2 = cnx.execute('INSERT Bookmark B: B path "?vid=index", B title "index", '
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   558
                                'B bookmarked_by U WHERE U login "anon"')[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   559
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   560
        with self.new_access('anon').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   561
            anoneid = cnx.user.eid
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   562
            self.assertEqual(cnx.execute('Any T,P ORDERBY lower(T) WHERE B is Bookmark,B title T,B path P,'
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   563
                                         'B bookmarked_by U, U eid %s' % anoneid).rows,
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   564
                              [['index', '?vid=index']])
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   565
            self.assertEqual(cnx.execute('Any T,P ORDERBY lower(T) WHERE B is Bookmark,B title T,B path P,'
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   566
                                         'B bookmarked_by U, U eid %(x)s', {'x': anoneid}).rows,
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   567
                              [['index', '?vid=index']])
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   568
            # can read others bookmarks as well
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   569
            self.assertEqual(cnx.execute('Any B where B is Bookmark, NOT B bookmarked_by U').rows,
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   570
                              [[beid1]])
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   571
            self.assertRaises(Unauthorized, cnx.execute,'DELETE B bookmarked_by U')
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   572
            self.assertRaises(Unauthorized,
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   573
                              cnx.execute, 'SET B bookmarked_by U WHERE U eid %(x)s, B eid %(b)s',
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   574
                              {'x': anoneid, 'b': beid1})
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   575
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   576
    def test_ambigous_ordered(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   577
        with self.new_access('anon').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   578
            names = [t for t, in cnx.execute('Any N ORDERBY lower(N) WHERE X name N')]
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   579
            self.assertEqual(names, sorted(names, key=lambda x: x.lower()))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   580
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   581
    def test_in_state_without_update_perm(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   582
        """check a user change in_state without having update permission on the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   583
        subject
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   584
        """
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   585
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   586
            eid = cnx.execute('INSERT Affaire X: X ref "ARCT01"')[0][0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   587
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   588
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   589
            # needed to remove rql expr granting update perm to the user
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   590
            affschema = self.schema['Affaire']
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   591
            with self.temporary_permissions(Affaire={'update': affschema.get_groups('update'),
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   592
                                                     'read': ('users',)}):
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   593
                self.assertRaises(Unauthorized,
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   594
                                  affschema.check_perm, cnx, 'update', eid=eid)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   595
                aff = cnx.execute('Any X WHERE X ref "ARCT01"').get_entity(0, 0)
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   596
                aff.cw_adapt_to('IWorkflowable').fire_transition('abort')
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   597
                cnx.commit()
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   598
                # though changing a user state (even logged user) is reserved to managers
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   599
                user = cnx.user
8461
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   600
                # XXX wether it should raise Unauthorized or ValidationError is not clear
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   601
                # the best would probably ValidationError if the transition doesn't exist
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   602
                # from the current state but Unauthorized if it exists but user can't pass it
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   603
                self.assertRaises(ValidationError,
8af7c6d86efb [test] update server security test using login and new temporary_permissions context managers
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8452
diff changeset
   604
                                  user.cw_adapt_to('IWorkflowable').fire_transition, 'deactivate')
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   605
2501
fa86d99c2c3a test and fix wf history security
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2500
diff changeset
   606
    def test_trinfo_security(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   607
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   608
            aff = cnx.execute('INSERT Affaire X: X ref "ARCT01"').get_entity(0, 0)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   609
            iworkflowable = aff.cw_adapt_to('IWorkflowable')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   610
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   611
            iworkflowable.fire_transition('abort')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   612
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   613
            # can change tr info comment
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   614
            cnx.execute('SET TI comment %(c)s WHERE TI wf_info_for X, X ref "ARCT01"',
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   615
                         {'c': u'bouh!'})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   616
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   617
            aff.cw_clear_relation_cache('wf_info_for', 'object')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   618
            trinfo = iworkflowable.latest_trinfo()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   619
            self.assertEqual(trinfo.comment, 'bouh!')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   620
            # but not from_state/to_state
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   621
            aff.cw_clear_relation_cache('wf_info_for', role='object')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   622
            self.assertRaises(Unauthorized, cnx.execute,
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   623
                              'SET TI from_state S WHERE TI eid %(ti)s, S name "ben non"',
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   624
                              {'ti': trinfo.eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   625
            self.assertRaises(Unauthorized, cnx.execute,
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   626
                              'SET TI to_state S WHERE TI eid %(ti)s, S name "pitetre"',
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   627
                              {'ti': trinfo.eid})
2501
fa86d99c2c3a test and fix wf history security
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2500
diff changeset
   628
8161
6f4229eb8178 [test] fix test broken by 8158:2ee254e74382 and add a test for that change
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8075
diff changeset
   629
    def test_emailaddress_security(self):
8649
8fbb2f65721e [test] precheck initial condition
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8546
diff changeset
   630
        # check for prexisting email adresse
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   631
        with self.admin_access.repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   632
            if cnx.execute('Any X WHERE X is EmailAddress'):
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   633
                rset = cnx.execute('Any X, U WHERE X is EmailAddress, U use_email X')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   634
                msg = ['Preexisting email readable by anon found!']
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   635
                tmpl = '  - "%s" used by user "%s"'
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   636
                for i in xrange(len(rset)):
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   637
                    email, user = rset.get_entity(i, 0), rset.get_entity(i, 1)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   638
                    msg.append(tmpl % (email.dc_title(), user.dc_title()))
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   639
                raise RuntimeError('\n'.join(msg))
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   640
            # actual test
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   641
            cnx.execute('INSERT EmailAddress X: X address "hop"').get_entity(0, 0)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   642
            cnx.execute('INSERT EmailAddress X: X address "anon", '
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   643
                         'U use_email X WHERE U login "anon"').get_entity(0, 0)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   644
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   645
            self.assertEqual(len(cnx.execute('Any X WHERE X is EmailAddress')), 2)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   646
        with self.new_access('anon').repo_cnx() as cnx:
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   647
            self.assertEqual(len(cnx.execute('Any X WHERE X is EmailAddress')), 1)
8161
6f4229eb8178 [test] fix test broken by 8158:2ee254e74382 and add a test for that change
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8075
diff changeset
   648
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   649
if __name__ == '__main__':
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   650
    unittest_main()