mirror of
				https://github.com/steveiliop56/tinyauth.git
				synced 2025-10-31 06:05:43 +00:00 
			
		
		
		
	feat: try to reconnect to ldap server if heartbeat fails
This commit is contained in:
		| @@ -1,11 +1,13 @@ | ||||
| package ldap | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"crypto/tls" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| 	"tinyauth/internal/types" | ||||
|  | ||||
| 	"github.com/cenkalti/backoff/v5" | ||||
| 	ldapgo "github.com/go-ldap/ldap/v3" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| ) | ||||
| @@ -30,6 +32,11 @@ func NewLDAP(config types.LdapConfig) (*LDAP, error) { | ||||
| 			err := ldap.heartbeat() | ||||
| 			if err != nil { | ||||
| 				log.Error().Err(err).Msg("LDAP connection heartbeat failed") | ||||
| 				if reconnectErr := ldap.reconnect(); reconnectErr != nil { | ||||
| 					log.Error().Err(reconnectErr).Msg("Failed to reconnect to LDAP server") | ||||
| 					continue | ||||
| 				} | ||||
| 				log.Info().Msg("Successfully reconnected to LDAP server") | ||||
| 			} | ||||
| 		} | ||||
| 	}() | ||||
| @@ -38,6 +45,7 @@ func NewLDAP(config types.LdapConfig) (*LDAP, error) { | ||||
| } | ||||
|  | ||||
| func (l *LDAP) connect() (*ldapgo.Conn, error) { | ||||
| 	log.Debug().Msg("Connecting to LDAP server") | ||||
| 	conn, err := ldapgo.DialURL(l.Config.Address, ldapgo.DialWithTLSConfig(&tls.Config{ | ||||
| 		InsecureSkipVerify: l.Config.Insecure, | ||||
| 		MinVersion:         tls.VersionTLS12, | ||||
| @@ -46,6 +54,7 @@ func (l *LDAP) connect() (*ldapgo.Conn, error) { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	log.Debug().Msg("Binding to LDAP server") | ||||
| 	err = conn.Bind(l.Config.BindDN, l.Config.BindPassword) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| @@ -109,3 +118,29 @@ func (l *LDAP) heartbeat() error { | ||||
| 	// No error means the connection is alive | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (l *LDAP) reconnect() error { | ||||
| 	log.Info().Msg("Reconnecting to LDAP server") | ||||
|  | ||||
| 	exp := backoff.NewExponentialBackOff() | ||||
| 	exp.InitialInterval = 500 * time.Millisecond | ||||
| 	exp.RandomizationFactor = 0.1 | ||||
| 	exp.Multiplier = 1.5 | ||||
| 	exp.Reset() | ||||
|  | ||||
| 	operation := func() (*ldapgo.Conn, error) { | ||||
| 		_, err := l.connect() | ||||
| 		if err != nil { | ||||
| 			return nil, nil | ||||
| 		} | ||||
| 		return nil, nil | ||||
| 	} | ||||
|  | ||||
| 	_, err := backoff.Retry(context.TODO(), operation, backoff.WithBackOff(exp), backoff.WithMaxTries(3)) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Stavros
					Stavros