Mercurial > p > roundup > code
annotate roundup/security.py @ 8139:de58ff07890e permission-performance
Rename parameter of hasPermission
Rename only_no_check to skip_permissions_with_check.
Revert explicit no-properties check in Permission.searchable, this check
is already taken care of by the _properties_dict check. Add a comment on
what _properties_dict does.
| author | Ralf Schlatterbeck <rsc@runtux.com> |
|---|---|
| date | Thu, 24 Oct 2024 09:19:25 +0200 |
| parents | 8e9181dfc9fa |
| children | e9af08743759 |
| rev | line source |
|---|---|
|
2005
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1644
diff
changeset
|
1 """Handle the security declarations used in Roundup trackers. |
|
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1644
diff
changeset
|
2 """ |
|
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1644
diff
changeset
|
3 __docformat__ = 'restructuredtext' |
|
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1644
diff
changeset
|
4 |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
5 import weakref |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
6 |
|
2983
9614a101b68f
Stuff from the train ride this morning:
Richard Jones <richard@users.sourceforge.net>
parents:
2834
diff
changeset
|
7 from roundup import hyperdb, support |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
8 |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
9 import logging |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
10 logger = logging.getLogger('roundup.security') |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
11 |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
12 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
13 class Permission: |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
14 ''' Defines a Permission with the attributes |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
15 - name |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
16 - description |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
17 - klass (optional) |
|
2983
9614a101b68f
Stuff from the train ride this morning:
Richard Jones <richard@users.sourceforge.net>
parents:
2834
diff
changeset
|
18 - properties (optional) |
|
2652
281beec48408
add note about new functionality to Permission class docstring;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2649
diff
changeset
|
19 - check function (optional) |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
20 - props_only (optional, internal field is limit_perm_to_props_only) |
|
8125
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
21 - filter function (optional) returns filter arguments for |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
22 determining which records are visible by the user. The filter |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
23 function comes into play when determining if a set of nodes |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
24 found via a filter call of a class can be seen by the user -- |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
25 the normal way would be to call the permissions for each item |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
26 found, the filter call performs this on the database for all |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
27 nodes. |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
28 Signature of the filter function: |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
29 filter(db, userid, klass) |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
30 The filter must return a list of dictionaries with filter parameters. |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
31 Note that sort and group parameters of the filter call should |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
32 not be set by filter method (they will be overwritten) and the |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
33 parameter search_matches must not be set. |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
34 An empty list returned means no access for this filter method. |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
35 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
36 The klass may be unset, indicating that this permission is not |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
37 locked to a particular class. That means there may be multiple |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
38 Permissions for the same name for different classes. |
|
2652
281beec48408
add note about new functionality to Permission class docstring;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2649
diff
changeset
|
39 |
|
2983
9614a101b68f
Stuff from the train ride this morning:
Richard Jones <richard@users.sourceforge.net>
parents:
2834
diff
changeset
|
40 If property names are set, permission is restricted to those |
|
9614a101b68f
Stuff from the train ride this morning:
Richard Jones <richard@users.sourceforge.net>
parents:
2834
diff
changeset
|
41 properties only. |
|
2652
281beec48408
add note about new functionality to Permission class docstring;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2649
diff
changeset
|
42 |
|
281beec48408
add note about new functionality to Permission class docstring;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2649
diff
changeset
|
43 If check function is set, permission is granted only when |
|
281beec48408
add note about new functionality to Permission class docstring;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2649
diff
changeset
|
44 the function returns value interpreted as boolean true. |
|
281beec48408
add note about new functionality to Permission class docstring;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2649
diff
changeset
|
45 The function is called with arguments db, userid, itemid. |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
46 |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
47 When the system checks klass permission rather than the klass |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
48 property permission (i.e. properties=None and item=None), it |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
49 will apply any permission that matches on permission name and |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
50 class. If the permission has a check function, the check |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
51 function will be run. By making the permission valid only for |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
52 properties using props_only=True the permission will be |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
53 skipped. You can set the default value for props_only for all |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
54 properties by calling: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
55 |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
56 db.security.set_props_only_default() |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
57 |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
58 with a True or False value. |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
59 ''' |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
60 |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
61 limit_perm_to_props_only = False |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
62 |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
63 def __init__(self, name='', description='', klass=None, |
|
8125
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
64 properties=None, check=None, props_only=None, filter=None): |
|
5269
c94fd717e28c
Fix http://issues.roundup-tracker.org/issue2550952 make __call__
John Rouillard <rouilj@ieee.org>
parents:
5199
diff
changeset
|
65 from roundup.anypy import findargspec |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
66 self.name = name |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
67 self.description = description |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
68 self.klass = klass |
|
2983
9614a101b68f
Stuff from the train ride this morning:
Richard Jones <richard@users.sourceforge.net>
parents:
2834
diff
changeset
|
69 self.properties = properties |
|
9614a101b68f
Stuff from the train ride this morning:
Richard Jones <richard@users.sourceforge.net>
parents:
2834
diff
changeset
|
70 self._properties_dict = support.TruthDict(properties) |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
71 self.check = check |
|
8125
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
72 self.filter = filter |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
73 if properties is not None: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
74 # Set to None unless properties are defined. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
75 # This means that: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
76 # a=Property(name="Edit", klass="issue", check=dummy, |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
77 # props_only=True) |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
78 # b=Property(name="Edit", klass="issue", check=dummy, |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
79 # props_only=False) |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
80 # a == b will be true. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
81 if props_only is None: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
82 self.limit_perm_to_props_only = \ |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
83 Permission.limit_perm_to_props_only |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
84 else: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
85 # see note on use of bool() in set_props_only_default() |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
86 self.limit_perm_to_props_only = bool(props_only) |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
87 else: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
88 self.limit_perm_to_props_only = None |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
89 |
|
5186
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
90 if check is None: |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
91 self.check_version = 0 |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
92 else: |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
93 args = findargspec.findargspec(check) |
|
5269
c94fd717e28c
Fix http://issues.roundup-tracker.org/issue2550952 make __call__
John Rouillard <rouilj@ieee.org>
parents:
5199
diff
changeset
|
94 # args[2] is the keywords argument. Leave it as a subscript and |
|
c94fd717e28c
Fix http://issues.roundup-tracker.org/issue2550952 make __call__
John Rouillard <rouilj@ieee.org>
parents:
5199
diff
changeset
|
95 # do not use named tuple reference as names change in python 3. |
|
5186
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
96 # If there is a **parameter defined in the function spec, the |
|
5269
c94fd717e28c
Fix http://issues.roundup-tracker.org/issue2550952 make __call__
John Rouillard <rouilj@ieee.org>
parents:
5199
diff
changeset
|
97 # value of the 3rd argument (2nd index) in the tuple is not None. |
|
5186
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
98 if args[2] is None: |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
99 # function definition is function(db, userid, itemid) |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
100 self.check_version = 1 |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
101 else: |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
102 # function definition is function(db, userid, itemid, **other) |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
103 self.check_version = 2 |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
104 |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
105 def test(self, db, permission, classname, property, userid, itemid): |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
106 ''' Test permissions 5 args: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
107 permission - string like Edit, Register etc. Required, no wildcard. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
108 classname - string like issue, msg etc. Can be None to match any |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
109 class. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
110 property - array of strings that are property names. Optional. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
111 if None this is an item or klass access check. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
112 userid - number that is id for user. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
113 itemid - id for classname. e.g. 3 in issue3. If missing this is |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
114 a class access check, otherwies it's a object access check. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
115 ''' |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
116 |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
117 if permission != self.name: |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
118 return 0 |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
119 |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
120 # are we checking the correct class |
|
3535
75dc225613cc
fix security check for hasPermission(Permission, None)
Richard Jones <richard@users.sourceforge.net>
parents:
3117
diff
changeset
|
121 if self.klass is not None and self.klass != classname: |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
122 return 0 |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
123 |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
124 # what about property? |
|
8139
de58ff07890e
Rename parameter of hasPermission
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8131
diff
changeset
|
125 # Note that _properties_dict always returns True if it was |
|
de58ff07890e
Rename parameter of hasPermission
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8131
diff
changeset
|
126 # initialized with empty properties |
|
2983
9614a101b68f
Stuff from the train ride this morning:
Richard Jones <richard@users.sourceforge.net>
parents:
2834
diff
changeset
|
127 if property is not None and not self._properties_dict[property]: |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
128 return 0 |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
129 |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
130 # is this a props_only permission and permissions are set |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
131 if property is None and self.properties is not None and \ |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
132 self.limit_perm_to_props_only: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
133 return 0 |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
134 |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
135 # check code |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
136 if itemid is not None and self.check is not None: |
|
5186
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
137 if self.check_version == 1: |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
138 if not self.check(db, userid, itemid): |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
139 return 0 |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
140 elif self.check_version == 2: |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
141 if not self.check(db, userid, itemid, property=property, |
|
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
142 permission=permission, classname=classname): |
|
5186
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
143 return 0 |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
144 |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
145 # we have a winner |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
146 return 1 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
147 |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
148 def searchable(self, classname, property): |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
149 """ A Permission is searchable for the given permission if it |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
150 doesn't include a check method and otherwise matches the |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
151 given parameters. |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
152 """ |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
153 if self.name not in ('View', 'Search'): |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
154 return 0 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
155 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
156 # are we checking the correct class |
|
4443
9edbab31e2ac
- admin permissions are special:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4438
diff
changeset
|
157 if self.klass is not None and self.klass != classname: |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
158 return 0 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
159 |
|
8131
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
160 # Do not allow access if we have a check method |
|
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
161 if self.check: |
|
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
162 return 0 |
|
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
163 |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
164 # what about property? |
|
8139
de58ff07890e
Rename parameter of hasPermission
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8131
diff
changeset
|
165 # Note that _properties_dict always returns True if it was |
|
de58ff07890e
Rename parameter of hasPermission
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8131
diff
changeset
|
166 # initialized with empty properties |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
167 if not self._properties_dict[property]: |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
168 return 0 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
169 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
170 return 1 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
171 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
172 def __repr__(self): |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
173 return '<Permission 0x%x %r,%r,%r,%r,%r>' % (id(self), self.name, |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
174 self.klass, self.properties, self.check, |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
175 self.limit_perm_to_props_only) |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
176 |
|
5414
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
177 def __eq__(self, other): |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
178 if self.name != other.name: |
|
5414
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
179 return False |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
180 |
|
5414
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
181 if self.klass != other.klass: return False |
|
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
182 if self.properties != other.properties: return False |
|
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
183 if self.check != other.check: return False |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
184 if self.limit_perm_to_props_only != \ |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
185 other.limit_perm_to_props_only: return False |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
186 |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
187 # match |
|
5414
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
188 return True |
|
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
189 |
|
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
190 def __ne__(self, other): |
|
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
191 return not self.__eq__(other) |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
192 |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
193 def __getitem__(self, index): |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
194 return (self.name, self.klass, self.properties, self.check, |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
195 self.limit_perm_to_props_only)[index] |
|
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
196 |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
197 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
198 class Role: |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
199 ''' Defines a Role with the attributes |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
200 - name |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
201 - description |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
202 - permissions |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
203 ''' |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
204 def __init__(self, name='', description='', permissions=None): |
|
1512
9b93d140b8e6
role names made case insensitive
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1218
diff
changeset
|
205 self.name = name.lower() |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
206 self.description = description |
|
8119
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
207 # This is a dict of permission names each containing a dict of |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
208 # *class names*, with a special entry for non-class permissions |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
209 # where the key is None. In each class dict we have a dictionary |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
210 # with the values True and False for permission with and without |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
211 # a check method. These dicts each contain a list of permissions. |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
212 if permissions is None: |
|
8119
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
213 self._permissions = {} |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
214 elif isinstance(permissions, list): |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
215 self._permissions = {} |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
216 for p in permissions: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
217 self.addPermission(p) |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
218 else: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
219 raise ValueError("Invalid permissions for Role: %s" % permissions) |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
220 |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
221 def __repr__(self): |
|
8119
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
222 pl = self.permission_list() |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
223 return '<Role 0x%x %r,%r>' % (id(self), self.name, pl) |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
224 |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
225 def addPermission (self, *permissions): |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
226 for p in permissions: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
227 pn = p.name |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
228 self._permissions.setdefault(pn, {}) |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
229 cn = p.klass |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
230 if p.klass not in self._permissions[pn]: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
231 self._permissions[pn][cn] = dict (((False, []), (True, []))) |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
232 self._permissions[pn][cn][bool(p.check)].append(p) |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
233 |
|
8125
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
234 def filter_iter (self, permission, classname): |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
235 """ Loop over all permissions for the current role on the class |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
236 with a check method (and props_only False). |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
237 """ |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
238 if permission not in self._permissions: |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
239 return |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
240 for c in (None, classname): |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
241 if c not in self._permissions[permission]: |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
242 continue |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
243 perms = self._permissions[permission][c][True] |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
244 for p in perms: |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
245 if p.limit_perm_to_props_only and p.properties: |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
246 continue |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
247 yield p |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
248 |
|
8119
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
249 def hasPermission (self, db, perm, uid, classname, property, itemid, chk): |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
250 # if itemid is given a classname must, too, checked in caller |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
251 assert not itemid or classname |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
252 perms = self._permissions |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
253 if perm not in perms: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
254 return False |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
255 # If we have a classname we also need to check permission with |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
256 # an empty classname (e.g. 'admin' has access on everything) |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
257 if classname is not None and None in perms[perm]: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
258 for p in perms[perm][None][chk]: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
259 # permission match? |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
260 if p.test(db, perm, classname, property, uid, itemid): |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
261 return True |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
262 if classname not in perms[perm]: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
263 return False |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
264 for p in perms[perm][classname][chk]: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
265 # permission match? |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
266 if p.test(db, perm, classname, property, uid, itemid): |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
267 return True |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
268 |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
269 def permission_list (self): |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
270 """ Used for reporting in admin tool """ |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
271 l = [] |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
272 for p in self._permissions: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
273 for c in self._permissions[p]: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
274 for cond in (False, True): |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
275 l.extend (self._permissions[p][c][cond]) |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
276 l.sort (key = lambda x: (x.klass or '', x.name)) |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
277 return l |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
278 |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
279 def searchable (self, classname, propname): |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
280 for perm in 'View', 'Search': |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
281 # Only permissions without a check method |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
282 if perm not in self._permissions: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
283 continue |
|
8131
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
284 p = self._permissions[perm] |
|
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
285 if classname not in p and None not in p: |
|
8119
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
286 continue |
|
8131
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
287 if None in p: |
|
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
288 for p in p[None][False]: |
|
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
289 if p.searchable(classname, propname): |
|
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
290 return True |
|
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
291 if classname in p: |
|
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
292 for p in p[classname][False]: |
|
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
293 if p.searchable(classname, propname): |
|
8e9181dfc9fa
Fix searchable checks in roundup/security.py
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8125
diff
changeset
|
294 return True |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
295 |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
296 |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
297 class Security: |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
298 def __init__(self, db): |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
299 ''' Initialise the permission and role classes, and add in the |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
300 base roles (for admin user). |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
301 ''' |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
302 self.db = weakref.proxy(db) # use a weak ref to avoid circularity |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
303 |
|
8119
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
304 # Permissions are mapped by name to a list of Permissions by class |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
305 self.permission = {} |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
306 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
307 # roles are mapped by name to the Role |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
308 self.role = {} |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
309 |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
310 # the default Roles |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
311 self.addRole(name="User", description="A regular user, no privs") |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
312 self.addRole(name="Admin", description="An admin user, full privs") |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
313 self.addRole(name="Anonymous", description="An anonymous user") |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
314 |
|
4088
34434785f308
Plug a number of security holes:
Richard Jones <richard@users.sourceforge.net>
parents:
3535
diff
changeset
|
315 # default permissions - Admin may do anything |
|
5127
425b4c4fc345
issue2550831: Make the classic template query.edit page work.
John Rouillard <rouilj@ieee.org>
parents:
5110
diff
changeset
|
316 for p in 'create edit restore retire view'.split(): |
|
4088
34434785f308
Plug a number of security holes:
Richard Jones <richard@users.sourceforge.net>
parents:
3535
diff
changeset
|
317 p = self.addPermission(name=p.title(), |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
318 description="User may %s everything" % p) |
|
4088
34434785f308
Plug a number of security holes:
Richard Jones <richard@users.sourceforge.net>
parents:
3535
diff
changeset
|
319 self.addPermissionToRole('Admin', p) |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
320 |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
321 # initialise the permissions and roles needed for the UIs |
|
992
6003d6fa02a5
new CGI frontend support
Richard Jones <richard@users.sourceforge.net>
parents:
938
diff
changeset
|
322 from roundup.cgi import client |
|
6003d6fa02a5
new CGI frontend support
Richard Jones <richard@users.sourceforge.net>
parents:
938
diff
changeset
|
323 client.initialiseSecurity(self) |
|
938
62c49e259047
preparation for moving cgi modules around
Richard Jones <richard@users.sourceforge.net>
parents:
909
diff
changeset
|
324 from roundup import mailgw |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
325 mailgw.initialiseSecurity(self) |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
326 |
|
8125
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
327 def filter_iter(self, permission, userid, classname): |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
328 """ Loop over all permissions for the current user on the class |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
329 with a check method (and props_only False). |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
330 """ |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
331 for rolename in self.db.user.get_roles(userid): |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
332 if not rolename or (rolename not in self.role): |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
333 continue |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
334 r = self.role[rolename] |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
335 for perm in r.filter_iter(permission, classname): |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
336 yield perm |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
337 |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
338 def getPermission(self, permission, classname=None, properties=None, |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
339 check=None, props_only=None): |
|
905
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
340 ''' Find the Permission matching the name and for the class, if the |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
341 classname is specified. |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
342 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
343 Raise ValueError if there is no exact match. |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
344 ''' |
|
5128
4058fc1ec746
replacing depricated has_key references by in to support python 3. Errors reported by python -3 roundup_server. Unit tests test_config test_security pass although test_config is a bit weak in coverage.
John Rouillard <rouilj@ieee.org>
parents:
5127
diff
changeset
|
345 if permission not in self.permission: |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
346 raise ValueError('No permission "%s" defined' % permission) |
|
909
ef9c759c243e
Fix to hasPermission, thanks Stefan Seefeld.
Richard Jones <richard@users.sourceforge.net>
parents:
908
diff
changeset
|
347 |
| 2834 | 348 if classname: |
| 349 try: | |
| 350 self.db.getclass(classname) | |
| 351 except KeyError: | |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
352 raise ValueError('No class "%s" defined' % classname) |
| 2834 | 353 |
|
909
ef9c759c243e
Fix to hasPermission, thanks Stefan Seefeld.
Richard Jones <richard@users.sourceforge.net>
parents:
908
diff
changeset
|
354 # look through all the permissions of the given name |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
355 tester = Permission(permission, klass=classname, properties=properties, |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
356 check=check, |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
357 props_only=props_only) |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
358 for perm in self.permission[permission]: |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
359 if perm == tester: |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
360 return perm |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
361 raise ValueError('No permission "%s" defined for "%s"' % (permission, |
|
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
362 classname)) |
|
905
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
363 |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
364 def hasPermission(self, permission, userid, classname=None, |
|
8139
de58ff07890e
Rename parameter of hasPermission
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8131
diff
changeset
|
365 property=None, itemid=None, |
|
de58ff07890e
Rename parameter of hasPermission
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8131
diff
changeset
|
366 skip_permissions_with_check=False): |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
367 '''Look through all the Roles, and hence Permissions, and |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
368 see if "permission" exists given the constraints of |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
369 classname, property, itemid, and props_only. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
370 |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
371 If classname is specified (and only classname) the |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
372 search will match: |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
373 |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
374 if there is *any* Permission for that classname, and |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
375 that Permission was not created with props_only = True |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
376 |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
377 *NOTE* the Permission will match even if there are |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
378 additional constraints like a check or properties and |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
379 props_only is False. This can be unexpected. Using |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
380 props_only = True or setting the default value to True can |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
381 help prevent surprises. |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
382 |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
383 If property is specified, the Permission matched must have |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
384 either no properties listed or the property must appear in |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
385 the list. |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
386 |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
387 If itemid is specified, the Permission matched must have |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
388 either no check function defined or the check function, |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
389 when invoked, must return a True value. |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
390 |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
391 Note that this functionality is actually implemented by the |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
392 Permission.test() method. |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
393 |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
394 ''' |
|
2983
9614a101b68f
Stuff from the train ride this morning:
Richard Jones <richard@users.sourceforge.net>
parents:
2834
diff
changeset
|
395 if itemid and classname is None: |
|
5378
35ea9b1efc14
Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5269
diff
changeset
|
396 raise ValueError('classname must accompany itemid') |
|
8119
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
397 # for each of the user's Roles, check the permissions |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
398 # Note that checks with a check method are typically a lot more |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
399 # expensive than the ones without. So we check the ones without |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
400 # a check method first |
|
8121
2a4d0413bd20
When computing batch check class-permissions first
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8120
diff
changeset
|
401 checklist = (False, True) |
|
8139
de58ff07890e
Rename parameter of hasPermission
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8131
diff
changeset
|
402 if skip_permissions_with_check: |
|
8121
2a4d0413bd20
When computing batch check class-permissions first
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8120
diff
changeset
|
403 checklist = (False,) |
|
2a4d0413bd20
When computing batch check class-permissions first
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8120
diff
changeset
|
404 for has_check in checklist: |
|
8119
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
405 for rolename in self.db.user.get_roles(userid): |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
406 if not rolename or (rolename not in self.role): |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
407 continue |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
408 r = self.role[rolename] |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
409 v = r.hasPermission(self.db, permission, userid, classname, |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
410 property, itemid, has_check) |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
411 if v: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
412 return v |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
413 return False |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
414 |
|
8125
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
415 def is_filterable(self, permission, userid, classname): |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
416 """ Check if all permissions for the current user on the class |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
417 with a check method (and props_only False) also have a |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
418 filter method. We only consider permissions with props_only |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
419 set to False. Note that this will return True if there are |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
420 no permissions with a check method found, the performed |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
421 checks later will find no matching records. |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
422 """ |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
423 for perm in self.filter_iter (permission, userid, classname): |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
424 if not perm.filter: |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
425 return False |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
426 return True |
|
b358da7c89e5
Optimize filtering of search results
Ralf Schlatterbeck <rsc@runtux.com>
parents:
8121
diff
changeset
|
427 |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
428 def roleHasSearchPermission(self, classname, property, *rolenames): |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
429 """ For each of the given roles, check the permissions. |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
430 Property can be a transitive property. |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
431 """ |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
432 perms = [] |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
433 # Note: break from inner loop means "found" |
|
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
434 # break from outer loop means "not found" |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
435 cn = classname |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
436 prev = None |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
437 prop = None |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
438 Link = hyperdb.Link |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
439 Multilink = hyperdb.Multilink |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
440 for propname in property.split('.'): |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
441 if prev: |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
442 try: |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
443 cn = prop.classname |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
444 except AttributeError: |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
445 break |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
446 prev = propname |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
447 try: |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
448 cls = self.db.getclass(cn) |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
449 prop = cls.getprops()[propname] |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
450 except KeyError: |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
451 break |
|
8119
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
452 for rn in rolenames: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
453 if self.role[rn].searchable(cn, propname): |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
454 break |
|
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
455 else: |
|
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
456 break |
|
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
457 else: |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
458 # for Link and Multilink require search permission on label- |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
459 # and order-properties and on ID |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
460 if isinstance(prop, Multilink) or isinstance(prop, Link): |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
461 try: |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
462 cls = self.db.getclass(prop.classname) |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
463 except KeyError: |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
464 return 0 |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
465 props = dict.fromkeys(('id', cls.labelprop(), cls.orderprop())) |
|
5395
23b8e6067f7c
Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5378
diff
changeset
|
466 for p in props.keys(): |
|
8119
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
467 for rn in rolenames: |
|
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
468 if self.role[rn].searchable(prop.classname, p): |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
469 break |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
470 else: |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
471 return 0 |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
472 return 1 |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
473 return 0 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
474 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
475 def hasSearchPermission(self, userid, classname, property): |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
476 '''Look through all the Roles, and hence Permissions, and |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
477 see if "permission" exists given the constraints of |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
478 classname and property. |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
479 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
480 A search permission is granted if we find a 'View' or |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
481 'Search' permission for the user which does *not* include |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
482 a check function. If such a permission is found, the user may |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
483 search for the given property in the given class. |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
484 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
485 Note that classname *and* property are mandatory arguments. |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
486 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
487 Contrary to hasPermission, the search will *not* match if |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
488 there are additional constraints (namely a search function) |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
489 on a Permission found. |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
490 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
491 Concerning property, the Permission matched must have |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
492 either no properties listed or the property must appear in |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
493 the list. |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
494 ''' |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
495 roles = [r for r in self.db.user.get_roles(userid) |
|
5128
4058fc1ec746
replacing depricated has_key references by in to support python 3. Errors reported by python -3 roundup_server. Unit tests test_config test_security pass although test_config is a bit weak in coverage.
John Rouillard <rouilj@ieee.org>
parents:
5127
diff
changeset
|
496 if r and (r in self.role)] |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
497 return self.roleHasSearchPermission(classname, property, *roles) |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
498 |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
499 def addPermission(self, **propspec): |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
500 ''' Create a new Permission with the properties defined in |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
501 'propspec'. See the Permission class for the possible |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
502 keyword args. |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
503 ''' |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
504 perm = Permission(**propspec) |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
505 self.permission.setdefault(perm.name, []).append(perm) |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
506 return perm |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
507 |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
508 def addRole(self, **propspec): |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
509 ''' Create a new Role with the properties defined in 'propspec' |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
510 ''' |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
511 role = Role(**propspec) |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
512 self.role[role.name] = role |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
513 return role |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
514 |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
515 def set_props_only_default(self, props_only=None): |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
516 if props_only is not None: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
517 # NOTE: only valid values are True and False because these |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
518 # will be compared as part of tuple == tuple and |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
519 # (3,) == (True,) is False even though 3 is a True value |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
520 # in a boolean context. So use bool() to coerce value. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
521 Permission.limit_perm_to_props_only = \ |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
522 bool(props_only) |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
523 |
|
5199
1f72b73d7770
Still trying to figure out why travis ci fails without a call to
John Rouillard <rouilj@ieee.org>
parents:
5196
diff
changeset
|
524 def get_props_only_default(self): |
|
1f72b73d7770
Still trying to figure out why travis ci fails without a call to
John Rouillard <rouilj@ieee.org>
parents:
5196
diff
changeset
|
525 return Permission.limit_perm_to_props_only |
|
1f72b73d7770
Still trying to figure out why travis ci fails without a call to
John Rouillard <rouilj@ieee.org>
parents:
5196
diff
changeset
|
526 |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
527 def addPermissionToRole(self, rolename, permission, classname=None, |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
528 properties=None, check=None, props_only=None): |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
529 ''' Add the permission to the role's permission list. |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
530 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
531 'rolename' is the name of the role to add the permission to. |
|
2991
b9a55628a78d
more doc fixes
Richard Jones <richard@users.sourceforge.net>
parents:
2983
diff
changeset
|
532 |
|
b9a55628a78d
more doc fixes
Richard Jones <richard@users.sourceforge.net>
parents:
2983
diff
changeset
|
533 'permission' is either a Permission *or* a permission name |
|
3115
ece73371713c
fix Permission.__repr__()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2991
diff
changeset
|
534 accompanied by 'classname' (thus in the second case a Permission |
|
2991
b9a55628a78d
more doc fixes
Richard Jones <richard@users.sourceforge.net>
parents:
2983
diff
changeset
|
535 is obtained by passing 'permission' and 'classname' to |
|
b9a55628a78d
more doc fixes
Richard Jones <richard@users.sourceforge.net>
parents:
2983
diff
changeset
|
536 self.getPermission) |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
537 ''' |
|
2991
b9a55628a78d
more doc fixes
Richard Jones <richard@users.sourceforge.net>
parents:
2983
diff
changeset
|
538 if not isinstance(permission, Permission): |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
539 permission = self.getPermission(permission, classname, |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
540 properties, check, props_only) |
|
1512
9b93d140b8e6
role names made case insensitive
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1218
diff
changeset
|
541 role = self.role[rolename.lower()] |
|
8119
c12377fb4144
Change permission representation
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6012
diff
changeset
|
542 role.addPermission(permission) |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
543 |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
544 # Convenience methods for removing non-allowed properties from a |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
545 # filterspec or sort/group list |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
546 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
547 def filterFilterspec(self, userid, classname, filterspec): |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
548 """ Return a filterspec that has all non-allowed properties removed. |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
549 """ |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
550 return dict([(k, v) for k, v in filterspec.items() |
|
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
551 if self.hasSearchPermission(userid, classname, k)]) |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
552 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
553 def filterSortspec(self, userid, classname, sort): |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
554 """ Return a sort- or group-list that has all non-allowed properties |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
555 removed. |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
556 """ |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
557 if isinstance(sort, tuple) and sort[0] in '+-': |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
558 sort = [sort] |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
559 return [(d, p) for d, p in sort |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
560 if self.hasSearchPermission(userid, classname, p)] |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
561 |
|
2652
281beec48408
add note about new functionality to Permission class docstring;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2649
diff
changeset
|
562 # vim: set filetype=python sts=4 sw=4 et si : |
