Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package user
  4. import (
  5. "context"
  6. "fmt"
  7. "code.gitea.io/gitea/models/auth"
  8. "code.gitea.io/gitea/models/db"
  9. )
  10. // UserList is a list of user.
  11. // This type provide valuable methods to retrieve information for a group of users efficiently.
  12. type UserList []*User //revive:disable-line:exported
  13. // GetUserIDs returns a slice of user's id
  14. func (users UserList) GetUserIDs() []int64 {
  15. userIDs := make([]int64, 0, len(users))
  16. for _, user := range users {
  17. userIDs = append(userIDs, user.ID) // Considering that user id are unique in the list
  18. }
  19. return userIDs
  20. }
  21. // GetTwoFaStatus return state of 2FA enrollement
  22. func (users UserList) GetTwoFaStatus(ctx context.Context) map[int64]bool {
  23. results := make(map[int64]bool, len(users))
  24. for _, user := range users {
  25. results[user.ID] = false // Set default to false
  26. }
  27. if tokenMaps, err := users.loadTwoFactorStatus(ctx); err == nil {
  28. for _, token := range tokenMaps {
  29. results[token.UID] = true
  30. }
  31. }
  32. if ids, err := users.userIDsWithWebAuthn(ctx); err == nil {
  33. for _, id := range ids {
  34. results[id] = true
  35. }
  36. }
  37. return results
  38. }
  39. func (users UserList) loadTwoFactorStatus(ctx context.Context) (map[int64]*auth.TwoFactor, error) {
  40. if len(users) == 0 {
  41. return nil, nil
  42. }
  43. userIDs := users.GetUserIDs()
  44. tokenMaps := make(map[int64]*auth.TwoFactor, len(userIDs))
  45. if err := db.GetEngine(ctx).In("uid", userIDs).Find(&tokenMaps); err != nil {
  46. return nil, fmt.Errorf("find two factor: %w", err)
  47. }
  48. return tokenMaps, nil
  49. }
  50. func (users UserList) userIDsWithWebAuthn(ctx context.Context) ([]int64, error) {
  51. if len(users) == 0 {
  52. return nil, nil
  53. }
  54. ids := make([]int64, 0, len(users))
  55. if err := db.GetEngine(ctx).Table(new(auth.WebAuthnCredential)).In("user_id", users.GetUserIDs()).Select("user_id").Distinct("user_id").Find(&ids); err != nil {
  56. return nil, fmt.Errorf("find two factor: %w", err)
  57. }
  58. return ids, nil
  59. }
  60. // GetUsersByIDs returns all resolved users from a list of Ids.
  61. func GetUsersByIDs(ctx context.Context, ids []int64) (UserList, error) {
  62. ous := make([]*User, 0, len(ids))
  63. if len(ids) == 0 {
  64. return ous, nil
  65. }
  66. err := db.GetEngine(ctx).In("id", ids).
  67. Asc("name").
  68. Find(&ous)
  69. return ous, err
  70. }