// 漏洞管理相关功能 let currentVulnerabilityId = null; let vulnerabilityFilters = { id: '', conversation_id: '', severity: '', status: '' }; // 初始化漏洞管理页面 function initVulnerabilityPage() { loadVulnerabilityStats(); loadVulnerabilities(); } // 加载漏洞统计 async function loadVulnerabilityStats() { try { // 检查apiFetch是否可用 if (typeof apiFetch === 'undefined') { console.error('apiFetch未定义,请确保auth.js已加载'); throw new Error('apiFetch未定义'); } const params = new URLSearchParams(); if (vulnerabilityFilters.conversation_id) { params.append('conversation_id', vulnerabilityFilters.conversation_id); } const response = await apiFetch(`/api/vulnerabilities/stats?${params.toString()}`); if (!response.ok) { const errorText = await response.text(); console.error('获取统计失败:', response.status, errorText); throw new Error(`获取统计失败: ${response.status}`); } const stats = await response.json(); updateVulnerabilityStats(stats); } catch (error) { console.error('加载漏洞统计失败:', error); // 统计失败不影响列表显示,只重置统计为0 updateVulnerabilityStats(null); } } // 更新漏洞统计显示 function updateVulnerabilityStats(stats) { // 处理空值情况 if (!stats) { stats = { total: 0, by_severity: {}, by_status: {} }; } document.getElementById('stat-total').textContent = stats.total || 0; const bySeverity = stats.by_severity || {}; document.getElementById('stat-critical').textContent = bySeverity.critical || 0; document.getElementById('stat-high').textContent = bySeverity.high || 0; document.getElementById('stat-medium').textContent = bySeverity.medium || 0; document.getElementById('stat-low').textContent = bySeverity.low || 0; document.getElementById('stat-info').textContent = bySeverity.info || 0; } // 加载漏洞列表 async function loadVulnerabilities() { const listContainer = document.getElementById('vulnerabilities-list'); listContainer.innerHTML = '
加载中...
'; try { // 检查apiFetch是否可用 if (typeof apiFetch === 'undefined') { console.error('apiFetch未定义,请确保auth.js已加载'); throw new Error('apiFetch未定义'); } const params = new URLSearchParams(); params.append('limit', '100'); params.append('offset', '0'); if (vulnerabilityFilters.id) { params.append('id', vulnerabilityFilters.id); } if (vulnerabilityFilters.conversation_id) { params.append('conversation_id', vulnerabilityFilters.conversation_id); } if (vulnerabilityFilters.severity) { params.append('severity', vulnerabilityFilters.severity); } if (vulnerabilityFilters.status) { params.append('status', vulnerabilityFilters.status); } const response = await apiFetch(`/api/vulnerabilities?${params.toString()}`); if (!response.ok) { const errorText = await response.text(); console.error('获取漏洞列表失败:', response.status, errorText); throw new Error(`获取漏洞列表失败: ${response.status}`); } const vulnerabilities = await response.json(); renderVulnerabilities(vulnerabilities); } catch (error) { console.error('加载漏洞列表失败:', error); listContainer.innerHTML = `
加载失败: ${error.message}
`; } } // 渲染漏洞列表 function renderVulnerabilities(vulnerabilities) { const listContainer = document.getElementById('vulnerabilities-list'); // 处理空值情况 if (!vulnerabilities || !Array.isArray(vulnerabilities)) { listContainer.innerHTML = '
暂无漏洞记录
'; return; } if (vulnerabilities.length === 0) { listContainer.innerHTML = '
暂无漏洞记录
'; return; } const html = vulnerabilities.map(vuln => { const severityClass = `severity-${vuln.severity}`; const severityText = { 'critical': '严重', 'high': '高危', 'medium': '中危', 'low': '低危', 'info': '信息' }[vuln.severity] || vuln.severity; const statusText = { 'open': '待处理', 'confirmed': '已确认', 'fixed': '已修复', 'false_positive': '误报' }[vuln.status] || vuln.status; const createdDate = new Date(vuln.created_at).toLocaleString('zh-CN'); return `

${escapeHtml(vuln.title)}

