Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package step-cli for openSUSE:Factory 
checked in at 2025-03-05 17:04:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/step-cli (Old)
 and      /work/SRC/openSUSE:Factory/.step-cli.new.19136 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "step-cli"

Wed Mar  5 17:04:08 2025 rev:7 rq:1250411 version:0.28.5

Changes:
--------
--- /work/SRC/openSUSE:Factory/step-cli/step-cli.changes        2025-02-20 
22:05:15.240091781 +0100
+++ /work/SRC/openSUSE:Factory/.step-cli.new.19136/step-cli.changes     
2025-03-05 17:05:00.750574402 +0100
@@ -1,0 +2,24 @@
+Wed Mar  5 12:34:56 UTC 2025 - Johannes Kastl 
<opensuse_buildserv...@ojkastl.de>
+
+- update to 0.28.5:
+  https://github.com/smallstep/cli/releases/tag/v0.28.5
+  * Merge pull request #1382 from smallstep/herman/crypto-v0.59.1
+  * Merge pull request #1383 from
+    smallstep/herman/fix-token-user-braces
+  * Change .Token.user.field to not use curly braces
+  * Upgrade go.step.sm/crypto to v0.59.1
+
+-------------------------------------------------------------------
+Wed Mar  5 10:28:16 UTC 2025 - Johannes Kastl 
<opensuse_buildserv...@ojkastl.de>
+
+- update to 0.28.4:
+  https://github.com/smallstep/cli/releases/tag/v0.28.4
+  * Added
+    - Add the --set and --set-file flags to the step ca token
+      command, allowing the user to set keys in the "user" claim in
+      the resulting JWT. (#1375)
+    - Support for downloading additional default settings when
+      running 'step ssh config' (#1377) 'min-password-length' and
+      'provisioner'
+
+-------------------------------------------------------------------

Old:
----
  cli-0.28.3.tar.gz

New:
----
  cli-0.28.5.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ step-cli.spec ++++++
--- /var/tmp/diff_new_pack.kScSNL/_old  2025-03-05 17:05:03.258679621 +0100
+++ /var/tmp/diff_new_pack.kScSNL/_new  2025-03-05 17:05:03.258679621 +0100
@@ -22,7 +22,7 @@
 %define pkg_name cli
 %define pkg_version %{version}
 Name:           step-cli
-Version:        0.28.3
+Version:        0.28.5
 Release:        0
 Summary:        Zero trust swiss army knife for working with X509, OAuth, JWT, 
OATH OTP, etc
 License:        Apache-2.0
@@ -37,7 +37,7 @@
 BuildRequires:  golang-packaging
 BuildRequires:  pkgconfig
 BuildRequires:  zsh
-BuildRequires:  golang(API) >= 1.19
+BuildRequires:  golang(API) >= 1.23.6
 BuildRequires:  pkgconfig(bash-completion)
 BuildRequires:  pkgconfig(systemd)
 Conflicts:      step

++++++ cli-0.28.3.tar.gz -> cli-0.28.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/.VERSION new/cli-0.28.5/.VERSION
--- old/cli-0.28.3/.VERSION     2025-02-20 18:46:12.000000000 +0100
+++ new/cli-0.28.5/.VERSION     2025-03-05 12:08:34.000000000 +0100
@@ -1 +1 @@
- (HEAD -> master, tag: v0.28.3)
+ (HEAD -> master, tag: v0.28.5)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/.github/workflows/release.yml 
new/cli-0.28.5/.github/workflows/release.yml
--- old/cli-0.28.3/.github/workflows/release.yml        2025-02-20 
18:46:12.000000000 +0100
+++ new/cli-0.28.5/.github/workflows/release.yml        2025-03-05 
12:08:34.000000000 +0100
@@ -162,9 +162,9 @@
           ]' > "$RUNNER_TEMP/reference-routes.json"
 
           # Replace old route manifest with new
-          jq --argfile newRoutes "$RUNNER_TEMP/reference-routes.json" 'walk(
+          jq --slurpfile newRoutes "$RUNNER_TEMP/reference-routes.json" 'walk(
             if type == "object" and .isStepReference == true then
-              .routes = $newRoutes
+              .routes = $newRoutes[0]
             else . end
           )' < manifest.json > manifest.json.new
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/CHANGELOG.md new/cli-0.28.5/CHANGELOG.md
--- old/cli-0.28.3/CHANGELOG.md 2025-02-20 18:46:12.000000000 +0100
+++ new/cli-0.28.5/CHANGELOG.md 2025-03-05 12:08:34.000000000 +0100
@@ -26,6 +26,15 @@
 
 ---
 
+## [0.28.4] - 2025-03-04
+
+### Added
+
+- Add the --set and --set-file flags to the step ca token command, allowing 
the user to set keys in the "user" claim in the resulting JWT. 
(smallstep/cli#1375)
+- Support for downloading additional default settings when running 'step ssh 
config' (smallstep/cli#1377)
+    - 'min-password-length' and 'provisioner'
+
+
 ## [0.28.3] - 2025-02-20
 
 ### Added
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/command/ca/token.go 
new/cli-0.28.5/command/ca/token.go
--- old/cli-0.28.3/command/ca/token.go  2025-02-20 18:46:12.000000000 +0100
+++ new/cli-0.28.5/command/ca/token.go  2025-03-05 12:08:34.000000000 +0100
@@ -34,7 +34,8 @@
 [**--sshpop-cert**=<file>] [**--sshpop-key**=<file>]
 [**--cnf**=<fingerprint>] [**--cnf-file**=<file>]
 [**--ssh**] [**--host**] [**--principal**=<name>] 
[**--k8ssa-token-path**=<file>]
-[**--ca-url**=<uri>] [**--root**=<file>] [**--context**=<name>]`,
+[**--ca-url**=<uri>] [**--root**=<file>] [**--context**=<name>]
+[**--set**=<key=value>] [**--set-file**=<file>]`,
                Description: `**step ca token** command generates a one-time 
token granting access to the
 certificates authority.
 
@@ -174,6 +175,18 @@
 $ step ca token --kms yubikey:pin-value=123456 \
   --x5c-cert yubikey:slot-id=82 --x5c-key yubikey:slot-id=82 \
   internal.example.com
+'''
+
+Generate a token with custom data in the "user" claim. The example below can be
+accessed in a template as **.Token.user.field**, rendering to the string
+"value".
+
+This is distinct from **.Insecure.User**: any attributes set using this option
+are added to a claim named "user" in the signed JWT produced by this command.
+This data may therefore be considered trusted (insofar as the token itself is
+trusted).
+'''
+$ step ca token --set field=value internal.example.com
 '''`,
                Flags: []cli.Flag{
                        provisionerKidFlag,
@@ -244,6 +257,8 @@
                        flags.CaURL,
                        flags.Root,
                        flags.Context,
+                       flags.TemplateSet,
+                       flags.TemplateSetFile,
                },
        }
 }
@@ -350,11 +365,29 @@
                tokenOpts = append(tokenOpts, 
cautils.WithConfirmationFingerprint(cnf))
        }
 
+       templateData, err := flags.GetTemplateData(ctx)
+       if err != nil {
+               return err
+       }
+       if templateData != nil {
+               tokenOpts = append(tokenOpts, 
cautils.WithCustomAttributes(templateData))
+       }
+
        // --san and --type revoke are incompatible. Revocation tokens do not 
support SANs.
        if typ == cautils.RevokeType && len(sans) > 0 {
                return errs.IncompatibleFlagWithFlag(ctx, "san", "revoke")
        }
 
+       // --offline doesn't support tokenOpts, so reject set/set-file
+       if offline {
+               if len(ctx.StringSlice("set")) > 0 {
+                       return errs.IncompatibleFlagWithFlag(ctx, "offline", 
"set")
+               }
+               if ctx.String("set-file") != "" {
+                       return errs.IncompatibleFlagWithFlag(ctx, "offline", 
"set-file")
+               }
+       }
+
        // parse times or durations
        notBefore, ok := flags.ParseTimeOrDuration(ctx.String("not-before"))
        if !ok {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/command/oauth/cmd.go 
new/cli-0.28.5/command/oauth/cmd.go
--- old/cli-0.28.3/command/oauth/cmd.go 2025-02-20 18:46:12.000000000 +0100
+++ new/cli-0.28.5/command/oauth/cmd.go 2025-03-05 12:08:34.000000000 +0100
@@ -784,18 +784,22 @@
                return nil, err
        }
 
