diff --git a/cmd/tinyauth/create_oidc_client.go b/cmd/tinyauth/create_oidc_client.go new file mode 100644 index 0000000..9efb154 --- /dev/null +++ b/cmd/tinyauth/create_oidc_client.go @@ -0,0 +1,38 @@ +package main + +import ( + "fmt" + + "github.com/google/uuid" + "github.com/steveiliop56/tinyauth/internal/utils" + "github.com/steveiliop56/tinyauth/internal/utils/tlog" + "github.com/traefik/paerser/cli" +) + +func createOidcClientCmd() *cli.Command { + return &cli.Command{ + Name: "create", + Description: "Create a new OIDC Client", + Configuration: nil, + Resources: nil, + AllowArg: true, + Run: func(args []string) error { + tlog.NewSimpleLogger().Init() + + if len(args) == 0 { + tlog.App.Fatal().Msg("Client name is required. Use tinyauth oidc create ") + } + + clientName := args[0] + + uuid := uuid.New() + clientId := uuid.String() + clientSecret := "ta-" + utils.GenerateString(61) + + fmt.Printf("Client Name: %s\n", clientName) + fmt.Printf("Client ID: %s\n", clientId) + fmt.Printf("Client Secret: %s\n", clientSecret) + return nil + }, + } +} diff --git a/cmd/tinyauth/create.go b/cmd/tinyauth/create_user.go similarity index 100% rename from cmd/tinyauth/create.go rename to cmd/tinyauth/create_user.go diff --git a/cmd/tinyauth/generate.go b/cmd/tinyauth/generate_totp.go similarity index 100% rename from cmd/tinyauth/generate.go rename to cmd/tinyauth/generate_totp.go diff --git a/cmd/tinyauth/tinyauth.go b/cmd/tinyauth/tinyauth.go index a6cb93e..0f2825e 100644 --- a/cmd/tinyauth/tinyauth.go +++ b/cmd/tinyauth/tinyauth.go @@ -23,7 +23,7 @@ func main() { cmdTinyauth := &cli.Command{ Name: "tinyauth", - Description: "The simplest way to protect your apps with a login screen.", + Description: "The simplest way to protect your apps with a login screen", Configuration: tConfig, Resources: loaders, Run: func(_ []string) error { @@ -33,12 +33,17 @@ func main() { cmdUser := &cli.Command{ Name: "user", - Description: "Utilities for creating and verifying Tinyauth users.", + Description: "Manage Tinyauth users", } cmdTotp := &cli.Command{ Name: "totp", - Description: "Utilities for creating Tinyauth TOTP users.", + Description: "Manage Tinyauth TOTP users", + } + + cmdOidc := &cli.Command{ + Name: "oidc", + Description: "Manage Tinyauth OIDC clients", } err := cmdTinyauth.AddCommand(versionCmd()) @@ -71,6 +76,12 @@ func main() { log.Fatal().Err(err).Msg("Failed to add create command") } + err = cmdOidc.AddCommand(createOidcClientCmd()) + + if err != nil { + log.Fatal().Err(err).Msg("Failed to add create command") + } + err = cmdTinyauth.AddCommand(cmdUser) if err != nil { @@ -83,6 +94,12 @@ func main() { log.Fatal().Err(err).Msg("Failed to add totp command") } + err = cmdTinyauth.AddCommand(cmdOidc) + + if err != nil { + log.Fatal().Err(err).Msg("Failed to add oidc command") + } + err = cli.Execute(cmdTinyauth) if err != nil { diff --git a/cmd/tinyauth/verify.go b/cmd/tinyauth/verify_user.go similarity index 98% rename from cmd/tinyauth/verify.go rename to cmd/tinyauth/verify_user.go index aa98cbd..7501041 100644 --- a/cmd/tinyauth/verify.go +++ b/cmd/tinyauth/verify_user.go @@ -40,7 +40,7 @@ func verifyUserCmd() *cli.Command { return &cli.Command{ Name: "verify", - Description: "Verify a user is set up correctly.", + Description: "Verify a user is set up correctly", Configuration: tCfg, Resources: loaders, Run: func(_ []string) error { diff --git a/cmd/tinyauth/version.go b/cmd/tinyauth/version.go index aad6b55..b394880 100644 --- a/cmd/tinyauth/version.go +++ b/cmd/tinyauth/version.go @@ -11,7 +11,7 @@ import ( func versionCmd() *cli.Command { return &cli.Command{ Name: "version", - Description: "Print the version number of Tinyauth.", + Description: "Print the version number of Tinyauth", Configuration: nil, Resources: nil, Run: func(_ []string) error { diff --git a/internal/utils/security_utils.go b/internal/utils/security_utils.go index 40fe713..1b8d8e9 100644 --- a/internal/utils/security_utils.go +++ b/internal/utils/security_utils.go @@ -1,6 +1,7 @@ package utils import ( + "crypto/rand" "encoding/base64" "errors" "net" @@ -105,3 +106,9 @@ func GenerateUUID(str string) string { uuid := uuid.NewSHA1(uuid.NameSpaceURL, []byte(str)) return uuid.String() } + +func GenerateString(length int) string { + src := make([]byte, length) + rand.Read(src) + return base64.RawURLEncoding.EncodeToString(src)[:length] +}