@@ -159,46 +159,48 @@ pub async fn reply_login(
159
159
. clone ( )
160
160
. expect ( "OIDC provider did not return a sub which is currently required." ) ;
161
161
let user_info: user:: UserInfo = user_info. into ( ) ;
162
- let mut group: HashSet < String > = claims
162
+ let group: HashSet < String > = claims
163
163
. other
164
164
. remove ( "groups" )
165
165
. map ( serde_json:: from_value)
166
166
. transpose ( ) ?
167
167
. unwrap_or_default ( ) ;
168
168
let metadata = get_metadata ( ) . await ?;
169
- let mut role_exists = false ;
169
+
170
+ // Find which OIDC groups match existing roles in Parseable
171
+ let mut valid_oidc_roles = HashSet :: new ( ) ;
170
172
for role in metadata. roles . iter ( ) {
171
173
let role_name = role. 0 ;
172
- for group_name in group. iter ( ) {
173
- if group_name. eq ( role_name) {
174
- role_exists = true ;
175
- break ;
176
- }
174
+ if group. contains ( role_name) {
175
+ valid_oidc_roles. insert ( role_name. clone ( ) ) ;
177
176
}
178
177
}
179
-
180
- // Check if user already exists to preserve their existing roles
178
+
181
179
let existing_user = Users . get_user ( & username) ;
182
- if !role_exists || group. is_empty ( ) {
183
- group = if let Some ( existing_user) = & existing_user {
184
- // Preserve existing user roles instead of assigning default
185
- existing_user. roles . clone ( )
186
- } else {
187
- // Only assign default role for new users
188
- DEFAULT_ROLE
189
- . lock ( )
190
- . unwrap ( )
191
- . clone ( )
192
- . map ( |role| HashSet :: from ( [ role] ) )
193
- . unwrap_or_default ( )
194
- } ;
195
- }
180
+ let final_roles = match existing_user {
181
+ Some ( ref user) => {
182
+ // For existing users: keep existing roles + add new valid OIDC roles
183
+ let mut roles = user. roles . clone ( ) ;
184
+ roles. extend ( valid_oidc_roles) ; // Add new matching roles
185
+ roles
186
+ }
187
+ None => {
188
+ // For new users: use valid OIDC roles, fallback to default if none
189
+ if valid_oidc_roles. is_empty ( ) {
190
+ if let Some ( default_role) = DEFAULT_ROLE . lock ( ) . unwrap ( ) . clone ( ) {
191
+ HashSet :: from ( [ default_role] )
192
+ } else {
193
+ HashSet :: new ( )
194
+ }
195
+ } else {
196
+ valid_oidc_roles
197
+ }
198
+ }
199
+ } ;
196
200
197
- // User may not exist
198
- // create a new one depending on state of metadata
199
- let user = match ( existing_user, group) {
200
- ( Some ( user) , group) => update_user_if_changed ( user, group, user_info) . await ?,
201
- ( None , group) => put_user ( & username, group, user_info) . await ?,
201
+ let user = match ( existing_user, final_roles) {
202
+ ( Some ( user) , roles) => update_user_if_changed ( user, roles, user_info) . await ?,
203
+ ( None , roles) => put_user ( & username, roles, user_info) . await ?,
202
204
} ;
203
205
let id = Ulid :: new ( ) ;
204
206
Users . new_session ( & user, SessionKey :: SessionId ( id) ) ;
0 commit comments