aboutsummaryrefslogtreecommitdiff
path: root/internal/db/migrations/v20.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/db/migrations/v20.go')
-rw-r--r--internal/db/migrations/v20.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/internal/db/migrations/v20.go b/internal/db/migrations/v20.go
new file mode 100644
index 00000000..28f406bb
--- /dev/null
+++ b/internal/db/migrations/v20.go
@@ -0,0 +1,54 @@
+// Copyright 2022 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package migrations
+
+import (
+ "github.com/pkg/errors"
+ "gorm.io/gorm"
+
+ "gogs.io/gogs/internal/cryptoutil"
+)
+
+func migrateAccessTokenToSHA256(db *gorm.DB) error {
+ return db.Transaction(func(tx *gorm.DB) error {
+ // 1. Add column without constraints because all rows have NULL values for the
+ // "sha256" column.
+ type accessToken struct {
+ ID int64
+ Sha1 string
+ SHA256 string `gorm:"TYPE:VARCHAR(64)"`
+ }
+ err := tx.Migrator().AddColumn(&accessToken{}, "SHA256")
+ if err != nil {
+ return errors.Wrap(err, "add column")
+ }
+
+ // 2. Generate SHA256 for existing rows from their values in the "sha1" column.
+ var accessTokens []*accessToken
+ err = tx.Where("sha256 IS NULL").Find(&accessTokens).Error
+ if err != nil {
+ return errors.Wrap(err, "list")
+ }
+
+ for _, t := range accessTokens {
+ sha256 := cryptoutil.SHA256(t.Sha1)
+ err = tx.Model(&accessToken{}).Where("id = ?", t.ID).Update("sha256", sha256).Error
+ if err != nil {
+ return errors.Wrap(err, "update")
+ }
+ }
+
+ // 3. We are now safe to apply constraints to the "sha256" column.
+ type accessTokenWithConstraint struct {
+ SHA256 string `gorm:"type:VARCHAR(64);unique;not null"`
+ }
+ err = tx.Table("access_token").AutoMigrate(&accessTokenWithConstraint{})
+ if err != nil {
+ return errors.Wrap(err, "auto migrate")
+ }
+
+ return nil
+ })
+}