LDAP: Move LDAP globals to Config (#63255)
* structure dtos and private methods * add basic LDAP service * use LDAP service in ldap debug API * lower non fatal error * remove unused globals * wip * remove final globals * fix tests to use cfg enabled * restructure errors * remove logger from globals * use ldap service in authn * use ldap service in context handler * fix failed tests * fix ldap middleware provides * fix provides in auth_test.go
This commit is contained in:
@@ -5,13 +5,13 @@ import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/grafana/grafana/pkg/infra/remotecache"
|
||||
"github.com/hashicorp/go-multierror"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/grafana/grafana/pkg/infra/kvstore"
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/infra/network"
|
||||
"github.com/grafana/grafana/pkg/infra/remotecache"
|
||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||
"github.com/grafana/grafana/pkg/infra/usagestats"
|
||||
"github.com/grafana/grafana/pkg/login/social"
|
||||
@@ -22,6 +22,7 @@ import (
|
||||
"github.com/grafana/grafana/pkg/services/authn/authnimpl/sync"
|
||||
"github.com/grafana/grafana/pkg/services/authn/clients"
|
||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||
"github.com/grafana/grafana/pkg/services/ldap/service"
|
||||
"github.com/grafana/grafana/pkg/services/login"
|
||||
"github.com/grafana/grafana/pkg/services/loginattempt"
|
||||
"github.com/grafana/grafana/pkg/services/oauthtoken"
|
||||
@@ -59,6 +60,7 @@ func ProvideService(
|
||||
authInfoService login.AuthInfoService, renderService rendering.Service,
|
||||
features *featuremgmt.FeatureManager, oauthTokenService oauthtoken.OAuthTokenService,
|
||||
socialService social.Service, cache *remotecache.RemoteCache,
|
||||
ldapService service.LDAP,
|
||||
) *Service {
|
||||
s := &Service{
|
||||
log: log.New("authn.service"),
|
||||
@@ -87,7 +89,7 @@ func ProvideService(
|
||||
var proxyClients []authn.ProxyClient
|
||||
var passwordClients []authn.PasswordClient
|
||||
if s.cfg.LDAPEnabled {
|
||||
ldap := clients.ProvideLDAP(cfg)
|
||||
ldap := clients.ProvideLDAP(cfg, ldapService)
|
||||
proxyClients = append(proxyClients, ldap)
|
||||
passwordClients = append(passwordClients, ldap)
|
||||
}
|
||||
|
||||
@@ -13,8 +13,13 @@ import (
|
||||
var _ authn.ProxyClient = new(LDAP)
|
||||
var _ authn.PasswordClient = new(LDAP)
|
||||
|
||||
func ProvideLDAP(cfg *setting.Cfg) *LDAP {
|
||||
return &LDAP{cfg, &ldapServiceImpl{cfg}}
|
||||
type ldapService interface {
|
||||
Login(query *login.LoginUserQuery) (*login.ExternalUserInfo, error)
|
||||
User(username string) (*login.ExternalUserInfo, error)
|
||||
}
|
||||
|
||||
func ProvideLDAP(cfg *setting.Cfg, ldapService ldapService) *LDAP {
|
||||
return &LDAP{cfg, ldapService}
|
||||
}
|
||||
|
||||
type LDAP struct {
|
||||
@@ -60,35 +65,6 @@ func (c *LDAP) AuthenticatePassword(ctx context.Context, r *authn.Request, usern
|
||||
return identityFromLDAPInfo(r.OrgID, info, c.cfg.LDAPAllowSignup), nil
|
||||
}
|
||||
|
||||
type ldapService interface {
|
||||
Login(query *login.LoginUserQuery) (*login.ExternalUserInfo, error)
|
||||
User(username string) (*login.ExternalUserInfo, error)
|
||||
}
|
||||
|
||||
// FIXME: remove the implementation if we convert ldap to an actual service
|
||||
type ldapServiceImpl struct {
|
||||
cfg *setting.Cfg
|
||||
}
|
||||
|
||||
func (s *ldapServiceImpl) Login(query *login.LoginUserQuery) (*login.ExternalUserInfo, error) {
|
||||
cfg, err := multildap.GetConfig(s.cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return multildap.New(cfg.Servers).Login(query)
|
||||
}
|
||||
|
||||
func (s *ldapServiceImpl) User(username string) (*login.ExternalUserInfo, error) {
|
||||
cfg, err := multildap.GetConfig(s.cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
user, _, err := multildap.New(cfg.Servers).User(username)
|
||||
return user, err
|
||||
}
|
||||
|
||||
func identityFromLDAPInfo(orgID int64, info *login.ExternalUserInfo, allowSignup bool) *authn.Identity {
|
||||
return &authn.Identity{
|
||||
OrgID: orgID,
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
"github.com/grafana/grafana/pkg/services/authn"
|
||||
"github.com/grafana/grafana/pkg/services/ldap"
|
||||
"github.com/grafana/grafana/pkg/services/ldap/multildap"
|
||||
"github.com/grafana/grafana/pkg/services/ldap/service"
|
||||
"github.com/grafana/grafana/pkg/services/login"
|
||||
"github.com/grafana/grafana/pkg/services/org"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
@@ -68,7 +69,7 @@ func TestLDAP_AuthenticateProxy(t *testing.T) {
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.desc, func(t *testing.T) {
|
||||
c := &LDAP{cfg: setting.NewCfg(), service: fakeLDAPService{ExpectedInfo: tt.expectedLDAPInfo, ExpectedErr: tt.expectedLDAPErr}}
|
||||
c := &LDAP{cfg: setting.NewCfg(), service: &service.LDAPFakeService{ExpectedUser: tt.expectedLDAPInfo, ExpectedError: tt.expectedLDAPErr}}
|
||||
identity, err := c.AuthenticateProxy(context.Background(), &authn.Request{OrgID: 1}, tt.username, nil)
|
||||
assert.ErrorIs(t, err, tt.expectedErr)
|
||||
assert.EqualValues(t, tt.expectedIdentity, identity)
|
||||
@@ -140,7 +141,7 @@ func TestLDAP_AuthenticatePassword(t *testing.T) {
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.desc, func(t *testing.T) {
|
||||
c := &LDAP{cfg: setting.NewCfg(), service: fakeLDAPService{ExpectedInfo: tt.expectedLDAPInfo, ExpectedErr: tt.expectedLDAPErr}}
|
||||
c := &LDAP{cfg: setting.NewCfg(), service: &service.LDAPFakeService{ExpectedUser: tt.expectedLDAPInfo, ExpectedError: tt.expectedLDAPErr}}
|
||||
|
||||
identity, err := c.AuthenticatePassword(context.Background(), &authn.Request{OrgID: 1}, tt.username, tt.password)
|
||||
assert.ErrorIs(t, err, tt.expectedErr)
|
||||
@@ -152,18 +153,3 @@ func TestLDAP_AuthenticatePassword(t *testing.T) {
|
||||
func strPtr(s string) *string {
|
||||
return &s
|
||||
}
|
||||
|
||||
var _ ldapService = new(fakeLDAPService)
|
||||
|
||||
type fakeLDAPService struct {
|
||||
ExpectedErr error
|
||||
ExpectedInfo *login.ExternalUserInfo
|
||||
}
|
||||
|
||||
func (f fakeLDAPService) Login(query *login.LoginUserQuery) (*login.ExternalUserInfo, error) {
|
||||
return f.ExpectedInfo, f.ExpectedErr
|
||||
}
|
||||
|
||||
func (f fakeLDAPService) User(username string) (*login.ExternalUserInfo, error) {
|
||||
return f.ExpectedInfo, f.ExpectedErr
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user