refactor: enhance chat components with type safety and response functionality
- Updated type definitions in ChatWindow and MessageList components for better type safety. - Improved MessageInput to handle message responses, including a preview feature for replying to messages. - Enhanced the chat message handling logic to support message references and improve user interaction. - Refactored notification utility functions to support push notifications and rate limiting for email sending. - Updated backend schema to accommodate new features related to message responses and notifications.
This commit is contained in:
72
packages/backend/convex/actions/utils/nodeCrypto.ts
Normal file
72
packages/backend/convex/actions/utils/nodeCrypto.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
* 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}`);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user