Skip to content

Commit 83c6c9b

Browse files
committed
Updates
- session refresh in case of role modification - better error messages
1 parent 0b118ab commit 83c6c9b

File tree

4 files changed

+79
-7
lines changed

4 files changed

+79
-7
lines changed

src/handlers/http/modal/ingest/ingestor_role.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,19 @@
1616
*
1717
*/
1818

19+
use std::collections::HashSet;
20+
1921
use actix_web::{
2022
web::{self, Json},
2123
HttpResponse, Responder,
2224
};
2325

2426
use crate::{
2527
handlers::http::{modal::utils::rbac_utils::get_metadata, role::RoleError},
26-
rbac::{map::mut_roles, role::model::DefaultPrivilege},
28+
rbac::{
29+
map::{mut_roles, mut_sessions, read_user_groups, users},
30+
role::model::DefaultPrivilege,
31+
},
2732
storage,
2833
};
2934

@@ -40,5 +45,25 @@ pub async fn put(
4045
let _ = storage::put_staging_metadata(&metadata);
4146
mut_roles().insert(name.clone(), privileges);
4247

48+
// refresh the sessions of all users using this role
49+
// for this, iterate over all user_groups and users and create a hashset of users
50+
let mut session_refresh_users: HashSet<String> = HashSet::new();
51+
for user_group in read_user_groups().values().cloned() {
52+
if user_group.roles.contains(&name) {
53+
session_refresh_users.extend(user_group.users);
54+
}
55+
}
56+
57+
// iterate over all users to see if they have this role
58+
for user in users().values().cloned() {
59+
if user.roles.contains(&name) {
60+
session_refresh_users.insert(user.username().to_string());
61+
}
62+
}
63+
64+
for username in session_refresh_users {
65+
mut_sessions().remove_user(&username);
66+
}
67+
4368
Ok(HttpResponse::Ok().finish())
4469
}

src/handlers/http/modal/query/querier_role.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*
1717
*/
1818

19+
use std::collections::HashSet;
20+
1921
use actix_web::{
2022
web::{self, Json},
2123
HttpResponse, Responder,
@@ -27,7 +29,10 @@ use crate::{
2729
modal::utils::rbac_utils::{get_metadata, put_metadata},
2830
role::RoleError,
2931
},
30-
rbac::{map::mut_roles, role::model::DefaultPrivilege},
32+
rbac::{
33+
map::{mut_roles, mut_sessions, read_user_groups, users},
34+
role::model::DefaultPrivilege,
35+
},
3136
};
3237

3338
// Handler for PUT /api/v1/role/{name}
@@ -43,6 +48,26 @@ pub async fn put(
4348
put_metadata(&metadata).await?;
4449
mut_roles().insert(name.clone(), privileges.clone());
4550

51+
// refresh the sessions of all users using this role
52+
// for this, iterate over all user_groups and users and create a hashset of users
53+
let mut session_refresh_users: HashSet<String> = HashSet::new();
54+
for user_group in read_user_groups().values().cloned() {
55+
if user_group.roles.contains(&name) {
56+
session_refresh_users.extend(user_group.users);
57+
}
58+
}
59+
60+
// iterate over all users to see if they have this role
61+
for user in users().values().cloned() {
62+
if user.roles.contains(&name) {
63+
session_refresh_users.insert(user.username().to_string());
64+
}
65+
}
66+
67+
for username in session_refresh_users {
68+
mut_sessions().remove_user(&username);
69+
}
70+
4671
sync_role_update_with_ingestors(name.clone(), privileges.clone()).await?;
4772

4873
Ok(HttpResponse::Ok().finish())

src/handlers/http/rbac.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -379,9 +379,9 @@ pub enum RBACError {
379379
Anyhow(#[from] anyhow::Error),
380380
#[error("User cannot be created without a role")]
381381
RoleValidationError,
382-
#[error("User group already exists: '{0}'")]
382+
#[error("User group `{0}` already exists")]
383383
UserGroupExists(String),
384-
#[error("UserGroup does not exist: {0}")]
384+
#[error("UserGroup `{0}` does not exist")]
385385
UserGroupDoesNotExist(String),
386386
#[error("Invalid Roles: {0:?}")]
387387
RolesDoNotExist(Vec<String>),
@@ -391,9 +391,9 @@ pub enum RBACError {
391391
InvalidUserGroupRequest(Box<InvalidUserGroupError>),
392392
#[error("{0}")]
393393
InvalidSyncOperation(String),
394-
#[error("User group still being used by users: {0}")]
394+
#[error("User group `{0}` is still being used")]
395395
UserGroupNotEmpty(String),
396-
#[error("Resource in use: {0}")]
396+
#[error("Resource `{0}` is still in use")]
397397
ResourceInUse(String),
398398
#[error("{0}")]
399399
InvalidDeletionRequest(String),

src/handlers/http/role.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*
1717
*/
1818

19+
use std::collections::HashSet;
20+
1921
use actix_web::{
2022
http::header::ContentType,
2123
web::{self, Json},
@@ -26,7 +28,7 @@ use http::StatusCode;
2628
use crate::{
2729
parseable::PARSEABLE,
2830
rbac::{
29-
map::{mut_roles, DEFAULT_ROLE},
31+
map::{mut_roles, mut_sessions, read_user_groups, users, DEFAULT_ROLE},
3032
role::model::DefaultPrivilege,
3133
},
3234
storage::{self, ObjectStorageError, StorageMetadata},
@@ -45,6 +47,26 @@ pub async fn put(
4547
put_metadata(&metadata).await?;
4648
mut_roles().insert(name.clone(), privileges.clone());
4749

50+
// refresh the sessions of all users using this role
51+
// for this, iterate over all user_groups and users and create a hashset of users
52+
let mut session_refresh_users: HashSet<String> = HashSet::new();
53+
for user_group in read_user_groups().values().cloned() {
54+
if user_group.roles.contains(&name) {
55+
session_refresh_users.extend(user_group.users);
56+
}
57+
}
58+
59+
// iterate over all users to see if they have this role
60+
for user in users().values().cloned() {
61+
if user.roles.contains(&name) {
62+
session_refresh_users.insert(user.username().to_string());
63+
}
64+
}
65+
66+
for username in session_refresh_users {
67+
mut_sessions().remove_user(&username);
68+
}
69+
4870
Ok(HttpResponse::Ok().finish())
4971
}
5072

0 commit comments

Comments
 (0)