Mercurial > p > roundup > code
annotate roundup/security.py @ 6681:ab2ed11c021e
issue2551205: Add support for specifying valid origins for api: xmlrpc/rest
We now have an allow list to filter the hosts allowed to do api
requests. An element of this allow list must match the http ORIGIN
header exactly or the rest/xmlrpc CORS request will result in an
error.
The tracker host is always allowed to do a request.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Tue, 17 May 2022 17:18:51 -0400 |
| parents | 06e6bc21b67e |
| children | c12377fb4144 |
| 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) |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
21 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
22 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
|
23 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
|
24 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
|
25 |
|
2983
9614a101b68f
Stuff from the train ride this morning:
Richard Jones <richard@users.sourceforge.net>
parents:
2834
diff
changeset
|
26 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
|
27 properties only. |
|
2652
281beec48408
add note about new functionality to Permission class docstring;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2649
diff
changeset
|
28 |
|
281beec48408
add note about new functionality to Permission class docstring;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2649
diff
changeset
|
29 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
|
30 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
|
31 The function is called with arguments db, userid, itemid. |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
32 |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
33 When the system checks klass permission rather than the klass |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
34 property permission (i.e. properties=None and item=None), it |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
35 will apply any permission that matches on permission name and |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
36 class. If the permission has a check function, the check |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
37 function will be run. By making the permission valid only for |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
38 properties using props_only=True the permission will be |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
39 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
|
40 properties by calling: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
41 |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
42 db.security.set_props_only_default() |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
43 |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
44 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
|
45 ''' |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
46 |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
47 limit_perm_to_props_only = False |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
48 |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
49 def __init__(self, name='', description='', klass=None, |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
50 properties=None, check=None, props_only=None): |
|
5269
c94fd717e28c
Fix http://issues.roundup-tracker.org/issue2550952 make __call__
John Rouillard <rouilj@ieee.org>
parents:
5199
diff
changeset
|
51 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
|
52 self.name = name |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
53 self.description = description |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
54 self.klass = klass |
|
2983
9614a101b68f
Stuff from the train ride this morning:
Richard Jones <richard@users.sourceforge.net>
parents:
2834
diff
changeset
|
55 self.properties = properties |
|
9614a101b68f
Stuff from the train ride this morning:
Richard Jones <richard@users.sourceforge.net>
parents:
2834
diff
changeset
|
56 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
|
57 self.check = check |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
58 if properties is not None: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
59 # Set to None unless properties are defined. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
60 # This means that: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
61 # a=Property(name="Edit", klass="issue", check=dummy, |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
62 # props_only=True) |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
63 # b=Property(name="Edit", klass="issue", check=dummy, |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
64 # props_only=False) |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
65 # a == b will be true. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
66 if props_only is None: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
67 self.limit_perm_to_props_only = \ |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
68 Permission.limit_perm_to_props_only |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
69 else: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
70 # see note on use of bool() in set_props_only_default() |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
71 self.limit_perm_to_props_only = bool(props_only) |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
72 else: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
73 self.limit_perm_to_props_only = None |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
74 |
|
5186
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
75 if check is None: |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
76 self.check_version = 0 |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
77 else: |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
78 args = findargspec.findargspec(check) |
|
5269
c94fd717e28c
Fix http://issues.roundup-tracker.org/issue2550952 make __call__
John Rouillard <rouilj@ieee.org>
parents:
5199
diff
changeset
|
79 # 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
|
80 # 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
|
81 # 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
|
82 # 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
|
83 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
|
84 # 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
|
85 self.check_version = 1 |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
86 else: |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
87 # 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
|
88 self.check_version = 2 |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
89 |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
90 def test(self, db, permission, classname, property, userid, itemid): |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
91 ''' Test permissions 5 args: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
92 permission - string like Edit, Register etc. Required, no wildcard. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
93 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
|
94 class. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
95 property - array of strings that are property names. Optional. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
96 if None this is an item or klass access check. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
97 userid - number that is id for user. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
98 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
|
99 a class access check, otherwies it's a object access check. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
100 ''' |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
101 |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
102 if permission != self.name: |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
103 return 0 |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
104 |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
105 # 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
|
106 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
|
107 return 0 |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
108 |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
109 # what about property? |
|
2983
9614a101b68f
Stuff from the train ride this morning:
Richard Jones <richard@users.sourceforge.net>
parents:
2834
diff
changeset
|
110 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
|
111 return 0 |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
112 |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
113 # is this a props_only permission and permissions are set |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
114 if property is None and self.properties is not None and \ |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
115 self.limit_perm_to_props_only: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
116 return 0 |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
117 |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
118 # check code |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
119 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
|
120 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
|
121 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
|
122 return 0 |
|
36630a062fb5
Check in enhanced form for check command used by addPermission.
John Rouillard <rouilj@ieee.org>
parents:
5128
diff
changeset
|
123 elif self.check_version == 2: |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
124 if not self.check(db, userid, itemid, property=property, |
|
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
125 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
|
126 return 0 |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
127 |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
128 # we have a winner |
|
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
129 return 1 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
130 |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
131 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
|
132 """ 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
|
133 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
|
134 given parameters. |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
135 """ |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
136 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
|
137 return 0 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
138 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
139 # are we checking the correct class |
|
4443
9edbab31e2ac
- admin permissions are special:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4438
diff
changeset
|
140 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
|
141 return 0 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
142 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
143 # what about property? |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
144 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
|
145 return 0 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
146 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
147 if self.check: |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
148 return 0 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
149 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
150 return 1 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
151 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
152 def __repr__(self): |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
153 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
|
154 self.klass, self.properties, self.check, |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
155 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
|
156 |
|
5414
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
157 def __eq__(self, other): |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
158 if self.name != other.name: |
|
5414
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
159 return False |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
160 |
|
5414
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
161 if self.klass != other.klass: return False |
|
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
162 if self.properties != other.properties: return False |
|
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
163 if self.check != other.check: return False |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
164 if self.limit_perm_to_props_only != \ |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
165 other.limit_perm_to_props_only: return False |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
166 |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
167 # match |
|
5414
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
168 return True |
|
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
169 |
|
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
170 def __ne__(self, other): |
|
3fa026621f69
Python 3 preparation: comparisons.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
171 return not self.__eq__(other) |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
172 |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
173 def __getitem__(self, index): |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
174 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
|
175 self.limit_perm_to_props_only)[index] |
|
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
176 |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
177 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
178 class Role: |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
179 ''' 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
|
180 - name |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
181 - description |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
182 - permissions |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
183 ''' |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
184 def __init__(self, name='', description='', permissions=None): |
|
1512
9b93d140b8e6
role names made case insensitive
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1218
diff
changeset
|
185 self.name = name.lower() |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
186 self.description = description |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
187 if permissions is None: |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
188 permissions = [] |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
189 self.permissions = permissions |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
190 |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
191 def __repr__(self): |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
192 return '<Role 0x%x %r,%r>' % (id(self), self.name, self.permissions) |
|
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
193 |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
194 |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
195 class Security: |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
196 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
|
197 ''' 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
|
198 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
|
199 ''' |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
200 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
|
201 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
202 # permssions are mapped by name to a list of Permissions by class |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
203 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
|
204 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
205 # 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
|
206 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
|
207 |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
208 # 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
|
209 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
|
210 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
|
211 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
|
212 |
|
4088
34434785f308
Plug a number of security holes:
Richard Jones <richard@users.sourceforge.net>
parents:
3535
diff
changeset
|
213 # 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
|
214 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
|
215 p = self.addPermission(name=p.title(), |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
216 description="User may %s everything" % p) |
|
4088
34434785f308
Plug a number of security holes:
Richard Jones <richard@users.sourceforge.net>
parents:
3535
diff
changeset
|
217 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
|
218 |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
219 # 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
|
220 from roundup.cgi import client |
|
6003d6fa02a5
new CGI frontend support
Richard Jones <richard@users.sourceforge.net>
parents:
938
diff
changeset
|
221 client.initialiseSecurity(self) |
|
938
62c49e259047
preparation for moving cgi modules around
Richard Jones <richard@users.sourceforge.net>
parents:
909
diff
changeset
|
222 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
|
223 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
|
224 |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
225 def getPermission(self, permission, classname=None, properties=None, |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
226 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
|
227 ''' 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
|
228 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
|
229 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
230 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
|
231 ''' |
|
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
|
232 if permission not in self.permission: |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
233 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
|
234 |
| 2834 | 235 if classname: |
| 236 try: | |
| 237 self.db.getclass(classname) | |
| 238 except KeyError: | |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
239 raise ValueError('No class "%s" defined' % classname) |
| 2834 | 240 |
|
909
ef9c759c243e
Fix to hasPermission, thanks Stefan Seefeld.
Richard Jones <richard@users.sourceforge.net>
parents:
908
diff
changeset
|
241 # look through all the permissions of the given name |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
242 tester = Permission(permission, klass=classname, properties=properties, |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
243 check=check, |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
244 props_only=props_only) |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
245 for perm in self.permission[permission]: |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
246 if perm == tester: |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
247 return perm |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
248 raise ValueError('No permission "%s" defined for "%s"' % (permission, |
|
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
249 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
|
250 |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
251 def hasPermission(self, permission, userid, classname=None, |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
252 property=None, itemid=None): |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
253 '''Look through all the Roles, and hence Permissions, and |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
254 see if "permission" exists given the constraints of |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
255 classname, property, itemid, and props_only. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
256 |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
257 If classname is specified (and only classname) the |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
258 search will match: |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
259 |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
260 if there is *any* Permission for that classname, and |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
261 that Permission was not created with props_only = True |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
262 |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
263 *NOTE* the Permission will match even if there are |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
264 additional constraints like a check or properties and |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
265 props_only is False. This can be unexpected. Using |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
266 props_only = True or setting the default value to True can |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
267 help prevent surprises. |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
268 |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
269 If property is specified, the Permission matched must have |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
270 either no properties listed or the property must appear in |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
271 the list. |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
272 |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
273 If itemid is specified, the Permission matched must have |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
274 either no check function defined or the check function, |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
275 when invoked, must return a True value. |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
276 |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
277 Note that this functionality is actually implemented by the |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
278 Permission.test() method. |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
279 |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
280 ''' |
|
2983
9614a101b68f
Stuff from the train ride this morning:
Richard Jones <richard@users.sourceforge.net>
parents:
2834
diff
changeset
|
281 if itemid and classname is None: |
|
5378
35ea9b1efc14
Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5269
diff
changeset
|
282 raise ValueError('classname must accompany itemid') |
|
4306
966592263fb8
Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4088
diff
changeset
|
283 for rolename 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
|
284 if not rolename or (rolename not in self.role): |
|
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
|
285 continue |
|
909
ef9c759c243e
Fix to hasPermission, thanks Stefan Seefeld.
Richard Jones <richard@users.sourceforge.net>
parents:
908
diff
changeset
|
286 # for each of the user's Roles, check the permissions |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
287 for perm in self.role[rolename].permissions: |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
288 # permission match? |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
289 if perm.test(self.db, permission, classname, property, |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
290 userid, itemid): |
|
2649
1df7d4a41da4
Buncha stuff (sorry about the large checkin):
Richard Jones <richard@users.sourceforge.net>
parents:
2005
diff
changeset
|
291 return 1 |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
292 return 0 |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
293 |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
294 def roleHasSearchPermission(self, classname, property, *rolenames): |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
295 """ 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
|
296 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
|
297 """ |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
298 perms = [] |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
299 # pre-compute permissions |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
300 for rn in rolenames: |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
301 for perm in self.role[rn].permissions: |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
302 perms.append(perm) |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
303 # Note: break from inner loop means "found" |
|
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
304 # break from outer loop means "not found" |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
305 cn = classname |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
306 prev = None |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
307 prop = None |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
308 Link = hyperdb.Link |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
309 Multilink = hyperdb.Multilink |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
310 for propname in property.split('.'): |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
311 if prev: |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
312 try: |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
313 cn = prop.classname |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
314 except AttributeError: |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
315 break |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
316 prev = propname |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
317 try: |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
318 cls = self.db.getclass(cn) |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
319 prop = cls.getprops()[propname] |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
320 except KeyError: |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
321 break |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
322 for perm in perms: |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
323 if perm.searchable(cn, propname): |
|
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
324 break |
|
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
325 else: |
|
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
326 break |
|
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
327 else: |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
328 # 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
|
329 # and order-properties and on ID |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
330 if isinstance(prop, Multilink) or isinstance(prop, Link): |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
331 try: |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
332 cls = self.db.getclass(prop.classname) |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
333 except KeyError: |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
334 return 0 |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
335 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
|
336 for p in props.keys(): |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
337 for perm in perms: |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
338 if perm.searchable(prop.classname, p): |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
339 break |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
340 else: |
|
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
341 return 0 |
|
4438
222efa59ee6c
search permissions must allow transitive properties
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
342 return 1 |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
343 return 0 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
344 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
345 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
|
346 '''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
|
347 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
|
348 classname and property. |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
349 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
350 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
|
351 '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
|
352 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
|
353 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
|
354 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
355 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
|
356 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
357 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
|
358 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
|
359 on a Permission found. |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
360 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
361 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
|
362 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
|
363 the list. |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
364 ''' |
|
4444
8137456a86f3
more fixes to search permissions:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4443
diff
changeset
|
365 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
|
366 if r and (r in self.role)] |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
367 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
|
368 |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
369 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
|
370 ''' Create a new Permission with the properties defined in |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
371 'propspec'. See the Permission class for the possible |
|
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
372 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
|
373 ''' |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
374 perm = Permission(**propspec) |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
375 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
|
376 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
|
377 |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
378 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
|
379 ''' 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
|
380 ''' |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
381 role = Role(**propspec) |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
382 self.role[role.name] = role |
|
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
383 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
|
384 |
|
5196
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
385 def set_props_only_default(self, props_only=None): |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
386 if props_only is not None: |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
387 # NOTE: only valid values are True and False because these |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
388 # will be compared as part of tuple == tuple and |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
389 # (3,) == (True,) is False even though 3 is a True value |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
390 # in a boolean context. So use bool() to coerce value. |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
391 Permission.limit_perm_to_props_only = \ |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
392 bool(props_only) |
|
e0732fd6a6c7
Implement props_only feature for permissions.
rouilj@uland
parents:
5186
diff
changeset
|
393 |
|
5199
1f72b73d7770
Still trying to figure out why travis ci fails without a call to
John Rouillard <rouilj@ieee.org>
parents:
5196
diff
changeset
|
394 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
|
395 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
|
396 |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
397 def addPermissionToRole(self, rolename, permission, classname=None, |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
398 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
|
399 ''' 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
|
400 |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
401 '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
|
402 |
|
b9a55628a78d
more doc fixes
Richard Jones <richard@users.sourceforge.net>
parents:
2983
diff
changeset
|
403 'permission' is either a Permission *or* a permission name |
|
3115
ece73371713c
fix Permission.__repr__()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2991
diff
changeset
|
404 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
|
405 is obtained by passing 'permission' and 'classname' to |
|
b9a55628a78d
more doc fixes
Richard Jones <richard@users.sourceforge.net>
parents:
2983
diff
changeset
|
406 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
|
407 ''' |
|
2991
b9a55628a78d
more doc fixes
Richard Jones <richard@users.sourceforge.net>
parents:
2983
diff
changeset
|
408 if not isinstance(permission, Permission): |
|
3117
460eb0209a9e
Permissions improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
3115
diff
changeset
|
409 permission = self.getPermission(permission, classname, |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
410 properties, check, props_only) |
|
1512
9b93d140b8e6
role names made case insensitive
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1218
diff
changeset
|
411 role = self.role[rolename.lower()] |
|
908
a8d80ffe37cc
Removed the unnecessary volatiledb and the related complications.
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
412 role.permissions.append(permission) |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
413 |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
414 # 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
|
415 # filterspec or sort/group list |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
416 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
417 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
|
418 """ 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
|
419 """ |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
420 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
|
421 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
|
422 |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
423 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
|
424 """ 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
|
425 removed. |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
426 """ |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
427 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
|
428 sort = [sort] |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4306
diff
changeset
|
429 return [(d, p) for d, p in sort |
|
6012
06e6bc21b67e
flake8 changes whitepace and formatting
John Rouillard <rouilj@ieee.org>
parents:
5414
diff
changeset
|
430 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
|
431 |
|
2652
281beec48408
add note about new functionality to Permission class docstring;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2649
diff
changeset
|
432 # vim: set filetype=python sts=4 sw=4 et si : |
