mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-05-02 16:59:56 -05:00
81 lines
2.3 KiB
Go
81 lines
2.3 KiB
Go
package command
|
|
|
|
import (
|
|
"os"
|
|
"slices"
|
|
"strings"
|
|
|
|
"github.com/olekukonko/tablewriter"
|
|
"github.com/urfave/cli/v2"
|
|
|
|
"github.com/owncloud/ocis/v2/ocis-pkg/config/configlog"
|
|
"github.com/owncloud/ocis/v2/services/graph/pkg/config"
|
|
"github.com/owncloud/ocis/v2/services/graph/pkg/config/parser"
|
|
"github.com/owncloud/ocis/v2/services/graph/pkg/unifiedrole"
|
|
)
|
|
|
|
// UnifiedRoles bundles available commands for unified roles
|
|
func UnifiedRoles(cfg *config.Config) cli.Commands {
|
|
cmds := cli.Commands{
|
|
listUnifiedRoles(cfg),
|
|
}
|
|
|
|
for _, cmd := range cmds {
|
|
cmd.Category = "unified-roles"
|
|
cmd.Name = strings.Join([]string{cmd.Name, "unified-roles"}, "-")
|
|
cmd.Before = func(c *cli.Context) error {
|
|
return configlog.ReturnError(parser.ParseConfig(cfg))
|
|
}
|
|
}
|
|
|
|
return cmds
|
|
}
|
|
|
|
// unifiedRolesStatus lists available unified roles, it contains an indicator to show if the role is enabled or not
|
|
func listUnifiedRoles(cfg *config.Config) *cli.Command {
|
|
return &cli.Command{
|
|
Name: "list",
|
|
Usage: "list available unified roles",
|
|
Action: func(c *cli.Context) error {
|
|
tbl := tablewriter.NewWriter(os.Stdout)
|
|
tbl.SetRowLine(true)
|
|
tbl.SetAutoMergeCellsByColumnIndex([]int{0}) // rowspan should only affect the first column
|
|
|
|
headers := []string{"UID", "Enabled", "Description", "Condition", "Allowed resource actions"}
|
|
tbl.SetHeader(headers)
|
|
|
|
for _, definition := range unifiedrole.GetRoles(unifiedrole.RoleFilterAll()) {
|
|
const enabled = "enabled"
|
|
const disabled = "disabled"
|
|
|
|
rows := [][]string{
|
|
{definition.GetId(), disabled, definition.GetDescription()},
|
|
}
|
|
if slices.Contains(cfg.UnifiedRoles.AvailableRoles, definition.GetId()) {
|
|
rows[0][1] = enabled
|
|
}
|
|
|
|
for i, rolePermission := range definition.GetRolePermissions() {
|
|
actions := strings.Join(rolePermission.GetAllowedResourceActions(), "\n")
|
|
row := []string{rolePermission.GetCondition(), actions}
|
|
switch i {
|
|
case 0:
|
|
rows[0] = append(rows[0], row...)
|
|
default:
|
|
rows = append(rows, append(slices.Clone(rows[0][:len(rows[0])-len(row)]), row...))
|
|
}
|
|
}
|
|
|
|
for _, row := range rows {
|
|
// balance the row before adding it to the table,
|
|
// this prevents the row from having empty columns.
|
|
tbl.Append(append(row, make([]string, len(headers)-len(row))...))
|
|
}
|
|
}
|
|
|
|
tbl.Render()
|
|
return nil
|
|
},
|
|
}
|
|
}
|