7
7
from trac .web .chrome import Chrome
8
8
from trac .ticket .query import Query , QuerySyntaxError , QueryValueError
9
9
10
+
10
11
class ConfigurablePermissionPolicy (Component ):
11
12
implements (IPermissionRequestor , IPermissionPolicy )
12
13
@@ -21,12 +22,12 @@ def get_permission_actions(self):
21
22
return result
22
23
23
24
def check_permission (self , action , username , resource , user_perm ):
24
-
25
+
25
26
result = None
26
-
27
+
27
28
if resource is None :
28
29
return None
29
-
30
+
30
31
elif resource .realm == 'ticket' :
31
32
for perm in self .ticket_perm :
32
33
if (perm .action == action or perm .action == '*' or perm .action == '' ) \
@@ -36,7 +37,8 @@ def check_permission(self, action, username, resource, user_perm):
36
37
if perm .rule == '' or perm .rule == '*' :
37
38
flag = True
38
39
else :
39
- query_string = 'id=' + str (resource .id ) + '&' + perm .rule
40
+ query_string = 'id=' + \
41
+ str (resource .id ) + '&' + perm .rule
40
42
try :
41
43
query = Query .from_string (self .env , query_string )
42
44
except QuerySyntaxError as e :
@@ -48,16 +50,27 @@ def check_permission(self, action, username, resource, user_perm):
48
50
flag = ticketsCount > 0
49
51
50
52
if flag :
51
- return self ._should_allow (perm , user_perm )
53
+ result = self ._combine_result (
54
+ result , self ._should_allow (perm , user_perm ))
52
55
53
56
elif resource .realm == 'wiki' :
54
57
for perm in self .wiki_perm :
55
58
if perm .action == action or perm .action == '*' or perm .action == '' :
56
59
if perm .wiki_name == '' or perm .wiki_name == '*' or perm .wiki_name == resource .id :
57
- return self ._should_allow (perm , user_perm )
60
+ result = self ._combine_result (
61
+ result , self ._should_allow (perm , user_perm ))
58
62
59
63
return result
60
64
65
+ def _combine_result (self , result1 , result2 ):
66
+ if result2 is not None :
67
+ if result1 :
68
+ return result1 and result2
69
+ else :
70
+ return result1 or result2
71
+ else :
72
+ return result1
73
+
61
74
def _should_allow (self , perm , user_perm ):
62
75
if perm .permission == '' or perm .permission == '*' or self ._has_permission_simple (user_perm .username , perm .permission ):
63
76
if perm .result .lower () in ['allow' , 'allow-only' ]:
@@ -83,17 +96,22 @@ def _build_permission_config(self):
83
96
for opt_name , opt_value in self .config .options ('configurable-permission-rules' ):
84
97
values = map (lambda x : x .strip (), opt_value .split (',' ))
85
98
if len (values ) != 5 :
86
- self .log .warn ('ConfigurablePermissionPolicy: invalid syntax for rule "' + opt_name + '", ignore' )
99
+ self .log .warn (
100
+ 'ConfigurablePermissionPolicy: invalid syntax for rule "' + opt_name + '", ignore' )
87
101
continue
88
102
if not values [4 ].lower () in ['allow' , 'allow-only' , 'deny' , 'pass' , 'pass-only' ]:
89
- self .log .warn ('ConfigurablePermissionPolicy: invalid result for rule "' + opt_name + '", default to pass' )
103
+ self .log .warn (
104
+ 'ConfigurablePermissionPolicy: invalid result for rule "' + opt_name + '", default to pass' )
90
105
values [4 ] = 'pass'
91
106
if values [0 ] == 'ticket' :
92
- ticket_perm .append (ConfigurablePermissionPolicy .ConfigurableTicketPermission (* values ))
107
+ ticket_perm .append (
108
+ ConfigurablePermissionPolicy .ConfigurableTicketPermission (* values ))
93
109
elif values [0 ] == 'wiki' :
94
- wiki_perm .append (ConfigurablePermissionPolicy .ConfigurableWikiPermission (* values ))
110
+ wiki_perm .append (
111
+ ConfigurablePermissionPolicy .ConfigurableWikiPermission (* values ))
95
112
else :
96
- self .log .warn ('ConfigurablePermissionPolicy: not supported type for rule "' + opt_name + '", default to pass' )
113
+ self .log .warn (
114
+ 'ConfigurablePermissionPolicy: not supported type for rule "' + opt_name + '", default to pass' )
97
115
98
116
return wiki_perm , ticket_perm
99
117
@@ -112,5 +130,3 @@ def __init__(self, name, action, rule, permission, result):
112
130
self .permission = permission
113
131
self .action = action
114
132
self .result = result .lower ()
115
-
116
-
0 commit comments