1
1
package service
2
2
3
3
import (
4
+ "context"
4
5
"errors"
5
6
"sync"
6
7
8
+ "github.com/grafana/grafana/pkg/apimachinery/identity"
7
9
"github.com/grafana/grafana/pkg/infra/log"
10
+ "github.com/grafana/grafana/pkg/login/social"
11
+ "github.com/grafana/grafana/pkg/services/featuremgmt"
8
12
"github.com/grafana/grafana/pkg/services/ldap"
9
13
"github.com/grafana/grafana/pkg/services/ldap/multildap"
10
14
"github.com/grafana/grafana/pkg/services/login"
15
+ "github.com/grafana/grafana/pkg/services/ssosettings"
16
+ "github.com/grafana/grafana/pkg/services/ssosettings/models"
11
17
"github.com/grafana/grafana/pkg/setting"
12
18
)
13
19
@@ -29,39 +35,82 @@ type LDAP interface {
29
35
}
30
36
31
37
type LDAPImpl struct {
32
- client multildap.IMultiLDAP
33
- cfg * ldap.Config
34
- ldapCfg * ldap.ServersConfig
35
- log log.Logger
38
+ client multildap.IMultiLDAP
39
+ cfg * ldap.Config
40
+ ldapCfg * ldap.ServersConfig
41
+ log log.Logger
42
+ features featuremgmt.FeatureToggles
43
+ ssoSettings ssosettings.Service
36
44
37
45
// loadingMutex locks the reading of the config so multiple requests for reloading are sequential.
38
46
loadingMutex * sync.Mutex
39
47
}
40
48
41
- func ProvideService (cfg * setting.Cfg ) * LDAPImpl {
49
+ func ProvideService (cfg * setting.Cfg , features featuremgmt. FeatureToggles , ssoSettings ssosettings. Service ) * LDAPImpl {
42
50
s := & LDAPImpl {
43
- client : nil ,
44
- ldapCfg : nil ,
45
- cfg : ldap .GetLDAPConfig (cfg ),
46
51
log : log .New ("ldap.service" ),
47
52
loadingMutex : & sync.Mutex {},
53
+ features : features ,
54
+ ssoSettings : ssoSettings ,
48
55
}
49
56
50
- if ! cfg .LDAPAuthEnabled {
51
- return s
52
- }
57
+ if s .features .IsEnabledGlobally (featuremgmt .FlagSsoSettingsApi ) && s .features .IsEnabledGlobally (featuremgmt .FlagSsoSettingsLDAP ) {
58
+ s .ssoSettings .RegisterReloadable (social .LDAPProviderName , s )
53
59
54
- ldapCfg , err := multildap .GetConfig (s .cfg )
55
- if err != nil {
56
- s .log .Error ("Failed to get LDAP config" , "error" , err )
60
+ ldapSettings , err := s .ssoSettings .GetForProvider (context .Background (), social .LDAPProviderName )
61
+ if err != nil {
62
+ s .log .Error ("Failed to retrieve LDAP settings from SSO settings service" , "error" , err )
63
+ return s
64
+ }
65
+
66
+ err = s .Reload (context .Background (), * ldapSettings )
67
+ if err != nil {
68
+ s .log .Error ("Failed to load LDAP settings" , "error" , err )
69
+ return s
70
+ }
57
71
} else {
58
- s .ldapCfg = ldapCfg
59
- s .client = multildap .New (s .ldapCfg .Servers , s .cfg )
72
+ s .cfg = ldap .GetLDAPConfig (cfg )
73
+ if ! cfg .LDAPAuthEnabled {
74
+ return s
75
+ }
76
+
77
+ ldapCfg , err := multildap .GetConfig (s .cfg )
78
+ if err != nil {
79
+ s .log .Error ("Failed to get LDAP config" , "error" , err )
80
+ } else {
81
+ s .ldapCfg = ldapCfg
82
+ s .client = multildap .New (s .ldapCfg .Servers , s .cfg )
83
+ }
60
84
}
61
85
62
86
return s
63
87
}
64
88
89
+ func (s * LDAPImpl ) Reload (ctx context.Context , settings models.SSOSettings ) error {
90
+ cfg := & ldap.Config {}
91
+ cfg .Enabled = resolveBool (settings .Settings ["enabled" ], false )
92
+ cfg .SkipOrgRoleSync = resolveBool (settings .Settings ["skip_org_role_sync" ], false )
93
+ cfg .AllowSignUp = resolveBool (settings .Settings ["allow_sign_up" ], true )
94
+
95
+ ldapCfg , err := resolveServerConfig (settings .Settings ["config" ])
96
+ if err != nil {
97
+ return err
98
+ }
99
+
100
+ s .loadingMutex .Lock ()
101
+ defer s .loadingMutex .Unlock ()
102
+
103
+ s .cfg = cfg
104
+ s .ldapCfg = ldapCfg
105
+ s .client = multildap .New (s .ldapCfg .Servers , s .cfg )
106
+
107
+ return nil
108
+ }
109
+
110
+ func (s * LDAPImpl ) Validate (ctx context.Context , settings models.SSOSettings , oldSettings models.SSOSettings , requester identity.Requester ) error {
111
+ return nil
112
+ }
113
+
65
114
func (s * LDAPImpl ) ReloadConfig () error {
66
115
if ! s .cfg .Enabled {
67
116
return nil
0 commit comments