|
|
|
|
|
|
|
|
function loadSavedFiles() { |
|
|
const files = JSON.parse(localStorage.getItem('uploadedFiles') || '[]'); |
|
|
const fileContainer = document.getElementById('file-container'); |
|
|
|
|
|
|
|
|
const existingCards = document.querySelectorAll('custom-file-card'); |
|
|
existingCards.forEach(card => card.remove()); |
|
|
|
|
|
|
|
|
files.forEach(file => { |
|
|
const card = document.createElement('custom-file-card'); |
|
|
card.setAttribute('name', file.name); |
|
|
card.setAttribute('status', file.status); |
|
|
fileContainer.insertBefore(card, addFileCard); |
|
|
}); |
|
|
} |
|
|
|
|
|
document.addEventListener('DOMContentLoaded', function() { |
|
|
|
|
|
loadSavedFiles(); |
|
|
|
|
|
const addFileCard = document.getElementById('add-file-card'); |
|
|
const uploadModal = document.getElementById('upload-modal'); |
|
|
const closeModal = document.getElementById('close-modal'); |
|
|
const uploadForm = document.getElementById('upload-form'); |
|
|
|
|
|
document.getElementById('add-file-card').addEventListener('click', () => { |
|
|
document.getElementById('upload-modal').classList.remove('hidden'); |
|
|
}); |
|
|
|
|
|
document.getElementById('close-modal').addEventListener('click', () => { |
|
|
document.getElementById('upload-modal').classList.add('hidden'); |
|
|
}); |
|
|
|
|
|
uploadForm.addEventListener('submit', async (e) => { |
|
|
e.preventDefault(); |
|
|
e.stopPropagation(); |
|
|
|
|
|
const fileName = document.getElementById('file-name').value.trim(); |
|
|
const fileInput = document.getElementById('file-upload'); |
|
|
const file = fileInput.files[0]; |
|
|
if (!file || !fileName) { |
|
|
alert('Please provide both a project name and select a file'); |
|
|
return false; |
|
|
} |
|
|
|
|
|
createFileCard(fileName, 'pending'); |
|
|
|
|
|
|
|
|
uploadModal.classList.add('hidden'); |
|
|
|
|
|
try { |
|
|
|
|
|
updateFileCardStatus(fileName, 'pending'); |
|
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 2000)); |
|
|
|
|
|
|
|
|
const mockResponses = [ |
|
|
{ |
|
|
"node": "convert_to_fcg", |
|
|
"output": { |
|
|
"fcg_file_path": "/tmp/tmp2l9mdy32/uploaded_file.fcg" |
|
|
} |
|
|
}, |
|
|
{ |
|
|
"node": "detect_vulnerability_src", |
|
|
"output": { |
|
|
"predicted_class": Math.random() > 0.5 ? "Vulnerable" : "NonVulnerable", |
|
|
"confidence_score": (Math.random() * 0.5 + 0.5).toFixed(7) |
|
|
} |
|
|
}, |
|
|
{ |
|
|
"node": "detect_vulnerability_func", |
|
|
"output": { |
|
|
"vulnerable_functions": [ |
|
|
{ |
|
|
"function_name": "Example.doSomething()", |
|
|
"function_code": "function doSomething() public {\n // Vulnerable code\n}", |
|
|
"prediction": 1, |
|
|
"confidence": "99.99%" |
|
|
} |
|
|
] |
|
|
} |
|
|
}, |
|
|
{ |
|
|
"node": "explain_vulnerability_func", |
|
|
"output": { |
|
|
"explanations": [ |
|
|
{ |
|
|
"function_name": "Example.doSomething()", |
|
|
"explanation": "Vulnerability analysis of the function...\n\n### Security Issues Found:\n1. Direct use of block.timestamp for critical logic\n2. Potential front-running possible\n3. Missing access controls" |
|
|
} |
|
|
] |
|
|
} |
|
|
} |
|
|
]; |
|
|
|
|
|
for (const mockResponse of mockResponses) { |
|
|
switch(mockResponse.node) { |
|
|
case 'detect_vulnerability_src': |
|
|
const isVulnerable = mockResponse.output.predicted_class === "Vulnerable"; |
|
|
updateFileCardStatus(fileName, isVulnerable ? 'vulnerable' : 'safe'); |
|
|
|
|
|
localStorage.setItem(`analysis_${fileName}`, JSON.stringify({ |
|
|
isVulnerable, |
|
|
confidence: mockResponse.output.confidence_score, |
|
|
rawResponse: mockResponses |
|
|
})); |
|
|
|
|
|
if (isVulnerable) { |
|
|
setTimeout(() => { |
|
|
window.location.href = `analysis.html?file=${encodeURIComponent(fileName)}`; |
|
|
}, 1500); |
|
|
} |
|
|
break; |
|
|
|
|
|
default: |
|
|
|
|
|
localStorage.setItem(`${mockResponse.node}_${fileName}`, JSON.stringify(mockResponse)); |
|
|
} |
|
|
} |
|
|
} catch (error) { |
|
|
console.error('Error:', error); |
|
|
updateFileCardStatus(fileName, 'error'); |
|
|
|
|
|
|
|
|
alert('Analysis failed. Please try again.'); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
setTimeout(() => { |
|
|
uploadForm.reset(); |
|
|
}, 500); |
|
|
return false; |
|
|
}); |
|
|
|
|
|
function createFileCard(name, status) { |
|
|
const fileContainer = document.getElementById('file-container'); |
|
|
const card = document.createElement('custom-file-card'); |
|
|
card.setAttribute('name', name); |
|
|
card.setAttribute('status', status); |
|
|
fileContainer.insertBefore(card, addFileCard); |
|
|
|
|
|
|
|
|
const files = JSON.parse(localStorage.getItem('uploadedFiles') || '[]'); |
|
|
files.push({ name, status }); |
|
|
localStorage.setItem('uploadedFiles', JSON.stringify(files)); |
|
|
} |
|
|
|
|
|
function updateFileCardStatus(name, status) { |
|
|
const cards = document.querySelectorAll('custom-file-card'); |
|
|
for (const card of cards) { |
|
|
if (card.getAttribute('name') === name) { |
|
|
card.setAttribute('status', status); |
|
|
|
|
|
|
|
|
const files = JSON.parse(localStorage.getItem('uploadedFiles') || '[]'); |
|
|
const fileIndex = files.findIndex(f => f.name === name); |
|
|
if (fileIndex !== -1) { |
|
|
files[fileIndex].status = status; |
|
|
localStorage.setItem('uploadedFiles', JSON.stringify(files)); |
|
|
} |
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
function processAnalysisData(fileName, responses) { |
|
|
|
|
|
for (const response of responses) { |
|
|
if (response.node === 'detect_vulnerability_src') { |
|
|
updateFileCardStatus( |
|
|
fileName, |
|
|
response.output.predicted_class === "Vulnerable" ? 'vulnerable' : 'safe' |
|
|
); |
|
|
localStorage.setItem(`analysis_${fileName}`, JSON.stringify(response)); |
|
|
} |
|
|
localStorage.setItem(`${response.node}_${fileName}`, JSON.stringify(response)); |
|
|
} |
|
|
} |
|
|
}); |