122 lines
3.1 KiB
Go
122 lines
3.1 KiB
Go
package commands
|
|
|
|
import (
|
|
"encoding/base32"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/spf13/pflag"
|
|
|
|
"github.com/authelia/authelia/v4/internal/configuration/schema"
|
|
"github.com/authelia/authelia/v4/internal/model"
|
|
"github.com/authelia/authelia/v4/internal/storage"
|
|
)
|
|
|
|
func getStorageProvider(ctx *CmdCtx) (provider storage.Provider) {
|
|
switch {
|
|
case ctx.config.Storage.PostgreSQL != nil:
|
|
return storage.NewPostgreSQLProvider(ctx.config, ctx.trusted)
|
|
case ctx.config.Storage.MySQL != nil:
|
|
return storage.NewMySQLProvider(ctx.config, ctx.trusted)
|
|
case ctx.config.Storage.Local != nil:
|
|
return storage.NewSQLiteProvider(ctx.config)
|
|
default:
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func containsIdentifier(identifier model.UserOpaqueIdentifier, identifiers []model.UserOpaqueIdentifier) bool {
|
|
for i := 0; i < len(identifiers); i++ {
|
|
if identifier.Service == identifiers[i].Service && identifier.SectorID == identifiers[i].SectorID && identifier.Username == identifiers[i].Username {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func storageWrapCheckSchemaErr(err error) error {
|
|
switch {
|
|
case errors.Is(err, errStorageSchemaIncompatible):
|
|
return fmt.Errorf("command requires the use of a compatibe schema version: %w", err)
|
|
case errors.Is(err, errStorageSchemaOutdated):
|
|
return fmt.Errorf("command requires the use of a up to date schema version: %w", err)
|
|
default:
|
|
return err
|
|
}
|
|
}
|
|
|
|
func storageTOTPGenerateRunEOptsFromFlags(flags *pflag.FlagSet) (force bool, filename, secret string, err error) {
|
|
if force, err = flags.GetBool("force"); err != nil {
|
|
return force, filename, secret, err
|
|
}
|
|
|
|
if filename, err = flags.GetString("path"); err != nil {
|
|
return force, filename, secret, err
|
|
}
|
|
|
|
if secret, err = flags.GetString("secret"); err != nil {
|
|
return force, filename, secret, err
|
|
}
|
|
|
|
secretLength := base32.StdEncoding.WithPadding(base32.NoPadding).DecodedLen(len(secret))
|
|
if secret != "" && secretLength < schema.TOTPSecretSizeMinimum {
|
|
return force, filename, secret, fmt.Errorf("decoded length of the base32 secret must have "+
|
|
"a length of more than %d but '%s' has a decoded length of %d", schema.TOTPSecretSizeMinimum, secret, secretLength)
|
|
}
|
|
|
|
return force, filename, secret, nil
|
|
}
|
|
|
|
func storageWebauthnDeleteRunEOptsFromFlags(flags *pflag.FlagSet, args []string) (all, byKID bool, description, kid, user string, err error) {
|
|
if len(args) != 0 {
|
|
user = args[0]
|
|
}
|
|
|
|
f := 0
|
|
|
|
if flags.Changed(cmdFlagNameAll) {
|
|
if all, err = flags.GetBool(cmdFlagNameAll); err != nil {
|
|
return
|
|
}
|
|
|
|
f++
|
|
}
|
|
|
|
if flags.Changed(cmdFlagNameDescription) {
|
|
if description, err = flags.GetString(cmdFlagNameDescription); err != nil {
|
|
return
|
|
}
|
|
|
|
f++
|
|
}
|
|
|
|
if byKID = flags.Changed(cmdFlagNameKeyID); byKID {
|
|
if kid, err = flags.GetString(cmdFlagNameKeyID); err != nil {
|
|
return
|
|
}
|
|
|
|
f++
|
|
}
|
|
|
|
if f > 1 {
|
|
err = fmt.Errorf("must only supply one of the flags --all, --description, and --kid but %d were specified", f)
|
|
|
|
return
|
|
}
|
|
|
|
if f == 0 {
|
|
err = fmt.Errorf("must supply one of the flags --all, --description, or --kid")
|
|
|
|
return
|
|
}
|
|
|
|
if !byKID && len(user) == 0 {
|
|
err = fmt.Errorf("must supply the username or the --kid flag")
|
|
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|