Files
kleiax 904d14b64c
CI / test (push) Canceled after 0s
Initial commit
2026-09-12 22:22:17 +02:00

63 lines
2.4 KiB
Go

package web
import (
"strconv"
"gardomatic.kleiax.de/lib/client"
)
type roleEditorRole struct {
Name string
Label string
Permissions []string
Editable bool
EditLabel bool
Deletable bool
}
type roleEditorData struct {
ID string
Title string
Description string
Scope string
Roles []roleEditorRole
Permissions []permissionOption
CreateAction string
UpdateAction string
DeleteAction string
CSRFToken string
Garden *client.Garden
}
func globalRoleEditor(id, title, description, scope string, roles []client.Role, permissions []permissionOption, csrfToken string) roleEditorData {
result := roleEditorData{ID: id, Title: title, Description: description, Scope: scope, Permissions: permissions, CreateAction: webPath("admin.role.new"), UpdateAction: webPath("admin.role.update"), DeleteAction: webPath("admin.role.delete"), CSRFToken: csrfToken}
for _, role := range roles {
effective := []string{}
for _, permission := range permissions {
if clientRoleHasPermission(role, permission.Name) {
effective = append(effective, permission.Name)
}
}
result.Roles = append(result.Roles, roleEditorRole{Name: role.Name, Label: role.Label, Permissions: effective, Editable: role.Name != "owner", EditLabel: true, Deletable: !role.System})
}
return result
}
func gardenOverrideRoleEditor(gardenID int, roles []client.GardenRoleSetting, permissions []permissionOption, csrfToken string) roleEditorData {
id := strconv.Itoa(gardenID)
result := roleEditorData{ID: "garden-role-editor", Title: "Gartenspezifische Rollenrechte", Description: "Diese Einstellungen überschreiben die globalen Gartenrollen nur für diesen Garten.", Scope: "garden", Permissions: permissions, CreateAction: webPath("garden.role.new", id), UpdateAction: webPath("garden.role.update", id), DeleteAction: webPath("garden.role.delete", id), CSRFToken: csrfToken}
for _, setting := range roles {
result.Roles = append(result.Roles, roleEditorRole{Name: setting.Role.Name, Label: setting.Role.Label, Permissions: setting.EffectivePermissions, Editable: setting.Role.Name != "owner", Deletable: setting.Role.GardenID != nil})
}
return result
}
func clientRoleHasPermission(role client.Role, permission string) bool {
for _, granted := range role.Permissions {
if granted == permission || granted == "*" || granted == "garden:*" && permission != "garden:delete" {
return true
}
}
return false
}