mirror of
https://github.com/coder/coder.git
synced 2026-06-02 20:48:20 +00:00
cadf1352b4
<!-- If you have used AI to produce some or all of this PR, please ensure you have read our [AI Contribution guidelines](https://coder.com/docs/about/contributing/AI_CONTRIBUTING) before submitting. --> Add support for scoped API tokens in CLI This PR adds CLI support for creating and viewing API tokens with scopes and allow lists. It includes: - New `--scope` and `--allow` flags for the `tokens create` command - A new `tokens view` command to display detailed information about a token - Updated table columns in `tokens list` to show scopes and allow list entries - Updated help text and examples These changes enable users to create tokens with limited permissions through the CLI, similar to the existing functionality in the web UI.
79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
package cli
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"strings"
|
|
|
|
"github.com/spf13/pflag"
|
|
"golang.org/x/xerrors"
|
|
|
|
"github.com/coder/coder/v2/codersdk"
|
|
)
|
|
|
|
var (
|
|
_ pflag.SliceValue = &AllowListFlag{}
|
|
_ pflag.Value = &AllowListFlag{}
|
|
)
|
|
|
|
// AllowListFlag implements pflag.SliceValue for codersdk.APIAllowListTarget entries.
|
|
type AllowListFlag []codersdk.APIAllowListTarget
|
|
|
|
func AllowListFlagOf(al *[]codersdk.APIAllowListTarget) *AllowListFlag {
|
|
return (*AllowListFlag)(al)
|
|
}
|
|
|
|
func (a AllowListFlag) String() string {
|
|
return strings.Join(a.GetSlice(), ",")
|
|
}
|
|
|
|
func (a AllowListFlag) Value() []codersdk.APIAllowListTarget {
|
|
return []codersdk.APIAllowListTarget(a)
|
|
}
|
|
|
|
func (AllowListFlag) Type() string { return "allow-list" }
|
|
|
|
func (a *AllowListFlag) Set(set string) error {
|
|
values, err := csv.NewReader(strings.NewReader(set)).Read()
|
|
if err != nil {
|
|
return xerrors.Errorf("parse allow list entries as csv: %w", err)
|
|
}
|
|
for _, v := range values {
|
|
if err := a.Append(v); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (a *AllowListFlag) Append(value string) error {
|
|
value = strings.TrimSpace(value)
|
|
if value == "" {
|
|
return xerrors.New("allow list entry cannot be empty")
|
|
}
|
|
var target codersdk.APIAllowListTarget
|
|
if err := target.UnmarshalText([]byte(value)); err != nil {
|
|
return err
|
|
}
|
|
|
|
*a = append(*a, target)
|
|
return nil
|
|
}
|
|
|
|
func (a *AllowListFlag) Replace(items []string) error {
|
|
*a = []codersdk.APIAllowListTarget{}
|
|
for _, item := range items {
|
|
if err := a.Append(item); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (a *AllowListFlag) GetSlice() []string {
|
|
out := make([]string, len(*a))
|
|
for i, entry := range *a {
|
|
out[i] = entry.String()
|
|
}
|
|
return out
|
|
}
|