Skip to content

Commit 7213309

Browse files
authoredAug 3, 2021
Merge pull request #5 from oidc-mytoken/dev
0.3.0
2 parents 6bfb563 + c3bdc88 commit 7213309

File tree

11 files changed

+641
-264
lines changed

11 files changed

+641
-264
lines changed
 

‎go.mod

+11-9
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ module github.com/oidc-mytoken/client
33
go 1.14
44

55
require (
6-
github.com/Songmu/prompter v0.4.0
7-
github.com/go-resty/resty/v2 v2.5.0 // indirect
6+
github.com/Songmu/prompter v0.5.0
87
github.com/golang/protobuf v1.5.2 // indirect
9-
github.com/jessevdk/go-flags v1.4.0
10-
github.com/oidc-mytoken/lib v0.2.0
11-
github.com/oidc-mytoken/server v0.2.0
8+
github.com/oidc-mytoken/api v0.3.0
9+
github.com/oidc-mytoken/lib v0.2.1
10+
github.com/oidc-mytoken/server v0.3.0
1211
github.com/sirupsen/logrus v1.8.1
13-
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect
14-
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect
15-
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 // indirect
16-
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 // indirect
12+
github.com/zachmann/cli/v2 v2.3.1-0.20210512144416-96dd678d93c7
13+
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
14+
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985 // indirect
15+
golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 // indirect
16+
golang.org/x/term v0.0.0-20210503060354-a79de5458b56
17+
google.golang.org/protobuf v1.27.1 // indirect
18+
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
1719
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
1820
)

‎go.sum

+77-20
Large diffs are not rendered by default.

‎internal/commands/at.go

+47-11
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,61 @@ import (
44
"io/ioutil"
55

66
"github.com/oidc-mytoken/client/internal/config"
7+
"github.com/zachmann/cli/v2"
78
)
89

