- Implemented error handling for unhandled promise rejections related to message channels, improving stability during push notification operations. - Updated the PushNotificationManager component to manage push subscription registration with timeouts, preventing application hangs. - Enhanced the sidebar and chat components to display user avatars, improving user experience and visual consistency. - Refactored email processing logic to support scheduled email sending, integrating new backend functionalities for better email management. - Improved overall error handling and logging across components to reduce console spam and enhance debugging capabilities.
75 lines
2.1 KiB
TypeScript
75 lines
2.1 KiB
TypeScript
"use node";
|
|
|
|
/**
|
|
* Utilitários de criptografia compatíveis com Node.js
|
|
* Para uso em actions que rodam em ambiente Node.js
|
|
*/
|
|
|
|
/**
|
|
* Descriptografa senha SMTP usando Web Crypto API compatível com Node.js
|
|
* Esta versão funciona em ambiente Node.js (actions)
|
|
*/
|
|
export async function decryptSMTPPasswordNode(encryptedPassword: string): Promise<string> {
|
|
try {
|
|
// Em Node.js, crypto.subtle está disponível globalmente
|
|
const crypto = globalThis.crypto;
|
|
|
|
if (!crypto || !crypto.subtle) {
|
|
throw new Error("Web Crypto API não disponível");
|
|
}
|
|
|
|
// Chave base - mesma usada em auth/utils.ts
|
|
const keyMaterial = new TextEncoder().encode("SGSE-EMAIL-ENCRYPTION-KEY-2024");
|
|
|
|
// Importar chave material
|
|
const keyMaterialKey = await crypto.subtle.importKey(
|
|
"raw",
|
|
keyMaterial,
|
|
{ name: "PBKDF2" },
|
|
false,
|
|
["deriveBits", "deriveKey"]
|
|
);
|
|
|
|
// Derivar chave de 256 bits usando PBKDF2
|
|
const key = await crypto.subtle.deriveKey(
|
|
{
|
|
name: "PBKDF2",
|
|
salt: new TextEncoder().encode("SGSE-SALT"),
|
|
iterations: 100000,
|
|
hash: "SHA-256",
|
|
},
|
|
keyMaterialKey,
|
|
{ name: "AES-GCM", length: 256 },
|
|
false,
|
|
["encrypt", "decrypt"]
|
|
);
|
|
|
|
// Decodificar base64 manualmente (compatível com Node.js e browser)
|
|
const binaryString = atob(encryptedPassword);
|
|
const combined = Uint8Array.from(binaryString, (c) => c.charCodeAt(0));
|
|
|
|
// Extrair IV e dados criptografados
|
|
const iv = combined.slice(0, 12);
|
|
const encrypted = combined.slice(12);
|
|
|
|
// Descriptografar
|
|
const decrypted = await crypto.subtle.decrypt(
|
|
{
|
|
name: "AES-GCM",
|
|
iv: iv,
|
|
},
|
|
key,
|
|
encrypted
|
|
);
|
|
|
|
// Converter para string
|
|
const decoder = new TextDecoder();
|
|
return decoder.decode(decrypted);
|
|
} catch (error) {
|
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
console.error("Erro ao descriptografar senha SMTP (Node.js):", errorMessage);
|
|
throw new Error(`Falha ao descriptografar senha SMTP: ${errorMessage}`);
|
|
}
|
|
}
|
|
|