Skip to content

Commit 0b118ab

Browse files
committed
bugfix
- user sessions get removed upon modifying group's roles
1 parent 8f7a8ff commit 0b118ab

File tree

2 files changed

+32
-54
lines changed

2 files changed

+32
-54
lines changed

src/handlers/http/rbac.rs

Lines changed: 14 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use std::collections::{HashMap, HashSet};
2121
use crate::{
2222
rbac::{
2323
self,
24-
map::{read_user_groups, roles, write_user_groups},
24+
map::{read_user_groups, roles},
2525
role::model::DefaultPrivilege,
2626
user,
2727
utils::to_prism_user,
@@ -116,14 +116,11 @@ pub async fn post_user(
116116
return Err(RBACError::RoleValidationError);
117117
} else {
118118
let mut non_existent_roles = Vec::new();
119-
user_roles
120-
.iter()
121-
.map(|r| {
122-
if !roles().contains_key(r) {
123-
non_existent_roles.push(r.clone());
124-
}
125-
})
126-
.for_each(drop);
119+
for role in &user_roles {
120+
if !roles().contains_key(role) {
121+
non_existent_roles.push(role.clone());
122+
}
123+
}
127124
if !non_existent_roles.is_empty() {
128125
return Err(RBACError::RolesDoNotExist(non_existent_roles));
129126
}
@@ -244,24 +241,6 @@ pub async fn delete_user(username: web::Path<String>) -> Result<impl Responder,
244241
// delete from parseable.json first
245242
let mut metadata = get_metadata().await?;
246243
metadata.users.retain(|user| user.username() != username);
247-
248-
// Remove user from all groups
249-
let user_groups = Users.get_user_groups(&username);
250-
{
251-
let mut groups = write_user_groups();
252-
for group_name in &user_groups {
253-
if let Some(group) = groups.get_mut(group_name) {
254-
group.remove_users(HashSet::from_iter([username.clone()]))?;
255-
}
256-
}
257-
}
258-
259-
// Update metadata with modified groups
260-
for group in metadata.user_groups.iter_mut() {
261-
if user_groups.contains(&group.name) {
262-
group.users.retain(|u| u != &username);
263-
}
264-
}
265244
put_metadata(&metadata).await?;
266245

267246
// update in mem table
@@ -284,11 +263,11 @@ pub async fn add_roles_to_user(
284263
let mut non_existent_roles = Vec::new();
285264

286265
// check if the role exists
287-
roles_to_add.iter().for_each(|r| {
288-
if roles().get(r).is_none() {
289-
non_existent_roles.push(r.clone());
266+
for role in &roles_to_add {
267+
if !roles().contains_key(role) {
268+
non_existent_roles.push(role.clone());
290269
}
291-
});
270+
}
292271

293272
if !non_existent_roles.is_empty() {
294273
return Err(RBACError::RolesDoNotExist(non_existent_roles));
@@ -329,11 +308,11 @@ pub async fn remove_roles_from_user(
329308
let mut non_existent_roles = Vec::new();
330309

331310
// check if the role exists
332-
roles_to_remove.iter().for_each(|r| {
333-
if roles().get(r).is_none() {
334-
non_existent_roles.push(r.clone());
311+
for role in &roles_to_remove {
312+
if !roles().contains_key(role) {
313+
non_existent_roles.push(role.clone());
335314
}
336-
});
315+
}
337316

338317
if !non_existent_roles.is_empty() {
339318
return Err(RBACError::RolesDoNotExist(non_existent_roles));

src/rbac/user.rs

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use crate::{
3131
rbac::{InvalidUserGroupError, RBACError},
3232
},
3333
parseable::PARSEABLE,
34-
rbac::map::{read_user_groups, roles, users},
34+
rbac::map::{mut_sessions, read_user_groups, roles, users},
3535
};
3636

3737
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
@@ -266,11 +266,19 @@ impl UserGroup {
266266

267267
pub fn add_roles(&mut self, roles: HashSet<String>) -> Result<(), RBACError> {
268268
self.roles.extend(roles);
269+
// also refresh all user sessions
270+
for username in &self.users {
271+
mut_sessions().remove_user(username);
272+
}
269273
Ok(())
270274
}
271275

272276
pub fn add_users(&mut self, users: HashSet<String>) -> Result<(), RBACError> {
273-
self.users.extend(users);
277+
self.users.extend(users.clone());
278+
// also refresh all user sessions
279+
for username in &users {
280+
mut_sessions().remove_user(username);
281+
}
274282
Ok(())
275283
}
276284

@@ -283,6 +291,10 @@ impl UserGroup {
283291
}
284292
self.roles.clone_from(&new_roles);
285293

294+
// also refresh all user sessions
295+
for username in &self.users {
296+
mut_sessions().remove_user(username);
297+
}
286298
Ok(())
287299
}
288300

@@ -293,6 +305,10 @@ impl UserGroup {
293305
if old_users.eq(&new_users) {
294306
return Ok(());
295307
}
308+
// also refresh all user sessions
309+
for username in &users {
310+
mut_sessions().remove_user(username);
311+
}
296312
self.users.clone_from(&new_users);
297313

298314
Ok(())
@@ -305,21 +321,4 @@ impl UserGroup {
305321
put_metadata(&metadata).await?;
306322
Ok(())
307323
}
308-
309-
// // are these methods even needed??
310-
// pub fn group_name(&self) -> String {
311-
// self.name.clone()
312-
// }
313-
314-
// pub fn group_id(&self) -> Ulid {
315-
// self.id
316-
// }
317-
318-
// pub fn group_roles(&self) -> HashSet<String> {
319-
// self.roles.clone()
320-
// }
321-
322-
// pub fn group_users(&self) -> HashSet<String> {
323-
// self.users.clone()
324-
// }
325324
}

0 commit comments

Comments
 (0)