@@ -264,3 +264,68 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) *SearchResul
264
264
IsAdmin : isAdmin ,
265
265
}
266
266
}
267
+
268
+ // SearchEntries : search an LDAP source for all users matching userFilter
269
+ func (ls * Source ) SearchEntries () []* SearchResult {
270
+ l , err := dial (ls )
271
+ if err != nil {
272
+ log .Error (4 , "LDAP Connect error, %s:%v" , ls .Host , err )
273
+ ls .Enabled = false
274
+ return nil
275
+ }
276
+ defer l .Close ()
277
+
278
+ if ls .BindDN != "" && ls .BindPassword != "" {
279
+ err := l .Bind (ls .BindDN , ls .BindPassword )
280
+ if err != nil {
281
+ log .Debug ("Failed to bind as BindDN[%s]: %v" , ls .BindDN , err )
282
+ return nil
283
+ }
284
+ log .Trace ("Bound as BindDN %s" , ls .BindDN )
285
+ } else {
286
+ log .Trace ("Proceeding with anonymous LDAP search." )
287
+ }
288
+
289
+ userFilter := fmt .Sprintf (ls .Filter , "*" )
290
+
291
+ log .Trace ("Fetching attributes '%v', '%v', '%v', '%v' with filter %s and base %s" , ls .AttributeUsername , ls .AttributeName , ls .AttributeSurname , ls .AttributeMail , userFilter , ls .UserBase )
292
+ search := ldap .NewSearchRequest (
293
+ ls .UserBase , ldap .ScopeWholeSubtree , ldap .NeverDerefAliases , 0 , 0 , false , userFilter ,
294
+ []string {ls .AttributeUsername , ls .AttributeName , ls .AttributeSurname , ls .AttributeMail },
295
+ nil )
296
+
297
+ sr , err := l .Search (search )
298
+ if err != nil {
299
+ log .Error (4 , "LDAP Search failed unexpectedly! (%v)" , err )
300
+ return nil
301
+ }
302
+
303
+ result := make ([]* SearchResult , len (sr .Entries ))
304
+
305
+ for i , v := range sr .Entries {
306
+ result [i ] = & SearchResult {
307
+ Username : v .GetAttributeValue (ls .AttributeUsername ),
308
+ Name : v .GetAttributeValue (ls .AttributeName ),
309
+ Surname : v .GetAttributeValue (ls .AttributeSurname ),
310
+ Mail : v .GetAttributeValue (ls .AttributeMail ),
311
+ IsAdmin : false ,
312
+ }
313
+
314
+ if len (ls .AdminFilter ) > 0 {
315
+ log .Trace ("Checking admin with filter %s and base %s" , ls .AdminFilter , v .DN )
316
+ adminSearch := ldap .NewSearchRequest (
317
+ v .DN , ldap .ScopeWholeSubtree , ldap .NeverDerefAliases , 0 , 0 , false , ls .AdminFilter ,
318
+ []string {ls .AttributeName },
319
+ nil )
320
+
321
+ asr , err := l .Search (adminSearch )
322
+ if err != nil {
323
+ log .Error (4 , "LDAP Admin Search failed unexpectedly! (%v)" , err )
324
+ } else if len (asr .Entries ) == 1 {
325
+ result [i ].IsAdmin = true
326
+ }
327
+ }
328
+ }
329
+
330
+ return result
331
+ }
0 commit comments