package cmd import ( "crypto/rand" "encoding/hex" "fmt" "github.com/justinas/alice" "github.com/rs/zerolog" "orus.io/orus-io/go-orusapi/auth" ) func WithTokenOptions[E any]() Option[E] { return func(program *Program[E]) { program.TokenOptions = auth.NewTokenOptions( program.Name, func() *zerolog.Logger { return &program.Logger }, ) if _, err := program.Parser.AddGroup("Token", "Token Options", program.TokenOptions); err != nil { panic(err) } SetupGenerateAuthSecretCmd(program) } } func WithAuthMiddleware[E any](middleware any) Option[E] { return func(program *Program[E]) { program.authMiddlewares = append(program.authMiddlewares, getMiddleware[E](middleware)) } } func WithCookieMiddleware[E any, T any, PT interface { *T auth.Claims }]() Option[E] { return WithAuthMiddleware[E]( func(program *Program[E]) (alice.Constructor, error) { return auth.CookieMiddleware[T, PT](program.TokenOptions), nil }, ) } type GenerateAuthSecretCmd[E any] struct { program *Program[E] } func (cmd *GenerateAuthSecretCmd[E]) Execute([]string) error { secret := make([]byte, 32) if _, err := rand.Read(secret); err != nil { panic(err) } _, err := fmt.Println(hex.EncodeToString(secret)) return err } func SetupGenerateAuthSecretCmd[E any](program *Program[E]) *GenerateAuthSecretCmd[E] { cmd := GenerateAuthSecretCmd[E]{ program: program, } if _, err := program.Parser.AddCommand( "generate-auth-secret", "Generate a proper auth secret", "", &cmd, ); err != nil { program.Logger.Fatal().Err(err).Msg("could not init generate-auth-secret command") } return &cmd }