77 "fmt"
88 "io"
99 "math/rand"
10+ "net/http"
1011 "net/url"
1112 "strconv"
1213 "sync"
@@ -348,7 +349,7 @@ func (manager *Manager) Get(ctx context.Context, dn string) (*schema.Object, err
348349 }
349350
350351 // Make absolute DN
351- absdn , err := manager .absdn (dn , manager . dn )
352+ absdn , err := manager .absdn (dn )
352353 if err != nil {
353354 return nil , err
354355 }
@@ -385,7 +386,7 @@ func (manager *Manager) Create(ctx context.Context, dn string, attr url.Values)
385386 }
386387
387388 // Make absolute DN
388- absdn , err := manager .absdn (dn , manager . dn )
389+ absdn , err := manager .absdn (dn )
389390 if err != nil {
390391 return nil , err
391392 }
@@ -418,7 +419,7 @@ func (manager *Manager) Delete(ctx context.Context, dn string) (*schema.Object,
418419 }
419420
420421 // Make absolute DN
421- absdn , err := manager .absdn (dn , manager . dn )
422+ absdn , err := manager .absdn (dn )
422423 if err != nil {
423424 return nil , err
424425 }
@@ -450,19 +451,24 @@ func (manager *Manager) Bind(ctx context.Context, dn, password string) (*schema.
450451 }
451452
452453 // Make absolute DN
453- absdn , err := manager .absdn (dn , manager . dn )
454+ absdn , err := manager .absdn (dn )
454455 if err != nil {
455456 return nil , err
456457 }
457458
458- // Bind
459- if err := manager .conn .Bind (absdn .String (), password ); err != nil {
460- return nil , ldaperr (err )
459+ // Bind - which may result in invalid credentials
460+ var errs error
461+ if err := manager .conn .Bind (absdn .String (), password ); ldapErrorCode (err ) == ldap .LDAPResultInvalidCredentials {
462+ errs = ldaperr (err )
463+ } else if err != nil {
464+ return nil , err
461465 }
462466
463467 // Rebind with this user
464468 if err := ldapBind (manager .conn , manager .User (), manager .pass ); err != nil {
465- return nil , ldaperr (err )
469+ return nil , errors .Join (errs , ldaperr (err ))
470+ } else if errs != nil {
471+ return nil , errs
466472 }
467473
468474 // Return the user
@@ -487,7 +493,7 @@ func (manager *Manager) ChangePassword(ctx context.Context, dn, old string, new
487493 }
488494
489495 // Make absolute DN
490- absdn , err := manager .absdn (dn , manager . dn )
496+ absdn , err := manager .absdn (dn )
491497 if err != nil {
492498 return nil , err
493499 }
@@ -515,7 +521,7 @@ func (manager *Manager) Update(ctx context.Context, dn string, attr url.Values)
515521 }
516522
517523 // Make absolute DN
518- absdn , err := manager .absdn (dn , manager . dn )
524+ absdn , err := manager .absdn (dn )
519525 if err != nil {
520526 return nil , err
521527 }
@@ -887,13 +893,15 @@ func ldaperr(err error) error {
887893 return httpresponse .ErrNotFound .With (err .Error ())
888894 case ldap .LDAPResultConstraintViolation :
889895 return httpresponse .ErrConflict .With (err .Error ())
896+ case ldap .LDAPResultUnwillingToPerform :
897+ return httpresponse .Err (http .StatusServiceUnavailable ).With (err .Error ())
890898 default :
891899 return httpresponse .ErrInternalError .With (err )
892900 }
893901}
894902
895903// Make the DN absolute
896- func (manager * Manager ) absdn (dn string , base * schema. DN ) (* schema.DN , error ) {
904+ func (manager * Manager ) absdn (dn string ) (* schema.DN , error ) {
897905 rdn , err := schema .NewDN (dn )
898906 if err != nil {
899907 return nil , httpresponse .ErrBadRequest .Withf ("Invalid DN: %v" , err .Error ())
0 commit comments