package services import ( "encoding/json" "fmt" "github.com/sujit-baniya/fiber-boilerplate/app" "github.com/sujit-baniya/fiber-boilerplate/utils" ) // CifrarSecretoUmind / DescifrarSecretoUmind protegen en reposo los // secretos de terceros de uMind (headers de auth de tools, tokens de // Telegram/WhatsApp) — mismo patrón AES-GCM + APP_KEY que ya usa el proyecto // para la contraseña SMTP (utils.Encrypt/Decrypt, ver // rest/controllers/smtp_config_controller.go), no uno nuevo. func CifrarSecretoUmind(valor string) (string, error) { if valor == "" { return "", nil } if app.Http.Server.Key == "" { return "", fmt.Errorf("APP_KEY no está configurada, no se puede cifrar el secreto") } return utils.Encrypt(valor, app.Http.Server.Key), nil } func DescifrarSecretoUmind(valorCifrado string) (string, error) { if valorCifrado == "" { return "", nil } if app.Http.Server.Key == "" { return "", fmt.Errorf("APP_KEY no está configurada, no se puede descifrar el secreto") } return utils.Decrypt(valorCifrado, app.Http.Server.Key), nil } // CifrarCredencialesCanal / DescifrarCredencialesCanal empaquetan el mapa de // credenciales de un UmindCanal (bot_token de Telegram; access_token, // phone_number_id, app_secret y verify_token de WhatsApp) como un único blob // cifrado en UmindCanal.CredencialesEnc. func CifrarCredencialesCanal(credenciales map[string]string) (string, error) { b, err := json.Marshal(credenciales) if err != nil { return "", err } return CifrarSecretoUmind(string(b)) } func DescifrarCredencialesCanal(credencialesEnc string) (map[string]string, error) { plano, err := DescifrarSecretoUmind(credencialesEnc) if err != nil { return nil, err } if plano == "" { return map[string]string{}, nil } var credenciales map[string]string if err := json.Unmarshal([]byte(plano), &credenciales); err != nil { return nil, fmt.Errorf("credenciales del canal corruptas: %w", err) } return credenciales, nil }