-       if err := exec.OpenInBrowser(authURL, o.browser); err != nil {
-               fmt.Fprintln(os.Stderr, "Cannot open a web browser on your 
platform.")
-               fmt.Fprintln(os.Stderr)
-               fmt.Fprintln(os.Stderr, "Open a local web browser and visit:")
-               fmt.Fprintln(os.Stderr)
+       if skipBrowser := os.Getenv("STEP_OPEN_BROWSER") == "0"; skipBrowser {
                fmt.Fprintln(os.Stderr, authURL)
-               fmt.Fprintln(os.Stderr)
        } else {
-               fmt.Fprintln(os.Stderr, "Your default web browser has been 
opened to visit:")
-               fmt.Fprintln(os.Stderr)
-               fmt.Fprintln(os.Stderr, authURL)
-               fmt.Fprintln(os.Stderr)
+               if err := exec.OpenInBrowser(authURL, o.browser); err != nil {
+                       fmt.Fprintln(os.Stderr, "Cannot open a web browser on 
your platform.")
+                       fmt.Fprintln(os.Stderr)
+                       fmt.Fprintln(os.Stderr, "Open a local web browser and 
visit:")
+                       fmt.Fprintln(os.Stderr)
+                       fmt.Fprintln(os.Stderr, authURL)
+                       fmt.Fprintln(os.Stderr)
+               } else {
+                       fmt.Fprintln(os.Stderr, "Your default web browser has 
been opened to visit:")
+                       fmt.Fprintln(os.Stderr)
+                       fmt.Fprintln(os.Stderr, authURL)
+                       fmt.Fprintln(os.Stderr)
+               }
        }
 
        // Wait for response and return the token
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/command/ssh/certificate.go 
new/cli-0.28.5/command/ssh/certificate.go
--- old/cli-0.28.3/command/ssh/certificate.go   2025-02-20 18:46:12.000000000 
+0100
+++ new/cli-0.28.5/command/ssh/certificate.go   2025-03-05 12:08:34.000000000 
+0100
@@ -5,6 +5,7 @@
        "crypto"
        "crypto/rand"
        "crypto/x509"
+       "fmt"
        "net/url"
        "os"
        "strings"
@@ -44,7 +45,8 @@
 [**--console**] [**--no-password**] [**--insecure**] [**--force**] 
[**--x5c-cert**=<file>]
 [**--x5c-key**=<file>] [**--k8ssa-token-path**=<file>] [**--no-agent**]
 [**--kty**=<key-type>] [**--curve**=<curve>] [**--size**=<size>]
-[**--ca-url**=<uri>] [**--root**=<file>] [**--context**=<name>]`,
+[**--min-password-length**=<length>] [**--ca-url**=<uri>]
+[**--root**=<file>] [**--context**=<name>]`,
 
                Description: `**step ssh certificate** command generates an SSH 
key pair and creates a
 certificate using [step 
certificates](https://github.com/smallstep/certificates).
@@ -202,6 +204,11 @@
                                Name:  "no-agent",
                                Usage: "Do not add the generated certificate 
and associated private key to the SSH agent.",
                        },
+                       cli.IntFlag{
+                               Name:  "min-password-length",
+                               Usage: "Set minimum required length for 
password used to encrypt private key. The default value is '0'. Values <=0 are 
interpreted as if no minimum value is set.",
+                               Value: 0,
+                       },
                        flags.CaConfig,
                        flags.CaURL,
                        flags.Root,
@@ -240,6 +247,7 @@
        noPassword := ctx.Bool("no-password")
        insecure := ctx.Bool("insecure")
        sshPrivKeyFile := ctx.String("private-key")
+       minPasswordLength := ctx.Int("min-password-length")
        validAfter, validBefore, err := flags.ParseTimeDuration(ctx)
        if err != nil {
                return err
@@ -258,6 +266,8 @@
        switch {
        case noPassword && !insecure:
                return errs.RequiredInsecureFlag(ctx, "no-password")
+       case noPassword && minPasswordLength > 0:
+               return errs.IncompatibleFlagWithFlag(ctx, "no-password", 
"min-password-length")
        case noPassword && passwordFile != "":
                return errs.IncompatibleFlagWithFlag(ctx, "no-password", 
"password-file")
        case token != "" && provisionerPasswordFile != "":
@@ -456,42 +466,47 @@
                // Private key (with password unless --no-password --insecure)
                opts := []pemutil.Options{
                        pemutil.WithOpenSSH(true),
-                       pemutil.ToFile(keyFile, 0600),
+                       pemutil.ToFile(keyFile, 0o600),
                }
                switch {
                case noPassword && insecure:
                case passwordFile != "":
-                       opts = append(opts, 
pemutil.WithPasswordFile(passwordFile))
+                       opts = append(opts, 
pemutil.WithMinLengthPasswordFile(passwordFile, minPasswordLength))
                default:
-                       opts = append(opts, pemutil.WithPasswordPrompt("Please 
enter the password to encrypt the private key", func(s string) ([]byte, error) {
-                               return ui.PromptPassword(s, 
ui.WithValidateNotEmpty())
+                       prompt := "Please enter the password to encrypt the 
private key"
+                       if minPasswordLength > 0 {
+                               prompt = fmt.Sprintf("%s (must be at least %d 
characters)", prompt, minPasswordLength)
+                       }
+                       opts = append(opts, pemutil.WithPasswordPrompt(prompt, 
func(s string) ([]byte, error) {
+                               return ui.PromptPassword(s, 
ui.WithValidateNotEmpty(), ui.WithMinLength(minPasswordLength))
                        }))
                }
+
                _, err = pemutil.Serialize(priv, opts...)
                if err != nil {
                        return err
                }
 
-               if err := utils.WriteFile(pubFile, marshalPublicKey(sshPub, 
subject), 0644); err != nil {
+               if err := utils.WriteFile(pubFile, marshalPublicKey(sshPub, 
subject), 0o644); err != nil {
                        return err
                }
        }
 
        // Write certificate
-       if err := utils.WriteFile(crtFile, marshalPublicKey(resp.Certificate, 
subject), 0644); err != nil {
+       if err := utils.WriteFile(crtFile, marshalPublicKey(resp.Certificate, 
subject), 0o644); err != nil {
                return err
        }
 
        // Write Add User keys and certs
        if isAddUser && resp.AddUserCertificate != nil {
                id := provisioner.SanitizeSSHUserPrincipal(subject) + 
"-provisioner"
-               if _, err := pemutil.Serialize(auPriv, 
pemutil.WithOpenSSH(true), pemutil.ToFile(baseName+"-provisioner", 0600)); err 
!= nil {
+               if _, err := pemutil.Serialize(auPriv, 
pemutil.WithOpenSSH(true), pemutil.ToFile(baseName+"-provisioner", 0o600)); err 
!= nil {
                        return err
                }
-               if err := utils.WriteFile(baseName+"-provisioner.pub", 
marshalPublicKey(sshAuPub, id), 0644); err != nil {
+               if err := utils.WriteFile(baseName+"-provisioner.pub", 
marshalPublicKey(sshAuPub, id), 0o644); err != nil {
                        return err
                }
-               if err := utils.WriteFile(baseName+"-provisioner-cert.pub", 
marshalPublicKey(resp.AddUserCertificate, id), 0644); err != nil {
+               if err := utils.WriteFile(baseName+"-provisioner-cert.pub", 
marshalPublicKey(resp.AddUserCertificate, id), 0o644); err != nil {
                        return err
                }
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/flags/flags.go 
new/cli-0.28.5/flags/flags.go
--- old/cli-0.28.3/flags/flags.go       2025-02-20 18:46:12.000000000 +0100
+++ new/cli-0.28.5/flags/flags.go       2025-03-05 12:08:34.000000000 +0100
@@ -670,3 +670,21 @@
 
        return fmt.Sprintf("%s://%s", u.Scheme, u.Host), nil
 }
+
+// FirstStringOf returns the value of the first defined flag from the input 
list.
+// If no defined flags, returns first flag with non-empty default value.
+func FirstStringOf(ctx *cli.Context, flags ...string) string {
+       // Return first defined flag.
+       for _, f := range flags {
+               if ctx.IsSet(f) {
+                       return ctx.String(f)
+               }
+       }
+       // Return first non-empty, default, flag value.
+       for _, f := range flags {
+               if val := ctx.String(f); val != "" {
+                       return val
+               }
+       }
+       return ""
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/flags/flags_test.go 
new/cli-0.28.5/flags/flags_test.go
--- old/cli-0.28.3/flags/flags_test.go  2025-02-20 18:46:12.000000000 +0100
+++ new/cli-0.28.5/flags/flags_test.go  2025-03-05 12:08:34.000000000 +0100
@@ -230,3 +230,78 @@
                })
        }
 }
+
+func TestFirstStringOf(t *testing.T) {
+       getAppSet := func() (*cli.App, *flag.FlagSet) {
+               app := &cli.App{}
+               set := flag.NewFlagSet("contrive", 0)
+               return app, set
+       }
+       tests := []struct {
+               name       string
+               getContext func() *cli.Context
+               inputs     []string
+               want       string
+       }{
+               {
+                       name: "no-flags-empty",
+                       getContext: func() *cli.Context {
+                               app, set := getAppSet()
+                               //_ = set.String("ca-url", "", "")
+                               return cli.NewContext(app, set, nil)
+                       },
+                       inputs: []string{"foo", "bar"},
+                       want:   "",
+               },
+               {
+                       name: "return-first-set-flag",
+                       getContext: func() *cli.Context {
+                               app, set := getAppSet()
+                               _ = set.String("foo", "", "")
+                               _ = set.String("bar", "", "")
+                               _ = set.String("baz", "", "")
+                               ctx := cli.NewContext(app, set, nil)
+                               ctx.Set("bar", "test1")
+                               ctx.Set("baz", "test2")
+                               return ctx
+                       },
+                       inputs: []string{"foo", "bar", "baz"},
+                       want:   "test1",
+               },
+               {
+                       name: "return-first-default-flag",
+                       getContext: func() *cli.Context {
+                               app, set := getAppSet()
+                               _ = set.String("foo", "", "")
+                               _ = set.String("bar", "", "")
+                               _ = set.String("baz", "test1", "")
+                               ctx := cli.NewContext(app, set, nil)
+                               return ctx
+                       },
+                       inputs: []string{"foo", "bar", "baz"},
+                       want:   "test1",
+               },
+               {
+                       name: "all-empty",
+                       getContext: func() *cli.Context {
+                               app, set := getAppSet()
+                               _ = set.String("foo", "", "")
+                               _ = set.String("bar", "", "")
+                               _ = set.String("baz", "", "")
+                               ctx := cli.NewContext(app, set, nil)
+                               return ctx
+                       },
+                       inputs: []string{"foo", "bar", "baz"},
+                       want:   "",
+               },
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       ctx := tt.getContext()
+                       val := FirstStringOf(ctx, tt.inputs...)
+                       if val != tt.want {
+                               t.Errorf("expected %v, but got %v", tt.want, 
val)
+                       }
+               })
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/go.mod new/cli-0.28.5/go.mod
--- old/cli-0.28.3/go.mod       2025-02-20 18:46:12.000000000 +0100
+++ new/cli-0.28.5/go.mod       2025-03-05 12:08:34.000000000 +0100
@@ -7,8 +7,8 @@
        github.com/ThomasRooney/gexpect v0.0.0-20161231170123-5482f0350944
        github.com/ccoveille/go-safecast v1.5.0
        github.com/fxamacker/cbor/v2 v2.7.0
-       github.com/go-jose/go-jose/v3 v3.0.3
-       github.com/google/go-cmp v0.6.0
+       github.com/go-jose/go-jose/v3 v3.0.4
+       github.com/google/go-cmp v0.7.0
        github.com/google/go-tpm v0.9.3
        github.com/google/uuid v1.6.0
        github.com/icrowley/fake v0.0.0-20221112152111-d7b7e2276db2
@@ -19,7 +19,7 @@
        github.com/smallstep/assert v0.0.0-20200723003110-82e2b9b3b262
        github.com/smallstep/certificates v0.28.2
        github.com/smallstep/certinfo v1.13.0
-       github.com/smallstep/cli-utils v0.10.0
+       github.com/smallstep/cli-utils v0.12.1
        github.com/smallstep/go-attestation v0.4.4-0.20240109183208-413678f90935
        github.com/smallstep/linkedca v0.23.0
        github.com/smallstep/truststore v0.13.0
@@ -28,8 +28,8 @@
        github.com/stretchr/testify v1.10.0
        github.com/urfave/cli v1.22.16
        go.mozilla.org/pkcs7 v0.9.0
-       go.step.sm/crypto v0.57.1
-       golang.org/x/crypto v0.33.0
+       go.step.sm/crypto v0.59.1
+       golang.org/x/crypto v0.35.0
        golang.org/x/sys v0.30.0
        golang.org/x/term v0.29.0
        google.golang.org/protobuf v1.36.5
@@ -37,22 +37,22 @@
 )
 
 require (
-       cloud.google.com/go v0.116.0 // indirect
-       cloud.google.com/go/auth v0.14.1 // indirect
+       cloud.google.com/go v0.118.2 // indirect
+       cloud.google.com/go/auth v0.15.0 // indirect
        cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect
        cloud.google.com/go/compute/metadata v0.6.0 // indirect
-       cloud.google.com/go/iam v1.2.2 // indirect
+       cloud.google.com/go/iam v1.4.0 // indirect
        cloud.google.com/go/longrunning v0.6.4 // indirect
        cloud.google.com/go/security v1.18.3 // indirect
        dario.cat/mergo v1.0.1 // indirect
        filippo.io/edwards25519 v1.1.0 // indirect
        github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // 
indirect
        github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
-       github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1 // indirect
+       github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 // indirect
        github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
        github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 // 
indirect
        github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 // 
indirect
-       github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 // 
indirect
+       github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 // 
indirect
        github.com/Masterminds/goutils v1.1.1 // indirect
        github.com/Masterminds/semver/v3 v3.3.0 // indirect
        github.com/Masterminds/sprig/v3 v3.3.0 // indirect
@@ -74,7 +74,7 @@
        github.com/dustin/go-humanize v1.0.1 // indirect
        github.com/felixge/httpsnoop v1.0.4 // indirect
        github.com/go-chi/chi/v5 v5.2.1 // indirect
-       github.com/go-jose/go-jose/v4 v4.0.2 // indirect
+       github.com/go-jose/go-jose/v4 v4.0.5 // indirect
        github.com/go-logr/logr v1.4.2 // indirect
        github.com/go-logr/stdr v1.2.2 // indirect
        github.com/go-sql-driver/mysql v1.8.1 // indirect
@@ -84,7 +84,7 @@
        github.com/golang/snappy v0.0.4 // indirect
        github.com/google/btree v1.1.3 // indirect
        github.com/google/certificate-transparency-go v1.2.2 // indirect
-       github.com/google/go-tpm-tools v0.4.4 // indirect
+       github.com/google/go-tpm-tools v0.4.5 // indirect
        github.com/google/go-tspi v0.3.0 // indirect
        github.com/google/s2a-go v0.1.9 // indirect
        github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
@@ -126,21 +126,21 @@
        github.com/x448/float16 v0.8.4 // indirect
        go.etcd.io/bbolt v1.3.11 // indirect
        go.opentelemetry.io/auto/sdk v1.1.0 // indirect
-       
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc 
v0.58.0 // indirect
-       go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 
// indirect
+       
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc 
v0.59.0 // indirect
+       go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 
// indirect
        go.opentelemetry.io/otel v1.34.0 // indirect
        go.opentelemetry.io/otel/metric v1.34.0 // indirect
        go.opentelemetry.io/otel/trace v1.34.0 // indirect
-       golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81 // indirect
+       golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc // indirect
        golang.org/x/net v0.35.0 // indirect
        golang.org/x/oauth2 v0.26.0 // indirect
        golang.org/x/sync v0.11.0 // indirect
        golang.org/x/text v0.22.0 // indirect
        golang.org/x/time v0.10.0 // indirect
-       google.golang.org/api v0.221.0 // indirect
-       google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // 
indirect
-       google.golang.org/genproto/googleapis/api 
v0.0.0-20241209162323-e6fa225c2576 // indirect
-       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20250207221924-e9438ea467c6 // indirect
+       google.golang.org/api v0.223.0 // indirect
+       google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 // 
indirect
+       google.golang.org/genproto/googleapis/api 
v0.0.0-20250219182151-9fdb1cabc7b2 // indirect
+       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20250219182151-9fdb1cabc7b2 // indirect
        google.golang.org/grpc v1.70.0 // indirect
        google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 // indirect
        gopkg.in/yaml.v3 v3.0.1 // indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/go.sum new/cli-0.28.5/go.sum
--- old/cli-0.28.3/go.sum       2025-02-20 18:46:12.000000000 +0100
+++ new/cli-0.28.5/go.sum       2025-03-05 12:08:34.000000000 +0100
@@ -1,15 +1,15 @@
-cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE=
-cloud.google.com/go v0.116.0/go.mod 
h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U=
-cloud.google.com/go/auth v0.14.1 
h1:AwoJbzUdxA/whv1qj3TLKwh3XX5sikny2fc40wUl+h0=
-cloud.google.com/go/auth v0.14.1/go.mod 
h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM=
+cloud.google.com/go v0.118.2 h1:bKXO7RXMFDkniAAvvuMrAPtQ/VHrs9e7J5UT3yrGdTY=
+cloud.google.com/go v0.118.2/go.mod 
h1:CFO4UPEPi8oV21xoezZCrd3d81K4fFkDTEJu4R8K+9M=
+cloud.google.com/go/auth v0.15.0 
h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps=
+cloud.google.com/go/auth v0.15.0/go.mod 
h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8=
 cloud.google.com/go/auth/oauth2adapt v0.2.7 
h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M=
 cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod 
h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc=
 cloud.google.com/go/compute/metadata v0.6.0 
h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
 cloud.google.com/go/compute/metadata v0.6.0/go.mod 
h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
-cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA=
-cloud.google.com/go/iam v1.2.2/go.mod 
h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY=
-cloud.google.com/go/kms v1.20.5 h1:aQQ8esAIVZ1atdJRxihhdxGQ64/zEbJoJnCz/ydSmKg=
-cloud.google.com/go/kms v1.20.5/go.mod 
h1:C5A8M1sv2YWYy1AE6iSrnddSG9lRGdJq5XEdBy28Lmw=
+cloud.google.com/go/iam v1.4.0 h1:ZNfy/TYfn2uh/ukvhp783WhnbVluqf/tzOaqVUPlIPA=
+cloud.google.com/go/iam v1.4.0/go.mod 
h1:gMBgqPaERlriaOV0CUl//XUzDhSfXevn4OEUbg6VRs4=
+cloud.google.com/go/kms v1.21.0 h1:x3EeWKuYwdlo2HLse/876ZrKjk2L5r7Uexfm8+p6mSI=
+cloud.google.com/go/kms v1.21.0/go.mod 
h1:zoFXMhVVK7lQ3JC9xmhHMoQhnjEDZFoLAr5YMwzBLtk=
 cloud.google.com/go/longrunning v0.6.4 
h1:3tyw9rO3E2XVXzSApn1gyEEnH2K9SynNQjMlBi3uHLg=
 cloud.google.com/go/longrunning v0.6.4/go.mod 
h1:ttZpLCe6e7EXvn9OxpBRx7kZEB0efv8yBO6YnVMfhJs=
 cloud.google.com/go/security v1.18.3 
h1:ya9gfY1ign6Yy25VMMMgZ9xy7D/TczDB0ElXcyWmEVE=
@@ -22,10 +22,10 @@
 github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod 
h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 
h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ=
 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod 
h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1 
h1:1mvYtZfWQAnwNah/C+Z+Jb9rQH95LPE2vlmMuWAHJk8=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1/go.mod 
h1:75I/mXtme1JyWFtz8GocPHVFyH421IBoZErnO16dd0k=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.1 
h1:Bk5uOhSAenHyR5P61D/NzeQCv+4fEVV8mOkJ82NqpWw=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.1/go.mod 
h1:QZ4pw3or1WPmRBxf0cHd1tknzrT54WPBOQoGutCPvSU=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 
h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod 
h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 
h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod 
h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8=
 github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 
h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
 github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod 
h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
 github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 
h1:m/sWOGCREuSBqg2htVQTBY8nOZpyajYztF0vUvSZTuM=
@@ -34,8 +34,8 @@
 github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1/go.mod 
h1:9V2j0jn9jDEkCkv8w/bKTNppX/d0FVA1ud77xCIP4KA=
 github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 
h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM=
 github.com/AzureAD/microsoft-authentication-extensions-for-go/cache 
v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE=
-github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 
h1:kYRSnvJju5gYVyhkij+RTJ/VR6QIUaCfWeaFm2ycsjQ=
-github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2/go.mod 
h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
+github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 
h1:H5xDQaE3XowWfhZRUpnfC+rGZMEVoSiji+b+/HFAPU4=
+github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3/go.mod 
h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
 github.com/BurntSushi/toml v0.3.1/go.mod 
h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/toml v1.4.0/go.mod 
h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
 github.com/Masterminds/goutils v1.1.1 
h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
@@ -53,32 +53,32 @@
 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod 
h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d 
h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ=
 github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod 
h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
-github.com/aws/aws-sdk-go-v2 v1.34.0 
h1:9iyL+cjifckRGEVpRKZP3eIxVlL06Qk1Tk13vreaVQU=
-github.com/aws/aws-sdk-go-v2 v1.34.0/go.mod 
h1:JgstGg0JjWU1KpVJjD5H0y0yyAIpSdKEq556EI6yOOM=
-github.com/aws/aws-sdk-go-v2/config v1.29.2 
h1:JuIxOEPcSKpMB0J+khMjznG9LIhIBdmqNiEcPclnwqc=
-github.com/aws/aws-sdk-go-v2/config v1.29.2/go.mod 
h1:HktTHregOZwNSM/e7WTfVSu9RCX+3eOv+6ij27PtaYs=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.55 
h1:CDhKnDEaGkLA5ZszV/qw5uwN5M8rbv9Cl0JRN+PRsaM=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.55/go.mod 
h1:kPD/vj+RB5MREDUky376+zdnjZpR+WgdBBvwrmnlmKE=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.25 
h1:kU7tmXNaJ07LsyN3BUgGqAmVmQtq0w6duVIHAKfp0/w=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.25/go.mod 
h1:OiC8+OiqrURb1wrwmr/UbOVLFSWEGxjinj5C299VQdo=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.29 
h1:Ej0Rf3GMv50Qh4G4852j2djtoDb7AzQ7MuQeFHa3D70=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.29/go.mod 
h1:oeNTC7PwJNoM5AznVr23wxhLnuJv0ZDe5v7w0wqIs9M=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.29 
h1:6e8a71X+9GfghragVevC5bZqvATtc3mAMgxpSNbgzF0=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.29/go.mod 
h1:c4jkZiQ+BWpNqq7VtrxjwISrLrt/VvPq3XiopkUIolI=
+github.com/aws/aws-sdk-go-v2 v1.36.1 
h1:iTDl5U6oAhkNPba0e1t1hrwAo02ZMqbrGq4k5JBWM5E=
+github.com/aws/aws-sdk-go-v2 v1.36.1/go.mod 
h1:5PMILGVKiW32oDzjj6RU52yrNrDPUHcbZQYr1sM7qmM=
+github.com/aws/aws-sdk-go-v2/config v1.29.6 
h1:fqgqEKK5HaZVWLQoLiC9Q+xDlSp+1LYidp6ybGE2OGg=
+github.com/aws/aws-sdk-go-v2/config v1.29.6/go.mod 
h1:Ft+WLODzDQmCTHDvqAH1JfC2xxbZ0MxpZAcJqmE1LTQ=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.59 
h1:9btwmrt//Q6JcSdgJOLI98sdr5p7tssS9yAsGe8aKP4=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.59/go.mod 
h1:NM8fM6ovI3zak23UISdWidyZuI1ghNe2xjzUZAyT+08=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28 
h1:KwsodFKVQTlI5EyhRSugALzsV6mG/SGrdjlMXSZSdso=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28/go.mod 
h1:EY3APf9MzygVhKuPXAc5H+MkGb8k/DOSQjWS0LgkKqI=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32 
h1:BjUcr3X3K0wZPGFg2bxOWW3VPN8rkE3/61zhP+IHviA=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32/go.mod 
h1:80+OGC/bgzzFFTUmcuwD0lb4YutwQeKLFpmt6hoWapU=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32 
h1:m1GeXHVMJsRsUAqG6HjZWx9dj7F5TR+cF1bjyfYyBd4=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32/go.mod 
h1:IitoQxGfaKdVLNg0hD8/DXmAqNy0H4K2H2Sf91ti8sI=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 
h1:Pg9URiobXy85kgFev3og2CuOZ8JZUBENF+dcgWBaYNk=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2/go.mod 
h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 
h1:D4oz8/CzT9bAEYtVhSBmFj2dNOtaHOtMKc2vHBwYizA=
 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2/go.mod 
h1:Za3IHqTQ+yNcRHxu1OFucBh0ACZT4j4VQFF0BqpZcLY=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.10 
h1:hN4yJBGswmFTOVYqmbz1GBs9ZMtQe8SrYxPwrkrlRv8=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.10/go.mod 
h1:TsxON4fEZXyrKY+D+3d2gSTyJkGORexIYab9PTf56DA=
-github.com/aws/aws-sdk-go-v2/service/kms v1.37.14 
h1:IvhYu4W4wKMqN6DqtuVD7obkFflgTv1wmnZMjlSeDAA=
-github.com/aws/aws-sdk-go-v2/service/kms v1.37.14/go.mod 
h1:yqUt1GZH4uf7HUNT2Kd7qk6P+Vi5z+C5+NjNSNRO1L4=
-github.com/aws/aws-sdk-go-v2/service/sso v1.24.12 
h1:kznaW4f81mNMlREkU9w3jUuJvU5g/KsqDV43ab7Rp6s=
-github.com/aws/aws-sdk-go-v2/service/sso v1.24.12/go.mod 
h1:bZy9r8e0/s0P7BSDHgMLXK2KvdyRRBIQ2blKlvLt0IU=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.11 
h1:mUwIpAvILeKFnRx4h1dEgGEFGuV8KJ3pEScZWVFYuZA=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.11/go.mod 
h1:JDJtD+b8HNVv71axz8+S5492KM8wTzHRFpMKQbPlYxw=
-github.com/aws/aws-sdk-go-v2/service/sts v1.33.10 
h1:g9d+TOsu3ac7SgmY2dUf1qMgu/uJVTlQ4VCbH6hRxSw=
-github.com/aws/aws-sdk-go-v2/service/sts v1.33.10/go.mod 
h1:WZfNmntu92HO44MVZAubQaz3qCuIdeOdog2sADfU6hU=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13 
h1:SYVGSFQHlchIcy6e7x12bsrxClCXSP5et8cqVhL8cuw=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13/go.mod 
h1:kizuDaLX37bG5WZaoxGPQR/LNFXpxp0vsUnqfkWXfNE=
+github.com/aws/aws-sdk-go-v2/service/kms v1.37.18 
h1:pi9M/9n1PLayBXjia7LfwgXwcpFdFO7Q2cqKOZa1ZmM=
+github.com/aws/aws-sdk-go-v2/service/kms v1.37.18/go.mod 
h1:vZXvmzfhdsPj/axc8+qk/2fSCP4hGyaZ1MAduWEHAxM=
+github.com/aws/aws-sdk-go-v2/service/sso v1.24.15 
h1:/eE3DogBjYlvlbhd2ssWyeuovWunHLxfgw3s/OJa4GQ=
+github.com/aws/aws-sdk-go-v2/service/sso v1.24.15/go.mod 
h1:2PCJYpi7EKeA5SkStAmZlF6fi0uUABuhtF8ILHjGc3Y=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14 
h1:M/zwXiL2iXUrHputuXgmO94TVNmcenPHxgLXLutodKE=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14/go.mod 
h1:RVwIw3y/IqxC2YEXSIkAzRDdEU1iRabDPaYjpGCbCGQ=
+github.com/aws/aws-sdk-go-v2/service/sts v1.33.14 
h1:TzeR06UCMUq+KA3bDkujxK1GVGy+G8qQN/QVYzGLkQE=
+github.com/aws/aws-sdk-go-v2/service/sts v1.33.14/go.mod 
h1:dspXf/oYWGWo6DEvj98wpaTeqt5+DMidZD0A9BYTizc=
 github.com/aws/smithy-go v1.22.2 
h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ=
 github.com/aws/smithy-go v1.22.2/go.mod 
h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@@ -143,10 +143,10 @@
 github.com/fxamacker/cbor/v2 v2.7.0/go.mod 
h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
 github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8=
 github.com/go-chi/chi/v5 v5.2.1/go.mod 
h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
-github.com/go-jose/go-jose/v3 v3.0.3 
h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k=
-github.com/go-jose/go-jose/v3 v3.0.3/go.mod 
h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ=
-github.com/go-jose/go-jose/v4 v4.0.2 
h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk=
-github.com/go-jose/go-jose/v4 v4.0.2/go.mod 
h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY=
+github.com/go-jose/go-jose/v3 v3.0.4 
h1:Wp5HA7bLQcKnf6YYao/4kpRpVMp/yf6+pJKV8WFSaNY=
+github.com/go-jose/go-jose/v3 v3.0.4/go.mod 
h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ=
+github.com/go-jose/go-jose/v4 v4.0.5 
h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE=
+github.com/go-jose/go-jose/v4 v4.0.5/go.mod 
h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA=
 github.com/go-logr/logr v1.2.2/go.mod 
h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
 github.com/go-logr/logr v1.4.2/go.mod 
h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -172,20 +172,21 @@
 github.com/google/certificate-transparency-go v1.2.2 
h1:5TAzjQnCfN1vps2XWUgU6Svt++rgy9a+b8CBYXaKUAo=
 github.com/google/certificate-transparency-go v1.2.2/go.mod 
h1:d1o5XNQzK/yz8IXzEce6KXgMxfter/EcMP9vG4dBRNE=
 github.com/google/go-cmp v0.5.9/go.mod 
h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod 
h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-configfs-tsm v0.2.2 
h1:YnJ9rXIOj5BYD7/0DNnzs8AOp7UcvjfTvt215EWcs98=
-github.com/google/go-configfs-tsm v0.2.2/go.mod 
h1:EL1GTDFMb5PZQWDviGfZV9n87WeGTR/JUg13RfwkgRo=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod 
h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
+github.com/google/go-configfs-tsm v0.3.3-0.20240919001351-b4b5b84fdcbc 
h1:SG12DWUUM5igxm+//YX5Yq4vhdoRnOG9HkCodkOn+YU=
+github.com/google/go-configfs-tsm v0.3.3-0.20240919001351-b4b5b84fdcbc/go.mod 
h1:EL1GTDFMb5PZQWDviGfZV9n87WeGTR/JUg13RfwkgRo=
 github.com/google/go-github v17.0.0+incompatible/go.mod 
h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
 github.com/google/go-querystring v1.0.0/go.mod 
h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
-github.com/google/go-sev-guest v0.9.3 
h1:GOJ+EipURdeWFl/YYdgcCxyPeMgQUWlI056iFkBD8UU=
-github.com/google/go-sev-guest v0.9.3/go.mod 
h1:hc1R4R6f8+NcJwITs0L90fYWTsBpd1Ix+Gur15sqHDs=
-github.com/google/go-tdx-guest v0.3.1 
h1:gl0KvjdsD4RrJzyLefDOvFOUH3NAJri/3qvaL5m83Iw=
-github.com/google/go-tdx-guest v0.3.1/go.mod 
h1:/rc3d7rnPykOPuY8U9saMyEps0PZDThLk/RygXm04nE=
+github.com/google/go-sev-guest v0.12.1 
h1:H4rFYnPIn8HtqEsNTmh56Zxcf9BI9n48ZSYCnpYLYvc=
+github.com/google/go-sev-guest v0.12.1/go.mod 
h1:SK9vW+uyfuzYdVN0m8BShL3OQCtXZe/JPF7ZkpD3760=
+github.com/google/go-tdx-guest v0.3.2-0.20241009005452-097ee70d0843 
h1:+MoPobRN9HrDhGyn6HnF5NYo4uMBKaiFqAtf/D/OB4A=
+github.com/google/go-tdx-guest v0.3.2-0.20241009005452-097ee70d0843/go.mod 
h1:g/n8sKITIT9xRivBUbizo34DTsUm2nN2uU3A662h09g=
 github.com/google/go-tpm v0.9.3 h1:+yx0/anQuGzi+ssRqeD6WpXjW2L/V0dItUayO0i9sRc=
 github.com/google/go-tpm v0.9.3/go.mod 
h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY=
-github.com/google/go-tpm-tools v0.4.4 
h1:oiQfAIkc6xTy9Fl5NKTeTJkBTlXdHsxAofmQyxBKY98=
-github.com/google/go-tpm-tools v0.4.4/go.mod 
h1:T8jXkp2s+eltnCDIsXR84/MTcVU9Ja7bh3Mit0pa4AY=
+github.com/google/go-tpm-tools v0.4.5 
h1:3fhthtyMDbIZFR5/0y1hvUoZ1Kf4i1eZ7C73R4Pvd+k=
+github.com/google/go-tpm-tools v0.4.5/go.mod 
h1:ktjTNq8yZFD6TzdBFefUfen96rF3NpYwpSb2d8bc+Y8=
 github.com/google/go-tspi v0.3.0 
h1:ADtq8RKfP+jrTyIWIZDIYcKOMecRqNJFOew2IT0Inus=
 github.com/google/go-tspi v0.3.0/go.mod 
h1:xfMGI3G0PhxCdNVcYr1C4C+EizojDg/TXuX5by8CiHI=
 github.com/google/logger v1.1.1 h1:+6Z2geNxc9G+4D4oDO9njjjn2d0wN5d7uOo0vOIW1NQ=
@@ -252,8 +253,6 @@
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod 
h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
 github.com/newrelic/go-agent/v3 v3.36.0 
h1:PdvJZiUu45qg2qrOeia0gYr1vaZ2Ro6QIlqlgHObHXo=
 github.com/newrelic/go-agent/v3 v3.36.0/go.mod 
h1:GNTda53CohAhkgsc7/gqSsJhDZjj8vaky5u+vKz7wqM=
-github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw=
-github.com/pborman/uuid v1.2.1/go.mod 
h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 github.com/pelletier/go-toml v1.2.0/go.mod 
h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/peterbourgon/diskv/v3 v3.0.1 
h1:x06SQA46+PKIUftmEujdwSEpIx8kR+M9eLYsUxeYveU=
 github.com/peterbourgon/diskv/v3 v3.0.1/go.mod 
h1:kJ5Ny7vLdARGU3WUuy6uzO6T0nb/2gWcT1JiBvRmb5o=
@@ -299,8 +298,8 @@
 github.com/smallstep/certificates v0.28.2/go.mod 
h1:UWVIqq5A3toV9rSzYUnimqRNeU6xCt3YWB2mTaCxm28=
 github.com/smallstep/certinfo v1.13.0 
h1:iv/Fc1c8vke1asJZI7s3XoH7Wo/MY7znK0TlDUsSAhs=
 github.com/smallstep/certinfo v1.13.0/go.mod 
h1:2pGT3T7r0s5f3BpJRi/j5K5akgvL3RfYXts5rDICkEA=
-github.com/smallstep/cli-utils v0.10.0 
h1:CfXNvHtIN5pAzGvGP0NEUZoGFcj5epNEB6RSpSfduek=
-github.com/smallstep/cli-utils v0.10.0/go.mod 
h1:jIeNa5ctrVg89lU5TaQKYd6o1eFxi9mtZu1sXSxpEBg=
+github.com/smallstep/cli-utils v0.12.1 
h1:D9QvfbFqiKq3snGZ2xDcXEFrdFJ1mQfPHZMq/leerpE=
+github.com/smallstep/cli-utils v0.12.1/go.mod 
h1:skV2Neg8qjiKPu2fphM89H9bIxNpKiiRTnX9Q6Lc+20=
 github.com/smallstep/go-attestation v0.4.4-0.20240109183208-413678f90935 
h1:kjYvkvS/Wdy0PVRDUAA0gGJIVSEZYhiAJtfwYgOYoGA=
 github.com/smallstep/go-attestation 
v0.4.4-0.20240109183208-413678f90935/go.mod 
h1:vNAduivU014fubg6ewygkAvQC0IQVXqdc8vaGl/0er4=
 github.com/smallstep/linkedca v0.23.0 
h1:5W/7EudlK1HcCIdZM68dJlZ7orqCCCyv6bm2l/0JmLU=
@@ -360,10 +359,10 @@
 go.mozilla.org/pkcs7 v0.9.0/go.mod 
h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk=
 go.opentelemetry.io/auto/sdk v1.1.0 
h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
 go.opentelemetry.io/auto/sdk v1.1.0/go.mod 
h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc 
v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc 
v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 
h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod 
h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc 
v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc 
v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 
h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod 
h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I=
 go.opentelemetry.io/otel v1.34.0 
h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
 go.opentelemetry.io/otel v1.34.0/go.mod 
h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
 go.opentelemetry.io/otel/metric v1.34.0 
h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
@@ -374,8 +373,8 @@
 go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod 
h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
 go.opentelemetry.io/otel/trace v1.34.0 
h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
 go.opentelemetry.io/otel/trace v1.34.0/go.mod 
h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
-go.step.sm/crypto v0.57.1 h1:bt7ugfc0m2/nJ9/uhQOtXRW3xQr8zJwL087FLQk9mvc=
-go.step.sm/crypto v0.57.1/go.mod 
h1:wL25/Mh7edmo36AA93hf9agP493Zt3y4QBzB1wzwOjc=
+go.step.sm/crypto v0.59.1 h1:jUL+5p19YS9YJKLaPUgkS2OdGm7s0+hwP7AqTFyF9Cg=
+go.step.sm/crypto v0.59.1/go.mod 
h1:XHavmnzfTyPpQE/n4YokEtjiBzP3LZI9/1O061f5y0o=
 go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
 go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
 go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
@@ -387,10 +386,11 @@
 golang.org/x/crypto v0.19.0/go.mod 
h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
 golang.org/x/crypto v0.23.0/go.mod 
h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
 golang.org/x/crypto v0.27.0/go.mod 
h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
-golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
 golang.org/x/crypto v0.33.0/go.mod 
h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
-golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81 
h1:6R2FC06FonbXQ8pK11/PDFY6N6LWlf9KlzibaCapmqc=
-golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81/go.mod 
h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ=
+golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
+golang.org/x/crypto v0.35.0/go.mod 
h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
+golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc 
h1:O9NuF4s+E/PvMIy+9IUZB9znFwUIXEWSstNjek6VpVg=
+golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc/go.mod 
h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod 
h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
@@ -471,14 +471,14 @@
 golang.org/x/tools v0.13.0/go.mod 
h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod 
h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/api v0.221.0 h1:qzaJfLhDsbMeFee8zBRdt/Nc+xmOuafD/dbdgGfutOU=
-google.golang.org/api v0.221.0/go.mod 
h1:7sOU2+TL4TxUTdbi0gWgAIg7tH5qBXxoyhtL+9x3biQ=
-google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 
h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk=
-google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod 
h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc=
-google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 
h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q=
-google.golang.org/genproto/googleapis/api 
v0.0.0-20241209162323-e6fa225c2576/go.mod 
h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 
h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI=
-google.golang.org/genproto/googleapis/rpc 
v0.0.0-20250207221924-e9438ea467c6/go.mod 
h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
+google.golang.org/api v0.223.0 h1:JUTaWEriXmEy5AhvdMgksGGPEFsYfUKaPEYXd4c3Wvc=
+google.golang.org/api v0.223.0/go.mod 
h1:C+RS7Z+dDwds2b+zoAk5hN/eSfsiCn0UDrYof/M4d2M=
+google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 
h1:Pw6WnI9W/LIdRxqK7T6XGugGbHIRl5Q7q3BssH6xk4s=
+google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod 
h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE=
+google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 
h1:35ZFtrCgaAjF7AFAK0+lRSf+4AyYnWRbH7og13p7rZ4=
+google.golang.org/genproto/googleapis/api 
v0.0.0-20250219182151-9fdb1cabc7b2/go.mod 
h1:W9ynFDP/shebLB1Hl/ESTOap2jHd6pmLXPNZC7SVDbA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 
h1:DMTIbak9GhdaSxEjvVzAeNZvyc03I61duqNbnm3SU0M=
+google.golang.org/genproto/googleapis/rpc 
v0.0.0-20250219182151-9fdb1cabc7b2/go.mod 
h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I=
 google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
 google.golang.org/grpc v1.70.0/go.mod 
h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 
h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/internal/cast/cast_test.go 
new/cli-0.28.5/internal/cast/cast_test.go
--- old/cli-0.28.3/internal/cast/cast_test.go   2025-02-20 18:46:12.000000000 
+0100
+++ new/cli-0.28.5/internal/cast/cast_test.go   2025-03-05 12:08:34.000000000 
+0100
@@ -36,7 +36,7 @@
 }
 
 func TestInt64PanicsOnLargeValue(t *testing.T) {
-       require.Panics(t, func() { cast.Int64(uint64(math.MaxInt + 1)) })
+       require.Panics(t, func() { cast.Int64(uint64(math.MaxInt64 + 1)) })
 }
 
 func TestUint64ConvertsValues(t *testing.T) {
@@ -56,16 +56,16 @@
 }
 
 func TestInt32PanicsOnTooSmallValue(t *testing.T) {
-       require.Panics(t, func() { cast.Int32(math.MinInt32 - 1) })
+       require.Panics(t, func() { cast.Int32(int64(math.MinInt32 - 1)) })
 }
 
 func TestInt32PanicsOnLargeValue(t *testing.T) {
-       require.Panics(t, func() { cast.Int32(math.MaxInt32 + 1) })
+       require.Panics(t, func() { cast.Int32(int64(math.MaxInt32 + 1)) })
 }
 
 func TestUint32ConvertsValues(t *testing.T) {
        require.Equal(t, uint32(0), cast.Uint32(0))
-       require.Equal(t, uint32(math.MaxUint32), cast.Uint32(math.MaxUint32))
+       require.Equal(t, uint32(math.MaxUint32), 
cast.Uint32(int64(math.MaxUint32)))
        require.Equal(t, uint32(42), cast.Uint32(42))
 }
 
@@ -74,8 +74,9 @@
 }
 
 func TestUint32PanicsOnLargeValue(t *testing.T) {
-       require.Panics(t, func() { cast.Uint32(math.MaxUint32 + 1) })
+       require.Panics(t, func() { cast.Uint32(int64(math.MaxUint32 + 1)) })
 }
+
 func TestUint8ConvertsValues(t *testing.T) {
        require.Equal(t, uint8(0), cast.Uint8(0))
        require.Equal(t, uint8(math.MaxUint8), cast.Uint8(math.MaxUint8))
@@ -87,5 +88,5 @@
 }
 
 func TestUint8PanicsOnLargeValue(t *testing.T) {
-       require.Panics(t, func() { cast.Uint8(math.MaxUint32 + 1) })
+       require.Panics(t, func() { cast.Uint8(math.MaxUint8 + 1) })
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/token/options.go 
new/cli-0.28.5/token/options.go
--- old/cli-0.28.3/token/options.go     2025-02-20 18:46:12.000000000 +0100
+++ new/cli-0.28.5/token/options.go     2025-03-05 12:08:34.000000000 +0100
@@ -80,6 +80,25 @@
        }
 }
 
+// WithUserData returns an Option function that merges the provided map with 
the
+// existing user claim in the payload.
+func WithUserData(v map[string]interface{}) Options {
+       return func(c *Claims) error {
+               if _, ok := c.ExtraClaims[UserClaim]; !ok {
+                       c.Set(UserClaim, make(map[string]interface{}))
+               }
+               s := c.ExtraClaims[UserClaim]
+               sm, ok := s.(map[string]interface{})
+               if !ok {
+                       return fmt.Errorf("%q claim is %T, not 
map[string]interface{}", UserClaim, s)
+               }
+               for k, val := range v {
+                       sm[k] = val
+               }
+               return nil
+       }
+}
+
 // WithSSH returns an Options function that sets the step claim with the ssh
 // property in the value.
 func WithSSH(v interface{}) Options {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/token/token.go 
new/cli-0.28.5/token/token.go
--- old/cli-0.28.3/token/token.go       2025-02-20 18:46:12.000000000 +0100
+++ new/cli-0.28.5/token/token.go       2025-03-05 12:08:34.000000000 +0100
@@ -32,6 +32,9 @@
 // StepClaim is the property name for a JWT claim the stores the custom 
information in the certificate.
 const StepClaim = "step"
 
+// UserClaim is the property name for a JWT claim that stores user-provided 
custom information.
+const UserClaim = "user"
+
 // ConfirmationClaim is the property name for a JWT claim that stores a JSON
 // object used as Proof-Of-Possession.
 const ConfirmationClaim = "cnf"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/utils/cautils/bootstrap.go 
new/cli-0.28.5/utils/cautils/bootstrap.go
--- old/cli-0.28.3/utils/cautils/bootstrap.go   2025-02-20 18:46:12.000000000 
+0100
+++ new/cli-0.28.5/utils/cautils/bootstrap.go   2025-03-05 12:08:34.000000000 
+0100
@@ -25,9 +25,11 @@
 )
 
 type bootstrapAPIResponse struct {
-       CaURL       string `json:"url"`
-       Fingerprint string `json:"fingerprint"`
-       RedirectURL string `json:"redirect-url"`
+       CaURL             string `json:"url"`
+       Fingerprint       string `json:"fingerprint"`
+       RedirectURL       string `json:"redirect-url"`
+       Provisioner       string `json:"provisioner"`
+       MinPasswordLength int    `json:"min-password-length"`
 }
 
 // UseContext returns true if contexts should be used, false otherwise.
@@ -55,6 +57,20 @@
 type bootstrapContext struct {
        defaultContextName string
        redirectURL        string
+       provisioner        string
+       minPasswordLength  int
+}
+
+func withProvisioner(provisioner string) bootstrapOption {
+       return func(bc *bootstrapContext) {
+               bc.provisioner = provisioner
+       }
+}
+
+func withMinPasswordLength(minLength int) bootstrapOption {
+       return func(bc *bootstrapContext) {
+               bc.minPasswordLength = minLength
+       }
 }
 
 func withDefaultContextValues(context string) bootstrapOption {
@@ -70,10 +86,12 @@
 }
 
 type bootstrapConfig struct {
-       CA          string `json:"ca-url"`
-       Fingerprint string `json:"fingerprint"`
-       Root        string `json:"root"`
-       Redirect    string `json:"redirect-url"`
+       CA                string `json:"ca-url"`
+       Fingerprint       string `json:"fingerprint"`
+       Root              string `json:"root"`
+       Redirect          string `json:"redirect-url,omitempty"`
+       Provisioner       string `json:"provisioner,omitempty"`
+       MinPasswordLength int    `json:"min-password-length,omitempty"`
 }
 
 func bootstrap(ctx *cli.Context, caURL, fingerprint string, opts 
...bootstrapOption) error {
@@ -126,16 +144,16 @@
        rootFile := pki.GetRootCAPath()
        configFile := step.DefaultsFile()
 
-       if err = os.MkdirAll(filepath.Dir(rootFile), 0700); err != nil {
+       if err = os.MkdirAll(filepath.Dir(rootFile), 0o700); err != nil {
                return errs.FileError(err, rootFile)
        }
 
-       if err = os.MkdirAll(filepath.Dir(configFile), 0700); err != nil {
+       if err = os.MkdirAll(filepath.Dir(configFile), 0o700); err != nil {
                return errs.FileError(err, configFile)
        }
 
        // Serialize root
-       _, err = pemutil.Serialize(resp.RootPEM.Certificate, 
pemutil.ToFile(rootFile, 0600))
+       _, err = pemutil.Serialize(resp.RootPEM.Certificate, 
pemutil.ToFile(rootFile, 0o600))
        if err != nil {
                return err
        }
@@ -148,12 +166,19 @@
        }
 
        // Serialize defaults.json
-       b, err := json.MarshalIndent(bootstrapConfig{
+       bootConf := bootstrapConfig{
                CA:          caURL,
                Fingerprint: fingerprint,
                Root:        pki.GetRootCAPath(),
                Redirect:    bc.redirectURL,
-       }, "", "  ")
+       }
+       if bc.minPasswordLength > 0 {
+               bootConf.MinPasswordLength = bc.minPasswordLength
+       }
+       if bc.provisioner != "" {
+               bootConf.Provisioner = bc.provisioner
+       }
+       b, err := json.MarshalIndent(bootConf, "", "  ")
        if err != nil {
                return errors.Wrap(err, "error marshaling defaults.json")
        }
@@ -162,7 +187,7 @@
        ctx.Set("fingerprint", fingerprint)
        ctx.Set("root", rootFile)
 
-       if err := utils.WriteFile(configFile, b, 0644); err != nil {
+       if err := utils.WriteFile(configFile, b, 0o644); err != nil {
                return err
        }
 
@@ -171,12 +196,12 @@
        if step.Contexts().Enabled() {
                profileDefaultsFile := step.ProfileDefaultsFile()
 
-               if err := os.MkdirAll(filepath.Dir(profileDefaultsFile), 0700); 
err != nil {
+               if err := os.MkdirAll(filepath.Dir(profileDefaultsFile), 
0o700); err != nil {
                        return errs.FileError(err, profileDefaultsFile)
                }
 
                if _, err := os.Stat(profileDefaultsFile); os.IsNotExist(err) {
-                       if err := os.WriteFile(profileDefaultsFile, 
[]byte("{}"), 0600); err != nil {
+                       if err := os.WriteFile(profileDefaultsFile, 
[]byte("{}"), 0o600); err != nil {
                                return errs.FileError(err, profileDefaultsFile)
                        }
                        ui.Printf("The profile configuration has been saved in 
%s.\n", profileDefaultsFile)
@@ -254,9 +279,17 @@
                r.RedirectURL = "https://smallstep.com/app/teams/sso/success";
        }
 
-       return bootstrap(ctx, r.CaURL, r.Fingerprint,
-               withDefaultContextValues(teamAuthority+"."+team),
-               withRedirectURL(r.RedirectURL))
+       bootOpts := []bootstrapOption{
+               withDefaultContextValues(teamAuthority + "." + team),
+               withRedirectURL(r.RedirectURL),
+       }
+       if r.Provisioner != "" {
+               bootOpts = append(bootOpts, withProvisioner(r.Provisioner))
+       }
+       if r.MinPasswordLength > 0 {
+               bootOpts = append(bootOpts, 
withMinPasswordLength(r.MinPasswordLength))
+       }
+       return bootstrap(ctx, r.CaURL, r.Fingerprint, bootOpts...)
 }
 
 // BootstrapAuthority bootstraps an authority using only the caURL and 
fingerprint.
@@ -268,7 +301,7 @@
                }
        }
 
-       var opts = []bootstrapOption{
+       opts := []bootstrapOption{
                withDefaultContextValues(caHostname),
        }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/utils/cautils/certificate_flow.go 
new/cli-0.28.5/utils/cautils/certificate_flow.go
--- old/cli-0.28.3/utils/cautils/certificate_flow.go    2025-02-20 
18:46:12.000000000 +0100
+++ new/cli-0.28.5/utils/cautils/certificate_flow.go    2025-03-05 
12:08:34.000000000 +0100
@@ -43,6 +43,7 @@
        SSHPublicKey            ssh.PublicKey
        CertificateRequest      *x509.CertificateRequest
        ConfirmationFingerprint string
+       CustomAttributes        map[string]interface{}
 }
 
 // sharedContext is used to share information between commands.
@@ -88,6 +89,18 @@
        })
 }
 
+// WithCustomAttributes adds custom attributes to be set in the "user" claim.
+func WithCustomAttributes(v map[string]interface{}) Option {
+       return newFuncFlowOption(func(fo *flowContext) {
+               if fo.CustomAttributes == nil {
+                       fo.CustomAttributes = make(map[string]interface{})
+               }
+               for k, val := range v {
+                       fo.CustomAttributes[k] = val
+               }
+       })
+}
+
 // NewCertificateFlow initializes a cli flow to get a new certificate.
 func NewCertificateFlow(ctx *cli.Context, opts ...Option) (*CertificateFlow, 
error) {
        var err error
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/utils/cautils/token_flow.go 
new/cli-0.28.5/utils/cautils/token_flow.go
--- old/cli-0.28.3/utils/cautils/token_flow.go  2025-02-20 18:46:12.000000000 
+0100
+++ new/cli-0.28.5/utils/cautils/token_flow.go  2025-03-05 12:08:34.000000000 
+0100
@@ -212,7 +212,7 @@
        }
 
        kid := ctx.String("kid")
-       issuer := ctx.String("issuer")
+       issuer := flags.FirstStringOf(ctx, "provisioner", "issuer")
 
        // Require issuer and keyFile if ca.json does not exists.
        // kid can be passed or created using jwk.Thumbprint.
@@ -326,7 +326,7 @@
        }
 
        // Filter by issuer (provisioner name)
-       if issuer := ctx.String("issuer"); issuer != "" {
+       if issuer := flags.FirstStringOf(ctx, "provisioner", "issuer"); issuer 
!= "" {
                provisioners = provisionerFilter(provisioners, func(p 
provisioner.Interface) bool {
                        return p.GetName() == issuer
                })
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-0.28.3/utils/cautils/token_generator.go 
new/cli-0.28.5/utils/cautils/token_generator.go
--- old/cli-0.28.3/utils/cautils/token_generator.go     2025-02-20 
18:46:12.000000000 +0100
+++ new/cli-0.28.5/utils/cautils/token_generator.go     2025-03-05 
12:08:34.000000000 +0100
@@ -108,6 +108,11 @@
                opts = append(opts, 
token.WithConfirmationFingerprint(sharedContext.ConfirmationFingerprint))
        }
 
+       // Add custom user data, if set.
+       if sharedContext.CustomAttributes != nil {
+               opts = append(opts, 
token.WithUserData(sharedContext.CustomAttributes))
+       }
+
        return t.Token(sub, opts...)
 }
 
@@ -126,6 +131,11 @@
                ValidBefore: notAfter,
        })}, opts...)
 
+       // Add custom user data, if set.
+       if sharedContext.CustomAttributes != nil {
+               opts = append(opts, 
token.WithUserData(sharedContext.CustomAttributes))
+       }
+
        return t.Token(sub, opts...)
 }
 

++++++ vendor.tar.xz ++++++
++++ 4602 lines of diff (skipped)

Reply via email to