From 01d0f0e3d53d7c5089c747704b9850435cb4179f Mon Sep 17 00:00:00 2001 From: John Hooks Date: Mon, 3 Aug 2026 13:25:26 -0400 Subject: [PATCH 1/3] add claim-cli tool --- claim-cli/.gitignore | 1 + claim-cli/Makefile | 22 ++++++ claim-cli/cmd/read.go | 169 ++++++++++++++++++++++++++++++++++++++++++ claim-cli/cmd/root.go | 21 ++++++ claim-cli/go.mod | 43 +++++++++++ claim-cli/go.sum | 97 ++++++++++++++++++++++++ claim-cli/main.go | 7 ++ 7 files changed, 360 insertions(+) create mode 100644 claim-cli/.gitignore create mode 100644 claim-cli/Makefile create mode 100644 claim-cli/cmd/read.go create mode 100644 claim-cli/cmd/root.go create mode 100644 claim-cli/go.mod create mode 100644 claim-cli/go.sum create mode 100644 claim-cli/main.go diff --git a/claim-cli/.gitignore b/claim-cli/.gitignore new file mode 100644 index 0000000..30f0e83 --- /dev/null +++ b/claim-cli/.gitignore @@ -0,0 +1 @@ +claim-cli* diff --git a/claim-cli/Makefile b/claim-cli/Makefile new file mode 100644 index 0000000..f5db3aa --- /dev/null +++ b/claim-cli/Makefile @@ -0,0 +1,22 @@ +PROJECT_NAME := "claim-cli" +PKG := "github.com/chainguard-demo/platform-examples/claim-cli" +PKG_LIST := $(shell go list ${PKG}/... | grep -v /vendor/) +GO_FILES := $(shell find . -name '*.go' | grep -v /vendor/ | grep -v _test.go) +VERSION := $(shell if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then git describe --exact-match --tags HEAD 2>/dev/null || echo "dev-$(shell git rev-parse --short HEAD)"; else echo "dev"; fi) +GOOS=$(shell go env GOOS) +GOARCH=$(shell go env GOARCH) + +.PHONY: clean build help + +build: ## Builds the binary on the current platform + go build -a -ldflags "-s -w" -o $(PROJECT_NAME) + +clean: ## Reset everything + git clean -fd + git clean -fx + git reset --hard + +help: ## Display this help screen + @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + + diff --git a/claim-cli/cmd/read.go b/claim-cli/cmd/read.go new file mode 100644 index 0000000..e3e17fd --- /dev/null +++ b/claim-cli/cmd/read.go @@ -0,0 +1,169 @@ +package cmd + +import ( + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io" + "strings" + + "chainguard.dev/sdk/proto/capabilities" + "github.com/go-jose/go-jose/v4/jwt" + "github.com/olekukonko/tablewriter" + "github.com/olekukonko/tablewriter/renderer" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +var readCmd = &cobra.Command{ + Use: "read", + Short: "Read a JWT or capabilities string", + Long: `Takes a Chainguard JWT or capabilities string and prints out the details. + +Reads from a string or stdin. For stdin pass - as the argument. + +Examples: + +claim-cli read AAAAAAAAAMH_8gDx4eD__vn--DBJ__tvlCHm8B_wHmMAAAAAAAAAAQ== + +chainctl auth token | claim-cli read --jwt - `, + RunE: read, +} + +var caps capabilities.Set + +type tableRow struct { + org string + noun string + verb string +} + +type claims struct { + jwt.Claims `json:",inline"` + + Capabilities map[string]capabilities.Set `json:"cap,omitempty"` +} + +func init() { + rootCmd.AddCommand(readCmd) + readCmd.Flags().Bool("jwt", false, "Read a full JWT instead of just a capability claim") + viper.BindPFlag("jwt", readCmd.Flags().Lookup("jwt")) +} + +func read(cmd *cobra.Command, args []string) error { + if len(args) == 0 { + return errors.New("a JWT or capabilities string must be provided") + } + input := args[0] + + if args[0] == "-" { + s := new(strings.Builder) + var r io.Reader = cmd.InOrStdin() + _, err := io.Copy(s, r) + if err != nil { + return err + } + input = s.String() + } + + if viper.GetBool("jwt") { + return printJwtString(cmd.OutOrStdout(), input) + } else { + return printCapString(cmd.OutOrStdout(), input) + } + +} + +func printCapString(w io.Writer, c string) error { + out := []string{} + + if err := json.Unmarshal(fmt.Appendf([]byte{}, `%q`, c), &caps); err != nil { + return err + } + + for _, c := range caps { + cs := c.String() + if s, err := capabilities.Stringify(c); err == nil { + cs = s + } + out = append(out, cs) + } + + var rows []tableRow + + for _, v := range out { + var noun string + idx := strings.LastIndex(v, ".") + if idx == -1 { + noun = v + } else { + noun = v[:idx] + } + row := tableRow{ + noun: noun, + verb: v[strings.LastIndex(v, ".")+1:], + } + rows = append(rows, row) + } + + t := newTable(w, []string{"entity", "action"}) + for _, v := range rows { + t.Append(v.noun, v.verb) + } + return t.Render() + +} + +func printJwtString(w io.Writer, jwt string) error { + s := strings.Split(string(jwt), ".") + if len(s) != 3 { + return errors.New("invalid token format") + } + + d, err := base64.RawStdEncoding.DecodeString(s[1]) + if err != nil { + return fmt.Errorf("failed to decode token claims: %w", err) + } + + claims := new(claims) + if err := json.Unmarshal(d, claims); err != nil { + return fmt.Errorf("failed to unmarshal token claims: %w", err) + } + + rows := []tableRow{} + for group, caps := range claims.Capabilities { + for _, c := range caps { + cs := c.String() + if s, err := capabilities.Stringify(c); err == nil { + cs = s + } + var noun string + idx := strings.LastIndex(cs, ".") + if idx == -1 { + noun = cs + } else { + noun = cs[:idx] + } + rows = append(rows, tableRow{ + org: group, + noun: noun, + verb: cs[strings.LastIndex(cs, ".")+1:], + }) + } + } + + t := newTable(w, []string{"org", "entity", "action"}) + for _, v := range rows { + t.Append(v.org, v.noun, v.verb) + } + return t.Render() +} + +func newTable(w io.Writer, headers []string) *tablewriter.Table { + return tablewriter.NewTable(w, + tablewriter.WithConfig(tablewriter.NewConfigBuilder().Build()), + tablewriter.WithHeader(headers), + tablewriter.WithRenderer(renderer.NewBlueprint()), + ) +} diff --git a/claim-cli/cmd/root.go b/claim-cli/cmd/root.go new file mode 100644 index 0000000..620dad5 --- /dev/null +++ b/claim-cli/cmd/root.go @@ -0,0 +1,21 @@ +package cmd + +import ( + "os" + + "github.com/spf13/cobra" +) + +var rootCmd = &cobra.Command{ + Use: "claim-cli", + Short: "Interact with Chainguard tokens", +} + +func Execute() { + err := rootCmd.Execute() + if err != nil { + os.Exit(1) + } +} + +func init() {} diff --git a/claim-cli/go.mod b/claim-cli/go.mod new file mode 100644 index 0000000..2f101db --- /dev/null +++ b/claim-cli/go.mod @@ -0,0 +1,43 @@ +module github.com/chaingaurd-demo/platform-examples/claim-cli + +go 1.26.0 + +require ( + chainguard.dev/sdk v0.1.164 + github.com/go-jose/go-jose/v4 v4.1.4 + github.com/olekukonko/tablewriter v1.1.4 + github.com/spf13/cobra v1.10.2 + github.com/spf13/viper v1.21.0 +) + +require ( + github.com/bits-and-blooms/bitset v1.24.5 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/chainguard-dev/clog v1.8.1 // indirect + github.com/clipperhouse/displaywidth v0.10.0 // indirect + github.com/clipperhouse/uax29/v2 v2.6.0 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.19 // indirect + github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 // indirect + github.com/olekukonko/errors v1.2.0 // indirect + github.com/olekukonko/ll v0.1.6 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/sagikazarmark/locafero v0.11.0 // indirect + github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect + github.com/spf13/afero v1.15.0 // indirect + github.com/spf13/cast v1.10.0 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20260611194520-c48552f49976 // indirect + golang.org/x/sys v0.46.0 // indirect + golang.org/x/text v0.38.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad // indirect + google.golang.org/grpc v1.82.1 // indirect + google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect +) diff --git a/claim-cli/go.sum b/claim-cli/go.sum new file mode 100644 index 0000000..ff62a84 --- /dev/null +++ b/claim-cli/go.sum @@ -0,0 +1,97 @@ +chainguard.dev/sdk v0.1.164 h1:k2Ir/l1cuHDS/vg29sLNjJYm2kInnCfR5w0uFD0Y1Hg= +chainguard.dev/sdk v0.1.164/go.mod h1:y5AGo04erWjKtEyGX7fO9zZA4vtj9cLGXZjgIYxeMdo= +github.com/bits-and-blooms/bitset v1.24.5 h1:654xBVHc23gJMAgOTkPNoCVfiRxuIOAUnAZFtopqJ4w= +github.com/bits-and-blooms/bitset v1.24.5/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chainguard-dev/clog v1.8.1 h1:Lab3GEDsVm1J9XGlpWEBuzXX7eETRmd0vN5PYoNyT+Y= +github.com/chainguard-dev/clog v1.8.1/go.mod h1:5MQOZi+Iu7fV7GcJG8ag8rCB5elEOpqRMKEASgnGVdo= +github.com/clipperhouse/displaywidth v0.10.0 h1:GhBG8WuerxjFQQYeuZAeVTuyxuX+UraiZGD4HJQ3Y8g= +github.com/clipperhouse/displaywidth v0.10.0/go.mod h1:XqJajYsaiEwkxOj4bowCTMcT1SgvHo9flfF3jQasdbs= +github.com/clipperhouse/uax29/v2 v2.6.0 h1:z0cDbUV+aPASdFb2/ndFnS9ts/WNXgTNNGFoKXuhpos= +github.com/clipperhouse/uax29/v2 v2.6.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= +github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +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/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 h1:zrbMGy9YXpIeTnGj4EljqMiZsIcE09mmF8XsD5AYOJc= +github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6/go.mod h1:rEKTHC9roVVicUIfZK7DYrdIoM0EOr8mK1Hj5s3JjH0= +github.com/olekukonko/errors v1.2.0 h1:10Zcn4GeV59t/EGqJc8fUjtFT/FuUh5bTMzZ1XwmCRo= +github.com/olekukonko/errors v1.2.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= +github.com/olekukonko/ll v0.1.6 h1:lGVTHO+Qc4Qm+fce/2h2m5y9LvqaW+DCN7xW9hsU3uA= +github.com/olekukonko/ll v0.1.6/go.mod h1:NVUmjBb/aCtUpjKk75BhWrOlARz3dqsM+OtszpY4o88= +github.com/olekukonko/tablewriter v1.1.4 h1:ORUMI3dXbMnRlRggJX3+q7OzQFDdvgbN9nVWj1drm6I= +github.com/olekukonko/tablewriter v1.1.4/go.mod h1:+kedxuyTtgoZLwif3P1Em4hARJs+mVnzKxmsCL/C5RY= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= +github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/exp v0.0.0-20260611194520-c48552f49976 h1:X8Hz2ImujgbmetVuW+w2YkyZChE3cBpZi2P158rTG9M= +golang.org/x/exp v0.0.0-20260611194520-c48552f49976/go.mod h1:vnf4pv9iKZXY58sQE1L86zmNWJ4159e1RkcWiLCkeEY= +golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= +golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad h1:45WmJvIV6C2+O/jjLkPUH+F3aOj/1miDoU2DD0+NWbg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE= +google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/claim-cli/main.go b/claim-cli/main.go new file mode 100644 index 0000000..715f158 --- /dev/null +++ b/claim-cli/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/chaingaurd-demo/platform-examples/claim-cli/cmd" + +func main() { + cmd.Execute() +} From 6ae94721ff2214e434af4fab7e4b70438c9b022a Mon Sep 17 00:00:00 2001 From: John Hooks Date: Mon, 3 Aug 2026 13:29:59 -0400 Subject: [PATCH 2/3] add readme --- claim-cli/README.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 claim-cli/README.md diff --git a/claim-cli/README.md b/claim-cli/README.md new file mode 100644 index 0000000..3775239 --- /dev/null +++ b/claim-cli/README.md @@ -0,0 +1,41 @@ +# claim-cli + +Parse a Chainguard JWT or capabilities string into human readable tables. + +## Usage + +### Capabilities string from JWT + +`claim-cli read AAAAAAAAAMH_8gDx4eD__vn--DBJ__tvlCHm8B_wHmMAAAAAAAAAAQ==` + +┌─────────────────────────────────────────┬────────────────┐ +│ ENTITY │ ACTION │ +├─────────────────────────────────────────┼────────────────┤ +│ groups │ create │ +│ groups │ update │ +│ groups │ list │ +│ groups │ delete │ +│ group_invites │ create │ +│ group_invites │ list │ +│ group_invites │ delete │ +..... + + +### JWT Parsing + +`chainctl auth token | claim-cli read --jwt -` + +┌──────────────────────────────────────────┬─────────────────────────────────────────┬────────────────┐ +│ ORG │ ENTITY │ ACTION │ +├──────────────────────────────────────────┼─────────────────────────────────────────┼────────────────┤ +│ asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf │ groups │ create │ +│ asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf │ groups │ update │ +│ asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf │ groups │ list │ +│ asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf │ groups │ delete │ +│ asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf │ group_invites │ create │ +│ asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf │ group_invites │ list │ +│ asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf │ group_invites │ delete │ +│ asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf │ roles │ create │ +│ asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf │ roles │ update │ +│ asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf │ roles │ list │ +..... From 1b6e93d0b2d4b1b2c6e523dae2a1558b7d8b236c Mon Sep 17 00:00:00 2001 From: John Hooks Date: Mon, 3 Aug 2026 14:49:54 -0400 Subject: [PATCH 3/3] fix tables in readme --- claim-cli/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/claim-cli/README.md b/claim-cli/README.md index 3775239..0e7d6f5 100644 --- a/claim-cli/README.md +++ b/claim-cli/README.md @@ -8,6 +8,7 @@ Parse a Chainguard JWT or capabilities string into human readable tables. `claim-cli read AAAAAAAAAMH_8gDx4eD__vn--DBJ__tvlCHm8B_wHmMAAAAAAAAAAQ==` +``` ┌─────────────────────────────────────────┬────────────────┐ │ ENTITY │ ACTION │ ├─────────────────────────────────────────┼────────────────┤ @@ -19,12 +20,14 @@ Parse a Chainguard JWT or capabilities string into human readable tables. │ group_invites │ list │ │ group_invites │ delete │ ..... +``` ### JWT Parsing `chainctl auth token | claim-cli read --jwt -` +``` ┌──────────────────────────────────────────┬─────────────────────────────────────────┬────────────────┐ │ ORG │ ENTITY │ ACTION │ ├──────────────────────────────────────────┼─────────────────────────────────────────┼────────────────┤ @@ -39,3 +42,4 @@ Parse a Chainguard JWT or capabilities string into human readable tables. │ asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf │ roles │ update │ │ asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf │ roles │ list │ ..... +```