75f3dd141c
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CI and Release / lint-frontend (push) Has been cancelled
CI and Release / dockerfile-scan (push) Has been cancelled
CI and Release / test-frontend (push) Has been cancelled
CI and Release / lint-verification-agent (push) Has been cancelled
CI and Release / test-verification-agent (push) Has been cancelled
CI and Release / e2e-verification-agent (push) Has been cancelled
CI and Release / test-backend (push) Has been cancelled
CI and Release / build-dev-image (push) Has been cancelled
CI and Release / push-dev-image (push) Has been cancelled
CI and Release / build-image (push) Has been cancelled
CI and Release / build-verification-image (push) Has been cancelled
CI and Release / determine-version (push) Has been cancelled
CI and Release / push-image (push) Has been cancelled
CI and Release / push-verification-image (12) (push) Has been cancelled
CI and Release / lint-backend (push) Has been cancelled
CI and Release / push-verification-image (17) (push) Has been cancelled
CI and Release / push-verification-image (18) (push) Has been cancelled
CI and Release / release (push) Has been cancelled
CI and Release / publish-helm-chart (push) Has been cancelled
CI and Release / push-verification-image (13) (push) Has been cancelled
CI and Release / push-verification-image (14) (push) Has been cancelled
CI and Release / push-verification-image (15) (push) Has been cancelled
CI and Release / push-verification-image (16) (push) Has been cancelled
83 lines
2.0 KiB
Go
83 lines
2.0 KiB
Go
package secrets
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/google/uuid"
|
|
"gorm.io/gorm"
|
|
|
|
"databasus-backend/internal/config"
|
|
user_models "databasus-backend/internal/features/users/models"
|
|
"databasus-backend/internal/storage"
|
|
)
|
|
|
|
type SecretKeyService struct {
|
|
cachedKey *string
|
|
}
|
|
|
|
func (s *SecretKeyService) MigrateKeyFromDbToFileIfExist() error {
|
|
var secretKey user_models.SecretKey
|
|
|
|
err := storage.GetDb().First(&secretKey).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil
|
|
}
|
|
return fmt.Errorf("failed to check for secret key in database: %w", err)
|
|
}
|
|
|
|
if secretKey.Secret == "" {
|
|
return nil
|
|
}
|
|
|
|
secretKeyPath := config.GetEnv().SecretKeyPath
|
|
if err := os.MkdirAll(filepath.Dir(secretKeyPath), 0o755); err != nil {
|
|
return fmt.Errorf("failed to create secret key directory: %w", err)
|
|
}
|
|
|
|
if err := os.WriteFile(secretKeyPath, []byte(secretKey.Secret), 0o600); err != nil {
|
|
return fmt.Errorf("failed to write secret key to file: %w", err)
|
|
}
|
|
|
|
if err := storage.GetDb().Exec("DELETE FROM secret_keys").Error; err != nil {
|
|
return fmt.Errorf("failed to delete secret key from database: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *SecretKeyService) GetSecretKey() (string, error) {
|
|
if s.cachedKey != nil {
|
|
return *s.cachedKey, nil
|
|
}
|
|
|
|
secretKeyPath := config.GetEnv().SecretKeyPath
|
|
data, err := os.ReadFile(secretKeyPath)
|
|
if err != nil {
|
|
if os.IsNotExist(err) {
|
|
newKey := s.generateNewSecretKey()
|
|
if err := os.MkdirAll(filepath.Dir(secretKeyPath), 0o755); err != nil {
|
|
return "", fmt.Errorf("failed to create secret key directory: %w", err)
|
|
}
|
|
|
|
if err := os.WriteFile(secretKeyPath, []byte(newKey), 0o600); err != nil {
|
|
return "", fmt.Errorf("failed to write new secret key: %w", err)
|
|
}
|
|
s.cachedKey = &newKey
|
|
return newKey, nil
|
|
}
|
|
return "", fmt.Errorf("failed to read secret key file: %w", err)
|
|
}
|
|
|
|
key := string(data)
|
|
s.cachedKey = &key
|
|
return key, nil
|
|
}
|
|
|
|
func (s *SecretKeyService) generateNewSecretKey() string {
|
|
return uuid.New().String() + uuid.New().String()
|
|
}
|