Project

General

Profile

Revision 70938860

ID709388608fb2356642f6a48371d36d1187c5ba86
Parent 8b357a71
Child db6fbc92

Added by Vincent QUEMENER over 13 years ago

Correction de plusieurs bugs dans la vérification des permissions de l'arbre de sélection des groupes du formulaire de recherche de VigiBoard.

git-svn-id: https://vigilo-dev.si.c-s.fr/svn@6799 b22e2e97-25c9-44ff-b637-2e5ceca36478

View differences:

vigiboard/controllers/root.py
697 697
        """
698 698

  
699 699
        # Si l'identifiant du groupe parent n'est pas
700
        # spécifié, on retourne la liste des groupes racines,
701
        # fournie par la méthode get_root_hosts_groups.
700
        # spécifié, on retourne la liste des groupes
701
        # racines, fournie par la méthode get_root_groups.
702 702
        if parent_id is None:
703
            return self.get_root_host_groups()
703
            return self.get_root_groups()
704 704

  
705 705
        # TODO: Utiliser un schéma de validation
706 706
        parent_id = int(parent_id)
......
724 724
            user = get_current_user()
725 725
            GroupHierarchy_aliased = aliased(GroupHierarchy,
726 726
                name='GroupHierarchy_aliased')
727
            supitem_groups.join(
727
            supitem_groups = supitem_groups.join(
728 728
                (GroupHierarchy_aliased,
729
                    GroupHierarchy_aliased.idchild == SupItemGroup.idgroup),
729
                    or_(
730
                        GroupHierarchy_aliased.idchild == SupItemGroup.idgroup,
731
                        GroupHierarchy_aliased.idparent == SupItemGroup.idgroup
732
                    )),
730 733
                (DataPermission,
731
                    DataPermission.idgroup == GroupHierarchy_aliased.idparent),
734
                    or_(
735
                        DataPermission.idgroup == \
736
                            GroupHierarchy_aliased.idparent,
737
                        DataPermission.idgroup == \
738
                            GroupHierarchy_aliased.idchild,
739
                    )),
732 740
                (USER_GROUP_TABLE, USER_GROUP_TABLE.c.idgroup == \
733 741
                    DataPermission.idusergroup),
734 742
            ).filter(USER_GROUP_TABLE.c.username == user.user_name)
......
742 750

  
743 751
        return dict(groups = groups, leaves = [])
744 752

  
745
    def get_root_host_groups(self):
753
    def get_root_groups(self):
746 754
        """
747 755
        Retourne tous les groupes racines (c'est à dire n'ayant
748 756
        aucun parent) d'hôtes auquel l'utilisateur a accès.
......
775 783

  
776 784
            root_groups = root_groups.join(
777 785
                (GroupHierarchy,
778
                    GroupHierarchy.idchild == SupItemGroup.idgroup),
786
                    GroupHierarchy.idparent == SupItemGroup.idgroup),
779 787
                (DataPermission,
780
                    DataPermission.idgroup == GroupHierarchy.idparent),
788
                    DataPermission.idgroup == GroupHierarchy.idchild),
781 789
                (USER_GROUP_TABLE, USER_GROUP_TABLE.c.idgroup == \
782 790
                    DataPermission.idusergroup),
783 791
            ).filter(USER_GROUP_TABLE.c.username == user.user_name)
vigiboard/tests/functional/test_group_selection_tree.py
1
# -*- coding: utf-8 -*-
2
"""
3
Teste l'arbre de sélection des groupes du formulaire de recherche
4
"""
5
from nose.tools import assert_true, assert_equal
6
from datetime import datetime
7
import transaction
8

  
9
from vigiboard.tests import TestController
10
from vigilo.models.session import DBSession
11
from vigilo.models.tables import SupItemGroup, Host, Permission, StateName, \
12
                                    Event, CorrEvent, User, UserGroup, \
13
                                    DataPermission
14

  
15
from utils import populate_DB
16

  
17
class TestGroupSelectionTree(TestController):
18
    """Teste l'arbre de sélection des groupes du formulaire de recherche."""
19

  
20
    def setUp(self):
21
        super(TestGroupSelectionTree, self).setUp()
22
        populate_DB()
23

  
24
    def test_get_inexistent_group(self):
25
        """Récupération de l'étage de l'arbre pour un groupe inexistant"""
26

  
27
        # L'utilisateur est authentifié avec des permissions étendues.
28
        # Il cherche à obtenir la liste des groupes fils d'un groupe
29
        # qui n'existe pas, il ne doit donc obtenir aucun résultat.
30
        response = self.app.get('/get_groups?parent_id=%d' % -42,
31
            extra_environ={'REMOTE_USER': 'access'})
