1
- use itertools:: Itertools as _;
2
- use std:: { collections:: HashSet , future:: Future , sync:: Arc } ;
1
+ use std:: { collections:: HashSet , future:: Future } ;
3
2
4
3
use tracing:: debug;
5
4
use tracing:: Level ;
6
5
7
- use crate :: roles:: { BuiltinRoleSet , RoleConfig , RoleIdentifier } ;
6
+ use crate :: roles:: BuiltinRoleSet ;
8
7
9
8
pub type UserIdentity = String ;
10
9
pub type UserName = String ;
@@ -19,7 +18,6 @@ pub struct UserInfo {
19
18
pub struct Authorizer < S : StorageDriver > {
20
19
user : UserInfo ,
21
20
user_id : i64 ,
22
- pub roles_config : Arc < RoleConfig < S :: BuiltinRole > > ,
23
21
user_roles : HashSet < S :: BuiltinRole > ,
24
22
#[ allow( unused) ] // will be used soon
25
23
storage : S ,
@@ -45,58 +43,43 @@ pub trait StorageDriver: Clone {
45
43
fn fetch_subject_roles (
46
44
& self ,
47
45
subject_id : i64 ,
48
- roles_config : & RoleConfig < Self :: BuiltinRole > ,
49
46
) -> impl Future < Output = Result < HashSet < Self :: BuiltinRole > , Self :: Error > > + Send ;
50
47
51
48
fn ensure_subject_roles (
52
49
& self ,
53
50
subject_id : i64 ,
54
- roles_config : & RoleConfig < Self :: BuiltinRole > ,
55
51
roles : HashSet < Self :: BuiltinRole > ,
56
52
) -> impl Future < Output = Result < ( ) , Self :: Error > > + Send ;
57
53
58
54
fn remove_subject_roles (
59
55
& self ,
60
56
subject_id : i64 ,
61
- roles_config : & RoleConfig < Self :: BuiltinRole > ,
62
57
roles : HashSet < Self :: BuiltinRole > ,
63
58
) -> impl Future < Output = Result < HashSet < Self :: BuiltinRole > , Self :: Error > > + Send ;
64
59
}
65
60
66
61
impl < S : StorageDriver > Authorizer < S > {
67
- #[ tracing:: instrument( skip_all, fields( %user, roles_config = %roles_config. as_ref( ) ) , err) ]
68
- pub async fn try_initialize (
69
- user : UserInfo ,
70
- roles_config : Arc < RoleConfig < S :: BuiltinRole > > ,
71
- storage_driver : S ,
72
- ) -> Result < Self , S :: Error > {
62
+ #[ tracing:: instrument( skip_all, fields( %user) , err) ]
63
+ pub async fn try_initialize ( user : UserInfo , storage_driver : S ) -> Result < Self , S :: Error > {
73
64
let user_id = storage_driver. ensure_user ( & user) . await ?;
74
65
debug ! ( %user, %user_id, "user authenticated" ) ;
75
- let user_roles = storage_driver
76
- . fetch_subject_roles ( user_id, roles_config. as_ref ( ) )
77
- . await ?;
66
+ let user_roles = storage_driver. fetch_subject_roles ( user_id) . await ?;
78
67
Ok ( Self {
79
68
user,
80
69
user_id,
81
- roles_config,
82
70
user_roles,
83
71
storage : storage_driver,
84
72
} )
85
73
}
86
74
87
- pub fn new_superuser ( roles_config : Arc < RoleConfig < S :: BuiltinRole > > , storage_driver : S ) -> Self {
88
- debug_assert ! (
89
- roles_config. is_superuser( ) ,
90
- "Authorizer::new_superuser requires a superuser role config"
91
- ) ;
75
+ pub fn new_superuser ( storage_driver : S ) -> Self {
92
76
Self {
93
77
user : UserInfo {
94
78
identity : "superuser" . to_string ( ) ,
95
79
name : "Super User" . to_string ( ) ,
96
80
} ,
97
81
user_id : -1 ,
98
- roles_config,
99
- user_roles : Default :: default ( ) ,
82
+ user_roles : HashSet :: from ( [ S :: BuiltinRole :: superuser ( ) ] ) ,
100
83
storage : storage_driver,
101
84
}
102
85
}
@@ -106,7 +89,7 @@ impl<S: StorageDriver> Authorizer<S> {
106
89
}
107
90
108
91
pub fn is_superuser ( & self ) -> bool {
109
- self . roles_config . is_superuser ( ) || self . user_roles . contains ( & S :: BuiltinRole :: superuser ( ) )
92
+ self . user_roles . contains ( & S :: BuiltinRole :: superuser ( ) )
110
93
}
111
94
112
95
/// Returns whether a user with some id exists
@@ -132,65 +115,37 @@ impl<S: StorageDriver> Authorizer<S> {
132
115
Ok ( required_roles. is_subset ( & self . user_roles ) )
133
116
}
134
117
135
- #[ tracing:: instrument( skip_all, fields( user_id, auth_user = %self . user, user_roles = ?self . user_roles) , ret( level = Level :: DEBUG ) , err) ]
136
- pub async fn infer_application_roles (
137
- & self ,
138
- user_id : i64 ,
139
- ) -> Result < Vec < RoleIdentifier > , S :: Error > {
140
- if self . is_superuser ( ) {
141
- return Ok ( self . roles_config . application_roles ( ) . cloned ( ) . collect_vec ( ) ) ;
142
- }
143
-
144
- let resolved_roles = & self . roles_config . resolved_roles ;
145
- let user_roles = self
146
- . storage
147
- . fetch_subject_roles ( user_id, & self . roles_config )
148
- . await ?;
149
-
150
- let app_roles = resolved_roles
151
- . iter ( )
152
- . filter ( |( _, builtins) | user_roles. is_superset ( builtins) )
153
- . map ( |( app_role, _) | app_role)
154
- . cloned ( )
155
- . collect_vec ( ) ;
156
-
157
- Ok ( app_roles)
158
- }
159
-
160
118
#[ tracing:: instrument( skip_all, fields( user_id, auth_user = %self . user, user_roles = ?self . user_roles) , ret( level = Level :: DEBUG ) , err) ]
161
119
pub async fn user_builtin_roles (
162
120
& self ,
163
121
user_id : i64 ,
164
122
) -> Result < HashSet < S :: BuiltinRole > , S :: Error > {
165
- let user_roles = self
166
- . storage
167
- . fetch_subject_roles ( user_id, & self . roles_config )
168
- . await ?;
123
+ let user_roles = self . storage . fetch_subject_roles ( user_id) . await ?;
169
124
Ok ( user_roles. clone ( ) )
170
125
}
171
126
172
- #[ tracing:: instrument( skip_all, fields( user_id, auth_user = %self . user, ?roles, role_config = ? self . roles_config ) , ret( level = Level :: DEBUG ) , err) ]
127
+ #[ tracing:: instrument( skip_all, fields( user_id, auth_user = %self . user, ?roles) , ret( level = Level :: DEBUG ) , err) ]
173
128
pub async fn grant_roles (
174
129
& mut self ,
175
130
user_id : i64 ,
176
131
roles : HashSet < S :: BuiltinRole > ,
177
132
) -> Result < ( ) , S :: Error > {
178
133
self . storage
179
- . ensure_subject_roles ( user_id, & self . roles_config , roles. clone ( ) )
134
+ . ensure_subject_roles ( user_id, roles. clone ( ) )
180
135
. await ?;
181
136
self . user_roles . extend ( roles) ;
182
137
Ok ( ( ) )
183
138
}
184
139
185
- #[ tracing:: instrument( skip_all, fields( user_id, auth_user = %self . user, ?roles, role_config = ? self . roles_config ) , ret( level = Level :: DEBUG ) , err) ]
140
+ #[ tracing:: instrument( skip_all, fields( user_id, auth_user = %self . user, ?roles) , ret( level = Level :: DEBUG ) , err) ]
186
141
pub async fn strip_roles (
187
142
& mut self ,
188
143
user_id : i64 ,
189
144
roles : HashSet < S :: BuiltinRole > ,
190
145
) -> Result < ( ) , S :: Error > {
191
146
let removed_roles = self
192
147
. storage
193
- . remove_subject_roles ( user_id, & self . roles_config , roles. clone ( ) )
148
+ . remove_subject_roles ( user_id, roles. clone ( ) )
194
149
. await ?;
195
150
tracing:: debug!( ?removed_roles, "removed roles" ) ;
196
151
self . user_roles . retain ( |r| !roles. contains ( r) ) ;
@@ -203,7 +158,6 @@ impl<S: StorageDriver> std::fmt::Debug for Authorizer<S> {
203
158
f. debug_struct ( "Authorizer" )
204
159
. field ( "user" , & self . user )
205
160
. field ( "user_id" , & self . user_id )
206
- . field ( "roles_config" , & self . roles_config )
207
161
. field ( "user_roles" , & self . user_roles )
208
162
. finish ( )
209
163
}
@@ -234,9 +188,8 @@ mod tests {
234
188
235
189
#[ tokio:: test]
236
190
async fn superuser ( ) {
237
- let config = RoleConfig :: new_superuser ( ) ;
238
191
let storage = MockStorageDriver :: default ( ) ;
239
- let authorizer = Authorizer :: new_superuser ( config . into ( ) , storage) ;
192
+ let authorizer = Authorizer :: new_superuser ( storage) ;
240
193
assert ! ( authorizer. is_superuser( ) ) ;
241
194
// Check that the superuser has any role even if not explicitely granted
242
195
assert_eq ! (
@@ -249,7 +202,6 @@ mod tests {
249
202
250
203
#[ tokio:: test]
251
204
async fn check_roles ( ) {
252
- let config = default_test_config ( ) ;
253
205
let storage = MockStorageDriver :: default ( ) ;
254
206
255
207
// insert some mocked roles
@@ -270,7 +222,6 @@ mod tests {
270
222
identity : "toto" . to_owned ( ) ,
271
223
name : "Sir Toto, the One and Only" . to_owned ( ) ,
272
224
} ,
273
- config. into ( ) ,
274
225
storage,
275
226
)
276
227
. await
@@ -306,7 +257,7 @@ mod tests {
306
257
. unwrap( ) ) ;
307
258
308
259
assert ! ( !authorizer
309
- . check_roles( HashSet :: from( [ TestBuiltinRole :: DocEdit , ] ) )
260
+ . check_roles( HashSet :: from( [ TestBuiltinRole :: DocEdit ] ) )
310
261
. await
311
262
. unwrap( ) ) ;
312
263
assert ! ( !authorizer
@@ -334,7 +285,6 @@ mod tests {
334
285
async fn fetch_subject_roles (
335
286
& self ,
336
287
subject_id : i64 ,
337
- _roles_config : & RoleConfig < Self :: BuiltinRole > ,
338
288
) -> Result < HashSet < Self :: BuiltinRole > , Self :: Error > {
339
289
let user_roles = self . user_roles . lock ( ) . unwrap ( ) ;
340
290
let roles = user_roles. get ( & subject_id) . cloned ( ) . expect ( "no user" ) ;
@@ -344,7 +294,6 @@ mod tests {
344
294
async fn ensure_subject_roles (
345
295
& self ,
346
296
subject_id : i64 ,
347
- _roles_config : & RoleConfig < Self :: BuiltinRole > ,
348
297
roles : HashSet < Self :: BuiltinRole > ,
349
298
) -> Result < ( ) , Self :: Error > {
350
299
let mut user_roles = self . user_roles . lock ( ) . unwrap ( ) ;
@@ -355,7 +304,6 @@ mod tests {
355
304
async fn remove_subject_roles (
356
305
& self ,
357
306
subject_id : i64 ,
358
- _roles_config : & RoleConfig < Self :: BuiltinRole > ,
359
307
roles : HashSet < Self :: BuiltinRole > ,
360
308
) -> Result < HashSet < Self :: BuiltinRole > , Self :: Error > {
361
309
let mut user_roles = self . user_roles . lock ( ) . unwrap ( ) ;
0 commit comments