
Пакет ldapserver реализует LDAP-сервер
Этот пакет находится в разработке.
ldapserver — это вспомогательная библиотека для создания серверного программного обеспечения, способного говорить на протоколе LDAP. Это может быть альтернативная реализация LDAP, пользовательский LDAP-прокси или даже совершенно другой серверный компонент, способный «маскировать» свой API под LDAP-сервер.
Пакет поддерживает:
Если вы не задали маршрут для обработки AbandonRequest, пакет обработает его за вас (сигнал отправляется в канал message.Done).
Когда ни один маршрут не соответствует запросу, сервер сначала попытается вызвать специальный маршрут NotFound; если ничего не указано, он вернёт код ошибки UnwillingToResponse (53).
Не стесняйтесь вносить вклад и комментировать :)
// Listen to 10389 port for LDAP Request
// and route bind request to the handleBind func
package main
import (
"log"
"os"
"os/signal"
"syscall"
ldap "github.com/vjeantet/ldapserver"
)
func main() {
//ldap logger
ldap.Logger = log.New(os.Stdout, "[server] ", log.LstdFlags)
//Create a new LDAP Server
server := ldap.NewServer()
routes := ldap.NewRouteMux()
routes.Bind(handleBind)
server.Handle(routes)
// listen on 10389
go server.ListenAndServe("127.0.0.1:10389")
// When CTRL+C, SIGINT and SIGTERM signal occurs
// Then stop server gracefully
ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
<-ch
close(ch)
server.Stop()
}
// handleBind return Success if login == mysql
func handleBind(w ldap.ResponseWriter, m *ldap.Message) {
r := m.GetBindRequest()
res := ldap.NewBindResponse(ldap.LDAPResultSuccess)
if string(r.Name()) == "myLogin" {
w.Write(res)
return
}
log.Printf("Bind failed User=%s, Pass=%s", string(r.Name()), string(r.AuthenticationSimple()))
res.SetResultCode(ldap.LDAPResultInvalidCredentials)
res.SetDiagnosticMessage("invalid credentials")
w.Write(res)
}
Загляните в папку «examples».