|
|
|
@@ -17,7 +17,6 @@ import (
|
|
|
|
|
type LdapService struct {
|
|
|
|
|
log *logger.Logger
|
|
|
|
|
config model.Config
|
|
|
|
|
ctx context.Context
|
|
|
|
|
|
|
|
|
|
conn *ldapgo.Conn
|
|
|
|
|
mutex sync.RWMutex
|
|
|
|
@@ -27,7 +26,6 @@ type LdapService struct {
|
|
|
|
|
func NewLdapService(
|
|
|
|
|
log *logger.Logger,
|
|
|
|
|
config model.Config,
|
|
|
|
|
ctx context.Context,
|
|
|
|
|
dg *ding.Ding,
|
|
|
|
|
) (*LdapService, error) {
|
|
|
|
|
if config.LDAP.Address == "" {
|
|
|
|
@@ -37,7 +35,6 @@ func NewLdapService(
|
|
|
|
|
ldap := &LdapService{
|
|
|
|
|
log: log,
|
|
|
|
|
config: config,
|
|
|
|
|
ctx: ctx,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check whether authentication with client certificate is possible
|
|
|
|
@@ -66,9 +63,7 @@ func NewLdapService(
|
|
|
|
|
|
|
|
|
|
_, err := ldap.connect()
|
|
|
|
|
|
|
|
|
|
// Warn: This will hang the tinyauth startup for a good 45 seconds until it fails
|
|
|
|
|
if err != nil {
|
|
|
|
|
err = ldap.reconnect(10 * time.Second)
|
|
|
|
|
return nil, fmt.Errorf("failed to connect to ldap server: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -84,7 +79,7 @@ func NewLdapService(
|
|
|
|
|
err := ldap.heartbeat()
|
|
|
|
|
if err != nil {
|
|
|
|
|
ldap.log.App.Warn().Err(err).Msg("LDAP connection heartbeat failed, attempting to reconnect")
|
|
|
|
|
if reconnectErr := ldap.reconnect(5 * time.Second); reconnectErr != nil {
|
|
|
|
|
if reconnectErr := ldap.reconnect(); reconnectErr != nil {
|
|
|
|
|
ldap.log.App.Error().Err(reconnectErr).Msg("Failed to reconnect to LDAP server")
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
@@ -252,19 +247,17 @@ func (ldap *LdapService) heartbeat() error {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ldap *LdapService) reconnect(interval time.Duration) error {
|
|
|
|
|
func (ldap *LdapService) reconnect() error {
|
|
|
|
|
ldap.log.App.Info().Msg("Attempting to reconnect to LDAP server")
|
|
|
|
|
|
|
|
|
|
exp := backoff.NewExponentialBackOff()
|
|
|
|
|
exp.InitialInterval = interval
|
|
|
|
|
exp.InitialInterval = 500 * time.Millisecond
|
|
|
|
|
exp.RandomizationFactor = 0.1
|
|
|
|
|
exp.Multiplier = 1.5
|
|
|
|
|
exp.Reset()
|
|
|
|
|
|
|
|
|
|
operation := func() (*ldapgo.Conn, error) {
|
|
|
|
|
if ldap.conn != nil {
|
|
|
|
|
ldap.conn.Close()
|
|
|
|
|
}
|
|
|
|
|
conn, err := ldap.connect()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
@@ -272,7 +265,7 @@ func (ldap *LdapService) reconnect(interval time.Duration) error {
|
|
|
|
|
return conn, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, err := backoff.Retry(ldap.ctx, operation, backoff.WithBackOff(exp), backoff.WithMaxTries(3))
|
|
|
|
|
_, err := backoff.Retry(context.TODO(), operation, backoff.WithBackOff(exp), backoff.WithMaxTries(3))
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|