fix(安全): 修复HTML导出中的XSS漏洞并清理调试日志
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled

refactor(日志): 替换console.log为tracing日志系统
style(代码): 移除未使用的代码和依赖项

feat(测试): 添加端到端测试文档和CI工作流
docs(变更日志): 更新CHANGELOG.md记录0.1.0版本变更

perf(构建): 更新依赖版本并优化CI流程
This commit is contained in:
iven
2026-03-26 19:49:03 +08:00
parent b8d565a9eb
commit 978dc5cdd8
79 changed files with 3953 additions and 5724 deletions

View File

@@ -21,6 +21,9 @@ import {
clearKeyCache,
} from './crypto-utils';
import { secureStorage, isSecureStorageAvailable } from './secure-storage';
import { createLogger } from './logger';
const log = createLogger('EncryptedChatStorage');
// Storage keys
const CHAT_DATA_KEY = 'zclaw_chat_data';
@@ -77,7 +80,7 @@ async function getOrCreateMasterKey(): Promise<string> {
const keyHashValue = await hashSha256(newKey);
localStorage.setItem(CHAT_KEY_HASH_KEY, keyHashValue);
console.log('[EncryptedChatStorage] Generated new master key');
log.debug('Generated new master key');
return newKey;
}
@@ -92,7 +95,7 @@ async function getChatEncryptionKey(): Promise<CryptoKey> {
return cachedChatKey;
}
// Hash mismatch - clear cache and re-derive
console.warn('[EncryptedChatStorage] Key hash mismatch, re-deriving key');
log.warn('Key hash mismatch, re-deriving key');
cachedChatKey = null;
keyHash = null;
}
@@ -118,12 +121,12 @@ export async function initializeEncryptedChatStorage(): Promise<void> {
if (legacyData && !localStorage.getItem(ENCRYPTED_PREFIX + 'migrated')) {
await migrateFromLegacyStorage(legacyData);
localStorage.setItem(ENCRYPTED_PREFIX + 'migrated', 'true');
console.log('[EncryptedChatStorage] Migrated legacy data');
log.debug('Migrated legacy data');
}
console.log('[EncryptedChatStorage] Initialized successfully');
log.debug('Initialized successfully');
} catch (error) {
console.error('[EncryptedChatStorage] Initialization failed:', error);
log.error('Initialization failed:', error);
throw error;
}
}
@@ -136,10 +139,10 @@ async function migrateFromLegacyStorage(legacyData: string): Promise<void> {
const parsed = JSON.parse(legacyData);
if (parsed?.state?.conversations) {
await saveConversations(parsed.state.conversations);
console.log(`[EncryptedChatStorage] Migrated ${parsed.state.conversations.length} conversations`);
log.debug(`Migrated ${parsed.state.conversations.length} conversations`);
}
} catch (error) {
console.error('[EncryptedChatStorage] Migration failed:', error);
log.error('Migration failed:', error);
}
}
@@ -176,9 +179,9 @@ export async function saveConversations(conversations: unknown[]): Promise<void>
// Store the encrypted container
localStorage.setItem(CHAT_DATA_KEY, JSON.stringify(container));
console.log(`[EncryptedChatStorage] Saved ${conversations.length} conversations`);
log.debug(`Saved ${conversations.length} conversations`);
} catch (error) {
console.error('[EncryptedChatStorage] Failed to save conversations:', error);
log.error('Failed to save conversations:', error);
throw error;
}
}
@@ -199,20 +202,20 @@ export async function loadConversations<T = unknown>(): Promise<T[]> {
// Validate container structure
if (!container.data || !container.metadata) {
console.warn('[EncryptedChatStorage] Invalid container structure');
log.warn('Invalid container structure');
return [];
}
// Check version compatibility
if (container.metadata.version > STORAGE_VERSION) {
console.error('[EncryptedChatStorage] Incompatible storage version');
log.error('Incompatible storage version');
return [];
}
// Parse and decrypt the data
const encryptedData = JSON.parse(container.data);
if (!isValidEncryptedData(encryptedData)) {
console.error('[EncryptedChatStorage] Invalid encrypted data');
log.error('Invalid encrypted data');
return [];
}
@@ -223,10 +226,10 @@ export async function loadConversations<T = unknown>(): Promise<T[]> {
container.metadata.lastAccessedAt = Date.now();
localStorage.setItem(CHAT_DATA_KEY, JSON.stringify(container));
console.log(`[EncryptedChatStorage] Loaded ${conversations.length} conversations`);
log.debug(`Loaded ${conversations.length} conversations`);
return conversations;
} catch (error) {
console.error('[EncryptedChatStorage] Failed to load conversations:', error);
log.error('Failed to load conversations:', error);
return [];
}
}
@@ -249,9 +252,9 @@ export async function clearAllChatData(): Promise<void> {
keyHash = null;
clearKeyCache();
console.log('[EncryptedChatStorage] Cleared all chat data');
log.debug('Cleared all chat data');
} catch (error) {
console.error('[EncryptedChatStorage] Failed to clear chat data:', error);
log.error('Failed to clear chat data:', error);
throw error;
}
}
@@ -280,7 +283,7 @@ export async function exportEncryptedBackup(): Promise<string> {
return btoa(JSON.stringify(exportData));
} catch (error) {
console.error('[EncryptedChatStorage] Export failed:', error);
log.error('Export failed:', error);
throw error;
}
}
@@ -321,9 +324,9 @@ export async function importEncryptedBackup(
localStorage.setItem(CHAT_DATA_KEY, JSON.stringify(decoded.container));
}
console.log('[EncryptedChatStorage] Import completed successfully');
log.debug('Import completed successfully');
} catch (error) {
console.error('[EncryptedChatStorage] Import failed:', error);
log.error('Import failed:', error);
throw error;
}
}
@@ -404,9 +407,9 @@ export async function rotateEncryptionKey(): Promise<void> {
// Re-save all data with new key
await saveConversations(conversations);
console.log('[EncryptedChatStorage] Encryption key rotated successfully');
log.debug('Encryption key rotated successfully');
} catch (error) {
console.error('[EncryptedChatStorage] Key rotation failed:', error);
log.error('Key rotation failed:', error);
throw error;
}
}