Skip to content

Commit e04a947

Browse files
committed
use json
1 parent 32c29bd commit e04a947

File tree

2 files changed

+30
-11
lines changed

2 files changed

+30
-11
lines changed

models/auth/webauthn.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
"strings"
1010

1111
"code.gitea.io/gitea/models/db"
12+
"code.gitea.io/gitea/modules/json"
13+
"code.gitea.io/gitea/modules/log"
1214
"code.gitea.io/gitea/modules/timeutil"
1315
"code.gitea.io/gitea/modules/util"
1416

@@ -51,7 +53,7 @@ type WebAuthnCredential struct {
5153
PublicKey []byte
5254
AttestationType string
5355
AAGUID []byte
54-
Flags protocol.AuthenticatorFlags
56+
CredentialFlags string `xorm:"TEXT DEFAULT ''"`
5557
SignCount uint32 `xorm:"BIGINT"`
5658
CloneWarning bool
5759
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
@@ -95,6 +97,14 @@ type WebAuthnCredentialList []*WebAuthnCredential
9597
func (list WebAuthnCredentialList) ToCredentials() []webauthn.Credential {
9698
creds := make([]webauthn.Credential, 0, len(list))
9799
for _, cred := range list {
100+
var flags webauthn.CredentialFlags
101+
if cred.CredentialFlags != "" {
102+
err := json.Unmarshal([]byte(cred.CredentialFlags), &flags)
103+
if err != nil {
104+
log.Error("Failed to unmarshal CredentialFlags, webauthn credential id:%d, err:%v", cred.ID, err)
105+
continue
106+
}
107+
}
98108
creds = append(creds, webauthn.Credential{
99109
ID: cred.CredentialID,
100110
PublicKey: cred.PublicKey,
@@ -104,12 +114,7 @@ func (list WebAuthnCredentialList) ToCredentials() []webauthn.Credential {
104114
SignCount: cred.SignCount,
105115
CloneWarning: cred.CloneWarning,
106116
},
107-
Flags: webauthn.CredentialFlags{
108-
UserPresent: cred.Flags.HasUserPresent(),
109-
UserVerified: cred.Flags.HasUserVerified(),
110-
BackupEligible: cred.Flags.HasBackupEligible(),
111-
BackupState: cred.Flags.HasBackupState(),
112-
},
117+
Flags: flags,
113118
})
114119
}
115120
return creds
@@ -179,14 +184,18 @@ func CreateCredential(ctx context.Context, userID int64, name string, cred *weba
179184
if cred.Flags.BackupState {
180185
flags |= protocol.FlagBackupState
181186
}
187+
flagsJSON, err := json.Marshal(cred.Flags)
188+
if err != nil {
189+
return nil, err
190+
}
182191
c := &WebAuthnCredential{
183192
UserID: userID,
184193
Name: name,
185194
CredentialID: cred.ID,
186195
PublicKey: cred.PublicKey,
187196
AttestationType: cred.AttestationType,
188197
AAGUID: cred.Authenticator.AAGUID,
189-
Flags: flags,
198+
CredentialFlags: string(flagsJSON),
190199
SignCount: cred.Authenticator.SignCount,
191200
CloneWarning: false,
192201
}

models/migrations/v1_23/v310.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
package v1_23 //nolint
55

66
import (
7-
"github.com/go-webauthn/webauthn/protocol"
7+
"code.gitea.io/gitea/modules/json"
8+
9+
"github.com/go-webauthn/webauthn/webauthn"
810
"xorm.io/xorm"
911
)
1012

1113
type WebAuthnCredential struct {
12-
Flags protocol.AuthenticatorFlags
14+
CredentialFlags string `xorm:"TEXT DEFAULT ''"`
1315
}
1416

1517
func (cred WebAuthnCredential) TableName() string {
@@ -20,6 +22,14 @@ func AddFlagsOnWebAuthnCredential(x *xorm.Engine) error {
2022
if err := x.Sync(new(WebAuthnCredential)); err != nil {
2123
return err
2224
}
23-
_, err := x.Exec("UPDATE webauthn_credential SET flags = 29 WHERE id > 0")
25+
26+
defaultCredentialFlags := webauthn.CredentialFlags{
27+
BackupEligible: true,
28+
}
29+
defaultCredentialFlagsJSON, err := json.Marshal(defaultCredentialFlags)
30+
if err != nil {
31+
return err
32+
}
33+
_, err = x.Exec("UPDATE webauthn_credential SET credential_flags = ? WHERE credential_flags = '' OR credential_flags IS NULL", string(defaultCredentialFlagsJSON))
2434
return err
2535
}

0 commit comments

Comments
 (0)