2019-08-02 18:06:28 +02:00
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package models
import (
"fmt"
2021-09-19 19:49:59 +08:00
"code.gitea.io/gitea/models/db"
2021-09-25 21:00:12 +08:00
"code.gitea.io/gitea/models/login"
2019-08-02 18:06:28 +02:00
"code.gitea.io/gitea/modules/log"
)
2021-03-15 02:52:12 +08:00
// UserList is a list of user.
2019-08-02 18:06:28 +02:00
// This type provide valuable methods to retrieve information for a group of users efficiently.
type UserList [ ] * User
func ( users UserList ) getUserIDs ( ) [ ] int64 {
userIDs := make ( [ ] int64 , len ( users ) )
for _ , user := range users {
2021-03-15 02:52:12 +08:00
userIDs = append ( userIDs , user . ID ) // Considering that user id are unique in the list
2019-08-02 18:06:28 +02:00
}
return userIDs
}
// IsUserOrgOwner returns true if user is in the owner team of given organization.
func ( users UserList ) IsUserOrgOwner ( orgID int64 ) map [ int64 ] bool {
results := make ( map [ int64 ] bool , len ( users ) )
for _ , user := range users {
2021-03-15 02:52:12 +08:00
results [ user . ID ] = false // Set default to false
2019-08-02 18:06:28 +02:00
}
2021-09-23 16:45:36 +01:00
ownerMaps , err := users . loadOrganizationOwners ( db . GetEngine ( db . DefaultContext ) , orgID )
2019-08-02 18:06:28 +02:00
if err == nil {
for _ , owner := range ownerMaps {
results [ owner . UID ] = true
}
}
return results
}
2021-09-19 19:49:59 +08:00
func ( users UserList ) loadOrganizationOwners ( e db . Engine , orgID int64 ) ( map [ int64 ] * TeamUser , error ) {
2019-08-02 18:06:28 +02:00
if len ( users ) == 0 {
return nil , nil
}
ownerTeam , err := getOwnerTeam ( e , orgID )
if err != nil {
2019-09-23 22:08:03 +02:00
if IsErrTeamNotExist ( err ) {
2019-08-02 18:06:28 +02:00
log . Error ( "Organization does not have owner team: %d" , orgID )
return nil , nil
}
return nil , err
}
userIDs := users . getUserIDs ( )
ownerMaps := make ( map [ int64 ] * TeamUser )
err = e . In ( "uid" , userIDs ) .
And ( "org_id=?" , orgID ) .
And ( "team_id=?" , ownerTeam . ID ) .
Find ( & ownerMaps )
if err != nil {
return nil , fmt . Errorf ( "find team users: %v" , err )
}
return ownerMaps , nil
}
// GetTwoFaStatus return state of 2FA enrollement
func ( users UserList ) GetTwoFaStatus ( ) map [ int64 ] bool {
results := make ( map [ int64 ] bool , len ( users ) )
for _ , user := range users {
2021-03-15 02:52:12 +08:00
results [ user . ID ] = false // Set default to false
2019-08-02 18:06:28 +02:00
}
2021-09-23 16:45:36 +01:00
tokenMaps , err := users . loadTwoFactorStatus ( db . GetEngine ( db . DefaultContext ) )
2019-08-02 18:06:28 +02:00
if err == nil {
for _ , token := range tokenMaps {
results [ token . UID ] = true
}
}
return results
}
2021-09-25 21:00:12 +08:00
func ( users UserList ) loadTwoFactorStatus ( e db . Engine ) ( map [ int64 ] * login . TwoFactor , error ) {
2019-08-02 18:06:28 +02:00
if len ( users ) == 0 {
return nil , nil
}
userIDs := users . getUserIDs ( )
2021-09-25 21:00:12 +08:00
tokenMaps := make ( map [ int64 ] * login . TwoFactor , len ( userIDs ) )
2019-08-02 18:06:28 +02:00
err := e .
In ( "uid" , userIDs ) .
Find ( & tokenMaps )
if err != nil {
return nil , fmt . Errorf ( "find two factor: %v" , err )
}
return tokenMaps , nil
}