${severityText} ${statusText} ${createdDate}
`; }).join(''); listContainer.innerHTML = html; } // 显示添加漏洞模态框 function showAddVulnerabilityModal() { currentVulnerabilityId = null; document.getElementById('vulnerability-modal-title').textContent = '添加漏洞'; // 清空表单 document.getElementById('vulnerability-conversation-id').value = ''; document.getElementById('vulnerability-title').value = ''; document.getElementById('vulnerability-description').value = ''; document.getElementById('vulnerability-severity').value = ''; document.getElementById('vulnerability-status').value = 'open'; document.getElementById('vulnerability-type').value = ''; document.getElementById('vulnerability-target').value = ''; document.getElementById('vulnerability-proof').value = ''; document.getElementById('vulnerability-impact').value = ''; document.getElementById('vulnerability-recommendation').value = ''; document.getElementById('vulnerability-modal').style.display = 'block'; } // 编辑漏洞 async function editVulnerability(id) { try { const response = await apiFetch(`/api/vulnerabilities/${id}`); if (!response.ok) throw new Error('获取漏洞失败'); const vuln = await response.json(); currentVulnerabilityId = id; document.getElementById('vulnerability-modal-title').textContent = '编辑漏洞'; // 填充表单 document.getElementById('vulnerability-conversation-id').value = vuln.conversation_id || ''; document.getElementById('vulnerability-title').value = vuln.title || ''; document.getElementById('vulnerability-description').value = vuln.description || ''; document.getElementById('vulnerability-severity').value = vuln.severity || ''; document.getElementById('vulnerability-status').value = vuln.status || 'open'; document.getElementById('vulnerability-type').value = vuln.type || ''; document.getElementById('vulnerability-target').value = vuln.target || ''; document.getElementById('vulnerability-proof').value = vuln.proof || ''; document.getElementById('vulnerability-impact').value = vuln.impact || ''; document.getElementById('vulnerability-recommendation').value = vuln.recommendation || ''; document.getElementById('vulnerability-modal').style.display = 'block'; } catch (error) { console.error('加载漏洞失败:', error); alert('加载漏洞失败: ' + error.message); } } // 保存漏洞 async function saveVulnerability() { const conversationId = document.getElementById('vulnerability-conversation-id').value.trim(); const title = document.getElementById('vulnerability-title').value.trim(); const severity = document.getElementById('vulnerability-severity').value; if (!conversationId || !title || !severity) { alert('请填写必填字段:会话ID、标题和严重程度'); return; } const data = { conversation_id: conversationId, title: title, description: document.getElementById('vulnerability-description').value.trim(), severity: severity, status: document.getElementById('vulnerability-status').value, type: document.getElementById('vulnerability-type').value.trim(), target: document.getElementById('vulnerability-target').value.trim(), proof: document.getElementById('vulnerability-proof').value.trim(), impact: document.getElementById('vulnerability-impact').value.trim(), recommendation: document.getElementById('vulnerability-recommendation').value.trim() }; try { const url = currentVulnerabilityId ? `/api/vulnerabilities/${currentVulnerabilityId}` : '/api/vulnerabilities'; const method = currentVulnerabilityId ? 'PUT' : 'POST'; const response = await apiFetch(url, { method: method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); if (!response.ok) { const error = await response.json(); throw new Error(error.error || '保存失败'); } closeVulnerabilityModal(); loadVulnerabilityStats(); loadVulnerabilities(); } catch (error) { console.error('保存漏洞失败:', error); alert('保存漏洞失败: ' + error.message); } } // 删除漏洞 async function deleteVulnerability(id) { if (!confirm('确定要删除此漏洞吗?')) { return; } try { const response = await apiFetch(`/api/vulnerabilities/${id}`, { method: 'DELETE' }); if (!response.ok) throw new Error('删除失败'); loadVulnerabilityStats(); loadVulnerabilities(); } catch (error) { console.error('删除漏洞失败:', error); alert('删除漏洞失败: ' + error.message); } } // 关闭漏洞模态框 function closeVulnerabilityModal() { document.getElementById('vulnerability-modal').style.display = 'none'; currentVulnerabilityId = null; } // 筛选漏洞 function filterVulnerabilities() { vulnerabilityFilters.id = document.getElementById('vulnerability-id-filter').value.trim(); vulnerabilityFilters.conversation_id = document.getElementById('vulnerability-conversation-filter').value.trim(); vulnerabilityFilters.severity = document.getElementById('vulnerability-severity-filter').value; vulnerabilityFilters.status = document.getElementById('vulnerability-status-filter').value; loadVulnerabilityStats(); loadVulnerabilities(); } // 清除筛选 function clearVulnerabilityFilters() { document.getElementById('vulnerability-id-filter').value = ''; document.getElementById('vulnerability-conversation-filter').value = ''; document.getElementById('vulnerability-severity-filter').value = ''; document.getElementById('vulnerability-status-filter').value = ''; vulnerabilityFilters = { id: '', conversation_id: '', severity: '', status: '' }; loadVulnerabilityStats(); loadVulnerabilities(); } // 刷新漏洞 function refreshVulnerabilities() { loadVulnerabilityStats(); loadVulnerabilities(); } // 切换漏洞详情展开/折叠 function toggleVulnerabilityDetails(id) { const content = document.getElementById(`content-${id}`); const icon = document.getElementById(`expand-icon-${id}`); if (!content || !icon) return; if (content.style.display === 'none') { content.style.display = 'block'; icon.style.transform = 'rotate(90deg)'; } else { content.style.display = 'none'; icon.style.transform = 'rotate(0deg)'; } } // HTML转义 function escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; return div.innerHTML; } // 点击模态框外部关闭 window.onclick = function(event) { const modal = document.getElementById('vulnerability-modal'); if (event.target === modal) { closeVulnerabilityModal(); } }