fix: no webauthn devices doesn't display correctly (#4537)

* fix: no webauthn devices doesn't display correctly

* refactor: factorize
pull/4806/head
James Elliott 2022-12-12 12:21:27 +11:00 committed by GitHub
parent 326ed60a65
commit 67381b1318
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 16 deletions

View File

@ -9,6 +9,7 @@ import (
"github.com/authelia/authelia/v4/internal/middlewares" "github.com/authelia/authelia/v4/internal/middlewares"
"github.com/authelia/authelia/v4/internal/regulation" "github.com/authelia/authelia/v4/internal/regulation"
"github.com/authelia/authelia/v4/internal/storage"
) )
func getWebauthnDeviceIDFromContext(ctx *middlewares.AutheliaCtx) (int, error) { func getWebauthnDeviceIDFromContext(ctx *middlewares.AutheliaCtx) (int, error) {
@ -35,7 +36,7 @@ func WebauthnDevicesGet(ctx *middlewares.AutheliaCtx) {
devices, err := ctx.Providers.StorageProvider.LoadWebauthnDevicesByUsername(ctx, userSession.Username) devices, err := ctx.Providers.StorageProvider.LoadWebauthnDevicesByUsername(ctx, userSession.Username)
if err != nil { if err != nil && err != storage.ErrNoWebauthnDevice {
ctx.Error(err, messageOperationFailed) ctx.Error(err, messageOperationFailed)
return return
} }

View File

@ -136,6 +136,22 @@ func NewWebauthnDeviceFromCredential(rpid, username, description string, credent
return device return device
} }
// WebauthnDeviceJSON represents a Webauthn Device in the JSON format.
type WebauthnDeviceJSON struct {
ID int `json:"id"`
CreatedAt time.Time `json:"created_at"`
LastUsedAt *time.Time `json:"last_used_at,omitempty"`
RPID string `json:"rpid"`
Description string `json:"description"`
KID []byte `json:"kid"`
PublicKey []byte `json:"public_key"`
AttestationType string `json:"attestation_type"`
Transports []string `json:"transports"`
AAGUID string `json:"aaguid,omitempty"`
SignCount uint32 `json:"sign_count"`
CloneWarning bool `json:"clone_warning"`
}
// WebauthnDevice represents a Webauthn Device in the database storage. // WebauthnDevice represents a Webauthn Device in the database storage.
type WebauthnDevice struct { type WebauthnDevice struct {
ID int `db:"id"` ID int `db:"id"`
@ -155,20 +171,7 @@ type WebauthnDevice struct {
// MarshalJSON returns the WebauthnDevice in a JSON friendly manner. // MarshalJSON returns the WebauthnDevice in a JSON friendly manner.
func (w *WebauthnDevice) MarshalJSON() (data []byte, err error) { func (w *WebauthnDevice) MarshalJSON() (data []byte, err error) {
o := struct { o := WebauthnDeviceJSON{
ID int `json:"id"`
CreatedAt time.Time `json:"created_at"`
LastUsedAt *time.Time `json:"last_used_at,omitempty"`
RPID string `json:"rpid"`
Description string `json:"description"`
KID []byte `json:"kid"`
PublicKey []byte `json:"public_key"`
AttestationType string `json:"attestation_type"`
Transports []string `json:"transports"`
AAGUID string `json:"aaguid,omitempty"`
SignCount uint32 `json:"sign_count"`
CloneWarning bool `json:"clone_warning"`
}{
ID: w.ID, ID: w.ID,
CreatedAt: w.CreatedAt, CreatedAt: w.CreatedAt,
RPID: w.RPID, RPID: w.RPID,

View File

@ -941,7 +941,7 @@ func (p *SQLProvider) LoadWebauthnDevices(ctx context.Context, limit, page int)
func (p *SQLProvider) LoadWebauthnDevicesByUsername(ctx context.Context, username string) (devices []model.WebauthnDevice, err error) { func (p *SQLProvider) LoadWebauthnDevicesByUsername(ctx context.Context, username string) (devices []model.WebauthnDevice, err error) {
if err = p.db.SelectContext(ctx, &devices, p.sqlSelectWebauthnDevicesByUsername, username); err != nil { if err = p.db.SelectContext(ctx, &devices, p.sqlSelectWebauthnDevicesByUsername, username); err != nil {
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
return nil, ErrNoWebauthnDevice return devices, ErrNoWebauthnDevice
} }
return nil, fmt.Errorf("error selecting Webauthn devices for user '%s': %w", username, err) return nil, fmt.Errorf("error selecting Webauthn devices for user '%s': %w", username, err)