Fix OpenBao OIDC token exchange compatibility
This commit is contained in:
parent
06d20c3379
commit
d6d41dd84f
6 changed files with 43 additions and 11 deletions
|
|
@ -125,11 +125,16 @@ func (a *LDAPAdapter) LookupUser(ctx context.Context, username string) (*domain.
|
|||
entry := result.Entries[0]
|
||||
user := mapEntryToUser(entry)
|
||||
|
||||
// Run the canonical LDAP schema validator.
|
||||
// Runtime login should not fail because a live directory entry is missing
|
||||
// provisioning metadata such as cn/sn. Keep the warning visible for
|
||||
// diagnostics, but return the resolved user so token issuance can proceed.
|
||||
snap := validator.Snapshot{Users: []domain.User{user}}
|
||||
report := validator.Validate(snap, validator.ModeProvisioning)
|
||||
if !report.Passed {
|
||||
return nil, fmt.Errorf("lldap: validation failed for user %q: %s", username, validationSummary(report))
|
||||
if user.LDAPAttributes == nil {
|
||||
user.LDAPAttributes = make(map[string]string)
|
||||
}
|
||||
user.LDAPAttributes["_validation_warning"] = validationSummary(report)
|
||||
}
|
||||
|
||||
return &user, nil
|
||||
|
|
|
|||
|
|
@ -154,16 +154,20 @@ func TestLookupUser_NotFound(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestLookupUser_ValidationFailure(t *testing.T) {
|
||||
// Return an entry with an empty DisplayName and empty sn — will fail validator.
|
||||
dn := "uid=broken,ou=users,dc=netkingdom,dc=local"
|
||||
func TestLookupUser_ValidationWarningDoesNotBlockRuntimeLogin(t *testing.T) {
|
||||
// Return an entry with an empty DisplayName and empty sn. Runtime login
|
||||
// should still resolve the user; provisioning validators report the warning.
|
||||
dn := "uid=platform-root,ou=people,dc=netkingdom,dc=local"
|
||||
conn := &mockConn{
|
||||
searchFn: func(req *ldap.SearchRequest) (*ldap.SearchResult, error) {
|
||||
if req.BaseDN != "ou=people,dc=netkingdom,dc=local" {
|
||||
t.Fatalf("BaseDN: want ou=people,dc=netkingdom,dc=local, got %q", req.BaseDN)
|
||||
}
|
||||
attrs := []*ldap.EntryAttribute{
|
||||
{Name: "uid", Values: []string{"broken"}},
|
||||
{Name: "uid", Values: []string{"platform-root"}},
|
||||
{Name: "cn", Values: []string{""}},
|
||||
{Name: "sn", Values: []string{""}},
|
||||
{Name: "mail", Values: []string{"broken@example.com"}},
|
||||
{Name: "mail", Values: []string{"bernd.worsch@gmail.com"}},
|
||||
}
|
||||
return &ldap.SearchResult{
|
||||
Entries: []*ldap.Entry{{DN: dn, Attributes: attrs}},
|
||||
|
|
@ -171,10 +175,21 @@ func TestLookupUser_ValidationFailure(t *testing.T) {
|
|||
},
|
||||
}
|
||||
|
||||
adapter := makeAdapter(testConfig(), conn)
|
||||
_, err := adapter.LookupUser(context.Background(), "broken")
|
||||
if err == nil {
|
||||
t.Fatal("expected validation error, got nil")
|
||||
cfg := testConfig()
|
||||
cfg.UserOU = "ou=people"
|
||||
adapter := makeAdapter(cfg, conn)
|
||||
user, err := adapter.LookupUser(context.Background(), "platform-root")
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if user.ID != dn {
|
||||
t.Errorf("ID: want %q, got %q", dn, user.ID)
|
||||
}
|
||||
if user.Username != "platform-root" {
|
||||
t.Errorf("Username: want platform-root, got %q", user.Username)
|
||||
}
|
||||
if user.LDAPAttributes["_validation_warning"] == "" {
|
||||
t.Error("expected validation warning for missing displayName")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue