veza/veza-backend-api/internal/config/secrets.go
2025-12-03 20:29:37 +01:00

76 lines
2 KiB
Go

package config
import (
"fmt"
"os"
)
// SecretsProvider définit l'interface pour les fournisseurs de secrets (T0037)
type SecretsProvider interface {
GetSecret(name string) (string, error)
IsSecret(name string) bool
}
// EnvSecretsProvider récupère les secrets depuis les variables d'environnement (T0037)
type EnvSecretsProvider struct {
secretKeys map[string]bool
}
// NewEnvSecretsProvider crée un nouveau fournisseur de secrets depuis l'environnement
func NewEnvSecretsProvider(secretKeys []string) *EnvSecretsProvider {
keysMap := make(map[string]bool)
for _, key := range secretKeys {
keysMap[key] = true
}
return &EnvSecretsProvider{secretKeys: keysMap}
}
// GetSecret récupère un secret depuis les variables d'environnement (T0037)
func (p *EnvSecretsProvider) GetSecret(name string) (string, error) {
value := os.Getenv(name)
if value == "" {
return "", fmt.Errorf("secret %s not found", name)
}
return value, nil
}
// IsSecret vérifie si une clé est un secret (T0037)
func (p *EnvSecretsProvider) IsSecret(name string) bool {
return p.secretKeys[name]
}
// MaskSecret masque un secret pour l'affichage dans les logs (T0037)
// Masque les 4 premiers et 4 derniers caractères, remplace le reste par "****"
func MaskSecret(secret string) string {
if secret == "" {
return ""
}
if len(secret) <= 8 {
return "****"
}
return secret[:4] + "****" + secret[len(secret)-4:]
}
// MaskConfigValue masque une valeur si c'est un secret (T0037)
func MaskConfigValue(key, value string, provider SecretsProvider) string {
if provider != nil && provider.IsSecret(key) {
return MaskSecret(value)
}
return value
}
// DefaultSecretKeys retourne la liste des clés considérées comme secrets (T0037)
func DefaultSecretKeys() []string {
return []string{
"JWT_SECRET",
"DB_PASSWORD",
"DATABASE_PASSWORD",
"REDIS_PASSWORD",
"AWS_SECRET_ACCESS_KEY",
"AWS_ACCESS_KEY_ID",
"STRIPE_SECRET_KEY",
"STRIPE_WEBHOOK_SECRET",
"SMTP_PASSWORD",
"OAUTH_CLIENT_SECRET",
}
}