From 6195e0f1be333fbf8e3c3b85ba1038b5adf9960d Mon Sep 17 00:00:00 2001 From: ANIL SINGLA Date: Tue, 9 Jan 2024 17:30:26 +0530 Subject: [PATCH 1/3] Updated POI functons and Data #498 (#514) * Updated UI and Cleanup * Fixed UI issues and handled no data cases * updated POI page * updates to POI * added POI details * added months as unit and removed duplcate from Bestracking packages * added sonarqube data * updated POI for sonarqube and SAST --------- Co-authored-by: anilsingla111 --- package-lock.json | 84 ++- package.json | 1 + src/pages/BesAssessmentReport/index.tsx | 4 +- .../AssessmentAnalytics/index.tsx | 135 +++-- .../AssessmentReport/index.tsx | 534 +++++++++++++----- src/pages/BesVersionHistory/index.tsx | 27 +- src/pages/FuzzingModel/DefenceData.tsx | 6 +- src/pages/FuzzingModel/index.tsx | 10 +- .../FuzzingModel/sections/DefenseSummary.tsx | 10 +- .../FuzzingModel/sections/RightFuzzing.tsx | 10 +- .../ModelOfInterest/ModelDisplay/index.tsx | 4 +- .../ModelVulnerabilitiesDetailedTable.tsx | 4 +- .../ShowVulnerabilityContent.tsx | 4 +- .../VulnerablitiDisplay/index.tsx | 4 +- 14 files changed, 620 insertions(+), 217 deletions(-) diff --git a/package-lock.json b/package-lock.json index b46e1e02..a015ce69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "react-popper": "^1.0.0-beta.6", "react-router-dom": "6.10.0", "react-scripts": "^3.0.1", + "simplebar-react": "^3.2.4", "typescript": "^4.9.5", "web-vitals": "3.3.1" }, @@ -4055,8 +4056,15 @@ "node_modules/@types/lodash": { "version": "4.14.195", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", - "dev": true + "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dependencies": { + "@types/lodash": "*" + } }, "node_modules/@types/node": { "version": "16.18.38", @@ -6163,6 +6171,11 @@ "node": ">=6" } }, + "node_modules/can-use-dom": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz", + "integrity": "sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ==" + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -14109,6 +14122,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "node_modules/lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", @@ -18523,6 +18541,28 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, + "node_modules/simplebar-core": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/simplebar-core/-/simplebar-core-1.2.4.tgz", + "integrity": "sha512-P+Sqshef4fq3++gQ82TgNYcgl3qZFSCP5jS2/8NMmw18oagXOijMzs1G+vm6RUY3oMvpwH3wGoqh9u6SyDjHfQ==", + "dependencies": { + "@types/lodash-es": "^4.17.6", + "can-use-dom": "^0.1.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21" + } + }, + "node_modules/simplebar-react": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-3.2.4.tgz", + "integrity": "sha512-ogLN79e7JUm82wJChD7NSUB+4EHCFvDkjXpiu8hT1Alk7DnCekUWds61NXcsP9jC97KOgF5To/AVjYFbX0olgg==", + "dependencies": { + "simplebar-core": "^1.2.4" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -24561,8 +24601,15 @@ "@types/lodash": { "version": "4.14.195", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", - "dev": true + "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==" + }, + "@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "requires": { + "@types/lodash": "*" + } }, "@types/node": { "version": "16.18.38", @@ -26281,6 +26328,11 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, + "can-use-dom": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz", + "integrity": "sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ==" + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -32458,6 +32510,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", @@ -35964,6 +36021,25 @@ } } }, + "simplebar-core": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/simplebar-core/-/simplebar-core-1.2.4.tgz", + "integrity": "sha512-P+Sqshef4fq3++gQ82TgNYcgl3qZFSCP5jS2/8NMmw18oagXOijMzs1G+vm6RUY3oMvpwH3wGoqh9u6SyDjHfQ==", + "requires": { + "@types/lodash-es": "^4.17.6", + "can-use-dom": "^0.1.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21" + } + }, + "simplebar-react": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-3.2.4.tgz", + "integrity": "sha512-ogLN79e7JUm82wJChD7NSUB+4EHCFvDkjXpiu8hT1Alk7DnCekUWds61NXcsP9jC97KOgF5To/AVjYFbX0olgg==", + "requires": { + "simplebar-core": "^1.2.4" + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", diff --git a/package.json b/package.json index bd91b239..86641ded 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "react-popper": "^1.0.0-beta.6", "react-router-dom": "6.10.0", "react-scripts": "^3.0.1", + "simplebar-react": "^3.2.4", "typescript": "^4.9.5", "web-vitals": "3.3.1" }, diff --git a/src/pages/BesAssessmentReport/index.tsx b/src/pages/BesAssessmentReport/index.tsx index ecf73f6f..6f1c496b 100644 --- a/src/pages/BesAssessmentReport/index.tsx +++ b/src/pages/BesAssessmentReport/index.tsx @@ -5,7 +5,7 @@ import { assessment_path, assessment_report, } from "../../utils/assessmentReport"; -import { verifyLink } from "../BesVersionHistory/AssessmentReport"; +import { fetchJsonData } from "../BesVersionHistory/AssessmentReport"; import MKBox from "../../components/MKBox"; import DefaultNavbar from "../../examples/Navbars/DefaultNavbar"; import routes from "../../routes"; @@ -50,7 +50,7 @@ function BesAssessmentReport() { const [report, setreport]: any = useState({}); useEffect(() => { const link: string = `${assessment_datastore}/${besName}/${besVersion}/${assessment_path[besReport]}/${besName}-${besVersion}-${assessment_report[besReport]}-report.json`; - verifyLink(link, setreport); + fetchJsonData(link, setreport); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/src/pages/BesVersionHistory/AssessmentAnalytics/index.tsx b/src/pages/BesVersionHistory/AssessmentAnalytics/index.tsx index 580f1e62..5b4f8f2e 100644 --- a/src/pages/BesVersionHistory/AssessmentAnalytics/index.tsx +++ b/src/pages/BesVersionHistory/AssessmentAnalytics/index.tsx @@ -62,47 +62,85 @@ export const countSeverity = async (vulnerabilityData: any, setSeverity: any) => } } -const FetchCritical = ({ riskData }: any) => { - let tmp:any = []; - let flag=0; - let res:any = {}; - for(var i=0; i<= riskData.length; i++){ - tmp.push(riskData[i]); - } - if(tmp.length !== 0){ - res = tmp.map(function(vul:any, index:number){ - if(vul !== undefined && (vul.rule.security_severity_level === "critical")) - { - flag=1; - let name: string = vul.rule.name; - let url: string = vul.html_url; - let des: string = vul.description; - return ( - <> - - {name} : {name} - - - ) +const FetchCritical = ({ cqRiskData, sqRiskData }: any) => { + + let sqres: any = {}; + let cqres: any = {}; + let foundCrtical : boolean = false; + + //if(JSON.stringify(Object.values(sqRiskData).length) !== "0"){ + sqres = Object.values(sqRiskData).map(function(sqrisk: any, index:number){ + if(index === 5){ + let tmpres : any = {} + tmpres = sqrisk.map(function(issue:any, innerindex:number){ + if(issue.severity === "BLOCKER" || issue.severity === "CRITICAL"){ + foundCrtical = true; + let keyval1: string = "sqriskdata" + {innerindex}; + let keyval2: string = "innersqriskdata" + {innerindex}; + let keyval3: string = "sq" + {innerindex}; + return(<> + + {issue.rule} : + + {issue.message} + + + ) }else{ return(<>) } - }); - if(flag !== 0){ - return(<>{res}); + }); + return(<>{tmpres}) + }else{ + return(<>) + } + }) + //} + + //if(JSON.stringify(Object.values(cqRiskData).length) !== "0"){ + cqres = Object.values(cqRiskData).map(function(vul:any, index:number){ + if(vul !== undefined && (vul.rule.security_severity_level === "critical")) + { + foundCrtical = true; + return ( + <> + + {vul.rule.name} : {vul.rule.name} + + + ) + }else{ + return(<>) + } + }) + //} + + if(foundCrtical){ + if(cqres.length !== 0 && sqres.length !== 0){ + return(<>{cqres}{sqres}) + }else if(cqres.length !== 0 && sqres.length === 0){ + return(<>{cqres}) + }else if(cqres.length === 0 && sqres.length !== 0){ + return(<>{sqres}) }else{ return(<> - - No Critical Issues Found - - ); - } + + No Data Available + + ) + } }else{ return(<> - - No Data Available - - ); + + No critical issues found + + ) } } @@ -125,19 +163,27 @@ const FetchVulHistory = (versionDetails: any, setVulHistory: any) => } const FetchData = ({version, name, report, versionDetails, masterData}: any) => { - const [riskData, setRiskData]: any = React.useState({}); + const [cqRiskData, setCqRiskData]: any = React.useState({}); + const [sqRiskData, setSqRiskData]: any = React.useState({}); const [severityData, setSeverity] = React.useState([]); const [vulHistoryData, setVulHistory] = React.useState([]); React.useEffect(() => { let link: string = ""; if (version.trim()) { link = `${assessment_datastore}/${name}/${version}/${assessment_path["Codeql"]}/${name}-${version}-${assessment_report["Codeql"]}-report.json`; - getLinkData(link, setRiskData); + getLinkData(link, setCqRiskData); + } + }, [version]); + React.useEffect(() => { + let link: string = ""; + if (version.trim()) { + link = `${assessment_datastore}/${name}/${version}/${assessment_path["Sonarqube"]}/${name}-${version}-${assessment_report["Sonarqube"]}-report.json`; + getLinkData(link, setSqRiskData); } }, [version]); React.useEffect(() => { - countSeverity(riskData, setSeverity); - }, [riskData]); + countSeverity(cqRiskData, setSeverity); + }, [cqRiskData]); React.useEffect(() => { FetchVulHistory(versionDetails, setVulHistory); @@ -171,7 +217,10 @@ const FetchData = ({version, name, report, versionDetails, masterData}: any) => - + No Data Available @@ -191,7 +240,8 @@ const FetchData = ({version, name, report, versionDetails, masterData}: any) => @@ -257,8 +307,11 @@ function AssessmentAnalytics({ title, name, version, versionDetails, masterData, return ( <> + - + + diff --git a/src/pages/BesVersionHistory/AssessmentReport/index.tsx b/src/pages/BesVersionHistory/AssessmentReport/index.tsx index 7388ad6e..8f5a97a0 100644 --- a/src/pages/BesVersionHistory/AssessmentReport/index.tsx +++ b/src/pages/BesVersionHistory/AssessmentReport/index.tsx @@ -1,6 +1,6 @@ import * as React from "react"; -import Card from "@mui/material/Card"; + import Icon from "@mui/material/Icon"; import { Divider, Grid, Typography } from "@mui/material"; import { fetchJsonReport } from "../../../utils/fatch_json_report"; @@ -8,42 +8,63 @@ import { Link } from "react-router-dom"; import { assessment_datastore } from "../../../dataStore"; import MKBox from "../../../components/MKBox"; import MKTypography from "../../../components/MKTypography"; - import { assessment_path, assessment_report } from "../../../utils/assessmentReport"; -import { forEach } from "lodash"; -export const verifyLink = async (link: any, setLinkStatus: any) => { +export const fetchJsonData = async (link: any, setJsonData: any) => { try { const response = await fetchJsonReport(link); try { let data = JSON.parse(response); if (link.toLocaleLowerCase().endsWith(".pdf")) { - setLinkStatus(true); + setJsonData(true); } else { - setLinkStatus(data); + setJsonData(data); } return true; } catch (err) { if (link.toLocaleLowerCase().endsWith(".pdf")) { - setLinkStatus(false); + setJsonData(false); } else { - setLinkStatus({}); + setJsonData({}); } return false; } } catch (error) { if (link.toLocaleLowerCase().endsWith(".pdf")) { - setLinkStatus(false); + setJsonData(false); } else { - setLinkStatus({}); + setJsonData({}); } return false; } }; +export const fetchvulJsonData = async (link: any, vulTool: any, setCQData: any, setSQData: any) => { + try { + const response = await fetchJsonReport(link); + try { + let data = JSON.parse(response); + if(vulTool === "codeql"){ + setCQData(data); + } + else if(vulTool === "sonarqube"){ + setSQData(data); + } + else + return false + } catch (err) { + + return false; + } + } catch (error) { + + return false; + } +}; + const FetchLowScores = ({ data }: any) => { let lowscorers: any = []; let displayData: any = {}; @@ -60,125 +81,114 @@ const FetchLowScores = ({ data }: any) => { displayData = lowscorers.map(function(iss:any, index:number) { return(<> -
  • - {iss.name} : {iss.reason} + {iss.name} : {iss.reason} -
  • ) }) return(<> -
      {displayData} -
    ) }; const FetchCS = ({ data }: any) => { - return(<> -
      -
    • + - Age : {data.created_since} months - -
    • -
    • - - No. Of Contributors : {data.contributor_count} + Age : {data.created_since} months -
    • -
    • + + - Update Frequency : {data.commit_frequency} + No. Of Contributors : {data.contributor_count} -
    • -
    • + + + - Organisations : {data.org_count} + Organisations : {data.org_count} -
    • -
    • + + - Issue Fixed : {data.closed_issues_count} + Issue Fixed : {data.closed_issues_count} -
    • -
    • + + - Last Updated : {data.updated_since} + Last Updated : {data.updated_since} -
    • -
    +
    ); }; -const FetchSAST = ({ data }: any) => { +const FetchSAST = ({ cqData, sqData }: any) => { let critical: number = 0; let high: number = 0; let medium: number = 0; let low: number = 0; - data.forEach ((vul) => { - if(vul.rule.security_severity_level === "critical"){ - critical++; - }else if(vul.rule.security_severity_level === "high"){ - high++; - }else if(vul.rule.security_severity_level === "medium"){ - medium++; - }else if(vul.rule.security_severity_level === "high"){ - low++; - } - }); + if (JSON.stringify(Object.values(cqData).length) !== "0" && + JSON.stringify(Object.values(sqData).length) === "0"){ + cqData.forEach ((vul) => { + if(vul.rule.security_severity_level === "critical"){ + critical++; + }else if(vul.rule.security_severity_level === "high"){ + high++; + }else if(vul.rule.security_severity_level === "medium"){ + medium++; + }else if(vul.rule.security_severity_level === "high"){ + low++; + } + }); - return(<> - + return(<> + Critical : {critical} @@ -188,7 +198,6 @@ const FetchSAST = ({ data }: any) => { High : {high} @@ -200,7 +209,6 @@ const FetchSAST = ({ data }: any) => { Medium : {medium} @@ -210,7 +218,6 @@ const FetchSAST = ({ data }: any) => { Low : {low} @@ -220,6 +227,189 @@ const FetchSAST = ({ data }: any) => { ); + }else if (JSON.stringify(Object.values(cqData).length) === "0" && + JSON.stringify(Object.values(sqData).length) !== "0"){ + let sqblocker: number = 0; + let sqcritical: number = 0; + let sqmajor: number = 0; + let sqminor: number = 0; + + + sqData[5].forEach ((vul) => { + if(vul.severity === "BLOCKER"){ + sqblocker++; + }else if(vul.severity === "CRITICAL"){ + sqcritical++; + }else if(vul.severity === "MAJOR"){ + sqmajor++; + }else if(vul.severity === "MINOR"){ + sqminor++; + } + }); + + return(<> + + + + + Blocker : {sqblocker} + + + + + Critical : {sqcritical} + + + + + + + Major : {sqmajor} + + + + + Minor : {sqminor} + + + + + + ); + } else if (JSON.stringify(Object.values(cqData).length) !== "0" && + JSON.stringify(Object.values(sqData).length) !== "0"){ + let cqcritical: number = 0; + let cqhigh: number = 0; + let cqmedium: number = 0; + let cqlow: number = 0; + + let sqblocker: number = 0; + let sqcritical: number = 0; + let sqmajor: number = 0; + let sqminor: number = 0; + + cqData.forEach ((vul) => { + if(vul.rule.security_severity_level === "critical"){ + cqcritical++; + }else if(vul.rule.security_severity_level === "high"){ + cqhigh++; + }else if(vul.rule.security_severity_level === "medium"){ + cqmedium++; + }else if(vul.rule.security_severity_level === "low"){ + cqlow++; + } + }); + + sqData[5].forEach ((vul) => { + if(vul.severity === "BLOCKER"){ + sqblocker++; + }else if(vul.severity === "CRITICAL"){ + sqcritical++; + }else if(vul.severity === "MAJOR"){ + sqmajor++; + }else if(vul.severity === "MINOR"){ + sqminor++; + } + }); + + return(<> + + + + + + + + Critical : {cqcritical} + + + + + High : {cqhigh} + + + + + Medium : {cqmedium} + + + + + Low : {cqlow} + + + + + + + + + + + Critical : {sqblocker} + + + + + High : {sqcritical} + + + + + Medium : {sqmajor} + + + + + Low: {sqminor} + + + + + + + + + ); + }else{ + return(<>); + } }; const FetchLicense = ({ data, uniq_lic, itemData }: any) => { @@ -245,30 +435,33 @@ const FetchLicense = ({ data, uniq_lic, itemData }: any) => { - Project License : {itemData.license.key} + Project License : {itemData.license.key} - No. of Non License Files : {non_lic_files} + No. of Non License Files : {non_lic_files} - Unique Licenses : {license_list} + Unique Licenses : {license_list} @@ -300,10 +493,12 @@ const FetchSBOM = ({ data, masterData }: any) => { dis = tracked.map(function( td: string, index: number){ return(<> - {td} @@ -314,13 +509,14 @@ const FetchSBOM = ({ data, masterData }: any) => { return(<> - - Projects Under BeS : + Projects Under BeS : {dis} @@ -330,9 +526,12 @@ const FetchSBOM = ({ data, masterData }: any) => { ); }; -const CheckLink = ({ version, name, report, itemData, masterData }: any) => { - const [linkStatus, setLinkStatus]: any = React.useState({}); +const GetAssessmentData = ({ version, name, report, itemData, masterData }: any) => { + const [jsonData, setJsonData]: any = React.useState({}); + const [codeQlData, setCQData]: any = React.useState({}); + const [sonarqubeData, setSQData]: any = React.useState({}); let reportNameMap = ""; + if (report === "Criticality Score") { reportNameMap = "Criticality Score"; } else if (report === "Vulnerabilities") { @@ -344,17 +543,33 @@ const CheckLink = ({ version, name, report, itemData, masterData }: any) => { } else if (report === "ScoreCard") { reportNameMap = "Scorecard"; } - + + React.useEffect(() => { + if (version.trim()) { + let link: string = ""; + link= `${assessment_datastore}/${name}/${version}/${assessment_path[reportNameMap]}/${name}-${version}-${assessment_report[reportNameMap]}-report.json`; + fetchJsonData(link, setJsonData); + } + }, [version]); + React.useEffect(() => { if (version.trim()) { let link: string = ""; - link= `${assessment_datastore}/${name}/${version}/${assessment_path[reportNameMap]}/${name}-${version}-${assessment_report[reportNameMap]}-report.json`; - verifyLink(link, setLinkStatus); + link= `${assessment_datastore}/${name}/${version}/${assessment_path[reportNameMap]}/${name}-${version}-sonarqube-report.json`; + fetchvulJsonData(link, "sonarqube", setCQData, setSQData); } }, [version]); + + React.useEffect(() => { + if (version.trim()) { + let link: string = ""; + link= `${assessment_datastore}/${name}/${version}/${assessment_path[reportNameMap]}/${name}-${version}-codeql-report.json`; + fetchvulJsonData(link, "codeql", setCQData, setSQData); + } + }, [version]); - let linkStatusLength: number = Object.values(linkStatus).length; - if (report === "Criticality Score" && linkStatusLength !== 0){ + let jsonDataLength: number = Object.values(jsonData).length; + if (report === "Criticality Score" && jsonDataLength !== 0){ return ( <> { style={{fontSize: "calc(0.6rem + 0.5vw)", justifyContent: "center", display: "flex"}}> - {linkStatus.criticality_score} + {jsonData.criticality_score} - + > - + ); } const pathName: string = `/BeSLighthouse/bes_assessment_report/:${name}/:${version}/:${reportNameMap}`; - const myObject = { pathname: pathName, state: linkStatus } as { + const myObject = { pathname: pathName, state: jsonData } as { pathname: string; }; - - if (report === "ScoreCard" && linkStatusLength !== 0) { + if (report === "ScoreCard" && jsonDataLength !== 0) { return (<> { style={{fontSize: "calc(0.6rem + 0.5vw)", display: "flex", justifyContent: "center"}}> - {linkStatus.score} + {jsonData.score} - - + ); } - if (report === "Vulnerabilities" && linkStatusLength !== 0) { + if (report === "Vulnerabilities" && (JSON.stringify(Object.values(codeQlData).length) !== "0" && + JSON.stringify(Object.values(sonarqubeData).length) === "0")) { + return (<> - - {linkStatus.length} - + style={{fontSize: "calc(0.6rem + 0.5vw)", + display: "flex", + justifyContent: "center"}}> + {codeQlData.length} + + + + + + ); + }else if (report === "Vulnerabilities" && (JSON.stringify(Object.values(sonarqubeData).length) !== "0" && + JSON.stringify(Object.values(codeQlData).length) === "0")) { + + return (<> + + {Object.values(sonarqubeData).length} ); + }else if (report === "Vulnerabilities" && (JSON.stringify(Object.values(codeQlData).length) !== "0" && + JSON.stringify(Object.values(sonarqubeData).length) !== "0")){ + const codeqldetails: any = Object.values(codeQlData); + const sonardetails: any = Object.values(sonarqubeData); + const codeqllength: number = Object.values(codeQlData).length; + const sonarlength: number = Object.values(sonarqubeData).length; + return( + <> + + + + {codeqllength} + + + + + {sonardetails[0]} + + + + + + + + + + + + ); } - if (report === "License Compliance" && linkStatusLength !== 0) { + if (report === "License Compliance" && jsonDataLength !== 0) { let uniqueLicenses: any = []; - for (let i = 0; i < linkStatus.length; i++) { + for (let i = 0; i < jsonData.length; i++) { let flag: number = 0; for (let j = 0; j < uniqueLicenses.length; j++) { if ( - linkStatus[i].LicenseConcluded === uniqueLicenses[j] || - linkStatus[i].LicenseConcluded === "NOASSERTION" + jsonData[i].LicenseConcluded === uniqueLicenses[j] || + jsonData[i].LicenseConcluded === "NOASSERTION" ) { flag = 1; break; } } - if (flag === 0 && linkStatus[i].hasOwnProperty('LicenseConcluded') && linkStatus[i].LicenseConcluded.length !== 0) { - uniqueLicenses.push(linkStatus[i].LicenseConcluded); + + if (flag === 0 && jsonData[i].hasOwnProperty('LicenseConcluded') && jsonData[i].LicenseConcluded.length !== 0) { + uniqueLicenses.push(jsonData[i].LicenseConcluded); } } return( @@ -462,23 +736,23 @@ const CheckLink = ({ version, name, report, itemData, masterData }: any) => { {uniqueLicenses.length} - - + ); } - if (report === "Dependencies" && linkStatusLength !== 0) { + if (report === "Dependencies" && jsonDataLength !== 0) { return (<> { style={{ fontSize: "calc(0.6rem + 0.5vw)", display: "flex", justifyContent: "center"}}> - {linkStatus.packages.length} + {jsonData.packages.length} - - + ); } @@ -509,7 +783,8 @@ const CheckLink = ({ version, name, report, itemData, masterData }: any) => { return ( + style={{fontSize: "calc(0.6rem + 0.5vw)", display: "flex", + justifyContent: "center"}}> -- ); @@ -567,13 +842,13 @@ function AssessmentReport({ title, name, version, itemData, masterData, ...other "License Compliance", "Dependencies" ]; - return ( - + + return (<> - {report.map((value, index) => { + {report.map((value) => { return ( <> - + ); }; diff --git a/src/pages/BesVersionHistory/index.tsx b/src/pages/BesVersionHistory/index.tsx index f7d4b83d..14d9705d 100644 --- a/src/pages/BesVersionHistory/index.tsx +++ b/src/pages/BesVersionHistory/index.tsx @@ -139,7 +139,7 @@ function BesVersionHistory() { return ( <> - - - @@ -178,7 +178,7 @@ function BesVersionHistory() { - @@ -199,7 +199,6 @@ function BesVersionHistory() { style={{fontSize: "calc(0.4rem + 0.5vw)", height: '1.2rem', width: "20px"}} - > { versionSummary.map((option: any, index: any) => ( @@ -214,7 +213,7 @@ function BesVersionHistory() { - @@ -237,15 +236,13 @@ function BesVersionHistory() { - - - - - + - + - - - diff --git a/src/pages/FuzzingModel/DefenceData.tsx b/src/pages/FuzzingModel/DefenceData.tsx index c2b5f0f9..78b39efd 100644 --- a/src/pages/FuzzingModel/DefenceData.tsx +++ b/src/pages/FuzzingModel/DefenceData.tsx @@ -4,7 +4,7 @@ import { Card, CircularProgress, Grid } from "@mui/material"; import MKTypography from "../../components/MKTypography"; import DefenceReport from "./DefenceReport"; import MKButton from "../../components/MKButton"; -import { verifyLink } from "../BesVersionHistory/AssessmentReport"; +import { fetchJsonData } from "../BesVersionHistory/AssessmentReport"; import { besecureMlAssessmentDataStore } from "../../dataStore"; import { NavLink, useLocation } from "react-router-dom"; @@ -41,8 +41,8 @@ export default function DefenceData({ report, reportName }: any) { let defenceReportLink = `${besecureMlAssessmentDataStore}/${selectedFuzz.name}/fuzz-test/${reportName}/DefenceReport.pdf`; let vulnerabilityReportLink = `${besecureMlAssessmentDataStore}/${selectedFuzz.name}/fuzz-test/${reportName}/VulnerabilityReport.pdf`; React.useEffect(() => { - verifyLink(defenceReportLink, setDefenceReport); - verifyLink(vulnerabilityReportLink, setvulnerabilityReport); + fetchJsonData(defenceReportLink, setDefenceReport); + fetchJsonData(vulnerabilityReportLink, setvulnerabilityReport); try { setTimeout(setLoading, 6000); } catch (e) { diff --git a/src/pages/FuzzingModel/index.tsx b/src/pages/FuzzingModel/index.tsx index 5d6686e5..59043e6c 100644 --- a/src/pages/FuzzingModel/index.tsx +++ b/src/pages/FuzzingModel/index.tsx @@ -10,7 +10,7 @@ import RightFuzzing from "./sections/RightFuzzing"; import MKBox from "../../components/MKBox"; import { useLocation } from "react-router-dom"; import { besecureMlAssessmentDataStore } from "../../dataStore"; -import { verifyLink } from "../BesVersionHistory/AssessmentReport"; +import { fetchJsonData } from "../BesVersionHistory/AssessmentReport"; const lineOptions = { startPlug: "disc", @@ -135,14 +135,14 @@ function FuzzingModelPage() { let inferenceLink = `${besecureMlAssessmentDataStore}/${selectedFuzz.name}/fuzz-test/inference/JobMetadata.json`; let extractionLink = `${besecureMlAssessmentDataStore}/${selectedFuzz.name}/fuzz-test/extraction/JobMetadata.json`; let dataPoisoningLink = `${besecureMlAssessmentDataStore}/${selectedFuzz.name}/fuzz-test/dataPoisoning/JobMetadata.json`; - verifyLink(evasionLink, evasionSetreport).then((data) => { + fetchJsonData(evasionLink, evasionSetreport).then((data) => { if (data) setTimeout( () => evasionLineGraph(lineRefStartEvasion, lineRefRightEvasion), 200 ); }); - verifyLink(inferenceLink, inferenceSetreport).then((data) => { + fetchJsonData(inferenceLink, inferenceSetreport).then((data) => { if (data) setTimeout( () => @@ -151,7 +151,7 @@ function FuzzingModelPage() { ); }); - verifyLink(extractionLink, extractionSetreport).then((data) => { + fetchJsonData(extractionLink, extractionSetreport).then((data) => { if (data) setTimeout( () => @@ -159,7 +159,7 @@ function FuzzingModelPage() { 200 ); }); - verifyLink(dataPoisoningLink, dataPoisoningSetreport).then((data) => { + fetchJsonData(dataPoisoningLink, dataPoisoningSetreport).then((data) => { if (data) setTimeout( () => diff --git a/src/pages/FuzzingModel/sections/DefenseSummary.tsx b/src/pages/FuzzingModel/sections/DefenseSummary.tsx index f8dcd02c..a161f4f8 100644 --- a/src/pages/FuzzingModel/sections/DefenseSummary.tsx +++ b/src/pages/FuzzingModel/sections/DefenseSummary.tsx @@ -6,7 +6,7 @@ import MKTypography from "../../../components/MKTypography"; import Card from "@mui/material/Card"; import { useLocation } from "react-router-dom"; import { besecureMlAssessmentDataStore } from "../../../dataStore"; -import { verifyLink } from "../../BesVersionHistory/AssessmentReport"; +import { fetchJsonData } from "../../BesVersionHistory/AssessmentReport"; import bgImage from "../../../assets/images/neuralimage.png"; import Box from "@mui/material/Box"; @@ -67,10 +67,10 @@ function DefenseSummary() { let inferenceLink = `${besecureMlAssessmentDataStore}/${selectedFuzz.name}/fuzz-test/inference/DefenceReport.json`; let extractionLink = `${besecureMlAssessmentDataStore}/${selectedFuzz.name}/fuzz-test/extraction/DefenceReport.json`; let dataPoisoningLink = `${besecureMlAssessmentDataStore}/${selectedFuzz.name}/fuzz-test/dataPoisoning/DefenceReport.json`; - verifyLink(evasionLink, evasionSetreport); - verifyLink(inferenceLink, inferenceSetreport); - verifyLink(extractionLink, extractionSetreport); - verifyLink(dataPoisoningLink, dataPoisoningSetreport); + fetchJsonData(evasionLink, evasionSetreport); + fetchJsonData(inferenceLink, inferenceSetreport); + fetchJsonData(extractionLink, extractionSetreport); + fetchJsonData(dataPoisoningLink, dataPoisoningSetreport); }, []); return ( diff --git a/src/pages/ModelOfInterest/ModelDisplay/index.tsx b/src/pages/ModelOfInterest/ModelDisplay/index.tsx index 9c3e57ec..88f0ea97 100644 --- a/src/pages/ModelOfInterest/ModelDisplay/index.tsx +++ b/src/pages/ModelOfInterest/ModelDisplay/index.tsx @@ -2,7 +2,7 @@ import { filter } from "lodash"; import React, { useState } from "react"; import { modelOfInterestData } from "../../../dataStore"; import { getComparator } from "../../../layouts/pages/projectOfInterest/ProjectDisplay"; -import { verifyLink } from "../../BesVersionHistory/AssessmentReport"; +import { fetchJsonData } from "../../BesVersionHistory/AssessmentReport"; import SearchVoiList from "../../VulnerabilityOfInterest/VoiTable/SearchVoiList"; import ModelTable from "./ModelTable"; import ThreeWayToggleButton from "../../../examples/Button/ThreeWayToggle" @@ -33,7 +33,7 @@ export default function ModelDisplay() { const [report, setreport]: any = useState([]); React.useEffect(() => { - verifyLink(modelOfInterestData, setreport); + fetchJsonData(modelOfInterestData, setreport); }, []); const filteredCveReport = applySortFilter( report, diff --git a/src/pages/ModelVulnerabilitiesDetailed/ModelVulnerabilitiesDetailedTable.tsx b/src/pages/ModelVulnerabilitiesDetailed/ModelVulnerabilitiesDetailedTable.tsx index a49fed34..b8522ca7 100644 --- a/src/pages/ModelVulnerabilitiesDetailed/ModelVulnerabilitiesDetailedTable.tsx +++ b/src/pages/ModelVulnerabilitiesDetailed/ModelVulnerabilitiesDetailedTable.tsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import { verifyLink } from "../BesVersionHistory/AssessmentReport"; +import { fetchJsonData } from "../BesVersionHistory/AssessmentReport"; import { besecureMlAssessmentDataStore } from "../../dataStore"; import TableContainer from "@mui/material/TableContainer"; import Table from "@mui/material/Table"; @@ -46,7 +46,7 @@ export default function ModelVulnerabilitiesDetailedTable() { modelName = modelName.slice(1); React.useEffect(() => { let link = `${besecureMlAssessmentDataStore}/${modelName}/sast/${modelName}-sast-detailed-report.json`; - verifyLink(link, setreport); + fetchJsonData(link, setreport); }, []); const modelDetails = Object.values(report); diff --git a/src/pages/ShowVulnerabilityDetails/ShowVulnerabilityContent.tsx b/src/pages/ShowVulnerabilityDetails/ShowVulnerabilityContent.tsx index e41dca40..438ef533 100644 --- a/src/pages/ShowVulnerabilityDetails/ShowVulnerabilityContent.tsx +++ b/src/pages/ShowVulnerabilityDetails/ShowVulnerabilityContent.tsx @@ -1,7 +1,7 @@ import React, { useState } from "react"; import { useParams } from "react-router-dom"; import { vulnerabilityOffInterest } from "../../dataStore"; -import { verifyLink } from "../BesVersionHistory/AssessmentReport"; +import { fetchJsonData } from "../BesVersionHistory/AssessmentReport"; export const spanStyle: any = { fontSize: "1rem", @@ -287,7 +287,7 @@ function ShowVulnerabilityContent() { const [report, setreport]: any = useState([]); React.useEffect(() => { - verifyLink(vulnerabilityOffInterest, setreport); + fetchJsonData(vulnerabilityOffInterest, setreport); }, []); const cve_Id = cveId.slice(1); return ( diff --git a/src/pages/VulnerabilityOfInterest/VulnerablitiDisplay/index.tsx b/src/pages/VulnerabilityOfInterest/VulnerablitiDisplay/index.tsx index 6614a08a..5962ed86 100644 --- a/src/pages/VulnerabilityOfInterest/VulnerablitiDisplay/index.tsx +++ b/src/pages/VulnerabilityOfInterest/VulnerablitiDisplay/index.tsx @@ -2,7 +2,7 @@ import { filter } from "lodash"; import React, { useState } from "react"; import { vulnerabilityOffInterest } from "../../../dataStore"; import { getComparator } from "../../../layouts/pages/projectOfInterest/ProjectDisplay"; -import { verifyLink } from "../../BesVersionHistory/AssessmentReport"; +import { fetchJsonData } from "../../BesVersionHistory/AssessmentReport"; import SearchVoiList from "../VoiTable/SearchVoiList"; import VulnerabilityTable from "../VoiTable/VulnerabilityTable"; @@ -36,7 +36,7 @@ export default function VulnerablitiDisplay() { const [report, setreport]: any = useState([]); React.useEffect(() => { - verifyLink(vulnerabilityOffInterest, setreport); + fetchJsonData(vulnerabilityOffInterest, setreport); }, []); const filteredCveReport = applySortFilter( report, From 813e29ee9d47c8590ff1246b2d6452bb02bc0402 Mon Sep 17 00:00:00 2001 From: Arun Suresh <58501088+asa1997@users.noreply.github.com> Date: Tue, 9 Jan 2024 18:49:22 +0530 Subject: [PATCH 2/3] Added attribution (#515) * Added attribution * Removed images * Added images --- .../images/AIShield-watchtower-final-logo.png | Bin 0 -> 29925 bytes src/assets/images/aishield_logo.png | Bin 0 -> 14637 bytes src/pages/FuzzingModel/index.tsx | 15 ++++++++++++++- .../ModelVulnerabilitiesDetailed/index.tsx | 14 ++++++++++++++ .../AdversarialAttackSummary.tsx | 17 ++++++++++++++++- .../ShowModelDetails/StaticAnalysisSummary.tsx | 16 ++++++++++++++++ 6 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/assets/images/AIShield-watchtower-final-logo.png create mode 100644 src/assets/images/aishield_logo.png diff --git a/src/assets/images/AIShield-watchtower-final-logo.png b/src/assets/images/AIShield-watchtower-final-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b034a92242de1c9470fc506585b1b06bdb09740b GIT binary patch literal 29925 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 literal 0 HcmV?d00001 diff --git a/src/pages/FuzzingModel/index.tsx b/src/pages/FuzzingModel/index.tsx index 59043e6c..492d3688 100644 --- a/src/pages/FuzzingModel/index.tsx +++ b/src/pages/FuzzingModel/index.tsx @@ -11,7 +11,8 @@ import MKBox from "../../components/MKBox"; import { useLocation } from "react-router-dom"; import { besecureMlAssessmentDataStore } from "../../dataStore"; import { fetchJsonData } from "../BesVersionHistory/AssessmentReport"; - +import MKTypography from "../../components/MKTypography"; +import aishieldLogo from "../../assets/images/aishield_logo.png" const lineOptions = { startPlug: "disc", color: "red", @@ -222,6 +223,18 @@ function FuzzingModelPage() { + + + + + Powered by + + + + + + + ); } diff --git a/src/pages/ModelVulnerabilitiesDetailed/index.tsx b/src/pages/ModelVulnerabilitiesDetailed/index.tsx index 8efcd9f8..43c7293e 100644 --- a/src/pages/ModelVulnerabilitiesDetailed/index.tsx +++ b/src/pages/ModelVulnerabilitiesDetailed/index.tsx @@ -4,6 +4,8 @@ import routes from "../../routes"; import MKBox from "../../components/MKBox"; import { Card, Grid } from "@mui/material"; import ModelVulnerabilitiesDetailedTable from "./ModelVulnerabilitiesDetailedTable"; +import MKTypography from "../../components/MKTypography"; +import watchtowerLogo from "../../assets/images/AIShield-watchtower-final-logo.png" function ModelVulnerabilitiesDetailed() { @@ -20,6 +22,18 @@ function ModelVulnerabilitiesDetailed() { + + + + + Powered by + + + + + + +
    ); diff --git a/src/pages/ShowModelDetails/AdversarialAttackSummary.tsx b/src/pages/ShowModelDetails/AdversarialAttackSummary.tsx index 5d2ae833..2d3e0e92 100644 --- a/src/pages/ShowModelDetails/AdversarialAttackSummary.tsx +++ b/src/pages/ShowModelDetails/AdversarialAttackSummary.tsx @@ -208,7 +208,22 @@ const AdversarialAttackSummary = () => { - + + Powered by + Bosch AIShield + + {dividerDiv(1)} {attackGraph(selectedMenu, attackMap)} diff --git a/src/pages/ShowModelDetails/StaticAnalysisSummary.tsx b/src/pages/ShowModelDetails/StaticAnalysisSummary.tsx index 3b4aba56..8e099384 100644 --- a/src/pages/ShowModelDetails/StaticAnalysisSummary.tsx +++ b/src/pages/ShowModelDetails/StaticAnalysisSummary.tsx @@ -96,6 +96,22 @@ export default function StaticAnalysisSummary({ data }: any): any { })} )} + + Powered by + AIShield Watchtower + + ); } From 289f2c37b72463a8d9f8572b91b71a79e8b0fced Mon Sep 17 00:00:00 2001 From: Arun Suresh <58501088+asa1997@users.noreply.github.com> Date: Tue, 9 Jan 2024 20:55:36 +0530 Subject: [PATCH 3/3] CSS fixed (#516) * Added attribution * Removed images * Added images * CSS changes --- src/pages/FuzzingModel/index.tsx | 3 ++- src/pages/ModelVulnerabilitiesDetailed/index.tsx | 13 +++++++++++++ .../ShowModelDetails/AdversarialAttackSummary.tsx | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/pages/FuzzingModel/index.tsx b/src/pages/FuzzingModel/index.tsx index 492d3688..de3e5ca8 100644 --- a/src/pages/FuzzingModel/index.tsx +++ b/src/pages/FuzzingModel/index.tsx @@ -223,7 +223,8 @@ function FuzzingModelPage() { - + + diff --git a/src/pages/ModelVulnerabilitiesDetailed/index.tsx b/src/pages/ModelVulnerabilitiesDetailed/index.tsx index 43c7293e..9d19c837 100644 --- a/src/pages/ModelVulnerabilitiesDetailed/index.tsx +++ b/src/pages/ModelVulnerabilitiesDetailed/index.tsx @@ -35,6 +35,19 @@ function ModelVulnerabilitiesDetailed() {
    + + + + + + Powered by + + + + + + + ); } diff --git a/src/pages/ShowModelDetails/AdversarialAttackSummary.tsx b/src/pages/ShowModelDetails/AdversarialAttackSummary.tsx index 2d3e0e92..6e48f293 100644 --- a/src/pages/ShowModelDetails/AdversarialAttackSummary.tsx +++ b/src/pages/ShowModelDetails/AdversarialAttackSummary.tsx @@ -209,7 +209,7 @@ const AdversarialAttackSummary = () => { Powered by