File size: 8,042 Bytes
2dff984
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c4cfcc1
 
2dff984
 
c4cfcc1
 
2dff984
c4cfcc1
2dff984
 
3a90386
2dff984
3a90386
 
2dff984
3a90386
 
 
 
 
2dff984
 
 
 
 
 
 
 
 
 
 
3e0d8bd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2dff984
3e0d8bd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2dff984
 
 
 
 
 
 
 
3a90386
 
 
 
 
2dff984
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3e0d8bd
 
 
 
 
 
 
 
 
2dff984
3e0d8bd
2dff984
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185

// Load previously uploaded files when page loads
function loadSavedFiles() {
    const files = JSON.parse(localStorage.getItem('uploadedFiles') || '[]');
    const fileContainer = document.getElementById('file-container');
    
    // Clear existing cards except the add button
    const existingCards = document.querySelectorAll('custom-file-card');
    existingCards.forEach(card => card.remove());
    
    // Recreate cards from localStorage
    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() {
    // Load any previously uploaded files
    loadSavedFiles();
// Initialize modal functionality
    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');
    // Open modal when add file card is clicked
    document.getElementById('add-file-card').addEventListener('click', () => {
        document.getElementById('upload-modal').classList.remove('hidden');
    });
    // Close modal
    document.getElementById('close-modal').addEventListener('click', () => {
        document.getElementById('upload-modal').classList.add('hidden');
    });
// Handle file upload
    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;
        }
// Create a new file card immediately
        createFileCard(fileName, 'pending');
        
        // Close modal
        uploadModal.classList.add('hidden');
        // Simulate API call with mock response
        try {
            // Show loading state
            updateFileCardStatus(fileName, 'pending');
            // Simulate API delay
            await new Promise(resolve => setTimeout(resolve, 2000));
            
            // Generate mock response matching the API format
            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"
                            }
                        ]
                    }
                }
            ];
            // Process each mock response in sequence
            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 // Store full response
                        }));
                        
                        if (isVulnerable) {
                            setTimeout(() => {
                                window.location.href = `analysis.html?file=${encodeURIComponent(fileName)}`;
                            }, 1500);
                        }
                        break;
                    
                    default:
                        // Store other responses for detail view
                        localStorage.setItem(`${mockResponse.node}_${fileName}`, JSON.stringify(mockResponse));
                }
            }
} catch (error) {
            console.error('Error:', error);
            updateFileCardStatus(fileName, 'error');
            
            // Show error message to user
            alert('Analysis failed. Please try again.');
        }
        
        // Reset form
        // Reset form after slight delay to allow user to see submission feedback
        setTimeout(() => {
            uploadForm.reset();
        }, 500);
        return false;
});
    // Function to create a new file card
    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);
        
        // Store the file info in localStorage
        const files = JSON.parse(localStorage.getItem('uploadedFiles') || '[]');
        files.push({ name, status });
        localStorage.setItem('uploadedFiles', JSON.stringify(files));
    }
    // Function to update file card status
    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);
                
                // Update the file status in localStorage
                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;
            }
        }
    }
// Process analysis data from API
    function processAnalysisData(fileName, responses) {
        // This function now handles the full response array
        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));
        }
    }
});