rotate.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package keyrotate
  2. import (
  3. "github.com/porter-dev/porter/internal/models"
  4. gorm "github.com/porter-dev/porter/internal/repository/gorm"
  5. _gorm "gorm.io/gorm"
  6. )
  7. // process 100 records at a time
  8. const stepSize = 100
  9. func Rotate(db *_gorm.DB, oldKey, newKey *[32]byte) error {
  10. err := rotateClusterModel(db, oldKey, newKey)
  11. if err != nil {
  12. return err
  13. }
  14. return nil
  15. }
  16. func rotateClusterModel(db *_gorm.DB, oldKey, newKey *[32]byte) error {
  17. // get count of model
  18. var count int64
  19. if err := db.Model(&models.Cluster{}).Count(&count).Error; err != nil {
  20. return err
  21. }
  22. // cluster-scoped repository
  23. repo := gorm.NewClusterRepository(db, oldKey).(*gorm.ClusterRepository)
  24. // iterate (count / stepSize) + 1 times using Limit and Offset
  25. for i := 0; i < (int(count)/stepSize)+1; i++ {
  26. clusters := []*models.Cluster{}
  27. if err := db.Offset(i * stepSize).Limit(stepSize).Preload("TokenCache").Find(&clusters).Error; err != nil {
  28. return err
  29. }
  30. // decrypt with the old key
  31. for _, cluster := range clusters {
  32. err := repo.DecryptClusterData(cluster, oldKey)
  33. if err != nil {
  34. return err
  35. }
  36. }
  37. // encrypt with the new key and re-insert
  38. for _, cluster := range clusters {
  39. err := repo.EncryptClusterData(cluster, newKey)
  40. if err != nil {
  41. return err
  42. }
  43. if err := db.Save(cluster).Error; err != nil {
  44. return err
  45. }
  46. }
  47. }
  48. return nil
  49. }