2022-03-06 05:47:40 +00:00
|
|
|
package model
|
2021-11-23 09:45:38 +00:00
|
|
|
|
2022-03-28 01:26:30 +00:00
|
|
|
import (
|
|
|
|
"github.com/authelia/authelia/v4/internal/utils"
|
|
|
|
)
|
|
|
|
|
2021-11-23 09:45:38 +00:00
|
|
|
// UserInfo represents the user information required by the web UI.
|
|
|
|
type UserInfo struct {
|
|
|
|
// The users display name.
|
|
|
|
DisplayName string `db:"-" json:"display_name"`
|
|
|
|
|
|
|
|
// The preferred 2FA method.
|
|
|
|
Method string `db:"second_factor_method" json:"method" valid:"required"`
|
|
|
|
|
2021-12-01 03:32:58 +00:00
|
|
|
// True if a TOTP device has been registered.
|
|
|
|
HasTOTP bool `db:"has_totp" json:"has_totp" valid:"required"`
|
|
|
|
|
2023-04-10 07:01:23 +00:00
|
|
|
// True if a WebAuthn device has been registered.
|
|
|
|
HasWebAuthn bool `db:"has_webauthn" json:"has_webauthn" valid:"required"`
|
2021-11-23 09:45:38 +00:00
|
|
|
|
2021-12-01 03:32:58 +00:00
|
|
|
// True if a duo device has been configured as the preferred.
|
|
|
|
HasDuo bool `db:"has_duo" json:"has_duo" valid:"required"`
|
2021-11-23 09:45:38 +00:00
|
|
|
}
|
2022-03-28 01:26:30 +00:00
|
|
|
|
|
|
|
// SetDefaultPreferred2FAMethod configures the default method based on what is configured as available and the users available methods.
|
2022-04-17 23:58:24 +00:00
|
|
|
func (i *UserInfo) SetDefaultPreferred2FAMethod(methods []string, fallback string) (changed bool) {
|
2022-03-28 01:26:30 +00:00
|
|
|
if len(methods) == 0 {
|
|
|
|
// No point attempting to change the method if no methods are available.
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
before := i.Method
|
|
|
|
|
2023-04-10 07:01:23 +00:00
|
|
|
totp, webauthn, duo := utils.IsStringInSlice(SecondFactorMethodTOTP, methods), utils.IsStringInSlice(SecondFactorMethodWebAuthn, methods), utils.IsStringInSlice(SecondFactorMethodDuo, methods)
|
2022-03-28 01:26:30 +00:00
|
|
|
|
2022-04-17 23:58:24 +00:00
|
|
|
if i.Method == "" && utils.IsStringInSlice(fallback, methods) {
|
|
|
|
i.Method = fallback
|
|
|
|
} else if i.Method != "" && !utils.IsStringInSlice(i.Method, methods) {
|
2022-03-28 01:26:30 +00:00
|
|
|
i.Method = ""
|
|
|
|
}
|
|
|
|
|
|
|
|
if i.Method == "" {
|
2022-04-17 23:58:24 +00:00
|
|
|
i.setMethod(totp, webauthn, duo, methods, fallback)
|
2022-03-28 01:26:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return before != i.Method
|
|
|
|
}
|
2022-04-17 23:58:24 +00:00
|
|
|
|
|
|
|
func (i *UserInfo) setMethod(totp, webauthn, duo bool, methods []string, fallback string) {
|
|
|
|
switch {
|
|
|
|
case i.HasTOTP && totp:
|
|
|
|
i.Method = SecondFactorMethodTOTP
|
2023-04-10 07:01:23 +00:00
|
|
|
case i.HasWebAuthn && webauthn:
|
|
|
|
i.Method = SecondFactorMethodWebAuthn
|
2022-04-17 23:58:24 +00:00
|
|
|
case i.HasDuo && duo:
|
|
|
|
i.Method = SecondFactorMethodDuo
|
|
|
|
case fallback != "" && utils.IsStringInSlice(fallback, methods):
|
|
|
|
i.Method = fallback
|
|
|
|
case totp:
|
|
|
|
i.Method = SecondFactorMethodTOTP
|
|
|
|
case webauthn:
|
2023-04-10 07:01:23 +00:00
|
|
|
i.Method = SecondFactorMethodWebAuthn
|
2022-04-17 23:58:24 +00:00
|
|
|
case duo:
|
|
|
|
i.Method = SecondFactorMethodDuo
|
|
|
|
}
|
|
|
|
}
|