2018-01-26 10:41:41 +01:00
|
|
|
package login
|
|
|
|
|
|
|
|
|
|
import (
|
2021-11-08 09:53:51 -05:00
|
|
|
"context"
|
2019-04-26 15:47:16 +03:00
|
|
|
"errors"
|
2018-01-26 10:41:41 +01:00
|
|
|
"testing"
|
|
|
|
|
|
2023-01-27 13:36:54 -05:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
|
2019-05-17 14:57:26 +03:00
|
|
|
"github.com/grafana/grafana/pkg/services/ldap"
|
2023-02-08 09:32:59 +01:00
|
|
|
"github.com/grafana/grafana/pkg/services/ldap/multildap"
|
2023-01-27 13:36:54 -05:00
|
|
|
"github.com/grafana/grafana/pkg/services/login"
|
2022-04-04 20:36:15 +02:00
|
|
|
"github.com/grafana/grafana/pkg/services/login/logintest"
|
2018-01-26 10:41:41 +01:00
|
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
|
|
|
)
|
|
|
|
|
|
2020-11-05 13:07:06 +01:00
|
|
|
var errTest = errors.New("test error")
|
2019-04-26 15:47:16 +03:00
|
|
|
|
2021-01-01 13:11:04 +01:00
|
|
|
func TestLoginUsingLDAP(t *testing.T) {
|
|
|
|
|
LDAPLoginScenario(t, "When LDAP enabled and no server configured", func(sc *LDAPLoginScenarioContext) {
|
|
|
|
|
setting.LDAPEnabled = true
|
2018-01-26 10:41:41 +01:00
|
|
|
|
2021-01-01 13:11:04 +01:00
|
|
|
sc.withLoginResult(false)
|
|
|
|
|
getLDAPConfig = func(*setting.Cfg) (*ldap.Config, error) {
|
|
|
|
|
config := &ldap.Config{
|
|
|
|
|
Servers: []*ldap.ServerConfig{},
|
|
|
|
|
}
|
2018-01-26 10:41:41 +01:00
|
|
|
|
2021-01-01 13:11:04 +01:00
|
|
|
return config, nil
|
|
|
|
|
}
|
2018-01-26 10:41:41 +01:00
|
|
|
|
2022-04-04 20:36:15 +02:00
|
|
|
loginService := &logintest.LoginServiceFake{}
|
|
|
|
|
enabled, err := loginUsingLDAP(context.Background(), sc.loginUserQuery, loginService)
|
2021-01-01 13:11:04 +01:00
|
|
|
require.EqualError(t, err, errTest.Error())
|
2018-01-26 10:41:41 +01:00
|
|
|
|
2021-01-01 13:11:04 +01:00
|
|
|
assert.True(t, enabled)
|
|
|
|
|
assert.True(t, sc.LDAPAuthenticatorMock.loginCalled)
|
|
|
|
|
})
|
2018-01-26 10:41:41 +01:00
|
|
|
|
2021-01-01 13:11:04 +01:00
|
|
|
LDAPLoginScenario(t, "When LDAP disabled", func(sc *LDAPLoginScenarioContext) {
|
|
|
|
|
setting.LDAPEnabled = false
|
2018-01-26 10:41:41 +01:00
|
|
|
|
2021-01-01 13:11:04 +01:00
|
|
|
sc.withLoginResult(false)
|
2022-04-04 20:36:15 +02:00
|
|
|
loginService := &logintest.LoginServiceFake{}
|
|
|
|
|
enabled, err := loginUsingLDAP(context.Background(), sc.loginUserQuery, loginService)
|
2021-01-01 13:11:04 +01:00
|
|
|
require.NoError(t, err)
|
2018-01-26 10:41:41 +01:00
|
|
|
|
2021-01-01 13:11:04 +01:00
|
|
|
assert.False(t, enabled)
|
|
|
|
|
assert.False(t, sc.LDAPAuthenticatorMock.loginCalled)
|
2018-01-26 10:41:41 +01:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-26 15:47:16 +03:00
|
|
|
type mockAuth struct {
|
2018-01-26 10:41:41 +01:00
|
|
|
validLogin bool
|
|
|
|
|
loginCalled bool
|
2019-09-04 15:29:14 +01:00
|
|
|
pingCalled bool
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (auth *mockAuth) Ping() ([]*multildap.ServerStatus, error) {
|
|
|
|
|
auth.pingCalled = true
|
|
|
|
|
|
|
|
|
|
return nil, nil
|
2018-01-26 10:41:41 +01:00
|
|
|
}
|
|
|
|
|
|
2023-01-27 13:36:54 -05:00
|
|
|
func (auth *mockAuth) Login(query *login.LoginUserQuery) (
|
|
|
|
|
*login.ExternalUserInfo,
|
2019-05-17 14:57:26 +03:00
|
|
|
error,
|
|
|
|
|
) {
|
2019-04-26 15:47:16 +03:00
|
|
|
auth.loginCalled = true
|
2018-01-26 10:41:41 +01:00
|
|
|
|
2019-04-26 15:47:16 +03:00
|
|
|
if !auth.validLogin {
|
2019-05-17 14:57:26 +03:00
|
|
|
return nil, errTest
|
2018-01-26 10:41:41 +01:00
|
|
|
}
|
|
|
|
|
|
2019-05-17 14:57:26 +03:00
|
|
|
return nil, nil
|
2018-01-26 10:41:41 +01:00
|
|
|
}
|
|
|
|
|
|
2019-05-17 14:57:26 +03:00
|
|
|
func (auth *mockAuth) Users(logins []string) (
|
2023-01-27 13:36:54 -05:00
|
|
|
[]*login.ExternalUserInfo,
|
2019-05-17 14:57:26 +03:00
|
|
|
error,
|
|
|
|
|
) {
|
2019-04-26 15:47:16 +03:00
|
|
|
return nil, nil
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-17 14:57:26 +03:00
|
|
|
func (auth *mockAuth) User(login string) (
|
2023-01-27 13:36:54 -05:00
|
|
|
*login.ExternalUserInfo,
|
2019-09-03 18:34:44 +01:00
|
|
|
ldap.ServerConfig,
|
2019-05-17 14:57:26 +03:00
|
|
|
error,
|
|
|
|
|
) {
|
2019-09-03 18:34:44 +01:00
|
|
|
return nil, ldap.ServerConfig{}, nil
|
2019-05-17 14:57:26 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (auth *mockAuth) Add(dn string, values map[string][]string) error {
|
2018-01-26 10:41:41 +01:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-17 14:57:26 +03:00
|
|
|
func (auth *mockAuth) Remove(dn string) error {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func mockLDAPAuthenticator(valid bool) *mockAuth {
|
|
|
|
|
mock := &mockAuth{
|
|
|
|
|
validLogin: valid,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
newLDAP = func(servers []*ldap.ServerConfig) multildap.IMultiLDAP {
|
|
|
|
|
return mock
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return mock
|
2018-01-26 10:41:41 +01:00
|
|
|
}
|
|
|
|
|
|
2019-05-17 14:57:26 +03:00
|
|
|
type LDAPLoginScenarioContext struct {
|
2023-01-27 13:36:54 -05:00
|
|
|
loginUserQuery *login.LoginUserQuery
|
2019-05-17 14:57:26 +03:00
|
|
|
LDAPAuthenticatorMock *mockAuth
|
2018-01-26 10:41:41 +01:00
|
|
|
}
|
|
|
|
|
|
2019-05-17 14:57:26 +03:00
|
|
|
type LDAPLoginScenarioFunc func(c *LDAPLoginScenarioContext)
|
2018-01-26 10:41:41 +01:00
|
|
|
|
2021-01-01 13:11:04 +01:00
|
|
|
func LDAPLoginScenario(t *testing.T, desc string, fn LDAPLoginScenarioFunc) {
|
|
|
|
|
t.Helper()
|
|
|
|
|
|
|
|
|
|
t.Run(desc, func(t *testing.T) {
|
2019-04-26 15:47:16 +03:00
|
|
|
mock := &mockAuth{}
|
2018-01-26 10:41:41 +01:00
|
|
|
|
2019-05-17 14:57:26 +03:00
|
|
|
sc := &LDAPLoginScenarioContext{
|
2023-01-27 13:36:54 -05:00
|
|
|
loginUserQuery: &login.LoginUserQuery{
|
2018-01-26 10:41:41 +01:00
|
|
|
Username: "user",
|
|
|
|
|
Password: "pwd",
|
|
|
|
|
IpAddress: "192.168.1.1:56433",
|
|
|
|
|
},
|
2019-05-17 14:57:26 +03:00
|
|
|
LDAPAuthenticatorMock: mock,
|
2019-04-26 15:47:16 +03:00
|
|
|
}
|
|
|
|
|
|
2020-12-11 11:44:44 +01:00
|
|
|
origNewLDAP := newLDAP
|
|
|
|
|
origGetLDAPConfig := getLDAPConfig
|
2021-01-01 13:11:04 +01:00
|
|
|
origLDAPEnabled := setting.LDAPEnabled
|
|
|
|
|
t.Cleanup(func() {
|
2020-12-11 11:44:44 +01:00
|
|
|
newLDAP = origNewLDAP
|
|
|
|
|
getLDAPConfig = origGetLDAPConfig
|
2021-01-01 13:11:04 +01:00
|
|
|
setting.LDAPEnabled = origLDAPEnabled
|
|
|
|
|
})
|
2020-12-11 11:44:44 +01:00
|
|
|
|
|
|
|
|
getLDAPConfig = func(*setting.Cfg) (*ldap.Config, error) {
|
2019-05-17 14:57:26 +03:00
|
|
|
config := &ldap.Config{
|
|
|
|
|
Servers: []*ldap.ServerConfig{
|
2019-04-26 15:47:16 +03:00
|
|
|
{
|
|
|
|
|
Host: "",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-03 22:53:07 +10:00
|
|
|
return config, nil
|
2019-04-26 15:47:16 +03:00
|
|
|
}
|
|
|
|
|
|
2019-05-17 14:57:26 +03:00
|
|
|
newLDAP = func(server []*ldap.ServerConfig) multildap.IMultiLDAP {
|
2019-04-26 15:47:16 +03:00
|
|
|
return mock
|
2018-01-26 10:41:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn(sc)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-17 14:57:26 +03:00
|
|
|
func (sc *LDAPLoginScenarioContext) withLoginResult(valid bool) {
|
|
|
|
|
sc.LDAPAuthenticatorMock = mockLDAPAuthenticator(valid)
|
2018-01-26 10:41:41 +01:00
|
|
|
}
|