mirror of
https://github.com/Awuqing/BackupX.git
synced 2026-05-06 20:02:41 +08:00
61 lines
1.7 KiB
Go
61 lines
1.7 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"backupx/server/internal/config"
|
|
"backupx/server/internal/model"
|
|
"backupx/server/internal/repository"
|
|
"backupx/server/internal/security"
|
|
)
|
|
|
|
const (
|
|
jwtSecretKey = "security.jwt_secret"
|
|
encryptionKeyKey = "security.encryption_key"
|
|
)
|
|
|
|
type ResolvedSecurity struct {
|
|
JWTSecret string
|
|
EncryptionKey string
|
|
}
|
|
|
|
func ResolveSecurity(ctx context.Context, cfg config.SecurityConfig, repo repository.SystemConfigRepository) (ResolvedSecurity, error) {
|
|
jwtSecret, err := ensureSecurityValue(ctx, repo, jwtSecretKey, cfg.JWTSecret, 48)
|
|
if err != nil {
|
|
return ResolvedSecurity{}, fmt.Errorf("resolve jwt secret: %w", err)
|
|
}
|
|
encryptionKey, err := ensureSecurityValue(ctx, repo, encryptionKeyKey, cfg.EncryptionKey, 48)
|
|
if err != nil {
|
|
return ResolvedSecurity{}, fmt.Errorf("resolve encryption key: %w", err)
|
|
}
|
|
return ResolvedSecurity{JWTSecret: jwtSecret, EncryptionKey: encryptionKey}, nil
|
|
}
|
|
|
|
func ensureSecurityValue(ctx context.Context, repo repository.SystemConfigRepository, key, configuredValue string, size int) (string, error) {
|
|
if strings.TrimSpace(configuredValue) != "" {
|
|
if err := repo.Upsert(ctx, &model.SystemConfig{Key: key, Value: configuredValue, Encrypted: false}); err != nil {
|
|
return "", err
|
|
}
|
|
return configuredValue, nil
|
|
}
|
|
|
|
stored, err := repo.GetByKey(ctx, key)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if stored != nil && strings.TrimSpace(stored.Value) != "" {
|
|
return stored.Value, nil
|
|
}
|
|
|
|
generated, err := security.GenerateSecret(size)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if err := repo.Upsert(ctx, &model.SystemConfig{Key: key, Value: generated, Encrypted: false}); err != nil {
|
|
return "", err
|
|
}
|
|
return generated, nil
|
|
}
|