
حزمة ldapserver تنفّذ خادم LDAP
هذه الحزمة قيد التطوير.
ldapserver هي مكتبة مساعدة لبناء برمجيات خوادم قادرة على التحدث ببروتوكول LDAP. يمكن أن تكون بديلاً لتطبيق LDAP، أو وكيل LDAP مخصصًا، أو حتى نظامًا خلفيًا مختلفًا تمامًا قادرًا على "إخفاء" واجهة برمجته ليبدو كخادم LDAP.
تدعم الحزمة:
إذا لم تقم بتعيين مسار للتعامل مع طلب AbandonRequest، فستتعامل الحزمة معه نيابةً عنك. (يتم إرسال إشارة إلى message.Done chan)
عندما لا يطابق أي مسار الطلب، سيحاول الخادم أولاً استدعاء مسار خاص 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"