diff --git a/config/main.go b/config/main.go deleted file mode 100644 index ae95552..0000000 --- a/config/main.go +++ /dev/null @@ -1,5 +0,0 @@ -package config - -var SmtpHostname, SmtpPort, Domain, Base, Uid string -var BaseLenght, UidLenght int - diff --git a/fsldap.go b/fsldap.go index 4d30eca..f554cd1 100644 --- a/fsldap.go +++ b/fsldap.go @@ -7,25 +7,11 @@ import ( "syscall" ldap "github.com/vjeantet/ldapserver" - - "gt.kalli.st/czar/fsldap/config" + "gt.kalli.st/czar/fsldap/handler" - "gt.kalli.st/czar/fsldap/utils" ) -func init(){ - log.Print("Loading vars...") - config.SmtpHostname = utils.Env("SMTP_HOSTNAME") - config.SmtpPort = utils.Env("SMTP_PORT") - config.Domain = utils.Env("SMTP_DOMAIN") - config.Base = utils.Env("LDAP_BASE") - config.Uid = utils.Env("LDAP_UID") - config.BaseLenght = len(config.Base) + 1 - config.UidLenght = len(config.Uid) + 1 -} - - func main() { server := ldap.NewServer() routes := ldap.NewRouteMux() diff --git a/handler/ldap_handlers.go b/handler/ldap_handlers.go index 1d033a0..5baffc4 100644 --- a/handler/ldap_handlers.go +++ b/handler/ldap_handlers.go @@ -4,17 +4,16 @@ import ( "crypto/tls" "fmt" "net/smtp" - + "log" "github.com/lor00x/goldap/message" ldap "github.com/vjeantet/ldapserver" - "gt.kalli.st/czar/fsldap/config" "gt.kalli.st/czar/fsldap/utils" ) - -var smtpHost = config.SmtpHostname -var smtpHostPort = fmt.Sprintf("%s:%s", smtpHost,config.SmtpPort) +var smtpHost = utils.Env("SMTP_HOSTNAME") +var smtpPort = utils.Env("SMTP_PORT") +var smtpHostPort = fmt.Sprintf("%s:%s", smtpHost,smtpPort) var tlsconfig = &tls.Config { InsecureSkipVerify: true, @@ -22,28 +21,51 @@ var tlsconfig = &tls.Config { } func Bind(w ldap.ResponseWriter, m *ldap.Message) { + + log.Print("BIND REQUEST", m.LDAPMessage.ProtocolOpName()) + 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 + } + log.Print("Name",name) password := string(r.AuthenticationSimple()) + + log.Print("BEFORE USER") user := utils.GetUser(name) + log.Print("AFTER USER") + mail := utils.GetMail(user) + + log.Print("Auth ", smtpHost, " ",user, " ", mail) auth := smtp.PlainAuth("", mail, password, smtpHost) + log.Print("Dial ", smtpHostPort) client, error := smtp.Dial(smtpHostPort) if error != nil { res.SetResultCode(ldap.LDAPResultInvalidCredentials) + log.Print("invalid credentials DIAL ", error, " host: ",smtpHostPort) res.SetDiagnosticMessage("invalid credentials") w.Write(res) return } + log.Print("StartTLS") client.StartTLS(tlsconfig) + log.Print("Client AUTH") err := client.Auth(auth) if err != nil { res.SetResultCode(ldap.LDAPResultInvalidCredentials) + log.Print("invalid credentials AUTH ", err) res.SetDiagnosticMessage("invalid credentials") w.Write(res) return } + log.Print("Success") w.Write(res) } @@ -53,21 +75,26 @@ func WhoAmI(w ldap.ResponseWriter, m *ldap.Message) { } func Search(w ldap.ResponseWriter, m *ldap.Message) { + log.Print("Searching") r := m.GetSearchRequest() select { case <-m.Done: return default: } - name := string(r.FilterString()) + name := string(r.BaseObject()) + log.Print("Name ",name) if name == ""{ return } - user := utils.GetSearchUser(name) + + user := utils.GetUser(name) mail := utils.GetMail(user) attr := utils.GetLdapName(user) entry := ldap.NewSearchResultEntry(attr) entry.AddAttribute("mail", message.AttributeValue(mail)) + entry.AddAttribute("cn", message.AttributeValue(user)) + log.Print(entry) w.Write(entry) response := ldap.NewSearchResultDoneResponse(ldap.LDAPResultSuccess) w.Write(response) diff --git a/utils/dotenv.go b/utils/dotenv.go index 88dc3c3..afb787b 100644 --- a/utils/dotenv.go +++ b/utils/dotenv.go @@ -7,6 +7,8 @@ import ( "github.com/joho/godotenv" ) +var SmtpHostname, SmtpPort, Domain, Base, Uid string +var BaseLenght, UidLenght int func init(){ loadEnv() @@ -18,6 +20,13 @@ func loadEnv(){ if err != nil { log.Fatal("error loading .env file") } + + Domain = Env("SMTP_DOMAIN") + Base = Env("LDAP_BASE") + Uid = Env("LDAP_UID") + BaseLenght = len(Base) + 1 + UidLenght = len(Uid) + 1 + log.Print("Base ",Base," BaseLenght ",BaseLenght) } diff --git a/utils/ldap.go b/utils/ldap.go index ce6cf93..81137c7 100644 --- a/utils/ldap.go +++ b/utils/ldap.go @@ -2,26 +2,26 @@ package utils import ( "fmt" - - "gt.kalli.st/czar/fsldap/config" + "log" ) func GetMail(user string) string { - return fmt.Sprintf("%s@%s", user, config.Domain) + return fmt.Sprintf("%s@%s", user, Domain) } func GetLdapName(user string) string { - return fmt.Sprintf("%s=%s,%s", config.Uid, user, config.Base) + return fmt.Sprintf("%s=%s,%s", Uid, user, Base) } func GetUser(name string) string { - endIndex := len(name) - config.BaseLenght - user := name[config.UidLenght:endIndex] + endIndex := len(name) - BaseLenght + user := name[UidLenght:endIndex] + log.Print("User ", user) return user } func GetSearchUser(name string) string { - startIndex := config.UidLenght + 1 + startIndex := UidLenght + 1 endIndex := len(name) - 1 user := name[startIndex:endIndex] return user