diff --git a/resource/create.go b/resource/create.go index a0866ca..f656214 100644 --- a/resource/create.go +++ b/resource/create.go @@ -25,6 +25,7 @@ func init() { ResourceCreateCmd.Flags().StringP("password", "p", "", "Resource Password") ResourceCreateCmd.Flags().StringP("description", "d", "", "Resource Description") ResourceCreateCmd.Flags().StringP("folderParentID", "f", "", "Folder in which to create the Resource") + ResourceCreateCmd.Flags().String("expired", "", "Expiry date/time (ISO8601), e.g. 2025-12-31T23:59:59Z") ResourceCreateCmd.MarkFlagRequired("name") ResourceCreateCmd.MarkFlagRequired("password") @@ -55,6 +56,10 @@ func ResourceCreate(cmd *cobra.Command, args []string) error { if err != nil { return err } + expired, err := cmd.Flags().GetString("expired") + if err != nil { + return err + } jsonOutput, err := cmd.Flags().GetBool("json") if err != nil { return err @@ -83,6 +88,12 @@ func ResourceCreate(cmd *cobra.Command, args []string) error { return fmt.Errorf("Creating Resource: %w", err) } + if expired != "" { + if err := SetResourceExpiry(ctx, client, id, expired); err != nil { + return err + } + } + if jsonOutput { jsonId, err := json.MarshalIndent( map[string]string{"id": id}, diff --git a/resource/expiry.go b/resource/expiry.go new file mode 100644 index 0000000..ef6b2b2 --- /dev/null +++ b/resource/expiry.go @@ -0,0 +1,29 @@ +package resource + +import ( + "context" + "fmt" + + "github.com/passbolt/go-passbolt/api" +) + +// SetResourceExpiry updates only the expiry date of a resource. +func SetResourceExpiry(ctx context.Context, client *api.Client, id string, expired string) error { + if expired == "" { + return nil + } + _, _, err := client.DoCustomRequestAndReturnRawResponse( + ctx, + "PUT", + fmt.Sprintf("resources/%s.json", id), + "v2", + map[string]string{"expired": expired}, + nil, + ) + if err != nil { + return fmt.Errorf("Setting expiry: %w", err) + } + return nil +} + + diff --git a/resource/update.go b/resource/update.go index 797c9cb..ed4b840 100644 --- a/resource/update.go +++ b/resource/update.go @@ -24,6 +24,8 @@ func init() { ResourceUpdateCmd.Flags().String("uri", "", "Resource URI") ResourceUpdateCmd.Flags().StringP("password", "p", "", "Resource Password") ResourceUpdateCmd.Flags().StringP("description", "d", "", "Resource Description") + ResourceUpdateCmd.Flags().String("expired", "", "Expiry date/time (ISO8601), e.g. 2025-12-31T23:59:59Z; use empty to clear with --clear-expired") + ResourceUpdateCmd.Flags().Bool("clear-expired", false, "Clear expiry (sets expired to null)") ResourceUpdateCmd.MarkFlagRequired("id") } @@ -53,6 +55,14 @@ func ResourceUpdate(cmd *cobra.Command, args []string) error { if err != nil { return err } + expired, err := cmd.Flags().GetString("expired") + if err != nil { + return err + } + clearExpired, err := cmd.Flags().GetBool("clear-expired") + if err != nil { + return err + } ctx := util.GetContext() @@ -76,5 +86,24 @@ func ResourceUpdate(cmd *cobra.Command, args []string) error { if err != nil { return fmt.Errorf("Updating Resource: %w", err) } + + if clearExpired { + // explicit clear to null + _, _, err := client.DoCustomRequestAndReturnRawResponse( + ctx, + "PUT", + fmt.Sprintf("resources/%s.json", id), + "v2", + map[string]*string{"expired": nil}, + nil, + ) + if err != nil { + return fmt.Errorf("Clearing expiry: %w", err) + } + } else if expired != "" { + if err := SetResourceExpiry(ctx, client, id, expired); err != nil { + return err + } + } return nil }