gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package v1_17
  4. import (
  5. "context"
  6. "fmt"
  7. "code.gitea.io/gitea/models/migrations/base"
  8. "code.gitea.io/gitea/modules/setting"
  9. "code.gitea.io/gitea/modules/timeutil"
  10. "xorm.io/xorm"
  11. )
  12. func RenameCredentialIDBytes(x *xorm.Engine) error {
  13. // This migration maybe rerun so that we should check if it has been run
  14. credentialIDExist, err := x.Dialect().IsColumnExist(x.DB(), context.Background(), "webauthn_credential", "credential_id")
  15. if err != nil {
  16. return err
  17. }
  18. if credentialIDExist {
  19. credentialIDBytesExists, err := x.Dialect().IsColumnExist(x.DB(), context.Background(), "webauthn_credential", "credential_id_bytes")
  20. if err != nil {
  21. return err
  22. }
  23. if !credentialIDBytesExists {
  24. return nil
  25. }
  26. }
  27. err = func() error {
  28. // webauthnCredential table
  29. type webauthnCredential struct {
  30. ID int64 `xorm:"pk autoincr"`
  31. Name string
  32. LowerName string `xorm:"unique(s)"`
  33. UserID int64 `xorm:"INDEX unique(s)"`
  34. // Note the lack of INDEX here
  35. CredentialIDBytes []byte `xorm:"VARBINARY(1024)"` // CredentialID is at most 1023 bytes as per spec released 20 July 2022
  36. PublicKey []byte
  37. AttestationType string
  38. AAGUID []byte
  39. SignCount uint32 `xorm:"BIGINT"`
  40. CloneWarning bool
  41. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  42. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  43. }
  44. sess := x.NewSession()
  45. defer sess.Close()
  46. if err := sess.Begin(); err != nil {
  47. return err
  48. }
  49. if err := sess.Sync(new(webauthnCredential)); err != nil {
  50. return fmt.Errorf("error on Sync: %w", err)
  51. }
  52. if credentialIDExist {
  53. // if both errors and message exist, drop message at first
  54. if err := base.DropTableColumns(sess, "webauthn_credential", "credential_id"); err != nil {
  55. return err
  56. }
  57. }
  58. switch {
  59. case setting.Database.Type.IsMySQL():
  60. if _, err := sess.Exec("ALTER TABLE `webauthn_credential` CHANGE credential_id_bytes credential_id VARBINARY(1024)"); err != nil {
  61. return err
  62. }
  63. case setting.Database.Type.IsMSSQL():
  64. if _, err := sess.Exec("sp_rename 'webauthn_credential.credential_id_bytes', 'credential_id', 'COLUMN'"); err != nil {
  65. return err
  66. }
  67. default:
  68. if _, err := sess.Exec("ALTER TABLE `webauthn_credential` RENAME COLUMN credential_id_bytes TO credential_id"); err != nil {
  69. return err
  70. }
  71. }
  72. return sess.Commit()
  73. }()
  74. if err != nil {
  75. return err
  76. }
  77. // Create webauthnCredential table
  78. type webauthnCredential struct {
  79. ID int64 `xorm:"pk autoincr"`
  80. Name string
  81. LowerName string `xorm:"unique(s)"`
  82. UserID int64 `xorm:"INDEX unique(s)"`
  83. CredentialID []byte `xorm:"INDEX VARBINARY(1024)"` // CredentialID is at most 1023 bytes as per spec released 20 July 2022
  84. PublicKey []byte
  85. AttestationType string
  86. AAGUID []byte
  87. SignCount uint32 `xorm:"BIGINT"`
  88. CloneWarning bool
  89. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  90. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  91. }
  92. return x.Sync(&webauthnCredential{})
  93. }