@@ -9,21 +9,24 @@ import (
9
9
)
10
10
11
11
type keystoneAuther struct {
12
- server string
13
- domainname string
14
- roles map [m.RoleType ][]string
12
+ server string
13
+ domainname string
14
+ roles map [m.RoleType ][]string
15
+ admin_roles []string
15
16
16
17
token string
17
18
project_list map [string ][]string
18
19
}
19
20
20
- func NewKeystoneAuthenticator (server , domainname string , admin_roles , editor_roles , viewer_roles []string ) * keystoneAuther {
21
+ func NewKeystoneAuthenticator (server , domainname string , global_admin_roles , admin_roles , editor_roles ,
22
+ read_editor_roles , viewer_roles []string ) * keystoneAuther {
21
23
roles := map [m.RoleType ][]string {
22
- m .ROLE_ADMIN : admin_roles ,
23
- m .ROLE_EDITOR : editor_roles ,
24
- m .ROLE_VIEWER : viewer_roles ,
24
+ m .ROLE_ADMIN : admin_roles ,
25
+ m .ROLE_EDITOR : editor_roles ,
26
+ m .ROLE_READ_ONLY_EDITOR : read_editor_roles ,
27
+ m .ROLE_VIEWER : viewer_roles ,
25
28
}
26
- return & keystoneAuther {server : server , domainname : domainname , roles : roles }
29
+ return & keystoneAuther {server : server , domainname : domainname , roles : roles , admin_roles : global_admin_roles }
27
30
}
28
31
29
32
func (a * keystoneAuther ) login (query * LoginUserQuery ) error {
@@ -86,6 +89,19 @@ func (a *keystoneAuther) createGrafanaUser(username string) (*m.User, error) {
86
89
return & cmd .Result , nil
87
90
}
88
91
92
+ func (a * keystoneAuther ) updateGrafanaUserPermissions (userid int64 , isAdmin bool ) error {
93
+ cmd := m.UpdateUserPermissionsCommand {
94
+ UserId : userid ,
95
+ IsGrafanaAdmin : isAdmin ,
96
+ }
97
+
98
+ if err := bus .Dispatch (& cmd ); err != nil {
99
+ return err
100
+ }
101
+
102
+ return nil
103
+ }
104
+
89
105
func (a * keystoneAuther ) getGrafanaOrgFor (orgname string ) (* m.Org , error ) {
90
106
// get org from grafana db
91
107
orgQuery := m.GetOrgByNameQuery {Name : orgname }
@@ -204,6 +220,30 @@ func (a *keystoneAuther) syncOrgRoles(username, password string, user *m.User) e
204
220
}
205
221
}
206
222
223
+ // set or unset admin permissions
224
+ isAdmin := false
225
+ role_map := make (map [string ]bool )
226
+ for _ , role := range a .admin_roles {
227
+ role_map [role ] = true
228
+ }
229
+ for project , _ := range a .project_list {
230
+ if isAdmin == true {
231
+ break
232
+ }
233
+ project_roles := a .project_list [project ]
234
+ for _ , role := range project_roles {
235
+ if _ , ok := role_map [role ]; ok {
236
+ isAdmin = true
237
+ break
238
+ }
239
+ }
240
+ }
241
+ if isAdmin != user .IsAdmin {
242
+ if err := a .updateGrafanaUserPermissions (user .Id , isAdmin ); err != nil {
243
+ return err
244
+ }
245
+ }
246
+
207
247
orgsQuery = m.GetUserOrgListQuery {UserId : user .Id }
208
248
if err := bus .Dispatch (& orgsQuery ); err != nil {
209
249
return err
@@ -268,7 +308,7 @@ func (a *keystoneAuther) getRole(user_roles []string) m.RoleType {
268
308
for _ , role := range user_roles {
269
309
role_map [role ] = true
270
310
}
271
- role_order := []m.RoleType {m .ROLE_ADMIN , m .ROLE_EDITOR , m .ROLE_VIEWER }
311
+ role_order := []m.RoleType {m .ROLE_ADMIN , m .ROLE_EDITOR , m .ROLE_READ_ONLY_EDITOR , m . ROLE_VIEWER }
272
312
for _ , role_type := range role_order {
273
313
for _ , role := range a .roles [role_type ] {
274
314
if _ , ok := role_map [role ]; ok {
0 commit comments