@@ -47,6 +47,15 @@ type Source struct {
47
47
Enabled bool // if this source is disabled
48
48
}
49
49
50
+ // SearchResult : user data
51
+ type SearchResult struct {
52
+ Username string // Username
53
+ Name string // Name
54
+ Surname string // Surname
55
+ Mail string // E-mail address
56
+ IsAdmin bool // if user is administrator
57
+ }
58
+
50
59
func (ls * Source ) sanitizedUserQuery (username string ) (string , bool ) {
51
60
// See http://tools.ietf.org/search/rfc4515
52
61
badCharacters := "\x00 ()*\\ "
@@ -150,17 +159,17 @@ func bindUser(l *ldap.Conn, userDN, passwd string) error {
150
159
}
151
160
152
161
// SearchEntry : search an LDAP source if an entry (name, passwd) is valid and in the specific filter
153
- func (ls * Source ) SearchEntry (name , passwd string , directBind bool ) ( string , string , string , string , bool , bool ) {
162
+ func (ls * Source ) SearchEntry (name , passwd string , directBind bool ) * SearchResult {
154
163
// See https://tools.ietf.org/search/rfc4513#section-5.1.2
155
164
if len (passwd ) == 0 {
156
165
log .Debug ("Auth. failed for %s, password cannot be empty" )
157
- return "" , "" , "" , "" , false , false
166
+ return nil
158
167
}
159
168
l , err := dial (ls )
160
169
if err != nil {
161
170
log .Error (4 , "LDAP Connect error, %s:%v" , ls .Host , err )
162
171
ls .Enabled = false
163
- return "" , "" , "" , "" , false , false
172
+ return nil
164
173
}
165
174
defer l .Close ()
166
175
@@ -171,29 +180,29 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str
171
180
var ok bool
172
181
userDN , ok = ls .sanitizedUserDN (name )
173
182
if ! ok {
174
- return "" , "" , "" , "" , false , false
183
+ return nil
175
184
}
176
185
} else {
177
186
log .Trace ("LDAP will use BindDN." )
178
187
179
188
var found bool
180
189
userDN , found = ls .findUserDN (l , name )
181
190
if ! found {
182
- return "" , "" , "" , "" , false , false
191
+ return nil
183
192
}
184
193
}
185
194
186
195
if directBind || ! ls .AttributesInBind {
187
196
// binds user (checking password) before looking-up attributes in user context
188
197
err = bindUser (l , userDN , passwd )
189
198
if err != nil {
190
- return "" , "" , "" , "" , false , false
199
+ return nil
191
200
}
192
201
}
193
202
194
203
userFilter , ok := ls .sanitizedUserQuery (name )
195
204
if ! ok {
196
- return "" , "" , "" , "" , false , false
205
+ return nil
197
206
}
198
207
199
208
log .Trace ("Fetching attributes '%v', '%v', '%v', '%v' with filter %s and base %s" , ls .AttributeUsername , ls .AttributeName , ls .AttributeSurname , ls .AttributeMail , userFilter , userDN )
@@ -205,15 +214,15 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str
205
214
sr , err := l .Search (search )
206
215
if err != nil {
207
216
log .Error (4 , "LDAP Search failed unexpectedly! (%v)" , err )
208
- return "" , "" , "" , "" , false , false
217
+ return nil
209
218
} else if len (sr .Entries ) < 1 {
210
219
if directBind {
211
220
log .Error (4 , "User filter inhibited user login." )
212
221
} else {
213
222
log .Error (4 , "LDAP Search failed unexpectedly! (0 entries)" )
214
223
}
215
224
216
- return "" , "" , "" , "" , false , false
225
+ return nil
217
226
}
218
227
219
228
username := sr .Entries [0 ].GetAttributeValue (ls .AttributeUsername )
@@ -243,9 +252,15 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str
243
252
// binds user (checking password) after looking-up attributes in BindDN context
244
253
err = bindUser (l , userDN , passwd )
245
254
if err != nil {
246
- return "" , "" , "" , "" , false , false
255
+ return nil
247
256
}
248
257
}
249
258
250
- return username , firstname , surname , mail , isAdmin , true
259
+ return & SearchResult {
260
+ Username : username ,
261
+ Name : firstname ,
262
+ Surname : surname ,
263
+ Mail : mail ,
264
+ IsAdmin : isAdmin ,
265
+ }
251
266
}
0 commit comments