mirror of https://github.com/grafana/grafana
Auth: Implement reload function for LDAP (#89267)
* keep config in a separate struct in LDAP * implement reload function for LDAP * remove param from sso service constructor * update unit tests * add feature flag * remove nil params * address feedback * add unit test for disabled configpull/89305/head^2
parent
0afbaa39df
commit
d074cc7892
|
@ -0,0 +1,299 @@ |
|||||||
|
package service |
||||||
|
|
||||||
|
import ( |
||||||
|
"context" |
||||||
|
"sync" |
||||||
|
"testing" |
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/services/featuremgmt" |
||||||
|
"github.com/grafana/grafana/pkg/services/ldap" |
||||||
|
"github.com/grafana/grafana/pkg/services/ssosettings/models" |
||||||
|
"github.com/stretchr/testify/require" |
||||||
|
) |
||||||
|
|
||||||
|
const ( |
||||||
|
validCert = `LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURYVENDQWtXZ0F3SUJBZ0lKQUxtVlZ1RFd1NE5ZTUEwR0NTcUdTSWIzRFFFQkN |
||||||
|
3VUFNRVV4Q3pBSkJnTlYKQkFZVEFrRlZNUk13RVFZRFZRUUlEQXBUYjIxbExWTjBZWFJsTVNFd0h3WURWUVFLREJoSmJuUmxjbTVsZENCWAphV1JuYVhSekl |
||||||
|
GQjBlU0JNZEdRd0hoY05NVFl4TWpNeE1UUXpORFEzV2hjTk5EZ3dOakkxTVRRek5EUTNXakJGCk1Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFR0ExVUVDQXdLVTI |
||||||
|
5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTAKWlhKdVpYUWdWMmxrWjJsMGN5QlFkSGtnVEhSa01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUTh |
||||||
|
BTUlJQgpDZ0tDQVFFQXpVQ0ZvemdOYjFoMU0wanpOUlNDamhPQm5SK3VWYlZwYVdmWFlJUitBaFdEZEVlNXJ5WStDZ2F2Ck9nOGJmTHlieXpGZGVobFlkRFJ |
||||||
|
na2VkRUIvR2pHOGFKdzA2bDBxRjRqRE9BdzBrRXlnV0N1Mm1jSDdYT3hSdCsKWUFIM1RWSGEvSHUxVzNXanprb2JxcXFMUThna0tXV00yN2ZPZ0FaNkdpZWF |
||||||
|
KQk42VkJTTU1jUGV5M0hXTEJtYworVFlKbXYxZGJhTzJqSGhLaDhwZkt3MFcxMlZNOFAxUElPOGd2NFBodS91dUpZaWVCV0tpeEJFeXkwbEhqeWl4CllGQ1I |
||||||
|
xMnhkaDRDQTQ3cTk1OFpSR25uRFVHRlZFMVFoZ1JhY0pDT1o5YmQ1dDltcjhLTGFWQllUQ0pvNUVSRTgKanltYWI1ZFBxZTVxS2ZKc0NaaXFXZ2xialVvOXR |
||||||
|
3SURBUUFCbzFBd1RqQWRCZ05WSFE0RUZnUVV4cHV3Y3MvQwpZUU95dWkrcjFHKzNLeEJOaHhrd0h3WURWUjBqQkJnd0ZvQVV4cHV3Y3MvQ1lRT3l1aStyMUc |
||||||
|
rM0t4Qk5oeGt3CkRBWURWUjBUQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBQWlXVUtzLzJ4L3ZpTkNLaTNZNmIKbEV1Q3RBR2h6T09aOUV |
||||||
|
qcnZKOCtDT0gzUmFnM3RWQldyY0JaMy91aGhQcTVneTlscXc0T2t2RXdzOTkvNWpGcwpYMUZKNk1LQmdxZnV5N3loNXMxWWZNMEFOSFljek1tWXBaZUFjUWY |
||||||
|
yQ0dBYVZmd1RUZlNsek5Mc0YybFcvbHk3CnlhcEZ6bFlTSkxHb1ZFK09IRXU4ZzVTbE5BQ1VFZmtYdys1RWdoaCtLemxJTjdSNlE3cjJpeFdORkJDL2pXZjc |
||||||
|
KTktVZkp5WDhxSUc1bWQxWVVlVDZHQlc5Qm0yLzEvUmlPMjRKVGFZbGZMZEtLOVRZYjhzRzVCK09MYWIyREltRwo5OUNKMjVSa0FjU29iV05GNXpEME82bGd |
||||||
|
PbzNjRWRCL2tzQ3EzaG10bEMvRGxMWi9EOENKKzdWdVpuUzFyUjJuCmFRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==` |
||||||
|
validKey = `LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFdlFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLY3dnZ1NqQWdFQUFv |
||||||
|
SUJBUUROUUlXak9BMXZXSFV6ClNQTTFGSUtPRTRHZEg2NVZ0V2xwWjlkZ2hINENGWU4wUjdtdkpqNEtCcTg2RHh0OHZKdkxNVjE2R1ZoME5HQ1IKNTBRSDhh |
||||||
|
TWJ4b25EVHFYU29YaU1NNEREU1FUS0JZSzdhWndmdGM3RkczNWdBZmROVWRyOGU3VmJkYVBPU2h1cQpxb3REeUNRcFpZemJ0ODZBQm5vYUo1b2tFM3BVRkl3 |
||||||
|
eHc5N0xjZFlzR1p6NU5nbWEvVjF0bzdhTWVFcUh5bDhyCkRSYlhaVXp3L1U4Zzd5Qy9nK0c3KzY0bGlKNEZZcUxFRVRMTFNVZVBLTEZnVUpIWGJGMkhnSURq |
||||||
|
dXIzbnhsRWEKZWNOUVlWVVRWQ0dCRnB3a0k1bjF0M20zMmF2d290cFVGaE1JbWprUkVUeVBLWnB2bDArcDdtb3A4bXdKbUtwYQpDVnVOU2oyM0FnTUJBQUVD |
||||||
|
Z2dFQUJuNEkvQjIweHhYY056QVNpVlpKdnVhOURkUkh0bXhUbGtMem5CajB4Mm9ZCnkxL05iczNkM29GUm41dUV1aEJaT1RjcGhzZ3dkUlNIRFhac1AzZ1VP |
||||||
|
YmV3K2QyTi96aWVVSWo4aExEVmx2SlAKclUvczRVL2w1M1EwTGlOQnlFOVRodkwrekpMUENLSnRkNXVIWmpCNWZGbTY5K1E3Z3U4eGc0eEhJdWIrMHBQNQpQ |
||||||
|
SGFubUhDRHJiZ05OL29xbGFyNEZaMk1YVGdla1c2QW15Yy9rb0U5aEluNEJhYTJLZS9CL0FVR1k0cE1STHFwClRBcnQrR1RWZVdlb0ZZOVFBQ1VwYUhwSmhH |
||||||
|
Yi9QaW91NnRsVTU3ZTQyY0xva2kxZjArU0FSc0JCS3lYQTdCQjEKMWZNSDEwS1FZRkE2OGRUWVdsS3pRYXUvSzR4YXFnNEZLbXR3RjY2R1FRS0JnUUQ5T3BO |
||||||
|
VVM3b1J4TUhWSmFCUgpUTldXK1YxRlh5Y3FvamVrRnBEaWpQYjJYNUNXVjE2b2VXZ2FYcDBuT0hGZHk5RVdzM0d0R3BmWmFzYVJWSHNYClNIdFBoNE5iOEpx |
||||||
|
SGRHRTAvQ0Q2dDArNERuczhCbjljU3F0ZFFCN1IzSm43SU1YaTlYL1U4TERLbytBMTgvSnEKVjhWZ1VuZ01ueTlZak1rUUliSzhUUldrWVFLQmdRRFBmNG54 |
||||||
|
TzZqdSt0T0hIT1JRdHkzYllERDArT1YzSTArTAoweXowdVByZXJ5QlZpOW5ZNDNLYWtINTJEN1VaRXd3c0JqakdYRCtXSDh4RXNtQldzR05YSnUwMjVQdnpJ |
||||||
|
Sm96CmxBRWlYdk1wL05tWXArdFk0ckRtTzhSaHlWb2NCcVdIemgzOG0wSUZPZDRCeUZENW5MRURyQTNwRFZvMGFOZ1kKbjBHd1J5c1pGd0tCZ1FEa0NqM202 |
||||||
|
Wk1Vc1VXRXR5K2FSMEVKaG1LeU9EQkRPblkwOUlWaEgyUy9GZXhWRnpVTgpMdGZLOTIwNmhwL0F3ZXozTG4ydVQ0WnpxcTVLN2ZNelVuaUpkQldkVkIwMDRs |
||||||
|
OHZvZVhwSWU5T1p1d2ZjQko5CmdGaTF6eXB4L3VGRHY0MjFCelFwQk4rUWZPZEtidmJkUVZGam5xQ3hiU0RyODB5VmxHTXJJNWZid1FLQmdHMDkKb1JyZXBP |
||||||
|
N0VJTzhHTi9HQ3J1TEsvcHRLR2t5aHkzUTZ4blZFbWRiNDdoWDduY0pBNUlvWlBtcmJsQ1ZTVU5zdwpuMTFYSGFia3NMOE9CZ2c5cnQ4b1FFVGhRdi9hRHpU |
||||||
|
T1c5YURsSk5yYWdlamlCVHdxOTlhWWVaMWdqbzFDWnE0CjJqS3VicENmeVpDNHJHRHRySWZaWWkxcStTMlVjUWh0ZDhEZGh3UWJBb0dBQU00RXBEQTR5SEI1 |
||||||
|
eWllazFwL28KQ2JxUkN0YS9EeDZFeW8wS2xOQXlQdUZQQXNodXBHNE5CeDdtVDJBU2ZMKzJWQkhvaTZtSFNyaStCRFg1cnlZRgpmTVl2cDdVUllvcTd3N3Fp |
||||||
|
dlJsdnZFZzV5b1lySzEzRjIrR2o2eEo0akVOOW0wS2RNL2czbUpHcTBIQlRJUXJwClNtNzVXWHNmbE94dVRuMDhMYmdHYzRzPQotLS0tLUVORCBSU0EgUFJJ |
||||||
|
VkFURSBLRVktLS0tLQ==` |
||||||
|
) |
||||||
|
|
||||||
|
var ( |
||||||
|
isAdmin = true |
||||||
|
) |
||||||
|
|
||||||
|
func TestReload(t *testing.T) { |
||||||
|
testCases := []struct { |
||||||
|
description string |
||||||
|
settings models.SSOSettings |
||||||
|
expectedServersConfig *ldap.ServersConfig |
||||||
|
expectedConfig *ldap.Config |
||||||
|
}{ |
||||||
|
{ |
||||||
|
description: "basic flow with minimal config", |
||||||
|
settings: models.SSOSettings{ |
||||||
|
Provider: "ldap", |
||||||
|
Settings: map[string]any{ |
||||||
|
"enabled": true, |
||||||
|
"skip_org_role_sync": false, |
||||||
|
"allow_sign_up": true, |
||||||
|
"config": map[string]any{ |
||||||
|
"servers": []any{ |
||||||
|
map[string]any{ |
||||||
|
"host": "127.0.0.1", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
IsDeleted: false, |
||||||
|
}, |
||||||
|
expectedServersConfig: &ldap.ServersConfig{ |
||||||
|
Servers: []*ldap.ServerConfig{ |
||||||
|
{ |
||||||
|
Host: "127.0.0.1", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
expectedConfig: &ldap.Config{ |
||||||
|
Enabled: true, |
||||||
|
AllowSignUp: true, |
||||||
|
SkipOrgRoleSync: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
description: "complete set of server parameters", |
||||||
|
settings: models.SSOSettings{ |
||||||
|
Provider: "ldap", |
||||||
|
Settings: map[string]any{ |
||||||
|
"enabled": true, |
||||||
|
"skip_org_role_sync": false, |
||||||
|
"allow_sign_up": true, |
||||||
|
"config": map[string]any{ |
||||||
|
"servers": []any{ |
||||||
|
map[string]any{ |
||||||
|
"host": "127.0.0.1", |
||||||
|
"port": 3389, |
||||||
|
"bind_dn": "cn=ldapservice,ou=users,dc=ldap,dc=goauthentik,dc=io", |
||||||
|
"bind_password": "grafana", |
||||||
|
"search_filter": "(cn=%s)", |
||||||
|
"ssl_skip_verify": false, |
||||||
|
"use_ssl": true, |
||||||
|
"start_tls": true, |
||||||
|
"min_tls_version": "TLS1.3", |
||||||
|
"timeout": 10, |
||||||
|
"root_ca_cert": "/path/to/certificate.crt", |
||||||
|
"root_ca_cert_value": []string{validCert}, |
||||||
|
"client_cert": "/path/to/client.crt", |
||||||
|
"client_cert_value": validCert, |
||||||
|
"client_key": "/path/to/client.key", |
||||||
|
"client_key_value": validKey, |
||||||
|
"group_search_filter": "(&(objectClass=posixGroup)(memberUid=%s))", |
||||||
|
"group_search_filter_user_attribute": "distinguishedName", |
||||||
|
"group_search_base_dns": []string{"ou=groups,dc=grafana,dc=org"}, |
||||||
|
"tls_ciphers": []string{ |
||||||
|
"TLS_AES_256_GCM_SHA384", |
||||||
|
}, |
||||||
|
"attributes": map[string]string{ |
||||||
|
"email": "mail", |
||||||
|
"member_of": "memberOf", |
||||||
|
"name": "displayName", |
||||||
|
"surname": "sn", |
||||||
|
"username": "cn", |
||||||
|
}, |
||||||
|
"search_base_dns": []string{ |
||||||
|
"DC=ldap,DC=goauthentik,DC=io", |
||||||
|
}, |
||||||
|
"group_mappings": []any{ |
||||||
|
map[string]any{ |
||||||
|
"group_dn": "cn=admin,ou=groups,dc=ldap,dc=goauthentik,dc=io", |
||||||
|
"org_id": 1, |
||||||
|
"org_role": "Admin", |
||||||
|
"grafana_admin": true, |
||||||
|
}, |
||||||
|
map[string]any{ |
||||||
|
"group_dn": "cn=editor,ou=groups,dc=ldap,dc=goauthentik,dc=io", |
||||||
|
"org_id": 1, |
||||||
|
"org_role": "Editor", |
||||||
|
}, |
||||||
|
map[string]any{ |
||||||
|
"group_dn": "cn=viewer,ou=groups,dc=ldap,dc=goauthentik,dc=io", |
||||||
|
"org_id": 1, |
||||||
|
"org_role": "Viewer", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
IsDeleted: false, |
||||||
|
}, |
||||||
|
expectedServersConfig: &ldap.ServersConfig{ |
||||||
|
Servers: []*ldap.ServerConfig{ |
||||||
|
{ |
||||||
|
Host: "127.0.0.1", |
||||||
|
Port: 3389, |
||||||
|
UseSSL: true, |
||||||
|
StartTLS: true, |
||||||
|
SkipVerifySSL: false, |
||||||
|
MinTLSVersion: "TLS1.3", |
||||||
|
TLSCiphers: []string{ |
||||||
|
"TLS_AES_256_GCM_SHA384", |
||||||
|
}, |
||||||
|
RootCACert: "/path/to/certificate.crt", |
||||||
|
RootCACertValue: []string{validCert}, |
||||||
|
ClientCert: "/path/to/client.crt", |
||||||
|
ClientCertValue: validCert, |
||||||
|
ClientKey: "/path/to/client.key", |
||||||
|
ClientKeyValue: validKey, |
||||||
|
BindDN: "cn=ldapservice,ou=users,dc=ldap,dc=goauthentik,dc=io", |
||||||
|
BindPassword: "grafana", |
||||||
|
Timeout: 10, |
||||||
|
Attr: ldap.AttributeMap{ |
||||||
|
Username: "cn", |
||||||
|
Name: "displayName", |
||||||
|
Surname: "sn", |
||||||
|
Email: "mail", |
||||||
|
MemberOf: "memberOf", |
||||||
|
}, |
||||||
|
SearchFilter: "(cn=%s)", |
||||||
|
SearchBaseDNs: []string{"DC=ldap,DC=goauthentik,DC=io"}, |
||||||
|
GroupSearchFilter: "(&(objectClass=posixGroup)(memberUid=%s))", |
||||||
|
GroupSearchFilterUserAttribute: "distinguishedName", |
||||||
|
GroupSearchBaseDNs: []string{"ou=groups,dc=grafana,dc=org"}, |
||||||
|
Groups: []*ldap.GroupToOrgRole{ |
||||||
|
{ |
||||||
|
GroupDN: "cn=admin,ou=groups,dc=ldap,dc=goauthentik,dc=io", |
||||||
|
OrgId: 1, |
||||||
|
OrgRole: "Admin", |
||||||
|
IsGrafanaAdmin: &isAdmin, |
||||||
|
}, |
||||||
|
{ |
||||||
|
GroupDN: "cn=editor,ou=groups,dc=ldap,dc=goauthentik,dc=io", |
||||||
|
OrgId: 1, |
||||||
|
OrgRole: "Editor", |
||||||
|
}, |
||||||
|
{ |
||||||
|
GroupDN: "cn=viewer,ou=groups,dc=ldap,dc=goauthentik,dc=io", |
||||||
|
OrgId: 1, |
||||||
|
OrgRole: "Viewer", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
expectedConfig: &ldap.Config{ |
||||||
|
Enabled: true, |
||||||
|
AllowSignUp: true, |
||||||
|
SkipOrgRoleSync: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
description: "no servers config", |
||||||
|
settings: models.SSOSettings{ |
||||||
|
Provider: "ldap", |
||||||
|
Settings: map[string]any{ |
||||||
|
"enabled": true, |
||||||
|
"skip_org_role_sync": false, |
||||||
|
"allow_sign_up": true, |
||||||
|
}, |
||||||
|
IsDeleted: false, |
||||||
|
}, |
||||||
|
expectedServersConfig: &ldap.ServersConfig{Servers: nil}, |
||||||
|
expectedConfig: &ldap.Config{ |
||||||
|
Enabled: true, |
||||||
|
AllowSignUp: true, |
||||||
|
SkipOrgRoleSync: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
description: "invalid settings", |
||||||
|
settings: models.SSOSettings{ |
||||||
|
Provider: "ldap", |
||||||
|
Settings: map[string]any{ |
||||||
|
"invalid": "some-value", |
||||||
|
"another_one": true, |
||||||
|
}, |
||||||
|
IsDeleted: false, |
||||||
|
}, |
||||||
|
expectedServersConfig: &ldap.ServersConfig{Servers: nil}, |
||||||
|
expectedConfig: &ldap.Config{ |
||||||
|
AllowSignUp: true, |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
description: "config disabled", |
||||||
|
settings: models.SSOSettings{ |
||||||
|
Provider: "ldap", |
||||||
|
Settings: map[string]any{ |
||||||
|
"enabled": false, |
||||||
|
"skip_org_role_sync": false, |
||||||
|
"allow_sign_up": true, |
||||||
|
"config": map[string]any{ |
||||||
|
"servers": []any{ |
||||||
|
map[string]any{ |
||||||
|
"host": "127.0.0.1", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
IsDeleted: false, |
||||||
|
}, |
||||||
|
expectedServersConfig: &ldap.ServersConfig{ |
||||||
|
Servers: []*ldap.ServerConfig{ |
||||||
|
{ |
||||||
|
Host: "127.0.0.1", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
expectedConfig: &ldap.Config{ |
||||||
|
Enabled: false, |
||||||
|
AllowSignUp: true, |
||||||
|
SkipOrgRoleSync: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
for _, tt := range testCases { |
||||||
|
t.Run(tt.description, func(t *testing.T) { |
||||||
|
ldapImpl := &LDAPImpl{ |
||||||
|
features: featuremgmt.WithManager(featuremgmt.FlagSsoSettingsApi), |
||||||
|
loadingMutex: &sync.Mutex{}, |
||||||
|
} |
||||||
|
|
||||||
|
err := ldapImpl.Reload(context.Background(), tt.settings) |
||||||
|
require.NoError(t, err) |
||||||
|
require.Equal(t, *tt.expectedServersConfig, *ldapImpl.ldapCfg) |
||||||
|
require.Equal(t, *tt.expectedConfig, *ldapImpl.cfg) |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue