@@ -25,7 +25,6 @@ use actix_web::{
2525 web:: { self , Data } ,
2626 HttpRequest , HttpResponse ,
2727} ;
28- use chrono:: { Days , Utc } ;
2928use http:: StatusCode ;
3029use log:: info;
3130use openid:: { Options , Token , Userinfo } ;
@@ -36,8 +35,7 @@ use url::Url;
3635use 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+
244226async fn get_metadata ( ) -> Result < crate :: storage:: StorageMetadata , ObjectStorageError > {
245227 let metadata = CONFIG
246228 . storage ( )
0 commit comments