@@ -36,7 +36,7 @@ use crate::{
3636 option:: CONFIG ,
3737 rbac:: {
3838 map:: { SessionKey , DEFAULT_ROLE } ,
39- user:: { User , UserType } ,
39+ user:: { self , User , UserType } ,
4040 Users ,
4141 } ,
4242 storage:: { self , ObjectStorageError , StorageMetadata } ,
@@ -138,19 +138,31 @@ pub async fn reply_login(
138138 else {
139139 return Ok ( HttpResponse :: Unauthorized ( ) . finish ( ) ) ;
140140 } ;
141- let username = user_info. sub . unwrap ( ) ;
142- let group: Option < HashSet < String > > = claims
141+ let username = user_info
142+ . sub
143+ . clone ( )
144+ . expect ( "OIDC provider did not return a sub which is currently required." ) ;
145+ let user_info: user:: UserInfo = user_info. into ( ) ;
146+
147+ let group: HashSet < String > = claims
143148 . other
144149 . remove ( "groups" )
145150 . map ( serde_json:: from_value)
146- . transpose ( ) ?;
151+ . transpose ( ) ?
152+ . unwrap_or_else ( || {
153+ DEFAULT_ROLE
154+ . lock ( )
155+ . unwrap ( )
156+ . clone ( )
157+ . map ( |role| HashSet :: from ( [ role] ) )
158+ . unwrap_or_default ( )
159+ } ) ;
147160
148161 // User may not exist
149162 // create a new one depending on state of metadata
150163 let user = match ( Users . get_user ( & username) , group) {
151- ( Some ( user) , Some ( group) ) => update_user_if_changed ( user, group) . await ?,
152- ( Some ( user) , None ) => user,
153- ( None , group) => put_user ( & username, group) . await ?,
164+ ( Some ( user) , group) => update_user_if_changed ( user, group, user_info) . await ?,
165+ ( None , group) => put_user ( & username, group, user_info) . await ?,
154166 } ;
155167 let id = Ulid :: new ( ) ;
156168 Users . new_session ( & user, SessionKey :: SessionId ( id) ) ;
@@ -257,25 +269,18 @@ async fn request_token(
257269// update local cache
258270async fn put_user (
259271 username : & str ,
260- group : Option < HashSet < String > > ,
272+ group : HashSet < String > ,
273+ user_info : user:: UserInfo ,
261274) -> Result < User , ObjectStorageError > {
262275 let mut metadata = get_metadata ( ) . await ?;
263- let group = group. unwrap_or_else ( || {
264- DEFAULT_ROLE
265- . lock ( )
266- . unwrap ( )
267- . clone ( )
268- . map ( |role| HashSet :: from ( [ role] ) )
269- . unwrap_or_default ( )
270- } ) ;
271276
272277 let user = metadata
273278 . users
274279 . iter ( )
275280 . find ( |user| user. username ( ) == username)
276281 . cloned ( )
277282 . unwrap_or_else ( || {
278- let user = User :: new_oauth ( username. to_owned ( ) , group) ;
283+ let user = User :: new_oauth ( username. to_owned ( ) , group, user_info ) ;
279284 metadata. users . push ( user. clone ( ) ) ;
280285 user
281286 } ) ;
@@ -288,14 +293,32 @@ async fn put_user(
288293async fn update_user_if_changed (
289294 mut user : User ,
290295 group : HashSet < String > ,
296+ user_info : user:: UserInfo ,
291297) -> Result < User , ObjectStorageError > {
292- // update user if roles have changed
293- if user. roles == group {
298+ let User { ty, roles } = & mut user;
299+ let UserType :: OAuth ( oauth_user) = ty else {
300+ unreachable ! ( )
301+ } ;
302+
303+ // update user only if roles or userinfo has changed
304+ if roles == & group && oauth_user. user_info == user_info {
294305 return Ok ( user) ;
295306 }
296- let metadata = get_metadata ( ) . await ?;
297- user. roles = group;
298- put_metadata ( & metadata) . await ?;
307+
308+ oauth_user. user_info = user_info;
309+ * roles = group;
310+
311+ let mut metadata = get_metadata ( ) . await ?;
312+
313+ if let Some ( entry) = metadata
314+ . users
315+ . iter_mut ( )
316+ . find ( |x| x. username ( ) == user. username ( ) )
317+ {
318+ entry. clone_from ( & user) ;
319+ put_metadata ( & metadata) . await ?;
320+ }
321+
299322 Users . put_user ( user. clone ( ) ) ;
300323 Ok ( user)
301324}
0 commit comments