diff --git a/docs/generate_cve_list.py b/docs/generate_cve_list.py new file mode 100644 index 000000000..f06683099 --- /dev/null +++ b/docs/generate_cve_list.py @@ -0,0 +1,60 @@ +#!/usr/bin/python3 +import os +import json +import re + +# Path to enumerate CVEs from +dir = "../" +CVE_list = [] + +# Fetch all the years +years = os.listdir(dir) +# Remove non-numeric years +years = [year for year in years if year.isdigit()] +# Sort descending (we want the latest at the top) +years.sort(reverse=True) + +# Clean up the text blocks +def clean_text(description_text): + description = re.sub(r'\n+', '\n', description_text) + # Remove the '-' at the beginning of each line + description_lines = description.split('\n') + description_lines = [line.lstrip('- ') for line in description_lines] + # Add
for each line + description = '\n'.join(description_lines) + return description + +# Generate JSON for each CVE +for year in years: + yearDir = os.path.join(dir, year) + for CVE_filename in os.listdir(yearDir): + # Open CVE file + with open(os.path.join(yearDir, CVE_filename), 'r') as CVE_file: + # Read CVE file + CVE_file_content = CVE_file.read() + + # Extract CVE description, references, and GitHub links + CVE_description = CVE_file_content.split('### Description')[1].split('###')[0].strip() + CVE_references = CVE_file_content.split('### Reference')[1].split('###')[0].strip() + CVE_github = CVE_file_content.split('### Github')[1].split('###')[0].strip() + + CVE_Name = CVE_filename.split('.')[0] + + CVE_description = clean_text(CVE_description) + CVE_github = clean_text(CVE_github) + CVE_references = clean_text(CVE_references) + + CVE_poc = [ref for ref in CVE_references.split('\n') if "No PoCs" not in ref] + CVE_poc += [poc for poc in CVE_github.split('\n') if "No PoCs" not in poc] + + thisCVE = {"cve": CVE_Name, "desc": CVE_description, "poc": CVE_poc} + CVE_list.append(thisCVE) + +# Convert CVE list to JSON without indentation +CVE_output = json.dumps(CVE_list) + +# Save CVE list to JSON file +with open('CVE_list.json', 'w') as outfile: + outfile.write(CVE_output) + +print("CVE list saved to CVE_list.json") diff --git a/docs/generate_summary_json.py b/docs/generate_summary_json.py deleted file mode 100644 index 87a90ac92..000000000 --- a/docs/generate_summary_json.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/python3 -import os -import datetime -import sys -import json -import re - -#Path to enumerate CVEs from -dir = "../" -CVE_list = [] - -#fetch all the years -years = os.listdir(dir) -#remove non numeric years -years = [year for year in years if year.isdigit()] -#sort descending (we want the latest at the top) -years.sort(reverse=True) - -#clean up the text blocks -def clean_text(description_text): - description = re.sub(r'\n+', '\n', description_text) - #remove the '-' at the beginning of each line - description_lines = description.split('\n') - description_lines = [line.lstrip('- ') for line in description_lines] - - #change urls with links with regular expression - #description_lines = [re.sub(r'(https?:\/\/[^\s]+)', r'\1', line) for line in description_lines] - - #add
for each line - description = '\n'.join(description_lines) - return description - -#generate JSON for each CVE -for year in years: - - yearDir = os.path.join(dir, year) - for CVE_filename in os.listdir(yearDir): - - #open CVE file - CVE_file = open(os.path.join(yearDir, CVE_filename), 'r') - #read CVE file - CVE_file_content = CVE_file.read() - - #extract CVE description, references and github - CVE_description = CVE_file_content.split('### Description')[1].split('###')[0].strip() - CVE_references = CVE_file_content.split('### Reference')[1].split('###')[0].strip() - CVE_github = CVE_file_content.split('### Github')[1].split('###')[0].strip() - - #TODO: extract imageshield label attributes - - CVE_Name = CVE_filename.split('.')[0] - - CVE_description = clean_text(CVE_description) - CVE_github = clean_text(CVE_github) - CVE_references = clean_text(CVE_references) - CVE_poc = [] - if "No PoCs" not in CVE_references: - if '\n' in CVE_references: - for ref in CVE_references.split('\n'): - CVE_poc.append(ref) - else: - CVE_poc.append(CVE_references) - if "No PoCs" not in CVE_github: - if '\n' in CVE_github: - for poc in CVE_github.split('\n'): - CVE_poc.append(poc) - else: - CVE_poc.append(CVE_github) - - thisCVE = {"cve": CVE_Name, "desc": CVE_description, "poc": CVE_poc} - CVE_list.append(thisCVE) - -CVE_output = f"{json.dumps(CVE_list)}" - -#save CVE list to JSON file -with open('CVE_list.json', 'w') as outfile: - outfile.write(CVE_output) diff --git a/docs/logic.js b/docs/logic.js index 6adba3e92..0a6d45448 100644 --- a/docs/logic.js +++ b/docs/logic.js @@ -10,66 +10,53 @@ const noResults = document.querySelector('div.noResults'); const colorUpdate = document.body; function escapeHTML(str) { - return str.replace(/[&<>"']/g, function (match) { - const escapeChars = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }; - return escapeChars[match]; - }); + return str.replace(/[&<>"']/g, match => ({ + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }[match])); } function convertLinksToList(links) { if (links.length === 0) { - return content; + return ''; } - let htmlOutput = `
` - return htmlOutput; + return `
`; } function getCveLink(cveId) { - return `${cveId}` + return `${cveId}`; } -var controls = { +const controls = { oldColor: '', - displayResults: function() { + displayResults() { results.style.display = ''; resultsTableHideable.classList.remove('hide'); }, - hideResults: function() { + hideResults() { results.style.display = 'none'; resultsTableHideable.classList.add('hide'); }, - doSearch: function(match, dataset) { - let results = []; - let words = match.toLowerCase().split(' '); - let posmatch = words.filter(word => word[0] !== '-'); - let negmatch = words.filter(word => word[0] === '-').map(word => word.substring(1)); + doSearch(match, dataset) { + const words = match.toLowerCase().split(' '); + const posmatch = words.filter(word => word[0] !== '-'); + const negmatch = words.filter(word => word[0] === '-').map(word => word.substring(1)); - dataset.forEach(e => { - let description = replaceStrings.reduce((desc, str) => desc.replace(str, ''), e.desc).toLowerCase(); - let combinedText = (e.cve + description).toLowerCase(); + return dataset.filter(e => { + const description = replaceStrings.reduce((desc, str) => desc.replace(str, ''), e.desc).toLowerCase(); + const combinedText = (e.cve + description).toLowerCase(); - let positiveMatch = posmatch.every(word => combinedText.includes(word)); - let negativeMatch = negmatch.some(word => combinedText.includes(word)); + const positiveMatch = posmatch.every(word => combinedText.includes(word)); + const negativeMatch = negmatch.some(word => combinedText.includes(word)); - if (positiveMatch && !negativeMatch) { - results.push(e); - } + return positiveMatch && !negativeMatch; }); - - return results; }, - updateResults: function(loc, results) { - if (results.length == 0) { + updateResults(loc, results) { + if (results.length === 0) { noResults.style.display = ''; noResults.textContent = 'No Results Found'; resultsTableHideable.classList.add('hide'); @@ -84,21 +71,21 @@ var controls = { noResults.style.display = 'none'; resultsTableHideable.classList.remove('hide'); - let fragment = document.createDocumentFragment(); + const fragment = document.createDocumentFragment(); results.forEach(r => { - let el = searchResultFormat + const el = searchResultFormat .replace('$cve', getCveLink(r.cve)) - .replace('$description', escapeHTML(r.desc) ) + .replace('$description', escapeHTML(r.desc)) .replace('$poc', convertLinksToList(r.poc)); - let wrapper = document.createElement('table'); + const wrapper = document.createElement('table'); wrapper.innerHTML = el; fragment.appendChild(wrapper.querySelector('tr')); }); loc.appendChild(fragment); } }, - setColor: function(loc, indicator) { - if (this.oldColor == indicator) return; + setColor(loc, indicator) { + if (this.oldColor === indicator) return; loc.className = loc.className.replace(/\bcolor-\S+/g, ''); loc.classList.add('color-' + indicator); this.oldColor = indicator; @@ -107,23 +94,21 @@ var controls = { window.controls = controls; -document.addEventListener('DOMContentLoaded', function() { - +document.addEventListener('DOMContentLoaded', () => { document.body.classList.add('fade'); - var currentSet = []; - var debounceTimer; + let currentSet = []; + let debounceTimer; function doSearch(event) { - var val = searchValue.value.trim(); + const val = searchValue.value.trim(); if (val !== '') { controls.displayResults(); - currentSet = window.dataset; - currentSet = window.controls.doSearch(val, currentSet); + currentSet = window.controls.doSearch(val, window.dataset); if (currentSet.length < totalLimit) { - window.controls.setColor(colorUpdate, currentSet.length == 0 ? 'no-results' : 'results-found'); + window.controls.setColor(colorUpdate, currentSet.length === 0 ? 'no-results' : 'results-found'); } window.controls.updateResults(resultsTable, currentSet); @@ -133,7 +118,7 @@ document.addEventListener('DOMContentLoaded', function() { noResults.style.display = 'none'; } - if (event.type == 'submit') { + if (event.type === 'submit') { event.preventDefault(); } } @@ -149,7 +134,7 @@ document.addEventListener('DOMContentLoaded', function() { form.addEventListener('submit', doSearch); - searchValue.addEventListener('input', function(event) { + searchValue.addEventListener('input', event => { clearTimeout(debounceTimer); debounceTimer = setTimeout(() => doSearch(event), 300); });