aboutsummaryrefslogtreecommitdiff
path: root/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'server.go')
-rw-r--r--server.go22
1 files changed, 20 insertions, 2 deletions
diff --git a/server.go b/server.go
index 071286c..cafeec5 100644
--- a/server.go
+++ b/server.go
@@ -44,7 +44,7 @@ type Closer interface {
//
type Server struct {
- Bind BindFunc
+ Bind BindFunc
Search SearchFunc
AddFns map[string]Adder
@@ -59,6 +59,9 @@ type Server struct {
EnforceLDAP bool
Stats *Stats
+ // If set, server will accept StartTLS.
+ TLSConfig *tls.Config
+
closing chan struct{}
}
@@ -307,12 +310,27 @@ handler:
server.Stats.countUnbinds(1)
break handler // simply disconnect
case ApplicationExtendedRequest:
- ldapResultCode := HandleExtendedRequest(req, boundDN, server.ExtendedFns, conn)
+ var tlsConn *tls.Conn
+ if n := len(req.Children); n == 1 || n == 2 {
+ if name := ber.DecodeString(req.Children[0].Data.Bytes()); name == oidStartTLS {
+ tlsConn = tls.Server(conn, server.TLSConfig)
+ }
+ }
+ var ldapResultCode LDAPResultCode
+ if tlsConn == nil {
+ // Wasn't an upgrade. Pass through.
+ ldapResultCode = HandleExtendedRequest(req, boundDN, server.ExtendedFns, conn)
+ } else {
+ ldapResultCode = LDAPResultSuccess
+ }
responsePacket := encodeLDAPResponse(messageID, ApplicationExtendedResponse, ldapResultCode, LDAPResultCodeMap[ldapResultCode])
if err = sendPacket(conn, responsePacket); err != nil {
log.Printf("sendPacket error %s", err.Error())
break handler
}
+ if tlsConn != nil {
+ conn = tlsConn
+ }
case ApplicationAbandonRequest:
HandleAbandonRequest(req, boundDN, server.AbandonFns, conn)
break handler