@@ -6,7 +6,6 @@ package ldap
6
6
import (
7
7
"context"
8
8
"fmt"
9
- "sort"
10
9
"strings"
11
10
12
11
asymkey_model "code.gitea.io/gitea/models/asymkey"
@@ -24,7 +23,6 @@ import (
24
23
func (source * Source ) Sync (ctx context.Context , updateExisting bool ) error {
25
24
log .Trace ("Doing: SyncExternalUsers[%s]" , source .authSource .Name )
26
25
27
- var existingUsers []int
28
26
isAttributeSSHPublicKeySet := len (strings .TrimSpace (source .AttributeSSHPublicKey )) > 0
29
27
var sshKeysNeedUpdate bool
30
28
@@ -41,9 +39,14 @@ func (source *Source) Sync(ctx context.Context, updateExisting bool) error {
41
39
default :
42
40
}
43
41
44
- sort .Slice (users , func (i , j int ) bool {
45
- return users [i ].LowerName < users [j ].LowerName
46
- })
42
+ usernameUsers := make (map [string ]* user_model.User , len (users ))
43
+ mailUsers := make (map [string ]* user_model.User , len (users ))
44
+ keepActiveUsers := make (map [int64 ]struct {})
45
+
46
+ for _ , u := range users {
47
+ usernameUsers [u .LowerName ] = u
48
+ mailUsers [strings .ToLower (u .Email )] = u
49
+ }
47
50
48
51
sr , err := source .SearchEntries ()
49
52
if err != nil {
@@ -59,11 +62,6 @@ func (source *Source) Sync(ctx context.Context, updateExisting bool) error {
59
62
log .Warn ("LDAP search found no entries but did not report an error. All users will be deactivated as per settings" )
60
63
}
61
64
62
- sort .Slice (sr , func (i , j int ) bool {
63
- return sr [i ].LowerName < sr [j ].LowerName
64
- })
65
-
66
- userPos := 0
67
65
orgCache := make (map [string ]* organization.Organization )
68
66
teamCache := make (map [string ]* organization.Team )
69
67
@@ -86,21 +84,27 @@ func (source *Source) Sync(ctx context.Context, updateExisting bool) error {
86
84
return db .ErrCancelledf ("During update of %s before completed update of users" , source .authSource .Name )
87
85
default :
88
86
}
89
- if len (su .Username ) == 0 {
87
+ if len (su .Username ) == 0 && len ( su . Mail ) == 0 {
90
88
continue
91
89
}
92
90
93
- if len (su .Mail ) == 0 {
94
- su .Mail = fmt .Sprintf ("%s@localhost" , su .Username )
91
+ var usr * user_model.User
92
+ if len (su .Username ) > 0 {
93
+ usr = usernameUsers [su .LowerName ]
94
+ }
95
+ if usr == nil && len (su .Mail ) > 0 {
96
+ usr = mailUsers [strings .ToLower (su .Mail )]
95
97
}
96
98
97
- var usr * user_model.User
98
- for userPos < len (users ) && users [userPos ].LowerName < su .LowerName {
99
- userPos ++
99
+ if usr != nil {
100
+ keepActiveUsers [usr .ID ] = struct {}{}
101
+ } else if len (su .Username ) == 0 {
102
+ // we cannot create the user if su.Username is empty
103
+ continue
100
104
}
101
- if userPos < len ( users ) && users [ userPos ]. LowerName == su . LowerName {
102
- usr = users [ userPos ]
103
- existingUsers = append ( existingUsers , userPos )
105
+
106
+ if len ( su . Mail ) == 0 {
107
+ su . Mail = fmt . Sprintf ( "%s@localhost" , su . Username )
104
108
}
105
109
106
110
fullName := composeFullName (su .Name , su .Surname , su .Username )
@@ -203,19 +207,17 @@ func (source *Source) Sync(ctx context.Context, updateExisting bool) error {
203
207
204
208
// Deactivate users not present in LDAP
205
209
if updateExisting {
206
- existPos := 0
207
- for i , usr := range users {
208
- for existPos < len (existingUsers ) && i > existingUsers [existPos ] {
209
- existPos ++
210
+ for _ , usr := range users {
211
+ if _ , ok := keepActiveUsers [usr .ID ]; ok {
212
+ continue
210
213
}
211
- if usr .IsActive && (existPos >= len (existingUsers ) || i < existingUsers [existPos ]) {
212
- log .Trace ("SyncExternalUsers[%s]: Deactivating user %s" , source .authSource .Name , usr .Name )
213
214
214
- usr .IsActive = false
215
- err = user_model .UpdateUserCols (ctx , usr , "is_active" )
216
- if err != nil {
217
- log .Error ("SyncExternalUsers[%s]: Error deactivating user %s: %v" , source .authSource .Name , usr .Name , err )
218
- }
215
+ log .Trace ("SyncExternalUsers[%s]: Deactivating user %s" , source .authSource .Name , usr .Name )
216
+
217
+ usr .IsActive = false
218
+ err = user_model .UpdateUserCols (ctx , usr , "is_active" )
219
+ if err != nil {
220
+ log .Error ("SyncExternalUsers[%s]: Error deactivating user %s: %v" , source .authSource .Name , usr .Name , err )
219
221
}
220
222
}
221
223
}
0 commit comments