gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package v1_17
  4. import (
  5. "encoding/base32"
  6. "fmt"
  7. "code.gitea.io/gitea/modules/timeutil"
  8. "xorm.io/xorm"
  9. )
  10. func StoreWebauthnCredentialIDAsBytes(x *xorm.Engine) error {
  11. // Create webauthnCredential table
  12. type webauthnCredential struct {
  13. ID int64 `xorm:"pk autoincr"`
  14. Name string
  15. LowerName string `xorm:"unique(s)"`
  16. UserID int64 `xorm:"INDEX unique(s)"`
  17. CredentialID string `xorm:"INDEX VARCHAR(410)"`
  18. // Note the lack of INDEX here - these will be created once the column is renamed in v223.go
  19. CredentialIDBytes []byte `xorm:"VARBINARY(1024)"` // CredentialID is at most 1023 bytes as per spec released 20 July 2022
  20. PublicKey []byte
  21. AttestationType string
  22. AAGUID []byte
  23. SignCount uint32 `xorm:"BIGINT"`
  24. CloneWarning bool
  25. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  26. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  27. }
  28. if err := x.Sync(&webauthnCredential{}); err != nil {
  29. return err
  30. }
  31. var start int
  32. creds := make([]*webauthnCredential, 0, 50)
  33. for {
  34. err := x.Select("id, credential_id").OrderBy("id").Limit(50, start).Find(&creds)
  35. if err != nil {
  36. return err
  37. }
  38. err = func() error {
  39. sess := x.NewSession()
  40. defer sess.Close()
  41. if err := sess.Begin(); err != nil {
  42. return fmt.Errorf("unable to allow start session. Error: %w", err)
  43. }
  44. for _, cred := range creds {
  45. cred.CredentialIDBytes, err = base32.HexEncoding.DecodeString(cred.CredentialID)
  46. if err != nil {
  47. return fmt.Errorf("unable to parse credential id %s for credential[%d]: %w", cred.CredentialID, cred.ID, err)
  48. }
  49. count, err := sess.ID(cred.ID).Cols("credential_id_bytes").Update(cred)
  50. if count != 1 || err != nil {
  51. return fmt.Errorf("unable to update credential id bytes for credential[%d]: %d,%w", cred.ID, count, err)
  52. }
  53. }
  54. return sess.Commit()
  55. }()
  56. if err != nil {
  57. return err
  58. }
  59. if len(creds) < 50 {
  60. break
  61. }
  62. start += 50
  63. creds = creds[:0]
  64. }
  65. return nil
  66. }