2021-11-28 22:11:58 +08:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2021-11-28 22:11:58 +08:00
package user
import (
2022-05-20 22:08:52 +08:00
"context"
2021-11-28 22:11:58 +08:00
"fmt"
2022-01-02 21:12:35 +08:00
"code.gitea.io/gitea/models/auth"
2021-11-28 22:11:58 +08:00
"code.gitea.io/gitea/models/db"
)
// UserList is a list of user.
// This type provide valuable methods to retrieve information for a group of users efficiently.
type UserList [ ] * User //revive:disable-line:exported
// GetUserIDs returns a slice of user's id
func ( users UserList ) GetUserIDs ( ) [ ] int64 {
2022-05-03 17:04:23 +08:00
userIDs := make ( [ ] int64 , 0 , len ( users ) )
2021-11-28 22:11:58 +08:00
for _ , user := range users {
userIDs = append ( userIDs , user . ID ) // Considering that user id are unique in the list
}
return userIDs
}
// GetTwoFaStatus return state of 2FA enrollement
2023-09-14 19:09:32 +02:00
func ( users UserList ) GetTwoFaStatus ( ctx context . Context ) map [ int64 ] bool {
2021-11-28 22:11:58 +08:00
results := make ( map [ int64 ] bool , len ( users ) )
for _ , user := range users {
results [ user . ID ] = false // Set default to false
}
2022-03-02 01:24:31 +01:00
2023-09-14 19:09:32 +02:00
if tokenMaps , err := users . loadTwoFactorStatus ( ctx ) ; err == nil {
2021-11-28 22:11:58 +08:00
for _ , token := range tokenMaps {
results [ token . UID ] = true
}
}
2023-09-14 19:09:32 +02:00
if ids , err := users . userIDsWithWebAuthn ( ctx ) ; err == nil {
2022-03-02 01:24:31 +01:00
for _ , id := range ids {
results [ id ] = true
}
}
2021-11-28 22:11:58 +08:00
return results
}
2022-05-20 22:08:52 +08:00
func ( users UserList ) loadTwoFactorStatus ( ctx context . Context ) ( map [ int64 ] * auth . TwoFactor , error ) {
2021-11-28 22:11:58 +08:00
if len ( users ) == 0 {
return nil , nil
}
userIDs := users . GetUserIDs ( )
2022-01-02 21:12:35 +08:00
tokenMaps := make ( map [ int64 ] * auth . TwoFactor , len ( userIDs ) )
2022-05-20 22:08:52 +08:00
if err := db . GetEngine ( ctx ) . In ( "uid" , userIDs ) . Find ( & tokenMaps ) ; err != nil {
2022-10-24 21:29:17 +02:00
return nil , fmt . Errorf ( "find two factor: %w" , err )
2021-11-28 22:11:58 +08:00
}
return tokenMaps , nil
}
2022-05-20 22:08:52 +08:00
func ( users UserList ) userIDsWithWebAuthn ( ctx context . Context ) ( [ ] int64 , error ) {
2022-03-02 01:24:31 +01:00
if len ( users ) == 0 {
return nil , nil
}
ids := make ( [ ] int64 , 0 , len ( users ) )
2022-05-20 22:08:52 +08:00
if err := db . GetEngine ( ctx ) . Table ( new ( auth . WebAuthnCredential ) ) . In ( "user_id" , users . GetUserIDs ( ) ) . Select ( "user_id" ) . Distinct ( "user_id" ) . Find ( & ids ) ; err != nil {
2022-10-24 21:29:17 +02:00
return nil , fmt . Errorf ( "find two factor: %w" , err )
2022-03-02 01:24:31 +01:00
}
return ids , nil
}
2021-11-28 22:11:58 +08:00
// GetUsersByIDs returns all resolved users from a list of Ids.
2023-09-14 19:09:32 +02:00
func GetUsersByIDs ( ctx context . Context , ids [ ] int64 ) ( UserList , error ) {
2021-11-28 22:11:58 +08:00
ous := make ( [ ] * User , 0 , len ( ids ) )
if len ( ids ) == 0 {
return ous , nil
}
2023-09-14 19:09:32 +02:00
err := db . GetEngine ( ctx ) . In ( "id" , ids ) .
2021-11-28 22:11:58 +08:00
Asc ( "name" ) .
Find ( & ous )
return ous , err
}