Files
efsldap/handler/ldap_handlers.go
Shin'ya Minazuki e4d9b92061 * Rename fsldap to efsldap
* Use gopkg.in/ini.v1 over github.com/joho/godotenv
* Fix typos

Signed-off-by: Shin'ya Minazuki <shinyoukai@laidback.moe>
2026-01-07 19:42:00 -03:00

121 lines
2.5 KiB
Go

package handler
import (
"crypto/tls"
"fmt"
"net/smtp"
"github.com/lor00x/goldap/message"
ldap "github.com/vjeantet/ldapserver"
"git.laidback.moe/YakumoLabs/efsldap/config"
"git.laidback.moe/YakumoLabs/efsldap/utils"
)
var (
base = config.Config.LDAPBase
smtpHost = config.Config.SMTPHost
smtpPort = config.Config.SMTPPort
smtpHostPort = fmt.Sprintf("%s:%s", smtpHost,smtpPort)
)
var tlsconfig = &tls.Config {
InsecureSkipVerify: true,
ServerName: smtpHost,
}
func Bind(w ldap.ResponseWriter, m *ldap.Message) {
r := m.GetBindRequest()
res := ldap.NewBindResponse(ldap.LDAPResultSuccess)
name := string(r.Name())
if(len(name) == 0) {
res.SetResultCode(ldap.LDAPResultInvalidCredentials)
res.SetDiagnosticMessage("invalid credentials")
w.Write(res)
return
}
password := string(r.AuthenticationSimple())
user := utils.GetUser(name)
mail := utils.GetMail(user)
auth := smtp.PlainAuth("", mail, password, smtpHost)
client, error := smtp.Dial(smtpHostPort)
if error != nil {
res.SetResultCode(ldap.LDAPResultInvalidCredentials)
res.SetDiagnosticMessage("invalid credentials")
w.Write(res)
return
}
client.StartTLS(tlsconfig)
err := client.Auth(auth)
if err != nil {
res.SetResultCode(ldap.LDAPResultInvalidCredentials)
res.SetDiagnosticMessage("invalid credentials")
w.Write(res)
return
}
w.Write(res)
}
func WhoAmI(w ldap.ResponseWriter, m *ldap.Message) {
res := ldap.NewExtendedResponse(ldap.LDAPResultSuccess)
w.Write(res)
}
func Search(w ldap.ResponseWriter, m *ldap.Message) {
r := m.GetSearchRequest()
select {
case <-m.Done:
return
default:
}
name := string(r.BaseObject())
search := false
if name == base {
name = string(r.FilterString())
search = true
}
if name == "" {
response := ldap.NewSearchResultDoneResponse(ldap.LDAPResultNoSuchObject)
w.Write(response)
return
}
var user string;
if(search) {
user = utils.GetSearchUser(name)
} else {
user = utils.GetUser(name)
}
if user == ""{
response := ldap.NewSearchResultDoneResponse(ldap.LDAPResultNoSuchObject)
w.Write(response)
return
}
mail := utils.GetMail(user)
if mail == ""{
response := ldap.NewSearchResultDoneResponse(ldap.LDAPResultNoSuchObject)
w.Write(response)
return
}
attr := utils.GetLdapName(user)
entry := ldap.NewSearchResultEntry(attr)
entry.AddAttribute("mail", message.AttributeValue(mail))
entry.AddAttribute("cn", message.AttributeValue(user))
w.Write(entry)
response := ldap.NewSearchResultDoneResponse(ldap.LDAPResultSuccess)
w.Write(response)
}