| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 | // 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 migrationsimport (	"github.com/pkg/errors"	"gorm.io/gorm"	"gogs.io/gogs/internal/cryptoutil")func migrateAccessTokenToSHA256(db *gorm.DB) error {	type accessToken struct {		ID     int64		Sha1   string		SHA256 string `gorm:"TYPE:VARCHAR(64)"`	}	if db.Migrator().HasColumn(&accessToken{}, "SHA256") {		return errMigrationSkipped	}	return db.Transaction(func(tx *gorm.DB) error {		// 1. Add column without constraints because all rows have NULL values for the		// "sha256" column.		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	})}
 |