Skip to content

Commit 1be08f7

Browse files
committed
Refactor
1 parent ad9e350 commit 1be08f7

File tree

2 files changed

+59
-56
lines changed

2 files changed

+59
-56
lines changed

server/src/handlers/http/oidc.rs

Lines changed: 37 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ use actix_web::{
2525
web::{self, Data},
2626
HttpRequest, HttpResponse,
2727
};
28-
use chrono::{Days, Utc};
2928
use http::StatusCode;
3029
use log::info;
3130
use openid::{Options, Token, Userinfo};
@@ -36,8 +35,7 @@ use url::Url;
3635
use crate::{
3736
option::CONFIG,
3837
rbac::{
39-
map::{mut_sessions, sessions, users, SessionKey},
40-
role::Permission,
38+
map::SessionKey,
4139
user::{User, UserType},
4240
Users,
4341
},
@@ -77,29 +75,26 @@ pub async fn login(
7775

7876
match session_key {
7977
// We can exchange basic auth for session cookie
80-
SessionKey::BasicAuth { username, password } => match users().get(&username) {
78+
SessionKey::BasicAuth { username, password } => match Users.get_user(&username) {
8179
Some(
82-
user @ User {
83-
ty: UserType::Native(basic),
80+
ref user @ User {
81+
ty: UserType::Native(ref basic),
8482
..
8583
},
8684
) if basic.verify_password(&password) => {
8785
let user_cookie = cookie_username(&username);
88-
let session_cookie = exchange_basic_for_cookie(
89-
username.clone(),
90-
SessionKey::BasicAuth { username, password },
91-
user.permissions(),
92-
);
86+
let session_cookie =
87+
exchange_basic_for_cookie(user, SessionKey::BasicAuth { username, password });
9388
return_to_client(query.redirect.as_str(), [user_cookie, session_cookie])
9489
}
9590
_ => ErrorBadRequest("Request contains basic auth that does not match").into(),
9691
},
9792
// if it's a valid active session, just redirect back
9893
key @ SessionKey::SessionId(_) => {
99-
if sessions().get(&key).is_some() {
94+
if Users.session_exists(&key) {
10095
return_to_client(query.redirect.as_str(), None)
10196
} else {
102-
mut_sessions().remove_session(&key);
97+
Users.remove_session(&key);
10398
redirect_to_oidc(query, oidc_client)
10499
}
105100
}
@@ -120,36 +115,12 @@ pub async fn reply_login(
120115

121116
// User may not exist
122117
// create a new one depending on state of metadata
123-
if !Users.contains(&username) {
124-
let mut metadata = get_metadata().await?;
125-
let user = match metadata
126-
.users
127-
.iter()
128-
.find(|user| user.username() == username)
129-
{
130-
Some(user) => user.clone(),
131-
None => {
132-
let user = User::new_oauth(username.clone());
133-
metadata.users.push(user.clone());
134-
put_metadata(&metadata).await?;
135-
user
136-
}
137-
};
138-
Users.put_user(user);
118+
let user = match Users.get_user(&username) {
119+
Some(user) => user,
120+
None => put_user(&username).await?,
139121
};
140-
141-
let permissions = users().get(&username).unwrap().permissions();
142122
let id = Ulid::new();
143-
144-
mut_sessions().track_new(
145-
username.clone(),
146-
crate::rbac::map::SessionKey::SessionId(id),
147-
Utc::now() + Days::new(7),
148-
permissions,
149-
);
150-
151-
let authorization_cookie = cookie_session(id);
152-
let username_cookie = cookie_username(&username);
123+
Users.new_session(&user, SessionKey::SessionId(id));
153124

154125
let redirect_url = login_query
155126
.state
@@ -158,24 +129,14 @@ pub async fn reply_login(
158129

159130
Ok(return_to_client(
160131
&redirect_url,
161-
[authorization_cookie, username_cookie],
132+
[cookie_session(id), cookie_username(&username)],
162133
))
163134
}
164135

165-
fn exchange_basic_for_cookie(
166-
username: String,
167-
key: SessionKey,
168-
permissions: Vec<Permission>,
169-
) -> Cookie<'static> {
136+
fn exchange_basic_for_cookie(user: &User, key: SessionKey) -> Cookie<'static> {
170137
let id = Ulid::new();
171-
let mut sessions = mut_sessions();
172-
sessions.remove_session(&key);
173-
sessions.track_new(
174-
username,
175-
SessionKey::SessionId(id),
176-
Utc::now() + Days::new(COOKIE_AGE_DAYS as u64),
177-
permissions,
178-
);
138+
Users.remove_session(&key);
139+
Users.new_session(user, key);
179140
cookie_session(id)
180141
}
181142

@@ -241,6 +202,27 @@ async fn request_token(
241202
Ok((token, userinfo))
242203
}
243204

205+
// put new user in metadata if does not exits
206+
// update local cache
207+
async fn put_user(username: &str) -> Result<User, ObjectStorageError> {
208+
let mut metadata = get_metadata().await?;
209+
let user = match metadata
210+
.users
211+
.iter()
212+
.find(|user| user.username() == username)
213+
{
214+
Some(user) => user.clone(),
215+
None => {
216+
let user = User::new_oauth(username.to_owned());
217+
metadata.users.push(user.clone());
218+
put_metadata(&metadata).await?;
219+
user
220+
}
221+
};
222+
Users.put_user(user.clone());
223+
Ok(user)
224+
}
225+
244226
async fn get_metadata() -> Result<crate::storage::StorageMetadata, ObjectStorageError> {
245227
let metadata = CONFIG
246228
.storage()

server/src/rbac.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub mod map;
2020
pub mod role;
2121
pub mod user;
2222

23-
use chrono::{DateTime, Utc};
23+
use chrono::{DateTime, Days, Utc};
2424

2525
use crate::rbac::map::{mut_sessions, mut_users, sessions, users};
2626
use crate::rbac::role::{model::DefaultPrivilege, Action};
@@ -46,6 +46,10 @@ impl Users {
4646
mut_users().insert(user);
4747
}
4848

49+
pub fn get_user(&self, username: &str) -> Option<User> {
50+
users().get(username).cloned()
51+
}
52+
4953
pub fn list_users(&self) -> Vec<String> {
5054
users().keys().cloned().collect()
5155
}
@@ -89,6 +93,23 @@ impl Users {
8993
sessions().get(session).cloned().unwrap_or_default()
9094
}
9195

96+
pub fn session_exists(&self, session: &SessionKey) -> bool {
97+
sessions().get(session).is_some()
98+
}
99+
100+
pub fn remove_session(&self, session: &SessionKey) {
101+
mut_sessions().remove_session(session)
102+
}
103+
104+
pub fn new_session(&self, user: &User, session: SessionKey) {
105+
mut_sessions().track_new(
106+
user.username().to_owned(),
107+
session,
108+
Utc::now() + Days::new(7),
109+
user.permissions(),
110+
)
111+
}
112+
92113
pub fn authorize(
93114
&self,
94115
key: SessionKey,

0 commit comments

Comments
 (0)