@ -26,6 +26,7 @@ type Ldapsource struct {
AttributeSurname string // Surname attribute
AttributeSurname string // Surname attribute
AttributeMail string // E-mail attribute
AttributeMail string // E-mail attribute
Filter string // Query filter to validate entry
Filter string // Query filter to validate entry
AdminFilter string // Query filter to check if user is admin
Enabled bool // if this source is disabled
Enabled bool // if this source is disabled
}
}
@ -77,17 +78,17 @@ func (ls Ldapsource) FindUserDN(name string) (string, bool) {
}
}
// searchEntry : search an LDAP source if an entry (name, passwd) is valid and in the specific filter
// searchEntry : search an LDAP source if an entry (name, passwd) is valid and in the specific filter
func ( ls Ldapsource ) SearchEntry ( name , passwd string ) ( string , string , string , bool ) {
func ( ls Ldapsource ) SearchEntry ( name , passwd string ) ( string , string , string , bool , bool ) {
userDN , found := ls . FindUserDN ( name )
userDN , found := ls . FindUserDN ( name )
if ! found {
if ! found {
return "" , "" , "" , false
return "" , "" , "" , false , false
}
}
l , err := ldapDial ( ls )
l , err := ldapDial ( ls )
if err != nil {
if err != nil {
log . Error ( 4 , "LDAP Connect error, %s:%v" , ls . Host , err )
log . Error ( 4 , "LDAP Connect error, %s:%v" , ls . Host , err )
ls . Enabled = false
ls . Enabled = false
return "" , "" , "" , false
return "" , "" , "" , false , false
}
}
defer l . Close ( )
defer l . Close ( )
@ -96,7 +97,7 @@ func (ls Ldapsource) SearchEntry(name, passwd string) (string, string, string, b
err = l . Bind ( userDN , passwd )
err = l . Bind ( userDN , passwd )
if err != nil {
if err != nil {
log . Debug ( "LDAP auth. failed for %s, reason: %v" , userDN , err )
log . Debug ( "LDAP auth. failed for %s, reason: %v" , userDN , err )
return "" , "" , "" , false
return "" , "" , "" , false , false
}
}
log . Trace ( "Bound successfully with userDN: %s" , userDN )
log . Trace ( "Bound successfully with userDN: %s" , userDN )
@ -109,16 +110,32 @@ func (ls Ldapsource) SearchEntry(name, passwd string) (string, string, string, b
sr , err := l . Search ( search )
sr , err := l . Search ( search )
if err != nil {
if err != nil {
log . Error ( 4 , "LDAP Search failed unexpectedly! (%v)" , err )
log . Error ( 4 , "LDAP Search failed unexpectedly! (%v)" , err )
return "" , "" , "" , false
return "" , "" , "" , false , false
} else if len ( sr . Entries ) < 1 {
} else if len ( sr . Entries ) < 1 {
log . Error ( 4 , "LDAP Search failed unexpectedly! (0 entries)" )
log . Error ( 4 , "LDAP Search failed unexpectedly! (0 entries)" )
return "" , "" , "" , false
return "" , "" , "" , false , false
}
}
name_attr := sr . Entries [ 0 ] . GetAttributeValue ( ls . AttributeName )
name_attr := sr . Entries [ 0 ] . GetAttributeValue ( ls . AttributeName )
sn_attr := sr . Entries [ 0 ] . GetAttributeValue ( ls . AttributeSurname )
sn_attr := sr . Entries [ 0 ] . GetAttributeValue ( ls . AttributeSurname )
mail_attr := sr . Entries [ 0 ] . GetAttributeValue ( ls . AttributeMail )
mail_attr := sr . Entries [ 0 ] . GetAttributeValue ( ls . AttributeMail )
return name_attr , sn_attr , mail_attr , true
search = ldap . NewSearchRequest (
userDN , ldap . ScopeWholeSubtree , ldap . NeverDerefAliases , 0 , 0 , false , ls . AdminFilter ,
[ ] string { ls . AttributeName } ,
nil )
sr , err = l . Search ( search )
admin_attr := false
if err != nil {
log . Error ( 4 , "LDAP Admin Search failed unexpectedly! (%v)" , err )
} else if len ( sr . Entries ) < 1 {
log . Error ( 4 , "LDAP Admin Search failed" )
} else {
admin_attr = true
}
return name_attr , sn_attr , mail_attr , admin_attr , true
}
}
func ldapDial ( ls Ldapsource ) ( * ldap . Conn , error ) {
func ldapDial ( ls Ldapsource ) ( * ldap . Conn , error ) {