2022-02-14 00:19:12 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2022-02-14 00:19:12 +03:00
2022-11-02 11:54:36 +03:00
package v1_16 //nolint
2022-02-14 00:19:12 +03:00
import (
"testing"
2022-11-02 11:54:36 +03:00
"code.gitea.io/gitea/models/migrations/base"
2022-02-14 00:19:12 +03:00
"code.gitea.io/gitea/modules/timeutil"
2022-02-23 23:16:07 +03:00
2022-02-14 00:19:12 +03:00
"github.com/stretchr/testify/assert"
"xorm.io/xorm/schemas"
)
2022-11-02 11:54:36 +03:00
func Test_RemigrateU2FCredentials ( t * testing . T ) {
2022-02-14 00:19:12 +03:00
// Create webauthnCredential table
type WebauthnCredential struct {
ID int64 ` xorm:"pk autoincr" `
Name string
LowerName string ` xorm:"unique(s)" `
UserID int64 ` xorm:"INDEX unique(s)" `
CredentialID string ` xorm:"INDEX VARCHAR(410)" ` // CredentalID in U2F is at most 255bytes / 5 * 8 = 408 - add a few extra characters for safety
PublicKey [ ] byte
AttestationType string
SignCount uint32 ` xorm:"BIGINT" `
CloneWarning bool
}
// Now migrate the old u2f registrations to the new format
type U2fRegistration struct {
ID int64 ` xorm:"pk autoincr" `
Name string
UserID int64 ` xorm:"INDEX" `
Raw [ ] byte
Counter uint32 ` xorm:"BIGINT" `
CreatedUnix timeutil . TimeStamp ` xorm:"INDEX created" `
UpdatedUnix timeutil . TimeStamp ` xorm:"INDEX updated" `
}
type ExpectedWebauthnCredential struct {
ID int64 ` xorm:"pk autoincr" `
CredentialID string ` xorm:"INDEX VARCHAR(410)" ` // CredentalID in U2F is at most 255bytes / 5 * 8 = 408 - add a few extra characters for safety
}
// Prepare and load the testing database
2022-11-02 11:54:36 +03:00
x , deferable := base . PrepareTestEnv ( t , 0 , new ( WebauthnCredential ) , new ( U2fRegistration ) , new ( ExpectedWebauthnCredential ) )
2022-02-14 00:19:12 +03:00
if x == nil || t . Failed ( ) {
defer deferable ( )
return
}
defer deferable ( )
if x . Dialect ( ) . URI ( ) . DBType == schemas . SQLITE {
return
}
// Run the migration
2022-11-02 11:54:36 +03:00
if err := RemigrateU2FCredentials ( x ) ; err != nil {
2022-02-14 00:19:12 +03:00
assert . NoError ( t , err )
return
}
expected := [ ] ExpectedWebauthnCredential { }
if err := x . Table ( "expected_webauthn_credential" ) . Asc ( "id" ) . Find ( & expected ) ; ! assert . NoError ( t , err ) {
return
}
got := [ ] ExpectedWebauthnCredential { }
if err := x . Table ( "webauthn_credential" ) . Select ( "id, credential_id" ) . Asc ( "id" ) . Find ( & got ) ; ! assert . NoError ( t , err ) {
return
}
assert . EqualValues ( t , expected , got )
}