Skip to content

Commit

Permalink
fixed graphs in issues page
Browse files Browse the repository at this point in the history
# Conflicts:
#	apps/dashboard/src/main/java/com/akto/action/testing/StartTestAction.java
  • Loading branch information
TangoBeeAkto committed Feb 4, 2025
1 parent ca952fc commit 258c3a4
Show file tree
Hide file tree
Showing 8 changed files with 50 additions and 39 deletions.
25 changes: 13 additions & 12 deletions apps/dashboard/src/main/java/com/akto/action/DashboardAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,11 @@ public class DashboardAction extends UserAction {
public String findTotalIssues() {
Set<Integer> demoCollections = new HashSet<>();
demoCollections.addAll(deactivatedCollections);
demoCollections.add(RuntimeListener.LLM_API_COLLECTION_ID);
demoCollections.add(RuntimeListener.VULNERABLE_API_COLLECTION_ID);

ApiCollection juiceshopCollection = ApiCollectionsDao.instance.findByName("juice_shop_demo");
if (juiceshopCollection != null) demoCollections.add(juiceshopCollection.getId());
// demoCollections.add(RuntimeListener.LLM_API_COLLECTION_ID);
// demoCollections.add(RuntimeListener.VULNERABLE_API_COLLECTION_ID);
//
// ApiCollection juiceshopCollection = ApiCollectionsDao.instance.findByName("juice_shop_demo");
// if (juiceshopCollection != null) demoCollections.add(juiceshopCollection.getId());


if (startTimeStamp == 0) startTimeStamp = Context.now() - 24 * 1 * 60 * 60;
Expand Down Expand Up @@ -107,13 +107,13 @@ public String fetchCriticalIssuesTrend(){

Set<Integer> demoCollections = new HashSet<>();
demoCollections.addAll(deactivatedCollections);
demoCollections.add(RuntimeListener.LLM_API_COLLECTION_ID);
demoCollections.add(RuntimeListener.VULNERABLE_API_COLLECTION_ID);

ApiCollection juiceshopCollection = ApiCollectionsDao.instance.findByName("juice_shop_demo");
if (juiceshopCollection != null) demoCollections.add(juiceshopCollection.getId());
// demoCollections.add(RuntimeListener.LLM_API_COLLECTION_ID);
// demoCollections.add(RuntimeListener.VULNERABLE_API_COLLECTION_ID);
//
// ApiCollection juiceshopCollection = ApiCollectionsDao.instance.findByName("juice_shop_demo");
// if (juiceshopCollection != null) demoCollections.add(juiceshopCollection.getId());

List<GlobalEnums.TestRunIssueStatus> allowedStatus = Arrays.asList(GlobalEnums.TestRunIssueStatus.OPEN, GlobalEnums.TestRunIssueStatus.FIXED);
List<GlobalEnums.TestRunIssueStatus> allowedStatus = Arrays.asList(GlobalEnums.TestRunIssueStatus.OPEN);
Bson issuesFilter = Filters.and(
Filters.in(TestingRunIssues.KEY_SEVERITY, severityToFetch),
Filters.gte(TestingRunIssues.CREATION_TIME, startTimeStamp),
Expand Down Expand Up @@ -149,10 +149,11 @@ public String fetchCriticalIssuesTrend(){

while(issuesCursor.hasNext()){
BasicDBObject basicDBObject = issuesCursor.next();
int val = (int) basicDBObject.values().toArray()[1];
BasicDBObject o = (BasicDBObject) basicDBObject.get("_id");
int date = o.getInt(dayOfYear);
int count = trendData.getOrDefault(date,0);
trendData.put(date, count+1);
trendData.put(date, count+val);
}

return SUCCESS.toUpperCase();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@

import com.akto.action.AccountAction;
import com.akto.action.UserAction;
import com.akto.dao.ApiCollectionsDao;
import com.akto.dao.RBACDao;
import com.akto.dao.context.Context;
import com.akto.dao.test_editor.YamlTemplateDao;
import com.akto.dao.testing.sources.TestSourceConfigsDao;
import com.akto.dao.testing_run_findings.TestingRunIssuesDao;
import com.akto.dao.testing.*;
import com.akto.dto.ApiCollection;
import com.akto.dto.testing.config.EditableTestingRunConfig;
import com.akto.dto.ApiInfo;
import com.akto.dto.User;
Expand All @@ -24,8 +26,10 @@
import com.akto.dto.testing.info.CurrentTestsStatus;
import com.akto.dto.testing.info.CurrentTestsStatus.StatusForIndividualTest;
import com.akto.dto.testing.sources.TestSourceConfig;
import com.akto.listener.RuntimeListener;
import com.akto.log.LoggerMaker;
import com.akto.log.LoggerMaker.LogDb;
import com.akto.usage.UsageMetricCalculator;
import com.akto.util.Constants;
import com.akto.util.DashboardMode;
import com.akto.util.enums.GlobalEnums;
Expand Down Expand Up @@ -87,6 +91,8 @@ public class StartTestAction extends UserAction {

private static final Gson gson = new Gson();

Set<Integer> deactivatedCollections = UsageMetricCalculator.getDeactivated();

private static List<ObjectId> getTestingRunListFromSummary(Bson filters){
Bson projections = Projections.fields(
Projections.excludeId(),
Expand Down Expand Up @@ -1037,12 +1043,16 @@ public String getIssueSummaryInfo(){
if(this.endTimestamp == 0){
this.endTimestamp = Context.now();
}
// issues default for 2 months
if(this.startTimestamp == 0){
this.startTimestamp = Context.now() - (2 * Constants.ONE_MONTH_TIMESTAMP);
}

Map<String,Integer> totalSubcategoriesCountMap = TestingRunIssuesDao.instance.getTotalSubcategoriesCountMap(this.startTimestamp,this.endTimestamp);
Set<Integer> demoCollections = new HashSet<>();
demoCollections.addAll(deactivatedCollections);
// demoCollections.add(RuntimeListener.LLM_API_COLLECTION_ID);
// demoCollections.add(RuntimeListener.VULNERABLE_API_COLLECTION_ID);
//
// ApiCollection juiceshopCollection = ApiCollectionsDao.instance.findByName("juice_shop_demo");
// if (juiceshopCollection != null) demoCollections.add(juiceshopCollection.getId());

Map<String,Integer> totalSubcategoriesCountMap = TestingRunIssuesDao.instance.getTotalSubcategoriesCountMap(this.startTimestamp,this.endTimestamp, demoCollections);
this.issuesSummaryInfoMap = totalSubcategoriesCountMap;

return SUCCESS.toUpperCase();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,8 @@ public String findTotalIssuesByDay() {
long daysBetween = (endTimeStamp - startEpoch) / ONE_DAY_TIMESTAMP;
List<Bson> pipeline = new ArrayList<>();

Bson notIncludedCollections = UsageMetricCalculator.excludeDemosAndDeactivated("_id." + TestingIssuesId.API_KEY_INFO + "." + ApiInfo.ApiInfoKey.API_COLLECTION_ID);
Set<Integer> deactivatedCollections = UsageMetricCalculator.getDeactivated();
Bson notIncludedCollections = Filters.nin(ID + "." + TestingIssuesId.API_KEY_INFO + "." + ApiInfo.ApiInfoKey.API_COLLECTION_ID, deactivatedCollections);

Bson filters = Filters.and(
notIncludedCollections,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -531,9 +531,9 @@ function HomeDashboard() {
linkUrl="/dashboard/issues"
/> : <EmptyCard title="Issues by Severity" subTitleComponent={showTestingComponents ? <Text alignment='center' color='subdued'>No issues found for this time-frame</Text>: runTestEmptyCardComponent}/>

const criticalUnsecuredAPIsOverTime = <CriticalUnsecuredAPIsOverTimeGraph linkText={"Fix critical issues"} linkUrl={"/dashboard/issues"} />
const criticalUnsecuredAPIsOverTime = <CriticalUnsecuredAPIsOverTimeGraph startTimestamp={startTimestamp} endTimestamp={endTimestamp} linkText={"Fix critical issues"} linkUrl={"/dashboard/issues"} />

const criticalFindings = <CriticalFindingsGraph linkText={"Fix critical issues"} linkUrl={"/dashboard/issues"} />
const criticalFindings = <CriticalFindingsGraph startTimestamp={startTimestamp} endTimestamp={endTimestamp} linkText={"Fix critical issues"} linkUrl={"/dashboard/issues"} />

const apisByRiskscoreComponent = <InfoCard
component={
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import testingFunc from "../../testing/transform.js"
import func from "@/util/func";
import BarGraph from '../../../components/charts/BarGraph.jsx';

const CriticalFindingsGraph = ({ linkText, linkUrl }) => {
const CriticalFindingsGraph = ({ startTimestamp, endTimestamp, linkText, linkUrl }) => {
const [criticalFindingsData, setCriticalFindingsData] = useState([])
const [showTestingComponents, setShowTestingComponents] = useState(false)

Expand All @@ -25,15 +25,15 @@ const CriticalFindingsGraph = ({ linkText, linkUrl }) => {

const fetchGraphData = async () => {
setShowTestingComponents(false)
const subcategoryDataResp = await testingApi.getSummaryInfo(0, func.timeNow())
const subcategoryDataResp = await testingApi.getSummaryInfo(startTimestamp, endTimestamp)
const tempResult = testingFunc.convertSubIntoSubcategory(subcategoryDataResp)
convertSubCategoryInfo(tempResult.subCategoryMap)
setShowTestingComponents(true)
}

useEffect(() => {
fetchGraphData()
}, [])
}, [startTimestamp, endTimestamp])

const defaultChartOptions = {
"legend": {
Expand All @@ -58,11 +58,11 @@ const CriticalFindingsGraph = ({ linkText, linkUrl }) => {
barWidth={30}
/>
}
title="Vulnerabilities findings"
titleToolTip="Overview of the most critical security issues detected, including the number of issues and APIs affected for each type of vulnerability."
title="Vulnerabilities findings by the top 5 categories"
titleToolTip="Overview of the most critical security issues detected, including the number of issues and APIs affected for each of the top 5 vulnerability categories."
linkText={linkText}
linkUrl={linkUrl}
/> : <EmptyCard title="Vulnerabilities findings" subTitleComponent={showTestingComponents ? <Text alignment='center' color='subdued'>No Vulnerabilities found</Text>: runTestEmptyCardComponent} />
/> : <EmptyCard title="Vulnerabilities findings by the top 5 categories" subTitleComponent={showTestingComponents ? <Text alignment='center' color='subdued'>No Vulnerabilities found</Text>: runTestEmptyCardComponent} />

return (
{...criticalFindings}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Link, Text } from '@shopify/polaris'
import InfoCard from '../../dashboard/new_components/InfoCard'
import dashboardApi from "../../dashboard/api.js"

const CriticalUnsecuredAPIsOverTimeGraph = ({ linkText, linkUrl }) => {
const CriticalUnsecuredAPIsOverTimeGraph = ({ startTimestamp, endTimestamp, linkText, linkUrl }) => {
const [unsecuredAPIs, setUnsecuredAPIs] = useState([])
const [showTestingComponents, setShowTestingComponents] = useState(false)

Expand All @@ -25,15 +25,15 @@ const CriticalUnsecuredAPIsOverTimeGraph = ({ linkText, linkUrl }) => {

const fetchGraphData = async () => {
setShowTestingComponents(false)
const criticalIssuesTrendResp = await dashboardApi.fetchCriticalIssuesTrend()
const criticalIssuesTrendResp = await dashboardApi.fetchCriticalIssuesTrend(startTimestamp, endTimestamp)

buildUnsecuredAPIs(criticalIssuesTrendResp)
setShowTestingComponents(true)
}

useEffect(() => {
fetchGraphData()
}, [])
}, [startTimestamp, endTimestamp])

const defaultChartOptions = {
"legend": {
Expand Down Expand Up @@ -61,11 +61,11 @@ const CriticalUnsecuredAPIsOverTimeGraph = ({ linkText, linkUrl }) => {
exportingDisabled={true}
/>
}
title="Critical Unsecured APIs Over Time"
title="Critical & High Issues Over Time"
titleToolTip="Chart showing the number of APIs detected(risk score >= 4) each month over the past year. Helps track security trends over time."
linkText={linkText}
linkUrl={linkUrl}
/> : <EmptyCard title="Critical Unsecured APIs Over Time" subTitleComponent={showTestingComponents ? <Text alignment='center' color='subdued'>No Unsecured APIs found</Text>: runTestEmptyCardComponent} />
/> : <EmptyCard title="Critical & High Issues Over Time" subTitleComponent={showTestingComponents ? <Text alignment='center' color='subdued'>No critical issue found</Text>: runTestEmptyCardComponent} />

return (
{...criticalUnsecuredAPIsOverTime}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -500,8 +500,8 @@ function IssuesPage() {
/>

<HorizontalGrid gap={5} columns={2} key={"critical-issues-graph-detail"}>
<CriticalUnsecuredAPIsOverTimeGraph linkText={""} linkUrl={""} />
<CriticalFindingsGraph linkText={""} linkUrl={""} />
<CriticalUnsecuredAPIsOverTimeGraph startTimestamp={startTimestamp} endTimestamp={endTimestamp} linkText={""} linkUrl={""} />
<CriticalFindingsGraph startTimestamp={startTimestamp} endTimestamp={endTimestamp} linkText={""} linkUrl={""} />
</HorizontalGrid>

<GithubServerTable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.akto.dao.testing_run_findings;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;

import org.bson.conversions.Bson;

Expand Down Expand Up @@ -124,13 +121,15 @@ public Map<Integer,Map<String,Integer>> getSeveritiesMapForCollections(Bson filt
return resultMap;
}

public Map<String, Integer> getTotalSubcategoriesCountMap(int startTimeStamp, int endTimeStamp){
public Map<String, Integer> getTotalSubcategoriesCountMap(int startTimeStamp, int endTimeStamp, Set<Integer> deactivatedCollections){
List<Bson> pipeline = new ArrayList<>();
if(deactivatedCollections == null) deactivatedCollections = new HashSet<>();

pipeline.add(Aggregates.match(Filters.and(
Filters.eq(TestingRunIssues.TEST_RUN_ISSUES_STATUS, "OPEN"),
Filters.lte(TestingRunIssues.LAST_SEEN, endTimeStamp),
Filters.gte(TestingRunIssues.LAST_SEEN, startTimeStamp)
Filters.gte(TestingRunIssues.LAST_SEEN, startTimeStamp),
Filters.nin("_id.apiInfoKey.apiCollectionId", deactivatedCollections)
)
));

Expand Down

0 comments on commit 258c3a4

Please sign in to comment.