Skip to content

Commit

Permalink
ldap/auth: add tests for login regressions
Browse files Browse the repository at this point in the history
Add tests to cover the regressions reported in
- #26171
- #26183
  • Loading branch information
fairclothjm committed Apr 9, 2024
1 parent 009702c commit 6497006
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 28 deletions.
119 changes: 95 additions & 24 deletions builtin/credential/ldap/backend_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ func TestLdapAuthBackend_CaseSensitivity(t *testing.T) {
}
}

cleanup, cfg := ldap.PrepareTestContainer(t, "latest")
cleanup, cfg := ldap.PrepareTestContainer(t, "master")
defer cleanup()
configReq := &logical.Request{
Operation: logical.UpdateOperation,
Expand Down Expand Up @@ -313,7 +313,7 @@ func TestLdapAuthBackend_UserPolicies(t *testing.T) {
var err error
b, storage := createBackendWithStorage(t)

cleanup, cfg := ldap.PrepareTestContainer(t, "latest")
cleanup, cfg := ldap.PrepareTestContainer(t, "master")
defer cleanup()
configReq := &logical.Request{
Operation: logical.UpdateOperation,
Expand Down Expand Up @@ -418,9 +418,79 @@ func factory(t *testing.T) logical.Backend {
return b
}

// TestBackend_LoginRegression_AnonBind is a test for the regression reported in
// https://github.com/hashicorp/vault/issues/26183.
func TestBackend_LoginRegression_AnonBind(t *testing.T) {
b := factory(t)
cleanup, cfg := ldap.PrepareTestContainer(t, "master")
cfg.UserAttr = "givenName"
cfg.AnonymousGroupSearch = true
defer cleanup()

logicaltest.Test(t, logicaltest.TestCase{
CredentialBackend: b,
Steps: []logicaltest.TestStep{
testAccStepConfigUrl(t, cfg),
// Map Admin_staff group (from LDAP server) with foo policy
testAccStepGroup(t, "admin_staff", "foo"),

// Map engineers group (local) with bar policy
testAccStepGroup(t, "engineers", "bar"),

// Map hermes conrad user with local engineers group
testAccStepUser(t, "hermes", "engineers"),

// Authenticate
testAccStepLogin(t, "hermes", "hermes"),

// Verify both groups mappings can be listed back
testAccStepGroupList(t, []string{"engineers", "admin_staff"}),

// Verify user mapping can be listed back
testAccStepUserList(t, []string{"hermes"}),
},
})
}

// TestBackend_LoginRegression_UserAttr is a test for the regression reported in
// https://github.com/hashicorp/vault/issues/26171.
// Vault relies on case insensitive user attribute keys for mapping user
// attributes to entity alias metadata.
func TestBackend_LoginRegression_UserAttr(t *testing.T) {
b := factory(t)
cleanup, cfg := ldap.PrepareTestContainer(t, "master")
cfg.UserAttr = "givenName"
cfg.AnonymousGroupSearch = true
defer cleanup()

logicaltest.Test(t, logicaltest.TestCase{
CredentialBackend: b,
Steps: []logicaltest.TestStep{
testAccStepConfigUrl(t, cfg),
// Map Admin_staff group (from LDAP server) with foo policy
testAccStepGroup(t, "admin_staff", "foo"),

// Map engineers group (local) with bar policy
testAccStepGroup(t, "engineers", "bar"),

// Map hermes conrad user with local engineers group
testAccStepUser(t, "hermes", "engineers"),

// Authenticate
testAccStepLogin(t, "hermes", "hermes"),

// Verify both groups mappings can be listed back
testAccStepGroupList(t, []string{"engineers", "admin_staff"}),

// Verify user mapping can be listed back
testAccStepUserList(t, []string{"hermes"}),
},
})
}

func TestBackend_basic(t *testing.T) {
b := factory(t)
cleanup, cfg := ldap.PrepareTestContainer(t, "latest")
cleanup, cfg := ldap.PrepareTestContainer(t, "master")
defer cleanup()

logicaltest.Test(t, logicaltest.TestCase{
Expand Down Expand Up @@ -450,7 +520,7 @@ func TestBackend_basic(t *testing.T) {

func TestBackend_basic_noPolicies(t *testing.T) {
b := factory(t)
cleanup, cfg := ldap.PrepareTestContainer(t, "latest")
cleanup, cfg := ldap.PrepareTestContainer(t, "master")
defer cleanup()

logicaltest.Test(t, logicaltest.TestCase{
Expand All @@ -468,7 +538,7 @@ func TestBackend_basic_noPolicies(t *testing.T) {

func TestBackend_basic_group_noPolicies(t *testing.T) {
b := factory(t)
cleanup, cfg := ldap.PrepareTestContainer(t, "latest")
cleanup, cfg := ldap.PrepareTestContainer(t, "master")
defer cleanup()

logicaltest.Test(t, logicaltest.TestCase{
Expand All @@ -489,7 +559,7 @@ func TestBackend_basic_group_noPolicies(t *testing.T) {

func TestBackend_basic_authbind(t *testing.T) {
b := factory(t)
cleanup, cfg := ldap.PrepareTestContainer(t, "latest")
cleanup, cfg := ldap.PrepareTestContainer(t, "master")
defer cleanup()

logicaltest.Test(t, logicaltest.TestCase{
Expand All @@ -506,7 +576,7 @@ func TestBackend_basic_authbind(t *testing.T) {

func TestBackend_basic_authbind_userfilter(t *testing.T) {
b := factory(t)
cleanup, cfg := ldap.PrepareTestContainer(t, "latest")
cleanup, cfg := ldap.PrepareTestContainer(t, "master")
defer cleanup()

// userattr not used in the userfilter should result in a warning in the response
Expand Down Expand Up @@ -649,7 +719,7 @@ func TestBackend_basic_authbind_userfilter(t *testing.T) {

func TestBackend_basic_authbind_metadata_name(t *testing.T) {
b := factory(t)
cleanup, cfg := ldap.PrepareTestContainer(t, "latest")
cleanup, cfg := ldap.PrepareTestContainer(t, "master")
defer cleanup()

cfg.UserAttr = "cn"
Expand Down Expand Up @@ -714,7 +784,7 @@ func addUPNAttributeToLDAPSchemaAndUser(t *testing.T, cfg *ldaputil.ConfigEntry,

func TestBackend_basic_discover(t *testing.T) {
b := factory(t)
cleanup, cfg := ldap.PrepareTestContainer(t, "latest")
cleanup, cfg := ldap.PrepareTestContainer(t, "master")
defer cleanup()

logicaltest.Test(t, logicaltest.TestCase{
Expand All @@ -731,7 +801,7 @@ func TestBackend_basic_discover(t *testing.T) {

func TestBackend_basic_nogroupdn(t *testing.T) {
b := factory(t)
cleanup, cfg := ldap.PrepareTestContainer(t, "latest")
cleanup, cfg := ldap.PrepareTestContainer(t, "master")
defer cleanup()

logicaltest.Test(t, logicaltest.TestCase{
Expand Down Expand Up @@ -821,19 +891,20 @@ func testAccStepConfigUrl(t *testing.T, cfg *ldaputil.ConfigEntry) logicaltest.T
Operation: logical.UpdateOperation,
Path: "config",
Data: map[string]interface{}{
"url": cfg.Url,
"userattr": cfg.UserAttr,
"userdn": cfg.UserDN,
"userfilter": cfg.UserFilter,
"groupdn": cfg.GroupDN,
"groupattr": cfg.GroupAttr,
"binddn": cfg.BindDN,
"bindpass": cfg.BindPassword,
"case_sensitive_names": true,
"token_policies": "abc,xyz",
"request_timeout": cfg.RequestTimeout,
"connection_timeout": cfg.ConnectionTimeout,
"username_as_alias": cfg.UsernameAsAlias,
"url": cfg.Url,
"userattr": cfg.UserAttr,
"userdn": cfg.UserDN,
"userfilter": cfg.UserFilter,
"groupdn": cfg.GroupDN,
"groupattr": cfg.GroupAttr,
"binddn": cfg.BindDN,
"bindpass": cfg.BindPassword,
"anonymous_group_search": cfg.AnonymousGroupSearch,
"case_sensitive_names": true,
"token_policies": "abc,xyz",
"request_timeout": cfg.RequestTimeout,
"connection_timeout": cfg.ConnectionTimeout,
"username_as_alias": cfg.UsernameAsAlias,
},
}
}
Expand Down Expand Up @@ -1180,7 +1251,7 @@ func TestLdapAuthBackend_ConfigUpgrade(t *testing.T) {

ctx := context.Background()

cleanup, cfg := ldap.PrepareTestContainer(t, "latest")
cleanup, cfg := ldap.PrepareTestContainer(t, "master")
defer cleanup()
configReq := &logical.Request{
Operation: logical.UpdateOperation,
Expand Down
9 changes: 5 additions & 4 deletions helper/testhelpers/ldap/ldaphelper.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"testing"

"github.com/hashicorp/cap/ldap"

"github.com/hashicorp/vault/sdk/helper/docker"
"github.com/hashicorp/vault/sdk/helper/ldaputil"
)
Expand All @@ -23,12 +24,12 @@ func PrepareTestContainer(t *testing.T, version string) (cleanup func(), cfg *ld
}

runner, err := docker.NewServiceRunner(docker.RunOptions{
// Currently set to "michelvocks" until https://github.com/rroemhild/docker-test-openldap/pull/14
// has been merged.
ImageRepo: "docker.mirror.hashicorp.services/michelvocks/docker-test-openldap",
// TODO(JMF): use the mirror once https://github.com/hashicorp/docker-registry-mirror/pull/64 is merged
// ImageRepo: "docker.mirror.hashicorp.services/rroemhild/docker-test-openldap",
ImageRepo: "ghcr.io/rroemhild/docker-test-openldap",
ImageTag: version,
ContainerName: "ldap",
Ports: []string{"389/tcp"},
Ports: []string{"10389/tcp"},
// Env: []string{"LDAP_DEBUG_LEVEL=384"},
})
if err != nil {
Expand Down

0 comments on commit 6497006

Please sign in to comment.