32
        json = response.json
33

  
34
        # On s'assure que la liste de groupes retournée est bien vide
35
        self.assertEqual(
36
            json, {'leaves': [], 'groups': []}
37
        )
38

  
39
        # L'utilisateur est authentifié et fait partie du groupe 'managers'.
40
        # Il cherche à obtenir la liste des groupes fils d'un groupe
41
        # qui n'existe pas, il ne doit donc obtenir aucun résultat.
42
        response = self.app.get('/get_groups?parent_id=%d' % -42,
43
            extra_environ={'REMOTE_USER': 'manager'})
44
        json = response.json
45

  
46
        # On s'assure que la liste de groupes retournée est bien vide
47
        self.assertEqual(
48
            json, {'leaves': [], 'groups': []}
49
        )
50

  
51
    def test_get_group_when_not_allowed(self):
52
        """Récupération de l'étage de l'arbre sans les droits"""
53

  
54
        # Récupération du groupe utilisé lors de ce test.
55
        group2 = SupItemGroup.by_group_name(u'group2')
56

  
57
        # L'utilisateur n'est pas authentifié.
58
        # Il cherche à obtenir la liste des groupes fils d'un groupe donné.
59
        response = self.app.get('/get_groups?parent_id=%d' % group2.idgroup,
60
            status=401)
61

  
62
        # L'utilisateur est authentifié avec des permissions
63
        # restreintes. Il cherche à obtenir la liste des groupes fils
64
        # d'un groupe auquel il n'a pas accès, même indirectement.
65
        response = self.app.get('/get_groups?parent_id=%d' % group2.idgroup,
66
            extra_environ={'REMOTE_USER': 'limited_access'})
67
        json = response.json
68

  
69
        # On s'assure que la liste de groupes retournée est bien vide
70
        self.assertEqual(
71
            json, {'leaves': [], 'groups': []}
72
        )
73

  
74
    def test_get_group_when_allowed(self):
75
        """Récupération de l'étage de l'arbre avec les droits"""
76

  
77
        # Récupération des groupes utilisés lors de ce test.
78
        root = SupItemGroup.by_group_name(u'root')
79
        maingroup = SupItemGroup.by_group_name(u'maingroup')
80
        group1 = SupItemGroup.by_group_name(u'group1')
81
        group2 = SupItemGroup.by_group_name(u'group2')
82

  
83
        # L'utilisateur est authentifié et fait partie du groupe 'managers'.
84
        # Il cherche à obtenir la liste des groupes fils d'un groupe donné.
85
        response = self.app.get('/get_groups?parent_id=%d' % root.idgroup,
86
            extra_environ={'REMOTE_USER': 'manager'})
87
        json = response.json
88

  
89
        # On s'assure que la liste retournée contient
90
        # bien les groupes fils de ce groupe parent
91
        self.assertEqual(
92
            json, {
93
                'leaves': [], 
94
                'groups': [
95
                    {'id': maingroup.idgroup, 'name': maingroup.name}
96
                ]
97
            }
98
        )
99

  
100
        # L'utilisateur est authentifié avec des permissions
101
        # étendues. Il cherche à obtenir la liste des groupes
102
        # fils d'un groupe auquel il a directement accès.
103
        response = self.app.get('/get_groups?parent_id=%d' % root.idgroup,
104
            extra_environ={'REMOTE_USER': 'access'})
105
        json = response.json
106

  
107
        # On s'assure que la liste retournée contient
108
        # bien les groupes fils de ce groupe parent
109
        self.assertEqual(
110
            json, {
111
                'leaves': [], 
112
                'groups': [
113
                    {'id': maingroup.idgroup, 'name': maingroup.name}
114
                ]
115
            }
116
        )
117

  
118
        # Le même utilisateur cherche à obtenir la liste des
119
        # groupes fils d'un groupe auquel il a indirectement accès.
120
        response = self.app.get('/get_groups?parent_id=%d' % maingroup.idgroup,
121
            extra_environ={'REMOTE_USER': 'access'})
122
        json = response.json
123

  
124
        # On s'assure que la liste retournée contient
125
        # bien les groupes fils de ce groupe parent.
126
        self.assertEqual(json, {
127
                'leaves': [], 
128
                'groups': [
129
                    {'id': group1.idgroup, 'name': group1.name},
130
                    {'id': group2.idgroup, 'name': group2.name}
131
                ]
132
            })
133

  
134
        # L'utilisateur est authentifié avec des permissions
135
        # restreintes. Il cherche à obtenir la liste des groupes
136
        # fils d'un groupe auquel il n'a pas accès, mais a toutefois
137
        # le droit d'accéder à un des groupes fils en question.
138
        response = self.app.get('/get_groups?parent_id=%d' % maingroup.idgroup,
139
            extra_environ={'REMOTE_USER': 'limited_access'})
140
        json = response.json
141

  
142
        # On s'assure que la liste retournée contient bien ce groupe fils.
143
        self.assertEqual(
144
            json, {
145
                'leaves': [], 
146
                'groups': [
147
                    {'id': group1.idgroup, 'name': group1.name}
148
                ]
149
            }
150
        )
151

  
152
        # Le même utilisateur cherche à obtenir la liste des groupes
153
        # fils d'un groupe de niveau encore supérieur.
154
        response = self.app.get('/get_groups?parent_id=%d' % root.idgroup,
155
            extra_environ={'REMOTE_USER': 'limited_access'})
156
        json = response.json
157

  
158
        # On s'assure que la liste retournée contient bien
159
        # le groupe parent du groupe auquel il a accès.
160
        self.assertEqual(
161
            json, {
162
                'leaves': [], 
163
                'groups': [
164
                    {'id': maingroup.idgroup, 'name': maingroup.name}
165
                ]
166
            }
167
        )
168

  
169
    def test_get_root_group_when_allowed(self):
170
        """Récupération des groupes racines de l'arbre avec les droits"""
171

  
172
        # Récupération du groupe utilisé lors de ce test.
173
        root = SupItemGroup.by_group_name(u'root')
174

  
175
        # L'utilisateur est authentifié et fait partie du groupe 'managers'.
176
        # Il cherche à obtenir la liste des groupes racines de l'arbre.
177
        response = self.app.get('/get_groups',
178
            extra_environ={'REMOTE_USER': 'manager'})
179
        json = response.json
180

  
181
        # On s'assure que la liste retournée contient bien le groupe racine.
182
        self.assertEqual(
183
            json, {
184
                'leaves': [], 
185
                'groups': [
186
                    {'id': root.idgroup, 'name': root.name}
187
                ]
188
            }
189
        )
190

  
191
        # L'utilisateur est authentifié avec des permissions étendues.
192
        # Il cherche à obtenir la liste des groupes racines de l'arbre.
193
        response = self.app.get('/get_groups',
194
            extra_environ={'REMOTE_USER': 'access'})
195
        json = response.json
196

  
197
        # On s'assure que la liste retournée contient bien le
198
        # groupe racine, auquel cet utilisateur a directement accès.
199
        self.assertEqual(
200
            json, {
201
                'leaves': [], 
202
                'groups': [
203
                    {'id': root.idgroup, 'name': root.name}
204
                ]
205
            }
206
        )
207

  
208
        # L'utilisateur est authentifié avec des permissions restreintes.
209
        # Il cherche à obtenir la liste des groupes racines de l'arbre.
210
        response = self.app.get('/get_groups',
211
            extra_environ={'REMOTE_USER': 'limited_access'})
212
        json = response.json
213

  
214
        # On s'assure que la liste retournée contient bien le
215
        # groupe racine, auquel cet utilisateur a indirectement accès.
216
        self.assertEqual(
217
            json, {
218
                'leaves': [], 
219
                'groups': [
220
                    {'id': root.idgroup, 'name': root.name}
221
                ]
222
            }
223
        )
224

  
225
    def test_get_root_group_when_not_allowed(self):
226
        """Récupération des groupes racines de l'arbre sans les droits"""
227

  
228
        # Récupération du groupe utilisé lors de ce test.
229
        root = SupItemGroup.by_group_name(u'root')
230

  
231
        # L'utilisateur n'est pas authentifié, et cherche
232
        # à obtenir la liste des groupes racines de l'arbre.
233
        response = self.app.get('/get_groups', status=401)
234

  
235
        # Création d'un nouvel utilisateur et d'un nouveau groupe
236
        usergroup = UserGroup(group_name=u'new_users')
237
        vigiboard_perm = Permission.by_permission_name(u'vigiboard-access')
238
        usergroup.permissions.append(vigiboard_perm)
239
        user = User(
240
            user_name=u'new_user',
241
            fullname=u'',
242
            email=u'user.has.no@access',
243
        )
244
        user.usergroups.append(usergroup)
245
        DBSession.add(user)
246

  
247
        # L'utilisateur est authentifié mais n'a aucun accès. Il
248
        # cherche à obtenir la liste des groupes racines de l'arbre.
249
        response = self.app.get('/get_groups',
250
            extra_environ={'REMOTE_USER': 'new_user'})
251
        json = response.json
252

  
253
        # On s'assure que la liste retournée est bien vide.
254
        self.assertEqual(
255
            json, {
256
                'leaves': [], 
257
                'groups': []
258
            }
259
        )
260

  

Also available in: Unified diff