
パッケージldapserverはLDAPサーバーを実装します。
このパッケージは開発中です。
ldapserver は、LDAPプロトコルを話すサーバーソフトウェアを構築するためのヘルパーライブラリです。これは、LDAPの代替実装、カスタムLDAPプロキシ、あるいはAPIをLDAPサーバーとして「偽装」できるまったく異なるバックエンドにもなり得ます。
このパッケージは以下をサポートしています。
AbandonRequestを処理するルートを設定しない場合、パッケージが代わりに処理します(signalは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"フォルダを参照してください。