diff --git a/cmd/list.go b/cmd/list.go index 7e94658..b563284 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -3,6 +3,7 @@ package cmd import ( "github.com/passbolt/go-passbolt-cli/folder" "github.com/passbolt/go-passbolt-cli/group" + "github.com/passbolt/go-passbolt-cli/permission" "github.com/passbolt/go-passbolt-cli/resource" "github.com/passbolt/go-passbolt-cli/user" "github.com/spf13/cobra" @@ -29,4 +30,5 @@ func init() { listCmd.AddCommand(folder.FolderListCmd) listCmd.AddCommand(group.GroupListCmd) listCmd.AddCommand(user.UserListCmd) + listCmd.AddCommand(permission.PermissionListCmd) } diff --git a/permission/json.go b/permission/json.go new file mode 100644 index 0000000..0b7035c --- /dev/null +++ b/permission/json.go @@ -0,0 +1,14 @@ +package permission + +import "time" + +type PermissionJsonOutput struct { + ID *string `json:"id,omitempty"` + Aco *string `json:"aco,omitempty"` + AcoForeignKey *string `json:"aco_foreign_key,omitempty"` + Aro *string `json:"aro,omitempty"` + AroForeignKey *string `json:"aro_foreign_key,omitempty"` + Type *int `json:"type,omitempty"` + CreatedTimestamp *time.Time `json:"created_timestamp,omitempty"` + ModifiedTimestamp *time.Time `json:"modified_timestamp,omitempty"` +} diff --git a/permission/list.go b/permission/list.go new file mode 100644 index 0000000..92af9d0 --- /dev/null +++ b/permission/list.go @@ -0,0 +1,119 @@ +package permission + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + "strings" + "time" + + "github.com/passbolt/go-passbolt-cli/util" + "github.com/spf13/cobra" + + "github.com/pterm/pterm" +) + +// PermissionListCmd Lists a Passbolt Permission +var PermissionListCmd = &cobra.Command{ + Use: "permission", + Short: "Lists Passbolt Permissions", + Long: `Lists Passbolt Permissions`, + Aliases: []string{"permissions"}, + RunE: PermissionList, +} + +func init() { + PermissionListCmd.Flags().StringP("resource", "r", "", "Resource to list permissions") + + PermissionListCmd.Flags().StringArrayP("column", "c", []string{"ID", "Aco", "AcoForeignKey", "Aro", "AroForeignKey", "Type"}, "Columns to return, possible Columns:\nID, Aco, AcoForeignKey, Aro, AroForeignKey, Type, CreatedTimestamp, ModifiedTimestamp") + + PermissionListCmd.MarkFlagRequired("resource") +} + +func PermissionList(cmd *cobra.Command, args []string) error { + resource, err := cmd.Flags().GetString("resource") + if err != nil { + return err + } + columns, err := cmd.Flags().GetStringArray("column") + if err != nil { + return err + } + if len(columns) == 0 { + return fmt.Errorf("You need to specify atleast one column to return") + } + jsonOutput, err := cmd.Flags().GetBool("json") + if err != nil { + return err + } + + ctx := util.GetContext() + + client, err := util.GetClient(ctx) + if err != nil { + return err + } + defer client.Logout(context.TODO()) + cmd.SilenceUsage = true + + permissions, err := client.GetResourcePermissions(ctx, resource) + if err != nil { + return fmt.Errorf("Listing Permission: %w", err) + } + + if jsonOutput { + outputPermissions := []PermissionJsonOutput{} + for i := range permissions { + outputPermissions = append(outputPermissions, PermissionJsonOutput{ + ID: &permissions[i].ID, + Aco: &permissions[i].ACO, + AcoForeignKey: &permissions[i].ACOForeignKey, + Aro: &permissions[i].ARO, + AroForeignKey: &permissions[i].AROForeignKey, + Type: &permissions[i].Type, + CreatedTimestamp: &permissions[i].Created.Time, + ModifiedTimestamp: &permissions[i].Modified.Time, + }) + } + jsonPermissions, err := json.MarshalIndent(outputPermissions, "", " ") + if err != nil { + return err + } + fmt.Println(string(jsonPermissions)) + } else { + data := pterm.TableData{columns} + + for _, permission := range permissions { + entry := make([]string, len(columns)) + for i := range columns { + switch strings.ToLower(columns[i]) { + case "id": + entry[i] = permission.ID + case "aco": + entry[i] = permission.ACO + case "acoforeignkey": + entry[i] = permission.ACOForeignKey + case "aro": + entry[i] = permission.ARO + case "aroforeignkey": + entry[i] = permission.AROForeignKey + case "type": + entry[i] = strconv.Itoa(permission.Type) + case "createdtimestamp": + entry[i] = permission.Created.Format(time.RFC3339) + case "modifiedtimestamp": + entry[i] = permission.Modified.Format(time.RFC3339) + default: + cmd.SilenceUsage = false + return fmt.Errorf("Unknown Column: %v", columns[i]) + } + } + data = append(data, entry) + } + + pterm.DefaultTable.WithHasHeader().WithData(data).Render() + } + + return nil +}