Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Copyright 2018 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package v1_6 //nolint
  4. import (
  5. "fmt"
  6. "code.gitea.io/gitea/models/migrations/base"
  7. "code.gitea.io/gitea/modules/timeutil"
  8. "code.gitea.io/gitea/modules/util"
  9. "xorm.io/xorm"
  10. )
  11. func AddScratchHash(x *xorm.Engine) error {
  12. // TwoFactor see models/twofactor.go
  13. type TwoFactor struct {
  14. ID int64 `xorm:"pk autoincr"`
  15. UID int64 `xorm:"UNIQUE"`
  16. Secret string
  17. ScratchToken string
  18. ScratchSalt string
  19. ScratchHash string
  20. LastUsedPasscode string `xorm:"VARCHAR(10)"`
  21. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  22. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  23. }
  24. if err := x.Sync(new(TwoFactor)); err != nil {
  25. return fmt.Errorf("Sync: %w", err)
  26. }
  27. sess := x.NewSession()
  28. defer sess.Close()
  29. if err := sess.Begin(); err != nil {
  30. return err
  31. }
  32. // transform all tokens to hashes
  33. const batchSize = 100
  34. for start := 0; ; start += batchSize {
  35. tfas := make([]*TwoFactor, 0, batchSize)
  36. if err := sess.Limit(batchSize, start).Find(&tfas); err != nil {
  37. return err
  38. }
  39. if len(tfas) == 0 {
  40. break
  41. }
  42. for _, tfa := range tfas {
  43. // generate salt
  44. salt, err := util.CryptoRandomString(10)
  45. if err != nil {
  46. return err
  47. }
  48. tfa.ScratchSalt = salt
  49. tfa.ScratchHash = base.HashToken(tfa.ScratchToken, salt)
  50. if _, err := sess.ID(tfa.ID).Cols("scratch_salt, scratch_hash").Update(tfa); err != nil {
  51. return fmt.Errorf("couldn't add in scratch_hash and scratch_salt: %w", err)
  52. }
  53. }
  54. }
  55. // Commit and begin new transaction for dropping columns
  56. if err := sess.Commit(); err != nil {
  57. return err
  58. }
  59. if err := sess.Begin(); err != nil {
  60. return err
  61. }
  62. if err := base.DropTableColumns(sess, "two_factor", "scratch_token"); err != nil {
  63. return err
  64. }
  65. return sess.Commit()
  66. }