9-
// atCommand is a type for holding and handling the AT command
10-
type atCommand struct {
11-
PTOptions
12-
Scopes []string `long:"scope" short:"s" description:"Request the passed scope. Can be used multiple times"`
13-
Audiences []string `long:"aud" description:"Request the passed audience. Can be used multiple times"`
14-
Out string `long:"out" short:"o" default:"/dev/stdout" description:"The access token will be printed to this output."`
10+
var atCommand = struct {
11+
*PTOptions
12+
Scopes cli.StringSlice
13+
Audiences cli.StringSlice
14+
Out string
15+
}{}
16+
17+
func init() {
18+
ptFlags, opts := getPTFlags()
19+
atCommand.PTOptions = opts
20+
app.Commands = append(app.Commands, &cli.Command{
21+
Name: "AT",
22+
Aliases: []string{"at", "access-token"},
23+
Usage: "Obtain an OIDC access token",
24+
Action: getAT,
25+
Flags: append(ptFlags,
26+
&cli.StringSliceFlag{
27+
Name: "scope",
28+
Aliases: []string{"s"},
29+
Usage: "Request the passed scope.",
30+
DefaultText: "all scopes allowed for the used mytoken",
31+
Destination: &atCommand.Scopes,
32+
Placeholder: "SCOPE",
33+
},
34+
&cli.StringSliceFlag{
35+
Name: "aud",
36+
Aliases: []string{"audience"},
37+
Usage: "Request the passed audience.",
38+
Destination: &atCommand.Audiences,
39+
Placeholder: "AUD",
40+
},
41+
&cli.StringFlag{
42+
Name: "out",
43+
Aliases: []string{"o"},
44+
Usage: "The access token will be printed to this output",
45+
Value: "/dev/stdout",
46+
Destination: &atCommand.Out,
47+
Placeholder: "FILE",
48+
},
49+
),
50+
})
1551
}
1652

17-
// Execute implements the flags.Commander interface
18-
func (atc *atCommand) Execute(args []string) error {
53+
func getAT(context *cli.Context) error {
54+
atc := atCommand
1955
var comment string
20-
if len(args) > 0 {
21-
comment = args[0]
56+
if context.Args().Len() > 0 {
57+
comment = context.Args().Get(0)
2258
}
2359
mytoken := config.Get().Mytoken
2460
provider, mToken := atc.Check()
25-
at, err := mytoken.GetAccessToken(mToken, provider.Issuer, atc.Scopes, atc.Audiences, comment)
61+
at, err := mytoken.GetAccessToken(mToken, provider.Issuer, atc.Scopes.Value(), atc.Audiences.Value(), comment)
2662
if err != nil {
2763
return err
2864
}

‎internal/commands/general.go

+61-9
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,70 @@ import (
1010
"github.com/oidc-mytoken/server/shared/utils"
1111
"github.com/oidc-mytoken/server/shared/utils/jwtutils"
1212
log "github.com/sirupsen/logrus"
13+
"github.com/zachmann/cli/v2"
1314

1415
"github.com/oidc-mytoken/client/internal/config"
1516
"github.com/oidc-mytoken/client/internal/model"
1617
)
1718

1819
// PTOptions holds command line options that can be used with all commands
1920
type PTOptions struct {
20-
Provider string `short:"i" long:"provider" description:"The name or issuer url of the OpenID provider that should be used"`
21-
Name string `short:"t" long:"name" description:"The name of the mytoken that should be used"`
22-
Mytoken *string `long:"MT" optional:"true" optional-value:"" description:"The passed mytoken is used instead of a stored one. If cou want to use this, please check if one of the more secure options --MT-file or --MT-env can be used"`
23-
MytokenFile string `long:"MT-file" description:"Read the mytoken that should be used from the first line of the passed file"`
24-
MytokenEnv string `long:"MT-env" description:"Read the mytoken that should be used from the passed environment variable"`
21+
Provider string
22+
Name string
23+
Mytoken string
24+
MytokenPrompt bool
25+
MytokenFile string
26+
MytokenEnv string
27+
}
28+
29+
func getPTFlags() ([]cli.Flag, *PTOptions) {
30+
opts := PTOptions{}
31+
flags := []cli.Flag{
32+
&cli.StringFlag{
33+
Name: "provider",
34+
Aliases: []string{"i", "issuer"},
35+
Usage: "The name or issuer url of the OpenID provider that should be used",
36+
EnvVars: []string{"MYTOKEN_PROVIDER"},
37+
Destination: &opts.Provider,
38+
Placeholder: "PROVIDER",
39+
},
40+
&cli.StringFlag{
41+
Name: "name",
42+
Aliases: []string{"t", "n"},
43+
Usage: "The `NAME` of the mytoken that should be used",
44+
EnvVars: []string{"MYTOKEN_NAME"},
45+
Destination: &opts.Name,
46+
},
47+
&cli.StringFlag{
48+
Name: "MT",
49+
Usage: "The passed `MYTOKEN` is used instead of a stored one. If you want to use this, please check if one of the more secure options --MT-prompt, --MT-file or --MT-env can be used",
50+
Destination: &opts.Mytoken,
51+
},
52+
&cli.BoolFlag{
53+
Name: "MT-prompt",
54+
Usage: "If set, you are prompted for a mytoken to be passed",
55+
Destination: &opts.MytokenPrompt,
56+
HideDefaultValue: true,
57+
},
58+
&cli.StringFlag{
59+
Name: "MT-file",
60+
Usage: "Read the mytoken that should be used from the first line of the passed `FILE`",
61+
TakesFile: true,
62+
Destination: &opts.MytokenFile,
63+
},
64+
&cli.StringFlag{
65+
Name: "MT-env",
66+
Usage: "Read the mytoken that should be used from the passed environment variable `ENV`",
67+
Destination: &opts.MytokenEnv,
68+
},
69+
}
70+
return flags, &opts
71+
}
72+
73+
func addPTFlags(cmd *cli.Command) *PTOptions {
74+
flags, opts := getPTFlags()
75+
cmd.Flags = append(cmd.Flags, flags...)
76+
return opts
2577
}
2678

2779
func (g *PTOptions) Check() (*model.Provider, string) {
@@ -45,12 +97,12 @@ func (g *PTOptions) Check() (*model.Provider, string) {
4597
}
4698

4799
func (g *PTOptions) getToken() (string, error) {
48-
if g.Mytoken != nil {
49-
if *g.Mytoken != "" {
50-
return *g.Mytoken, nil
51-
}
100+
if g.MytokenPrompt {
52101
return prompter.Password("Enter mytoken"), nil
53102
}
103+
if g.Mytoken != "" {
104+
return g.Mytoken, nil
105+
}
54106
if g.MytokenEnv != "" {
55107
tok, ok := os.LookupEnv(g.MytokenEnv)
56108
if ok {

‎internal/commands/info.go

+51-43
Original file line numberDiff line numberDiff line change
@@ -8,37 +8,51 @@ import (
88
"strings"
99

1010
"github.com/oidc-mytoken/server/shared/utils"
11+
"github.com/zachmann/cli/v2"
1112

1213
"github.com/oidc-mytoken/client/internal/config"
1314
)
1415

15-
// infoCommand is a type for holding and handling the info command
16-
type infoCommand struct {
17-
*PTOptions
18-
EventHistory historyCommand `command:"history" description:"List the event history for this token"`
19-
SubTree subTreeCommand `command:"subtokens" description:"List the tree of subtokens for this token"`
20-
Introspect introspectCommand `command:"introspect" description:"Gives basic information about this token and its usages"`
21-
TokenList listMytokensCommand `command:"list-mytokens" description:"List all mytokens"`
22-
}
23-
24-
// introspectCommand is a type for holding and handling the info command
25-
type introspectCommand struct {
26-
*PTOptions
27-
}
28-
29-
// historyCommand is a type for holding and handling the info command
30-
type historyCommand struct {
31-
*PTOptions
32-
}
33-
34-
// subTreeCommand is a type for holding and handling the info command
35-
type subTreeCommand struct {
36-
*PTOptions
37-
}
16+
var infoOptions *PTOptions
3817

39-
// listMytokensCommand is a type for holding and handling the info command
40-
type listMytokensCommand struct {
41-
*PTOptions
18+
func init() {
19+
var flags []cli.Flag
20+
flags, infoOptions = getPTFlags()
21+
cmd :=
22+
&cli.Command{
23+
Name: "info",
24+
Usage: "Get information about a mytoken",
25+
Action: info,
26+
Flags: flags,
27+
Subcommands: []*cli.Command{
28+
{
29+
Name: "history",
30+
Usage: "List the event history for this token",
31+
Action: history,
32+
Flags: flags,
33+
},
34+
{
35+
Name: "subtokens",
36+
Aliases: []string{"token-tree", "tree"},
37+
Usage: "List the tree of subtokens for this token",
38+
Action: subTree,
39+
Flags: flags,
40+
},
41+
{
42+
Name: "introspect",
43+
Usage: "Gives basic information about the token and its usages",
44+
Action: introspect,
45+
Flags: flags,
46+
},
47+
{
48+
Name: "list-mytokens",
49+
Usage: "List all mytokens",
50+
Action: listMytokens,
51+
Flags: flags,
52+
},
53+
},
54+
}
55+
app.Commands = append(app.Commands, cmd)
4256
}
4357

4458
func prettyPrintJSON(obj interface{}) error {
@@ -57,14 +71,12 @@ func prettyPrintJSON(obj interface{}) error {
5771
if err := json.Indent(&infoBuffer, data, "", " "); err != nil {
5872
return err
5973
}
60-
info := infoBuffer.String()
61-
fmt.Println(info)
74+
fmt.Println(infoBuffer.String())
6275
return nil
6376
}
6477

65-
// Execute implements the flags.Commander interface
66-
func (ic *infoCommand) Execute(args []string) error {
67-
_, mToken := ic.Check()
78+
func info(ctx *cli.Context) error {
79+
_, mToken := infoOptions.Check()
6880
if !utils.IsJWT(mToken) {
6981
return fmt.Errorf("The token is not a JWT.")
7082
}
@@ -76,43 +88,39 @@ func (ic *infoCommand) Execute(args []string) error {
7688
return prettyPrintJSON(decodedPayload)
7789
}
7890

79-
// Execute implements the flags.Commander interface
80-
func (ic *introspectCommand) Execute(args []string) error {
91+
func introspect(ctx *cli.Context) error {
8192
mytoken := config.Get().Mytoken
82-
_, mToken := ic.Check()
93+
_, mToken := infoOptions.Check()
8394
res, err := mytoken.TokeninfoIntrospect(mToken)
8495
if err != nil {
8596
return err
8697
}
8798
return prettyPrintJSON(res)
8899
}
89100

90-
// Execute implements the flags.Commander interface
91-
func (hc *historyCommand) Execute(args []string) error {
101+
func history(ctx *cli.Context) error {
92102
mytoken := config.Get().Mytoken
93-
_, mToken := hc.Check()
103+
_, mToken := infoOptions.Check()
94104
res, err := mytoken.TokeninfoHistory(mToken)
95105
if err != nil {
96106
return err
97107
}
98108
return prettyPrintJSON(res)
99109
}
100110

101-
// Execute implements the flags.Commander interface
102-
func (sc *subTreeCommand) Execute(args []string) error {
111+
func subTree(ctx *cli.Context) error {
103112
mytoken := config.Get().Mytoken
104-
_, mToken := sc.Check()
113+
_, mToken := infoOptions.Check()
105114
res, err := mytoken.TokeninfoSubtokens(mToken)
106115
if err != nil {
107116
return err
108117
}
109118
return prettyPrintJSON(res)
110119
}
111120

112-
// Execute implements the flags.Commander interface
113-
func (lc *listMytokensCommand) Execute(args []string) error {
121+
func listMytokens(ctx *cli.Context) error {
114122
mytoken := config.Get().Mytoken
115-
_, mToken := lc.Check()
123+
_, mToken := infoOptions.Check()
116124
res, err := mytoken.TokeninfoListMytokens(mToken)
117125
if err != nil {
118126
return err

‎internal/commands/list.go

+24-13
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,33 @@ import (
55
"strings"
66

77
"github.com/oidc-mytoken/client/internal/config"
8+
"github.com/zachmann/cli/v2"
89
)
910

10-
// listCommand is a type for holding and handling the list command
11-
type listCommand struct {
12-
ListTokens listTokenCommand `command:"tokens" description:"List the stored mytokens"`
13-
ListProviders listProviderCommand `command:"providers" description:"List the available providers"`
14-
// EventHistory historyCommand `command:"history" description:"List the event history for this token"`
15-
// SubTree treeCommand `command:"tree" description:"List the tree of subtokens for this token"`
11+
func init() {
12+
cmd :=
13+
&cli.Command{
14+
Name: "list",
15+
Usage: "List different information",
16+
Subcommands: []*cli.Command{
17+
{
18+
Name: "tokens",
19+
Aliases: []string{"MT", "mytokens"},
20+
Usage: "List the stored mytokens",
21+
Action: listTokens,
22+
},
23+
{
24+
Name: "providers",
25+
Aliases: []string{"issuers"},
26+
Usage: "List the available providers",
27+
Action: listProviders,
28+
},
29+
},
30+
}
31+
app.Commands = append(app.Commands, cmd)
1632
}
1733

18-
type listTokenCommand struct{}
19-
type listProviderCommand struct{}
20-
21-
// Execute implements the flags.Commander interface
22-
func (lt *listTokenCommand) Execute(args []string) error {
34+
func listTokens(ctx *cli.Context) error {
2335
for iss, tokens := range config.Get().TokensFileContent.Tokens {
2436
provider, found := config.Get().Providers.FindBy(iss, true)
2537
header := iss
@@ -41,8 +53,7 @@ func (lt *listTokenCommand) Execute(args []string) error {
4153
return nil
4254
}
4355

44-
// Execute implements the flags.Commander interface
45-
func (lp *listProviderCommand) Execute(args []string) error {
56+
func listProviders(ctx *cli.Context) error {
4657
defaultProvider := config.Get().DefaultProvider
4758
instanceProviders := config.Get().Mytoken.ProvidersSupported
4859
configProviders := config.Get().Providers

‎internal/commands/mt.go

+279-109
Large diffs are not rendered by default.

‎internal/commands/options.go

+62-39
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,87 @@
11
package commands
22

33
import (
4-
"fmt"
54
"os"
5+
"time"
66

7-
flags "github.com/jessevdk/go-flags"
7+
log "github.com/sirupsen/logrus"
8+
"github.com/zachmann/cli/v2"
9+
"golang.org/x/term"
810

911
"github.com/oidc-mytoken/client/internal/config"
1012
"github.com/oidc-mytoken/client/internal/model/version"
1113
)
1214

13-
type generalOptions struct {
14-
Config func(filename flags.Filename) `long:"config" value-name:"FILE" default:"" description:"Use FILE as the config file instead of the default one."`
15-
Version func() `short:"V" long:"version" description:"Prints the version and exits."`
15+
var app = &cli.App{
16+
Name: "mytoken",
17+
Usage: "Command line client for the mytoken server",
18+
Version: version.VERSION(),
19+
Compiled: time.Time{},
20+
Authors: []*cli.Author{{
21+
Name: "Gabriel Zachmann",
22+
Email: "gabriel.zachmann@kit.edu",
23+
}},
24+
Copyright: "Karlsruhe Institute of Technology 2020-2021",
25+
UseShortOptionHandling: true,
1626
}
1727

18-
// options holds all the command line commands and their options
19-
var options struct {
20-
GeneralOptions generalOptions
21-
MT mtCommand
22-
AT atCommand
23-
Revoke revokeCommand
24-
Info infoCommand
25-
List listCommand
26-
}
27-
28-
var parser *flags.Parser
28+
var configFile string
2929

3030
func init() {
31-
options.GeneralOptions.Version = func() {
32-
fmt.Printf("mytoken %s\n", version.VERSION())
33-
os.Exit(0)
31+
cli.AppHelpTemplate = `NAME:
32+
{{$v := offset .Name 6}}{{wrap .Name 3}}{{if .Usage}} - {{wrap .Usage $v}}{{end}}
33+
34+
USAGE:
35+
{{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Description}}
36+
37+
DESCRIPTION:
38+
{{wrap .Description 3}}{{end}}{{if .VisibleCommands}}
39+
40+
COMMANDS:{{range .VisibleCategories}}{{if .Name}}
41+
{{.Name}}:{{range .VisibleCommands}}
42+
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{range .VisibleCommands}}
43+
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
44+
45+
GLOBAL OPTIONS:
46+
{{range $index, $option := .VisibleFlags}}{{if $index}}
47+
{{end}}{{$option.String}}{{end}}{{end}}{{if .Version}}{{if not .HideVersion}}
48+
49+
VERSION:
50+
{{.Version}}{{end}}{{end}}
51+
52+
DOCUMENTATION:
53+
https://mytoken-docs.data.kit.edu/client/intro
54+
55+
CONTACT:
56+
m-contact@lists.kit.edu
57+
`
58+
59+
termWidth, _, err := term.GetSize(int(os.Stdout.Fd()))
60+
if err == nil {
61+
cli.HelpWrapAt = termWidth
3462
}
35-
options.GeneralOptions.Config = func(filename flags.Filename) {
36-
if filename != "" {
37-
config.Load(string(filename))
63+
64+
app.Flags = append(app.Flags, &cli.StringFlag{
65+
Name: "config",
66+
Usage: "Load configuration from `FILE`",
67+
EnvVars: []string{"MYTOKEN_CONFIG", "MYTOKEN_CONF"},
68+
TakesFile: true,
69+
DefaultText: "",
70+
Destination: &configFile,
71+
})
72+
app.Before = func(context *cli.Context) error {
73+
if context.IsSet("config") {
74+
config.Load(configFile)
3875
} else {
3976
config.LoadDefault()
4077
}
78+
return nil
4179
}
42-
43-
parser = flags.NewNamedParser("mytoken", flags.Default)
44-
_, _ = parser.AddGroup("Config Options", "", &options.GeneralOptions)
45-
_, _ = parser.AddCommand("AT", "Obtain access token", "Obtain a new OpenID Connect access token", &options.AT)
46-
_, _ = parser.AddCommand("revoke", "Revoke mytoken", "Revoke a mytoken token", &options.Revoke)
47-
_, _ = parser.AddCommand("list", "List different information", "List different information", &options.List)
48-
options.Info.PTOptions = &PTOptions{}
49-
options.Info.Introspect.PTOptions = options.Info.PTOptions
50-
options.Info.EventHistory.PTOptions = options.Info.PTOptions
51-
options.Info.SubTree.PTOptions = options.Info.PTOptions
52-
options.Info.TokenList.PTOptions = options.Info.PTOptions
53-
info, _ := parser.AddCommand("info", "Get information about a mytoken", "Get information about a mytoken", &options.Info)
54-
info.SubcommandsOptional = true
55-
mtInit()
5680
}
5781

5882
// Parse parses the command line options and calls the specified command
5983
func Parse() {
60-
_, err := parser.Parse()
61-
if err != nil {
62-
os.Exit(1)
84+
if err := app.Run(os.Args); err != nil {
85+
log.Fatal(err)
6386
}
6487
}

‎internal/commands/revoke.go

+26-7
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,37 @@ import (
44
"fmt"
55

66
"github.com/oidc-mytoken/client/internal/config"
7+
"github.com/zachmann/cli/v2"
78
)
89

9-
type revokeCommand struct {
10-
PTOptions
11-
Recursive bool `short:"r" long:"recursive" description:"If set also all subtokens are revoked"`
10+
var revokeCommand = struct {
11+
*PTOptions
12+
Recursive bool
13+
}{}
14+
15+
func init() {
16+
ptFlags, opts := getPTFlags()
17+
revokeCommand.PTOptions = opts
18+
app.Commands = append(app.Commands, &cli.Command{
19+
Name: "revoke",
20+
Usage: "Revokes a mytoken",
21+
Action: revoke,
22+
Flags: append(ptFlags,
23+
&cli.BoolFlag{
24+
Name: "recursive",
25+
Aliases: []string{"r"},
26+
Usage: "If set, also all subtokens are revoked",
27+
Destination: &revokeCommand.Recursive,
28+
HideDefaultValue: true,
29+
},
30+
),
31+
})
1232
}
1333

14-
// Execute implements the flags.Commander interface
15-
func (rc *revokeCommand) Execute(args []string) error {
34+
func revoke(context *cli.Context) error {
1635
mytoken := config.Get().Mytoken
17-
provider, mToken := rc.Check()
18-
err := mytoken.Revoke(mToken, provider.Issuer, rc.Recursive)
36+
provider, mToken := revokeCommand.Check()
37+
err := mytoken.Revoke(mToken, provider.Issuer, revokeCommand.Recursive)
1938
if err != nil {
2039
return err
2140
}

‎internal/config/config.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@ import (
88
"path/filepath"
99
"strings"
1010

11+
"github.com/oidc-mytoken/api/v0"
1112
mytokenlib "github.com/oidc-mytoken/lib"
12-
"github.com/oidc-mytoken/server/pkg/api/v0"
1313
"github.com/oidc-mytoken/server/shared/utils"
14+
"github.com/oidc-mytoken/server/shared/utils/fileutil"
1415
log "github.com/sirupsen/logrus"
1516
yaml "gopkg.in/yaml.v3"
1617

17-
"github.com/oidc-mytoken/server/shared/utils/fileutil"
18-
1918
"github.com/oidc-mytoken/client/internal/model"
2019
"github.com/oidc-mytoken/client/internal/utils/cryptutils"
2120
)

‎internal/model/version/version.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
// Version segments
88
const (
99
MAJOR = 0
10-
MINOR = 2
10+
MINOR = 3
1111
FIX = 0
1212
DEV = false
1313
)

0 commit comments

Comments
 (0)
Please sign in to comment.