// Copyright 2019 The Gitea Authors. All rights reserved.// SPDX-License-Identifier: MIT package cmd import ( "context" "testing" "forgejo.org/models/auth" "forgejo.org/services/auth/source/ldap" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/urfave/cli/v2") func TestAddLdapBindDn(t *testing.T) { // Mock cli functions to do not exit on error osExiter := cli.OsExiter defer func() { cli.OsExiter = osExiter }() cli.OsExiter = func(code int) {} // Test cases cases := []struct { args []string source *auth.Source errMsg string }{ // case 0 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source full", "--not-active", "--security-protocol", "ldaps", "--skip-tls-verify", "--host", "ldap-bind-server full", "--port", "9876", "--user-search-base", "ou=Users,dc=full-domain-bind,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=full-domain-bind,dc=org)", "--admin-filter", "(memberOf=cn=admin-group,ou=example,dc=full-domain-bind,dc=org)", "--restricted-filter", "(memberOf=cn=restricted-group,ou=example,dc=full-domain-bind,dc=org)", "--username-attribute", "uid-bind full", "--firstname-attribute", "givenName-bind full", "--surname-attribute", "sn-bind full", "--email-attribute", "mail-bind full", "--public-ssh-key-attribute", "publickey-bind full", "--avatar-attribute", "avatar-bind full", "--bind-dn", "cn=readonly,dc=full-domain-bind,dc=org", "--bind-password", "secret-bind-full", "--attributes-in-bind", "--synchronize-users", "--page-size", "99", }, source: &auth.Source{ Type: auth.LDAP, Name: "ldap (via Bind DN) source full", IsActive: false, IsSyncEnabled: true, Cfg: &ldap.Source{ Name: "ldap (via Bind DN) source full", Host: "ldap-bind-server full", Port: 9876, SecurityProtocol: ldap.SecurityProtocol(1), SkipVerify: true, BindDN: "cn=readonly,dc=full-domain-bind,dc=org", BindPassword: "secret-bind-full", UserBase: "ou=Users,dc=full-domain-bind,dc=org", AttributeUsername: "uid-bind full", AttributeName: "givenName-bind full", AttributeSurname: "sn-bind full", AttributeMail: "mail-bind full", AttributesInBind: true, AttributeSSHPublicKey: "publickey-bind full", AttributeAvatar: "avatar-bind full", SearchPageSize: 99, Filter: "(memberOf=cn=user-group,ou=example,dc=full-domain-bind,dc=org)", AdminFilter: "(memberOf=cn=admin-group,ou=example,dc=full-domain-bind,dc=org)", RestrictedFilter: "(memberOf=cn=restricted-group,ou=example,dc=full-domain-bind,dc=org)", Enabled: true, }, }, }, // case 1 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source min", "--security-protocol", "unencrypted", "--host", "ldap-bind-server min", "--port", "1234", "--user-search-base", "ou=Users,dc=min-domain-bind,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=min-domain-bind,dc=org)", "--email-attribute", "mail-bind min", }, source: &auth.Source{ Type: auth.LDAP, Name: "ldap (via Bind DN) source min", IsActive: true, Cfg: &ldap.Source{ Name: "ldap (via Bind DN) source min", Host: "ldap-bind-server min", Port: 1234, SecurityProtocol: ldap.SecurityProtocol(0), UserBase: "ou=Users,dc=min-domain-bind,dc=org", AttributeMail: "mail-bind min", Filter: "(memberOf=cn=user-group,ou=example,dc=min-domain-bind,dc=org)", Enabled: true, }, }, }, // case 2 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source", "--security-protocol", "zzzzz", "--host", "ldap-server", "--port", "1234", "--user-search-base", "ou=Users,dc=domain,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=domain,dc=org)", "--email-attribute", "mail", }, errMsg: "Unknown security protocol name: zzzzz", }, // case 3 { args: []string{ "ldap-test", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "1234", "--user-search-base", "ou=Users,dc=domain,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=domain,dc=org)", "--email-attribute", "mail", }, errMsg: "name is not set", }, // case 4 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source", "--host", "ldap-server", "--port", "1234", "--user-search-base", "ou=Users,dc=domain,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=domain,dc=org)", "--email-attribute", "mail", }, errMsg: "security-protocol is not set", }, // case 5 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source", "--security-protocol", "unencrypted", "--port", "1234", "--user-search-base", "ou=Users,dc=domain,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=domain,dc=org)", "--email-attribute", "mail", }, errMsg: "host is not set", }, // case 6 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--user-search-base", "ou=Users,dc=domain,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=domain,dc=org)", "--email-attribute", "mail", }, errMsg: "port is not set", }, // case 7 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "1234", "--user-search-base", "ou=Users,dc=domain,dc=org", "--email-attribute", "mail", }, errMsg: "user-filter is not set", }, // case 8 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "1234", "--user-search-base", "ou=Users,dc=domain,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=domain,dc=org)", }, errMsg: "email-attribute is not set", }, } for n, c := range cases { // Mock functions. var createdAuthSource *auth.Source service := &authService{ initDB: func(context.Context) error { return nil }, createAuthSource: func(ctx context.Context, authSource *auth.Source) error { createdAuthSource = authSource return nil }, updateAuthSource: func(ctx context.Context, authSource *auth.Source) error { assert.FailNow(t, "should not call updateAuthSource", "case: %d", n) return nil }, getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) { assert.FailNow(t, "should not call getAuthSourceByID", "case: %d", n) return nil, nil }, } // Create a copy of command to test app := cli.NewApp() app.Flags = microcmdAuthAddLdapBindDn.Flags app.Action = service.addLdapBindDn // Run it err := app.Run(c.args) if c.errMsg != "" { assert.EqualError(t, err, c.errMsg, "case %d: error should match", n) } else { require.NoError(t, err, "case %d: should have no errors", n) assert.Equal(t, c.source, createdAuthSource, "case %d: wrong authSource", n) } }} func TestAddLdapSimpleAuth(t *testing.T) { // Mock cli functions to do not exit on error osExiter := cli.OsExiter defer func() { cli.OsExiter = osExiter }() cli.OsExiter = func(code int) {} // Test cases cases := []struct { args []string authSource *auth.Source errMsg string }{ // case 0 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source full", "--not-active", "--security-protocol", "starttls", "--skip-tls-verify", "--host", "ldap-simple-server full", "--port", "987", "--user-search-base", "ou=Users,dc=full-domain-simple,dc=org", "--user-filter", "(&(objectClass=posixAccount)(full-simple-cn=%s))", "--admin-filter", "(memberOf=cn=admin-group,ou=example,dc=full-domain-simple,dc=org)", "--restricted-filter", "(memberOf=cn=restricted-group,ou=example,dc=full-domain-simple,dc=org)", "--username-attribute", "uid-simple full", "--firstname-attribute", "givenName-simple full", "--surname-attribute", "sn-simple full", "--email-attribute", "mail-simple full", "--public-ssh-key-attribute", "publickey-simple full", "--avatar-attribute", "avatar-simple full", "--user-dn", "cn=%s,ou=Users,dc=full-domain-simple,dc=org", }, authSource: &auth.Source{ Type: auth.DLDAP, Name: "ldap (simple auth) source full", IsActive: false, Cfg: &ldap.Source{ Name: "ldap (simple auth) source full", Host: "ldap-simple-server full", Port: 987, SecurityProtocol: ldap.SecurityProtocol(2), SkipVerify: true, UserDN: "cn=%s,ou=Users,dc=full-domain-simple,dc=org", UserBase: "ou=Users,dc=full-domain-simple,dc=org", AttributeUsername: "uid-simple full", AttributeName: "givenName-simple full", AttributeSurname: "sn-simple full", AttributeMail: "mail-simple full", AttributeSSHPublicKey: "publickey-simple full", AttributeAvatar: "avatar-simple full", Filter: "(&(objectClass=posixAccount)(full-simple-cn=%s))", AdminFilter: "(memberOf=cn=admin-group,ou=example,dc=full-domain-simple,dc=org)", RestrictedFilter: "(memberOf=cn=restricted-group,ou=example,dc=full-domain-simple,dc=org)", Enabled: true, }, }, }, // case 1 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source min", "--security-protocol", "unencrypted", "--host", "ldap-simple-server min", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(min-simple-cn=%s))", "--email-attribute", "mail-simple min", "--user-dn", "cn=%s,ou=Users,dc=min-domain-simple,dc=org", }, authSource: &auth.Source{ Type: auth.DLDAP, Name: "ldap (simple auth) source min", IsActive: true, Cfg: &ldap.Source{ Name: "ldap (simple auth) source min", Host: "ldap-simple-server min", Port: 123, SecurityProtocol: ldap.SecurityProtocol(0), UserDN: "cn=%s,ou=Users,dc=min-domain-simple,dc=org", AttributeMail: "mail-simple min", Filter: "(&(objectClass=posixAccount)(min-simple-cn=%s))", Enabled: true, }, }, }, // case 2 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--security-protocol", "zzzzz", "--host", "ldap-server", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--email-attribute", "mail", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "Unknown security protocol name: zzzzz", }, // case 3 { args: []string{ "ldap-test", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--email-attribute", "mail", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "name is not set", }, // case 4 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--host", "ldap-server", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--email-attribute", "mail", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "security-protocol is not set", }, // case 5 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--security-protocol", "unencrypted", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--email-attribute", "mail", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "host is not set", }, // case 6 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--email-attribute", "mail", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "port is not set", }, // case 7 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "123", "--email-attribute", "mail", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "user-filter is not set", }, // case 8 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "email-attribute is not set", }, // case 9 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--email-attribute", "mail", }, errMsg: "user-dn is not set", }, } for n, c := range cases { // Mock functions. var createdAuthSource *auth.Source service := &authService{ initDB: func(context.Context) error { return nil }, createAuthSource: func(ctx context.Context, authSource *auth.Source) error { createdAuthSource = authSource return nil }, updateAuthSource: func(ctx context.Context, authSource *auth.Source) error { assert.FailNow(t, "should not call updateAuthSource", "case: %d", n) return nil }, getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) { assert.FailNow(t, "should not call getAuthSourceByID", "case: %d", n) return nil, nil }, } // Create a copy of command to test app := cli.NewApp() app.Flags = microcmdAuthAddLdapSimpleAuth.Flags app.Action = service.addLdapSimpleAuth // Run it err := app.Run(c.args) if c.errMsg != "" { assert.EqualError(t, err, c.errMsg, "case %d: error should match", n) } else { require.NoError(t, err, "case %d: should have no errors", n) assert.Equal(t, c.authSource, createdAuthSource, "case %d: wrong authSource", n) } }} func TestUpdateLdapBindDn(t *testing.T) { // Mock cli functions to do not exit on error osExiter := cli.OsExiter defer func() { cli.OsExiter = osExiter }() cli.OsExiter = func(code int) {} // Test cases cases := []struct { args []string id int64 existingAuthSource *auth.Source authSource *auth.Source errMsg string }{ // case 0 { args: []string{ "ldap-test", "--id", "23", "--name", "ldap (via Bind DN) source full", "--not-active", "--security-protocol", "LDAPS", "--skip-tls-verify", "--host", "ldap-bind-server full", "--port", "9876", "--user-search-base", "ou=Users,dc=full-domain-bind,dc=org",Lines 1–500 of 1326. Load more
// Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package cmd import ( "context" "testing" "forgejo.org/models/auth" "forgejo.org/services/auth/source/ldap" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" ) func TestAddLdapBindDn(t *testing.T) { // Mock cli functions to do not exit on error osExiter := cli.OsExiter defer func() { cli.OsExiter = osExiter }() cli.OsExiter = func(code int) {} // Test cases cases := []struct { args []string source *auth.Source errMsg string }{ // case 0 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source full", "--not-active", "--security-protocol", "ldaps", "--skip-tls-verify", "--host", "ldap-bind-server full", "--port", "9876", "--user-search-base", "ou=Users,dc=full-domain-bind,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=full-domain-bind,dc=org)", "--admin-filter", "(memberOf=cn=admin-group,ou=example,dc=full-domain-bind,dc=org)", "--restricted-filter", "(memberOf=cn=restricted-group,ou=example,dc=full-domain-bind,dc=org)", "--username-attribute", "uid-bind full", "--firstname-attribute", "givenName-bind full", "--surname-attribute", "sn-bind full", "--email-attribute", "mail-bind full", "--public-ssh-key-attribute", "publickey-bind full", "--avatar-attribute", "avatar-bind full", "--bind-dn", "cn=readonly,dc=full-domain-bind,dc=org", "--bind-password", "secret-bind-full", "--attributes-in-bind", "--synchronize-users", "--page-size", "99", }, source: &auth.Source{ Type: auth.LDAP, Name: "ldap (via Bind DN) source full", IsActive: false, IsSyncEnabled: true, Cfg: &ldap.Source{ Name: "ldap (via Bind DN) source full", Host: "ldap-bind-server full", Port: 9876, SecurityProtocol: ldap.SecurityProtocol(1), SkipVerify: true, BindDN: "cn=readonly,dc=full-domain-bind,dc=org", BindPassword: "secret-bind-full", UserBase: "ou=Users,dc=full-domain-bind,dc=org", AttributeUsername: "uid-bind full", AttributeName: "givenName-bind full", AttributeSurname: "sn-bind full", AttributeMail: "mail-bind full", AttributesInBind: true, AttributeSSHPublicKey: "publickey-bind full", AttributeAvatar: "avatar-bind full", SearchPageSize: 99, Filter: "(memberOf=cn=user-group,ou=example,dc=full-domain-bind,dc=org)", AdminFilter: "(memberOf=cn=admin-group,ou=example,dc=full-domain-bind,dc=org)", RestrictedFilter: "(memberOf=cn=restricted-group,ou=example,dc=full-domain-bind,dc=org)", Enabled: true, }, }, }, // case 1 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source min", "--security-protocol", "unencrypted", "--host", "ldap-bind-server min", "--port", "1234", "--user-search-base", "ou=Users,dc=min-domain-bind,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=min-domain-bind,dc=org)", "--email-attribute", "mail-bind min", }, source: &auth.Source{ Type: auth.LDAP, Name: "ldap (via Bind DN) source min", IsActive: true, Cfg: &ldap.Source{ Name: "ldap (via Bind DN) source min", Host: "ldap-bind-server min", Port: 1234, SecurityProtocol: ldap.SecurityProtocol(0), UserBase: "ou=Users,dc=min-domain-bind,dc=org", AttributeMail: "mail-bind min", Filter: "(memberOf=cn=user-group,ou=example,dc=min-domain-bind,dc=org)", Enabled: true, }, }, }, // case 2 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source", "--security-protocol", "zzzzz", "--host", "ldap-server", "--port", "1234", "--user-search-base", "ou=Users,dc=domain,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=domain,dc=org)", "--email-attribute", "mail", }, errMsg: "Unknown security protocol name: zzzzz", }, // case 3 { args: []string{ "ldap-test", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "1234", "--user-search-base", "ou=Users,dc=domain,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=domain,dc=org)", "--email-attribute", "mail", }, errMsg: "name is not set", }, // case 4 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source", "--host", "ldap-server", "--port", "1234", "--user-search-base", "ou=Users,dc=domain,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=domain,dc=org)", "--email-attribute", "mail", }, errMsg: "security-protocol is not set", }, // case 5 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source", "--security-protocol", "unencrypted", "--port", "1234", "--user-search-base", "ou=Users,dc=domain,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=domain,dc=org)", "--email-attribute", "mail", }, errMsg: "host is not set", }, // case 6 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--user-search-base", "ou=Users,dc=domain,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=domain,dc=org)", "--email-attribute", "mail", }, errMsg: "port is not set", }, // case 7 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "1234", "--user-search-base", "ou=Users,dc=domain,dc=org", "--email-attribute", "mail", }, errMsg: "user-filter is not set", }, // case 8 { args: []string{ "ldap-test", "--name", "ldap (via Bind DN) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "1234", "--user-search-base", "ou=Users,dc=domain,dc=org", "--user-filter", "(memberOf=cn=user-group,ou=example,dc=domain,dc=org)", }, errMsg: "email-attribute is not set", }, } for n, c := range cases { // Mock functions. var createdAuthSource *auth.Source service := &authService{ initDB: func(context.Context) error { return nil }, createAuthSource: func(ctx context.Context, authSource *auth.Source) error { createdAuthSource = authSource return nil }, updateAuthSource: func(ctx context.Context, authSource *auth.Source) error { assert.FailNow(t, "should not call updateAuthSource", "case: %d", n) return nil }, getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) { assert.FailNow(t, "should not call getAuthSourceByID", "case: %d", n) return nil, nil }, } // Create a copy of command to test app := cli.NewApp() app.Flags = microcmdAuthAddLdapBindDn.Flags app.Action = service.addLdapBindDn // Run it err := app.Run(c.args) if c.errMsg != "" { assert.EqualError(t, err, c.errMsg, "case %d: error should match", n) } else { require.NoError(t, err, "case %d: should have no errors", n) assert.Equal(t, c.source, createdAuthSource, "case %d: wrong authSource", n) } } } func TestAddLdapSimpleAuth(t *testing.T) { // Mock cli functions to do not exit on error osExiter := cli.OsExiter defer func() { cli.OsExiter = osExiter }() cli.OsExiter = func(code int) {} // Test cases cases := []struct { args []string authSource *auth.Source errMsg string }{ // case 0 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source full", "--not-active", "--security-protocol", "starttls", "--skip-tls-verify", "--host", "ldap-simple-server full", "--port", "987", "--user-search-base", "ou=Users,dc=full-domain-simple,dc=org", "--user-filter", "(&(objectClass=posixAccount)(full-simple-cn=%s))", "--admin-filter", "(memberOf=cn=admin-group,ou=example,dc=full-domain-simple,dc=org)", "--restricted-filter", "(memberOf=cn=restricted-group,ou=example,dc=full-domain-simple,dc=org)", "--username-attribute", "uid-simple full", "--firstname-attribute", "givenName-simple full", "--surname-attribute", "sn-simple full", "--email-attribute", "mail-simple full", "--public-ssh-key-attribute", "publickey-simple full", "--avatar-attribute", "avatar-simple full", "--user-dn", "cn=%s,ou=Users,dc=full-domain-simple,dc=org", }, authSource: &auth.Source{ Type: auth.DLDAP, Name: "ldap (simple auth) source full", IsActive: false, Cfg: &ldap.Source{ Name: "ldap (simple auth) source full", Host: "ldap-simple-server full", Port: 987, SecurityProtocol: ldap.SecurityProtocol(2), SkipVerify: true, UserDN: "cn=%s,ou=Users,dc=full-domain-simple,dc=org", UserBase: "ou=Users,dc=full-domain-simple,dc=org", AttributeUsername: "uid-simple full", AttributeName: "givenName-simple full", AttributeSurname: "sn-simple full", AttributeMail: "mail-simple full", AttributeSSHPublicKey: "publickey-simple full", AttributeAvatar: "avatar-simple full", Filter: "(&(objectClass=posixAccount)(full-simple-cn=%s))", AdminFilter: "(memberOf=cn=admin-group,ou=example,dc=full-domain-simple,dc=org)", RestrictedFilter: "(memberOf=cn=restricted-group,ou=example,dc=full-domain-simple,dc=org)", Enabled: true, }, }, }, // case 1 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source min", "--security-protocol", "unencrypted", "--host", "ldap-simple-server min", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(min-simple-cn=%s))", "--email-attribute", "mail-simple min", "--user-dn", "cn=%s,ou=Users,dc=min-domain-simple,dc=org", }, authSource: &auth.Source{ Type: auth.DLDAP, Name: "ldap (simple auth) source min", IsActive: true, Cfg: &ldap.Source{ Name: "ldap (simple auth) source min", Host: "ldap-simple-server min", Port: 123, SecurityProtocol: ldap.SecurityProtocol(0), UserDN: "cn=%s,ou=Users,dc=min-domain-simple,dc=org", AttributeMail: "mail-simple min", Filter: "(&(objectClass=posixAccount)(min-simple-cn=%s))", Enabled: true, }, }, }, // case 2 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--security-protocol", "zzzzz", "--host", "ldap-server", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--email-attribute", "mail", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "Unknown security protocol name: zzzzz", }, // case 3 { args: []string{ "ldap-test", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--email-attribute", "mail", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "name is not set", }, // case 4 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--host", "ldap-server", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--email-attribute", "mail", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "security-protocol is not set", }, // case 5 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--security-protocol", "unencrypted", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--email-attribute", "mail", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "host is not set", }, // case 6 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--email-attribute", "mail", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "port is not set", }, // case 7 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "123", "--email-attribute", "mail", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "user-filter is not set", }, // case 8 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--user-dn", "cn=%s,ou=Users,dc=domain,dc=org", }, errMsg: "email-attribute is not set", }, // case 9 { args: []string{ "ldap-test", "--name", "ldap (simple auth) source", "--security-protocol", "unencrypted", "--host", "ldap-server", "--port", "123", "--user-filter", "(&(objectClass=posixAccount)(cn=%s))", "--email-attribute", "mail", }, errMsg: "user-dn is not set", }, } for n, c := range cases { // Mock functions. var createdAuthSource *auth.Source service := &authService{ initDB: func(context.Context) error { return nil }, createAuthSource: func(ctx context.Context, authSource *auth.Source) error { createdAuthSource = authSource return nil }, updateAuthSource: func(ctx context.Context, authSource *auth.Source) error { assert.FailNow(t, "should not call updateAuthSource", "case: %d", n) return nil }, getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) { assert.FailNow(t, "should not call getAuthSourceByID", "case: %d", n) return nil, nil }, } // Create a copy of command to test app := cli.NewApp() app.Flags = microcmdAuthAddLdapSimpleAuth.Flags app.Action = service.addLdapSimpleAuth // Run it err := app.Run(c.args) if c.errMsg != "" { assert.EqualError(t, err, c.errMsg, "case %d: error should match", n) } else { require.NoError(t, err, "case %d: should have no errors", n) assert.Equal(t, c.authSource, createdAuthSource, "case %d: wrong authSource", n) } } } func TestUpdateLdapBindDn(t *testing.T) { // Mock cli functions to do not exit on error osExiter := cli.OsExiter defer func() { cli.OsExiter = osExiter }() cli.OsExiter = func(code int) {} // Test cases cases := []struct { args []string id int64 existingAuthSource *auth.Source authSource *auth.Source errMsg string }{ // case 0 { args: []string{ "ldap-test", "--id", "23", "--name", "ldap (via Bind DN) source full", "--not-active", "--security-protocol", "LDAPS", "--skip-tls-verify", "--host", "ldap-bind-server full", "--port", "9876", "--user-search-base", "ou=Users,dc=full-domain-bind,dc=org",