From ce995fb1a5134dc130f6e12bf5a5ff4a88b49366 Mon Sep 17 00:00:00 2001 From: Samuel Lorch Date: Wed, 8 Sep 2021 14:51:26 +0200 Subject: [PATCH] add user commands --- cmd/create.go | 2 + cmd/delete.go | 2 + cmd/get.go | 3 ++ cmd/list.go | 2 + cmd/update.go | 2 + go.mod | 2 +- go.sum | 4 +- user/create.go | 71 +++++++++++++++++++++++++++++++++ user/delete.go | 44 +++++++++++++++++++++ user/get.go | 55 ++++++++++++++++++++++++++ user/list.go | 104 +++++++++++++++++++++++++++++++++++++++++++++++++ user/update.go | 68 ++++++++++++++++++++++++++++++++ 12 files changed, 356 insertions(+), 3 deletions(-) create mode 100644 user/create.go create mode 100644 user/delete.go create mode 100644 user/get.go create mode 100644 user/list.go create mode 100644 user/update.go diff --git a/cmd/create.go b/cmd/create.go index 8267ecb..87e5cf5 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -4,6 +4,7 @@ import ( "github.com/speatzle/go-passbolt-cli/folder" "github.com/speatzle/go-passbolt-cli/group" "github.com/speatzle/go-passbolt-cli/resource" + "github.com/speatzle/go-passbolt-cli/user" "github.com/spf13/cobra" ) @@ -20,4 +21,5 @@ func init() { createCmd.AddCommand(resource.ResourceCreateCmd) createCmd.AddCommand(folder.FolderCreateCmd) createCmd.AddCommand(group.GroupCreateCmd) + createCmd.AddCommand(user.UserCreateCmd) } diff --git a/cmd/delete.go b/cmd/delete.go index ed99f73..d11c461 100644 --- a/cmd/delete.go +++ b/cmd/delete.go @@ -4,6 +4,7 @@ import ( "github.com/speatzle/go-passbolt-cli/folder" "github.com/speatzle/go-passbolt-cli/group" "github.com/speatzle/go-passbolt-cli/resource" + "github.com/speatzle/go-passbolt-cli/user" "github.com/spf13/cobra" ) @@ -20,6 +21,7 @@ func init() { deleteCmd.AddCommand(resource.ResourceDeleteCmd) deleteCmd.AddCommand(folder.FolderDeleteCmd) deleteCmd.AddCommand(group.GroupDeleteCmd) + deleteCmd.AddCommand(user.UserDeleteCmd) deleteCmd.PersistentFlags().String("id", "", "ID of the Entity to Delete") } diff --git a/cmd/get.go b/cmd/get.go index a1d2211..624d91e 100644 --- a/cmd/get.go +++ b/cmd/get.go @@ -4,6 +4,7 @@ import ( "github.com/speatzle/go-passbolt-cli/folder" "github.com/speatzle/go-passbolt-cli/group" "github.com/speatzle/go-passbolt-cli/resource" + "github.com/speatzle/go-passbolt-cli/user" "github.com/spf13/cobra" ) @@ -20,4 +21,6 @@ func init() { getCmd.AddCommand(resource.ResourceGetCmd) getCmd.AddCommand(folder.FolderGetCmd) getCmd.AddCommand(group.GroupGetCmd) + getCmd.AddCommand(user.UserGetCmd) + } diff --git a/cmd/list.go b/cmd/list.go index 6756557..118135d 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -4,6 +4,7 @@ import ( "github.com/speatzle/go-passbolt-cli/folder" "github.com/speatzle/go-passbolt-cli/group" "github.com/speatzle/go-passbolt-cli/resource" + "github.com/speatzle/go-passbolt-cli/user" "github.com/spf13/cobra" ) @@ -20,4 +21,5 @@ func init() { listCmd.AddCommand(resource.ResourceListCmd) listCmd.AddCommand(folder.FolderListCmd) listCmd.AddCommand(group.GroupListCmd) + listCmd.AddCommand(user.UserListCmd) } diff --git a/cmd/update.go b/cmd/update.go index 06a9ab6..f1b2079 100644 --- a/cmd/update.go +++ b/cmd/update.go @@ -4,6 +4,7 @@ import ( "github.com/speatzle/go-passbolt-cli/folder" "github.com/speatzle/go-passbolt-cli/group" "github.com/speatzle/go-passbolt-cli/resource" + "github.com/speatzle/go-passbolt-cli/user" "github.com/spf13/cobra" ) @@ -20,4 +21,5 @@ func init() { updateCmd.AddCommand(resource.ResourceUpdateCmd) updateCmd.AddCommand(folder.FolderUpdateCmd) updateCmd.AddCommand(group.GroupUpdateCmd) + updateCmd.AddCommand(user.UserUpdateCmd) } diff --git a/go.mod b/go.mod index 4a5773a..e4bd2ba 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/fsnotify/fsnotify v1.5.1 // indirect github.com/pelletier/go-toml v1.9.4 // indirect github.com/pterm/pterm v0.12.30 - github.com/speatzle/go-passbolt v0.2.2 + github.com/speatzle/go-passbolt v0.3.0 github.com/spf13/cast v1.4.1 // indirect github.com/spf13/cobra v1.2.1 github.com/spf13/viper v1.8.1 diff --git a/go.sum b/go.sum index e799e16..e5cff29 100644 --- a/go.sum +++ b/go.sum @@ -246,8 +246,8 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykE github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/speatzle/go-passbolt v0.2.2 h1:7kkjkR4jSzedgw2Cvwhc1QN9+ET/RXBTF2pY3V8EFUg= -github.com/speatzle/go-passbolt v0.2.2/go.mod h1:fMxCWY6dYXyz070R6u8fzEeBfoxPG3xUquPeelXumso= +github.com/speatzle/go-passbolt v0.3.0 h1:GDg7cXCHqabZU5XE8SnbYnk2tCzsJuI5eciM6kJV8Z8= +github.com/speatzle/go-passbolt v0.3.0/go.mod h1:fMxCWY6dYXyz070R6u8fzEeBfoxPG3xUquPeelXumso= github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= diff --git a/user/create.go b/user/create.go new file mode 100644 index 0000000..d2822f7 --- /dev/null +++ b/user/create.go @@ -0,0 +1,71 @@ +package user + +import ( + "context" + "fmt" + + "github.com/speatzle/go-passbolt-cli/util" + "github.com/speatzle/go-passbolt/helper" + "github.com/spf13/cobra" +) + +// UserCreateCmd Creates a Passbolt User +var UserCreateCmd = &cobra.Command{ + Use: "user", + Short: "Creates a Passbolt User", + Long: `Creates a Passbolt User and Returns the Users ID`, + RunE: UserCreate, +} + +func init() { + UserCreateCmd.Flags().StringP("username", "u", "", "Username (needs to be a email address)") + UserCreateCmd.Flags().StringP("firstname", "f", "", "First Name") + UserCreateCmd.Flags().StringP("lastname", "l", "", "Last Name") + UserCreateCmd.Flags().StringP("role", "r", "user", "Role of User.\nPossible: user, admin") + + UserCreateCmd.MarkFlagRequired("username") + UserCreateCmd.MarkFlagRequired("firstname") + UserCreateCmd.MarkFlagRequired("lastname") +} + +func UserCreate(cmd *cobra.Command, args []string) error { + username, err := cmd.Flags().GetString("username") + if err != nil { + return err + } + firstname, err := cmd.Flags().GetString("firstname") + if err != nil { + return err + } + lastname, err := cmd.Flags().GetString("lastname") + if err != nil { + return err + } + role, err := cmd.Flags().GetString("role") + 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 + + id, err := helper.CreateUser( + ctx, + client, + role, + username, + firstname, + lastname, + ) + if err != nil { + return fmt.Errorf("Creating User: %w", err) + } + + fmt.Printf("UserID: %v\n", id) + return nil +} diff --git a/user/delete.go b/user/delete.go new file mode 100644 index 0000000..b4c1b17 --- /dev/null +++ b/user/delete.go @@ -0,0 +1,44 @@ +package user + +import ( + "context" + "fmt" + + "github.com/speatzle/go-passbolt-cli/util" + "github.com/speatzle/go-passbolt/helper" + "github.com/spf13/cobra" +) + +// UserDeleteCmd Deletes a User +var UserDeleteCmd = &cobra.Command{ + Use: "user", + Short: "Deletes a Passbolt User", + Long: `Deletes a Passbolt User`, + RunE: UserDelete, +} + +func UserDelete(cmd *cobra.Command, args []string) error { + resourceID, err := cmd.Flags().GetString("id") + if err != nil { + return err + } + + if resourceID == "" { + return fmt.Errorf("No ID to Delete Provided") + } + + ctx := util.GetContext() + + client, err := util.GetClient(ctx) + if err != nil { + return err + } + defer client.Logout(context.TODO()) + cmd.SilenceUsage = true + + helper.DeleteUser(ctx, client, resourceID) + if err != nil { + return fmt.Errorf("Deleting User: %w", err) + } + return nil +} diff --git a/user/get.go b/user/get.go new file mode 100644 index 0000000..81814b9 --- /dev/null +++ b/user/get.go @@ -0,0 +1,55 @@ +package user + +import ( + "context" + "fmt" + + "github.com/speatzle/go-passbolt-cli/util" + "github.com/speatzle/go-passbolt/helper" + "github.com/spf13/cobra" +) + +// UserGetCmd Gets a Passbolt User +var UserGetCmd = &cobra.Command{ + Use: "user", + Short: "Gets a Passbolt User", + Long: `Gets a Passbolt User`, + RunE: UserGet, +} + +func init() { + UserGetCmd.Flags().String("id", "", "id of User to Get") + + UserGetCmd.MarkFlagRequired("id") +} + +func UserGet(cmd *cobra.Command, args []string) error { + id, err := cmd.Flags().GetString("id") + 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 + + username, firstname, lastname, role, err := helper.GetUser( + ctx, + client, + id, + ) + if err != nil { + return fmt.Errorf("Getting User: %w", err) + } + fmt.Printf("Username: %v\n", username) + fmt.Printf("FirstName: %v\n", firstname) + fmt.Printf("LastName: %v\n", lastname) + fmt.Printf("Role: %v\n", role) + + return nil +} diff --git a/user/list.go b/user/list.go new file mode 100644 index 0000000..f78cb8b --- /dev/null +++ b/user/list.go @@ -0,0 +1,104 @@ +package user + +import ( + "context" + "fmt" + "strings" + + "github.com/speatzle/go-passbolt-cli/util" + "github.com/speatzle/go-passbolt/api" + "github.com/spf13/cobra" + + "github.com/pterm/pterm" +) + +// UserListCmd Lists a Passbolt User +var UserListCmd = &cobra.Command{ + Use: "user", + Short: "Lists Passbolt Users", + Long: `Lists Passbolt Users`, + Aliases: []string{"groups"}, + RunE: UserList, +} + +func init() { + UserListCmd.Flags().StringArrayP("groups", "g", []string{}, "Users that are members of groups") + UserListCmd.Flags().StringArrayP("resources", "r", []string{}, "Users that have access to resources") + + UserListCmd.Flags().StringP("search", "s", "", "Search for Users") + UserListCmd.Flags().BoolP("admin", "a", false, "Only show Admins") + + UserListCmd.Flags().StringArrayP("columns", "c", []string{"ID", "Username", "FirstName", "LastName", "Role"}, "Columns to return, possible Columns:\nID, Username, FirstName, LastName, Role") +} + +func UserList(cmd *cobra.Command, args []string) error { + groups, err := cmd.Flags().GetStringArray("groups") + if err != nil { + return err + } + resources, err := cmd.Flags().GetStringArray("resources") + if err != nil { + return err + } + search, err := cmd.Flags().GetString("search") + if err != nil { + return err + } + admin, err := cmd.Flags().GetBool("admin") + if err != nil { + return err + } + columns, err := cmd.Flags().GetStringArray("columns") + if err != nil { + return err + } + if len(columns) == 0 { + return fmt.Errorf("You need to specify atleast one column to return") + } + + ctx := util.GetContext() + + client, err := util.GetClient(ctx) + if err != nil { + return err + } + defer client.Logout(context.TODO()) + cmd.SilenceUsage = true + + users, err := client.GetUsers(ctx, &api.GetUsersOptions{ + FilterHasGroup: groups, + FilterHasAccess: resources, + FilterSearch: search, + FilterIsAdmin: admin, + }) + if err != nil { + return fmt.Errorf("Listing User: %w", err) + } + + data := pterm.TableData{columns} + + for _, user := range users { + entry := make([]string, len(columns)) + for i := range columns { + switch strings.ToLower(columns[i]) { + case "id": + entry[i] = user.ID + case "username": + entry[i] = user.Username + case "firstname": + entry[i] = user.Profile.FirstName + case "lastname": + entry[i] = user.Profile.LastName + case "role": + entry[i] = user.Role.Name + default: + cmd.SilenceUsage = false + return fmt.Errorf("Unknown Column: %v", columns[i]) + } + } + data = append(data, entry) + } + + pterm.DefaultTable.WithHasHeader().WithData(data).Render() + return nil +} diff --git a/user/update.go b/user/update.go new file mode 100644 index 0000000..11c431d --- /dev/null +++ b/user/update.go @@ -0,0 +1,68 @@ +package user + +import ( + "context" + "fmt" + + "github.com/speatzle/go-passbolt-cli/util" + "github.com/speatzle/go-passbolt/helper" + "github.com/spf13/cobra" +) + +// UserUpdateCmd Updates a Passbolt User +var UserUpdateCmd = &cobra.Command{ + Use: "user", + Short: "Updates a Passbolt User", + Long: `Updates a Passbolt User`, + RunE: UserUpdate, +} + +func init() { + UserUpdateCmd.Flags().String("id", "", "id of User to Update") + UserUpdateCmd.Flags().StringP("firstname", "f", "", "User FirstName") + UserUpdateCmd.Flags().StringP("lastname", "l", "", "User LastName") + UserUpdateCmd.Flags().StringP("role", "r", "", "User Role") + + UserUpdateCmd.MarkFlagRequired("id") +} + +func UserUpdate(cmd *cobra.Command, args []string) error { + id, err := cmd.Flags().GetString("id") + if err != nil { + return err + } + firstname, err := cmd.Flags().GetString("firstname") + if err != nil { + return err + } + lastname, err := cmd.Flags().GetString("lastname") + if err != nil { + return err + } + role, err := cmd.Flags().GetString("role") + 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 + + err = helper.UpdateUser( + ctx, + client, + id, + role, + firstname, + lastname, + ) + if err != nil { + return fmt.Errorf("Updating User: %w", err) + } + return nil +}