server/test/unittest_security.py
author Julien Cristau <julien.cristau@logilab.fr>
Thu, 22 Jan 2015 17:22:09 +0100
changeset 10158 efc8645ece43
parent 10156 57b68193413c
child 10161 138464fc1c33
permissions -rw-r--r--
[server/test] convert new test to 3.19 API
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9981
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
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
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    25
from cubicweb.server.querier import check_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
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    40
    def test_check_read_access(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    41
        rql = u'Personne U where U nom "managers"'
3252
c0e10da6f1cf tests update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
    42
        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
    43
        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
    44
            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
    45
                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
    46
                solution = rqlst.solutions[0]
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    47
                check_read_access(cnx, rqlst, solution, {})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    48
            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
    49
                self.assertRaises(Unauthorized,
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
    50
                                  check_read_access,
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    51
                                  cnx, rqlst, solution, {})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    52
                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
    53
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    54
    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
    55
        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
    56
            self.assertRaises(Unauthorized,
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    57
                              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
    58
        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
    59
            self.assertRaises(Unauthorized,
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    60
                              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
    61
8546
3d2038d6f20d [sources/native] automatically update passwords using deprecated hashes on login
Julien Cristau <julien.cristau@logilab.fr>
parents: 8488
diff changeset
    62
    def test_update_password(self):
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
    63
        """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
    64
        it will be updated on next login
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
    65
        """
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    66
        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
    67
            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
    68
                                         "WHERE cw_login = 'oldpassword'").fetchone()[0])
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    69
            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
    70
            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
    71
                                         "WHERE cw_login = 'oldpassword'").fetchone()[0])
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    72
            self.assertNotEqual(oldhash, newhash)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    73
            self.assertTrue(newhash.startswith('$6$'))
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    74
            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
    75
            self.assertEqual(newhash,
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    76
                             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
    77
                                                "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
    78
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
    79
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
    80
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
    81
    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
    82
        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
    83
            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
    84
            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
    85
        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
    86
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
    87
    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
    88
        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
    89
        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
    90
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
    91
    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
    92
        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
    93
            self.hijack_source_execute()
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
    94
            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
    95
            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
    96
                              '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
    97
            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
    98
            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
    99
                              '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
   100
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   101
class SecurityTC(BaseSecurityTC):
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   102
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   103
    def setUp(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   104
        super(SecurityTC, self).setUp()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   105
        # 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
   106
        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
   107
            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
   108
            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
   109
            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
   110
            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
   111
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   112
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   113
    def test_insert_security(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   114
        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
   115
            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
   116
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   117
            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
   118
10153
85cbf16fbb57 [security] Test case and fix for an INSERT security hole
Julien Cristau <julien.cristau@logilab.fr>
parents: 9981
diff changeset
   119
    def test_insert_security_2(self):
10158
efc8645ece43 [server/test] convert new test to 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 10156
diff changeset
   120
        with self.new_access('anon').repo_cnx() as cnx:
efc8645ece43 [server/test] convert new test to 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 10156
diff changeset
   121
            cnx.execute("INSERT Affaire X")
efc8645ece43 [server/test] convert new test to 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 10156
diff changeset
   122
            self.assertRaises(Unauthorized, cnx.commit)
10153
85cbf16fbb57 [security] Test case and fix for an INSERT security hole
Julien Cristau <julien.cristau@logilab.fr>
parents: 9981
diff changeset
   123
            # anon has no read permission on Affaire entities, so
85cbf16fbb57 [security] Test case and fix for an INSERT security hole
Julien Cristau <julien.cristau@logilab.fr>
parents: 9981
diff changeset
   124
            # rowcount == 0
10158
efc8645ece43 [server/test] convert new test to 3.19 API
Julien Cristau <julien.cristau@logilab.fr>
parents: 10156
diff changeset
   125
            self.assertEqual(cnx.execute('Affaire X').rowcount, 0)
10153
85cbf16fbb57 [security] Test case and fix for an INSERT security hole
Julien Cristau <julien.cristau@logilab.fr>
parents: 9981
diff changeset
   126
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   127
    def test_insert_rql_permission(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   128
        # 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
   129
        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
   130
            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
   131
            self.assertRaises(Unauthorized, cnx.commit)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   132
        # 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
   133
        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
   134
            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
   135
        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
   136
            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
   137
            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
   138
            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
   139
            cnx.commit()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   140
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   141
    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
   142
        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
   143
            # local security check
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   144
            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
   145
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   146
        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
   147
            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
   148
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   149
    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
   150
        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
   151
                                                  'add': ('guests', 'users', 'managers')}):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   152
            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
   153
                self.assertRaises(Unauthorized, cnx.execute,
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   154
                                  "SET X nom 'bidulechouette' WHERE X is Personne")
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   155
        # 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
   156
        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
   157
            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
   158
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   159
    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
   160
        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
   161
            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
   162
            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
   163
            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
   164
10114
6f4b4567b77d [security] check attributes: dispatch on the "add" action if entity was just created
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9984
diff changeset
   165
    def test_insert_immutable_attribute_update(self):
6f4b4567b77d [security] check attributes: dispatch on the "add" action if entity was just created
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9984
diff changeset
   166
        with self.admin_access.repo_cnx() as cnx:
6f4b4567b77d [security] check attributes: dispatch on the "add" action if entity was just created
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9984
diff changeset
   167
            cnx.create_entity('Old', name=u'Babar')
6f4b4567b77d [security] check attributes: dispatch on the "add" action if entity was just created
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9984
diff changeset
   168
            cnx.commit()
6f4b4567b77d [security] check attributes: dispatch on the "add" action if entity was just created
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9984
diff changeset
   169
            # this should be equivalent
6f4b4567b77d [security] check attributes: dispatch on the "add" action if entity was just created
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9984
diff changeset
   170
            o = cnx.create_entity('Old')
6f4b4567b77d [security] check attributes: dispatch on the "add" action if entity was just created
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9984
diff changeset
   171
            o.cw_set(name=u'Celeste')
6f4b4567b77d [security] check attributes: dispatch on the "add" action if entity was just created
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9984
diff changeset
   172
            cnx.commit()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   173
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   174
    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
   175
        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
   176
            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
   177
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   178
        # 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
   179
        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
   180
            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
   181
            # 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
   182
            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
   183
            # 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
   184
            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
   185
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   186
            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
   187
            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
   188
            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
   189
            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
   190
            cnx.commit()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   191
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   192
    def test_delete_security(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   193
        # 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
   194
        # user anyway, and since no user with login == 'bidule' exists, no
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   195
        # exception is raised
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   196
        #user._groups = {'guests':1}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   197
        #self.assertRaises(Unauthorized,
1398
5fe84a5f7035 rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents: 389
diff changeset
   198
        #                  self.o.execute, user, "DELETE CWUser X WHERE X login 'bidule'")
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   199
        # check local security
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   200
        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
   201
            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
   202
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   203
    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
   204
        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
   205
            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
   206
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   207
        # 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
   208
        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
   209
            # 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
   210
            cnx.execute("DELETE Affaire X")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   211
            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
   212
            # 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
   213
            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
   214
            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
   215
            cnx.rollback()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   216
            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
   217
            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
   218
            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
   219
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   220
##         # 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
   221
##         # and the other not
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   222
##         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
   223
            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
   224
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   225
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   226
    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
   227
        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
   228
            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
   229
            # 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
   230
            # 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
   231
            # anything
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   232
            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
   233
            # 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
   234
            # 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
   235
            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
   236
            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
   237
            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
   238
            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
   239
            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
   240
            self.assertRaises(Unauthorized,
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   241
                              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
   242
            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
   243
            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
   244
            # 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
   245
            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
   246
            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
   247
            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
   248
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   249
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   250
    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
   251
        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
   252
            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
   253
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   254
        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
   255
            # 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
   256
            cnx.execute("DELETE A concerne S")
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   257
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   258
        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
   259
            # 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
   260
            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
   261
            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
   262
                         {'x': eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   263
            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
   264
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   265
        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
   266
            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
   267
            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
   268
            cnx.rollback()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   269
            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
   270
            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
   271
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   272
            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
   273
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   274
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   275
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   276
    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
   277
        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
   278
            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
   279
        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
   280
            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
   281
                       {'x': ueid, 'passwd': 'newpwd'})
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   282
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   283
        self.repo.close(self.repo.connect('user', password='newpwd'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   284
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   285
    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
   286
        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
   287
            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
   288
        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
   289
            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
   290
                       {'x': ueid, 'passwd': 'newpwd'})
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   291
            self.assertRaises(Unauthorized, cnx.commit)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   292
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   293
    # read security test
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   294
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   295
    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
   296
        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
   297
            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
   298
                self.assertRaises(Unauthorized,
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   299
                                  cnx.execute, 'Personne U where U nom "managers"')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   300
321
247947250382 fix security bug w/ query using 'NOT X eid 123'
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   301
    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
   302
        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
   303
            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
   304
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   305
        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
   306
            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
   307
            self.assertEqual(rset.rows, [])
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})
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
   309
            # cache test
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   310
            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
   311
            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
   312
            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
   313
            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
   314
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   315
            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
   316
            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
   317
            # 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
   318
            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
   319
            self.assertEqual(rset.rows, [[aff2]])
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   320
            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
   321
            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
   322
            # 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
   323
            self.assertRaises(Unauthorized, cnx.execute,
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   324
                              '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
   325
c33d12865641 more tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4711
diff changeset
   326
c33d12865641 more tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4711
diff changeset
   327
    def test_entity_created_in_transaction(self):
c33d12865641 more tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4711
diff changeset
   328
        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
   329
        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
   330
            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
   331
                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
   332
                # 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
   333
                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
   334
                # 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
   335
                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
   336
                self.assertEqual(len(rset), 0)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   337
                self.assertRaises(Unauthorized, cnx.commit)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   338
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   339
    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
   340
        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
   341
            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
   342
            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
   343
            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
   344
                        {'x': card1})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   345
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   346
        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
   347
            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
   348
            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
   349
            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
   350
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   351
            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
   352
            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
   353
            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
   354
            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
   355
            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
   356
                              [card1, aff2])
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   357
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   358
    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
   359
        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
   360
            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
   361
            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
   362
            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
   363
        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
   364
            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
   365
                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
   366
                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
   367
                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
   368
                self.assertEqual(len(rset.rows), 1, rset.rows)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   369
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   370
    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
   371
        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
   372
            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
   373
            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
   374
            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
   375
        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
   376
            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
   377
                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
   378
                self.assertEqual(len(rset.rows), 1, rset.rows)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   379
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   380
    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
   381
        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
   382
            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
   383
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   384
        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
   385
            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
   386
            self.assertEqual(rset.rows, [[0]])
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   387
            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
   388
            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
   389
            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
   390
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   391
            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
   392
            self.assertEqual(rset.rows, [[1]])
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   393
            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
   394
            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
   395
            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
   396
            self.assertEqual(values['Societe'], 2)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   397
            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
   398
                              '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
   399
            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
   400
            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
   401
            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
   402
            self.assertEqual(values['Societe'], 2)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   403
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   404
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   405
    def test_attribute_security(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   406
        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
   407
            # 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
   408
            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
   409
                               "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
   410
            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
   411
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   412
        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
   413
            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
   414
                       "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
   415
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   416
            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
   417
                       "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
   418
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   419
            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
   420
                             "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
   421
            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 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
   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 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
   425
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   426
            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
   427
            cnx.commit()
9984
793377697c81 merge 3.18.6 into 3.19
Julien Cristau <julien.cristau@logilab.fr>
parents: 9782 9981
diff changeset
   428
        with self.new_access('iaminusersgrouponly').repo_cnx() as cnx:
793377697c81 merge 3.18.6 into 3.19
Julien Cristau <julien.cristau@logilab.fr>
parents: 9782 9981
diff changeset
   429
            cnx.execute('INSERT Frozable F: F name "Foo"')
793377697c81 merge 3.18.6 into 3.19
Julien Cristau <julien.cristau@logilab.fr>
parents: 9782 9981
diff changeset
   430
            cnx.commit()
793377697c81 merge 3.18.6 into 3.19
Julien Cristau <julien.cristau@logilab.fr>
parents: 9782 9981
diff changeset
   431
            cnx.execute('SET F name "Bar" WHERE F is Frozable')
793377697c81 merge 3.18.6 into 3.19
Julien Cristau <julien.cristau@logilab.fr>
parents: 9782 9981
diff changeset
   432
            cnx.commit()
793377697c81 merge 3.18.6 into 3.19
Julien Cristau <julien.cristau@logilab.fr>
parents: 9782 9981
diff changeset
   433
            cnx.execute('SET F name "BaBar" WHERE F is Frozable')
793377697c81 merge 3.18.6 into 3.19
Julien Cristau <julien.cristau@logilab.fr>
parents: 9782 9981
diff changeset
   434
            cnx.execute('SET F frozen True WHERE F is Frozable')
9981
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   435
            with self.assertRaises(Unauthorized):
9984
793377697c81 merge 3.18.6 into 3.19
Julien Cristau <julien.cristau@logilab.fr>
parents: 9782 9981
diff changeset
   436
                cnx.commit()
793377697c81 merge 3.18.6 into 3.19
Julien Cristau <julien.cristau@logilab.fr>
parents: 9782 9981
diff changeset
   437
            cnx.rollback()
793377697c81 merge 3.18.6 into 3.19
Julien Cristau <julien.cristau@logilab.fr>
parents: 9782 9981
diff changeset
   438
            cnx.execute('SET F frozen True WHERE F is Frozable')
793377697c81 merge 3.18.6 into 3.19
Julien Cristau <julien.cristau@logilab.fr>
parents: 9782 9981
diff changeset
   439
            cnx.commit()
793377697c81 merge 3.18.6 into 3.19
Julien Cristau <julien.cristau@logilab.fr>
parents: 9782 9981
diff changeset
   440
            cnx.execute('SET F name "Bar" WHERE F is Frozable')
9981
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   441
            with self.assertRaises(Unauthorized):
9984
793377697c81 merge 3.18.6 into 3.19
Julien Cristau <julien.cristau@logilab.fr>
parents: 9782 9981
diff changeset
   442
                cnx.commit()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   443
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   444
    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
   445
        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
   446
            # 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
   447
            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
   448
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   449
            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
   450
            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
   451
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   452
        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
   453
            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
   454
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   455
            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
   456
            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
   457
            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
   458
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   459
            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
   460
                                            {'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
   461
                              0)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   462
            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
   463
            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
   464
            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
   465
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   466
            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
   467
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   468
            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
   469
            self.assertRaises(Unauthorized, cnx.commit)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   470
            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
   471
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   472
            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
   473
            cnx.commit()
9395
96dba2efd16d [hooks/security] provide attribute "add" permission
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8694
diff changeset
   474
            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
   475
            cnx.commit()
9395
96dba2efd16d [hooks/security] provide attribute "add" permission
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8694
diff changeset
   476
            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
   477
            cnx.commit()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   478
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   479
    def test_attribute_read_security(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   480
        # 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
   481
        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
   482
        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
   483
                                        CWUser={'read': ('guests', 'users', 'managers')}):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   484
            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
   485
                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
   486
                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
   487
                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
   488
                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
   489
                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
   490
                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
   491
                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
   492
                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
   493
                self.assertTrue(x.creation_date)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   494
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
   495
    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
   496
        with self.temporary_permissions(Division={'read': ('managers',
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   497
                                                           ERQLExpression('X owned_by U'))}):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   498
            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
   499
                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
   500
                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
   501
                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
   502
                querier._annotate(rqlst)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   503
                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
   504
                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
   505
                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
   506
                    rqlst.as_string(),
9777
b2e47617a94e [tests/security] break lines > 100 chars
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9586
diff changeset
   507
                    '(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
   508
                    '(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
   509
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
   510
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   511
class BaseSchemaSecurityTC(BaseSecurityTC):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   512
    """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
   513
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   514
    def test_user_can_delete_object_he_created(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   515
        # 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
   516
        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
   517
            # 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
   518
            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
   519
            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
   520
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   521
        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
   522
            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
   523
            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
   524
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   525
            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
   526
                             1)
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   527
            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
   528
                                              '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
   529
                             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
   530
        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
   531
            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
   532
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   533
            self.assertFalse(cnx.execute('Affaire X'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   534
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   535
    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
   536
        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
   537
            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
   538
        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
   539
            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
   540
            # 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
   541
            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
   542
            self.assertEqual([['anon']], rset.rows)
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   543
            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
   544
            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
   545
            # 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
   546
            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
   547
            # 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
   548
            self.assertRaises(Unauthorized,
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   549
                              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
   550
            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
   551
            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
   552
            # but can't modify it
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   553
            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
   554
            self.assertRaises(Unauthorized, cnx.commit)
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1398
diff changeset
   555
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   556
    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
   557
        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
   558
            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
   559
            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
   560
            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
   561
            self.assertRaises(Unauthorized, cnx.execute, rql)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   562
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   563
    def test_owned_by(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   564
        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
   565
            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
   566
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   567
        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
   568
            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
   569
            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
   570
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   571
    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
   572
        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
   573
            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
   574
            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
   575
                                '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
   576
            cnx.commit()
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
            anoneid = cnx.user.eid
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   579
            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
   580
                                         '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
   581
                              [['index', '?vid=index']])
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   582
            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
   583
                                         '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
   584
                              [['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
   585
            # 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
   586
            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
   587
                              [[beid1]])
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   588
            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
   589
            self.assertRaises(Unauthorized,
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   590
                              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
   591
                              {'x': anoneid, 'b': beid1})
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   592
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   593
    def test_ambigous_ordered(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   594
        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
   595
            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
   596
            self.assertEqual(names, sorted(names, key=lambda x: x.lower()))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   597
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   598
    def test_in_state_without_update_perm(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   599
        """check a user change in_state without having update permission on the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   600
        subject
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   601
        """
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   602
        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
   603
            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
   604
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   605
        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
   606
            # 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
   607
            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
   608
            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
   609
                                                     '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
   610
                self.assertRaises(Unauthorized,
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   611
                                  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
   612
                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
   613
                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
   614
                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
   615
                # 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
   616
                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
   617
                # 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
   618
                # 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
   619
                # 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
   620
                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
   621
                                  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
   622
2501
fa86d99c2c3a test and fix wf history security
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2500
diff changeset
   623
    def test_trinfo_security(self):
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   624
        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
   625
            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
   626
            iworkflowable = aff.cw_adapt_to('IWorkflowable')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   627
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   628
            iworkflowable.fire_transition('abort')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   629
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   630
            # can change tr info comment
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   631
            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
   632
                         {'c': u'bouh!'})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   633
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   634
            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
   635
            trinfo = iworkflowable.latest_trinfo()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   636
            self.assertEqual(trinfo.comment, 'bouh!')
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   637
            # but not from_state/to_state
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   638
            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
   639
            self.assertRaises(Unauthorized, cnx.execute,
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   640
                              '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
   641
                              {'ti': trinfo.eid})
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   642
            self.assertRaises(Unauthorized, cnx.execute,
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   643
                              '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
   644
                              {'ti': trinfo.eid})
2501
fa86d99c2c3a test and fix wf history security
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2500
diff changeset
   645
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
   646
    def test_emailaddress_security(self):
8649
8fbb2f65721e [test] precheck initial condition
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8546
diff changeset
   647
        # check for prexisting email adresse
9782
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   648
        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
   649
            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
   650
                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
   651
                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
   652
                tmpl = '  - "%s" used by user "%s"'
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   653
                for i in xrange(len(rset)):
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   654
                    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
   655
                    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
   656
                raise RuntimeError('\n'.join(msg))
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   657
            # actual test
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   658
            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
   659
            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
   660
                         '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
   661
            cnx.commit()
95e8fa2c8da8 [tests/security] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9777
diff changeset
   662
            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
   663
        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
   664
            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
   665
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   666
if __name__ == '__main__':
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   667
    unittest_main()