Skip to content
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 43 additions & 58 deletions cmd/base-keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ package cmd

import (
"errors"
"fmt"

"github.com/evertras/bubble-table/table"
"github.com/opentdf/otdfctl/pkg/cli"
"github.com/opentdf/otdfctl/pkg/man"
"github.com/opentdf/otdfctl/pkg/utils"
"github.com/opentdf/platform/protocol/go/policy/kasregistry"
"github.com/spf13/cobra"
)
Expand All @@ -27,34 +29,34 @@ const (
var policyKasRegistryBaseKeysCmd *cobra.Command

func getKasKeyIdentifier(c *cli.Cli) (*kasregistry.KasKeyIdentifier, error) {
keyID := c.Flags.GetOptionalString("keyId")
kasID := c.Flags.GetOptionalString("kasId")
kasName := c.Flags.GetOptionalString("kasName")
kasURI := c.Flags.GetOptionalString("kasUri")
// This function is called when the user provides a human-readable key ID
// via the --key flag and identifies the KAS it belongs to via the --kas flag.
humanReadableKeyID := c.Flags.GetRequiredString("key") // Flag for the key's human-readable ID
kasIdentifierInput := c.Flags.GetRequiredString("kas") // Flag for KAS ID, URI, or Name

// Basic validation, though GetRequiredString should handle empty inputs.
if humanReadableKeyID == "" {
return nil, errors.New("--key (human-readable key ID) cannot be empty")
}
if kasIdentifierInput == "" {
return nil, errors.New("--kas (KAS identifier) cannot be empty")
}

var identifier *kasregistry.KasKeyIdentifier
if keyID != "" {
identifier = &kasregistry.KasKeyIdentifier{
Kid: keyID,
}
switch {
case kasID != "":
identifier.Identifier = &kasregistry.KasKeyIdentifier_KasId{
KasId: kasID,
}
case kasName != "":
identifier.Identifier = &kasregistry.KasKeyIdentifier_Name{
Name: kasName,
}
case kasURI != "":
identifier.Identifier = &kasregistry.KasKeyIdentifier_Uri{
Uri: kasURI,
}
default:
return nil, errors.New("at least one of 'kasId', 'kasName', or 'kasUri' must be provided with 'keyId'")
}
identifier := &kasregistry.KasKeyIdentifier{
Kid: humanReadableKeyID,
}

kasInputType := utils.ClassifyString(kasIdentifierInput)
switch kasInputType { //nolint:exhaustive // default catches unknown
case utils.StringTypeUUID:
identifier.Identifier = &kasregistry.KasKeyIdentifier_KasId{KasId: kasIdentifierInput}
case utils.StringTypeURI:
identifier.Identifier = &kasregistry.KasKeyIdentifier_Uri{Uri: kasIdentifierInput}
case utils.StringTypeGeneric:
identifier.Identifier = &kasregistry.KasKeyIdentifier_Name{Name: kasIdentifierInput}
default: // Catches StringTypeUnknown and any other unexpected types
return nil, fmt.Errorf("invalid KAS identifier: '%s'. Must be a KAS UUID, URI, or Name", kasIdentifierInput)
}
return identifier, nil
}

Expand Down Expand Up @@ -113,11 +115,15 @@ func setBaseKey(cmd *cobra.Command, args []string) {
h := NewHandler(c)
defer h.Close()

id := c.Flags.GetOptionalID("id")
var identifier *kasregistry.KasKeyIdentifier
var err error

identifier, err := getKasKeyIdentifier(c)
if err != nil {
c.ExitWithError("Invalid key identifier", err)
id := c.Flags.GetOptionalString("key")
if utils.ClassifyString(id) != utils.StringTypeUUID {
identifier, err = getKasKeyIdentifier(c)
if err != nil {
c.ExitWithError("Invalid key identifier", err)
}
}
baseKey, err := h.SetBaseKey(c.Context(), id, identifier)
if err != nil {
Expand Down Expand Up @@ -152,38 +158,17 @@ func init() {
man.WithRun(setBaseKey),
)
setDoc.Flags().StringP(
setDoc.GetDocFlag("id").Name,
setDoc.GetDocFlag("id").Shorthand,
setDoc.GetDocFlag("id").Default,
setDoc.GetDocFlag("id").Description,
)
setDoc.Flags().StringP(
setDoc.GetDocFlag("keyId").Name,
setDoc.GetDocFlag("keyId").Shorthand,
setDoc.GetDocFlag("keyId").Default,
setDoc.GetDocFlag("keyId").Description,
)
setDoc.Flags().StringP(
setDoc.GetDocFlag("kasUri").Name,
setDoc.GetDocFlag("kasUri").Shorthand,
setDoc.GetDocFlag("kasUri").Default,
setDoc.GetDocFlag("kasUri").Description,
)
setDoc.Flags().StringP(
setDoc.GetDocFlag("kasId").Name,
setDoc.GetDocFlag("kasId").Shorthand,
setDoc.GetDocFlag("kasId").Default,
setDoc.GetDocFlag("kasId").Description,
setDoc.GetDocFlag("key").Name,
setDoc.GetDocFlag("key").Shorthand,
setDoc.GetDocFlag("key").Default,
setDoc.GetDocFlag("key").Description,
)
setDoc.Flags().StringP(
setDoc.GetDocFlag("kasName").Name,
setDoc.GetDocFlag("kasName").Shorthand,
setDoc.GetDocFlag("kasName").Default,
setDoc.GetDocFlag("kasName").Description,
setDoc.GetDocFlag("kas").Name,
setDoc.GetDocFlag("kas").Shorthand,
setDoc.GetDocFlag("kas").Default,
setDoc.GetDocFlag("kas").Description,
)
setDoc.MarkFlagsMutuallyExclusive("id", "keyId")
setDoc.MarkFlagsOneRequired("id", "keyId")
setDoc.MarkFlagsMutuallyExclusive("kasUri", "kasId", "kasName")

doc := man.Docs.GetCommand("policy/kas-registry/key/base",
man.WithSubcommands(getDoc, setDoc))
Expand Down
Loading
Loading