diff --git a/frontend/src/app/organization/organization.component.html b/frontend/src/app/organization/organization.component.html index d0fb4b5b..8c31438f 100644 --- a/frontend/src/app/organization/organization.component.html +++ b/frontend/src/app/organization/organization.component.html @@ -33,7 +33,7 @@ {{ asset?.name }} {{asset?.jira?.id ? 'Yes' : 'No'}} {{ asset?.status === 'A' ? 'Active':'Archived' }} - {{asset?.openVulnCount}} + {{asset?.openVulnCount}} + diff --git a/frontend/src/app/organization/organization.component.ts b/frontend/src/app/organization/organization.component.ts index dc6ad8e4..7f15ade1 100644 --- a/frontend/src/app/organization/organization.component.ts +++ b/frontend/src/app/organization/organization.component.ts @@ -13,6 +13,7 @@ import { AuthService } from '../auth.service'; export class OrganizationComponent implements OnInit { assetAry: any = []; orgId: number; + assetId: number; org: any; isArchive = false; isAdmin: boolean; @@ -109,12 +110,15 @@ export class OrganizationComponent implements OnInit { * @param assetId asset ID passed required */ showOpenVulnsModal(assetId: number, assetName: string) { + this.assetId = assetId; this.displayOpenVulnModal = true; this.assetNameHeader = assetName; this.openVulns = []; - this.appService.getOpenVulnsByAssetId(assetId).subscribe((openVulns) => { - this.openVulns = openVulns; - }); + this.appService + .getOpenVulnsByAssetId(this.assetId) + .subscribe((openVulns) => { + this.openVulns = openVulns; + }); } /** @@ -146,4 +150,15 @@ export class OrganizationComponent implements OnInit { const selectedRiskAry = event.value.map((x) => x.name); this.vulnTable.filter(selectedRiskAry, 'risk', 'in'); } + + navigateToVulnDetail(vulnId: number, assessmentId: number) { + const url = this.router.serializeUrl( + this.router.createUrlTree([ + `organization/${this.orgId}/asset/${this.assetId}/assessment/${assessmentId}/vuln-form/${vulnId}`, + ]) + ); + let baseUrl = window.location.href.replace(this.router.url, ''); + + window.open(baseUrl + url, '_blank'); + } } diff --git a/src/routes/asset.controller.spec.ts b/src/routes/asset.controller.spec.ts index c4fb3820..ab8c1d26 100644 --- a/src/routes/asset.controller.spec.ts +++ b/src/routes/asset.controller.spec.ts @@ -749,4 +749,70 @@ describe('Asset Controller', () => { await assetController.updateAssetById(request, response); expect(response.statusCode).toBe(400); }); + test('Get open vulns by asset', async () => { + const org: Organization = { + id: null, + name: 'testOrg', + asset: null, + status: 'A', + teams: null, + }; + await getConnection().getRepository(Organization).insert(org); + const savedOrg = await getConnection() + .getRepository(Organization) + .findOne(1); + const assessments: Assessment[] = []; + const asset: Asset = { + id: null, + name: 'Test Asset', + status: 'A', + assessment: assessments, + organization: savedOrg, + jira: null, + teams: null, + }; + const savedAsset = await getConnection().getRepository(Asset).save(asset); + const request = new MockExpressRequest({ + params: { + assetId: savedAsset.id, + }, + userAssets: [savedAsset.id], + }); + const response = new MockExpressResponse(); + await assetController.getOpenVulnsByAsset(request, response); + expect(response.statusCode).toBe(200); + }); + test('Get open vulns by asset', async () => { + const org: Organization = { + id: null, + name: 'testOrg', + asset: null, + status: 'A', + teams: null, + }; + await getConnection().getRepository(Organization).insert(org); + const savedOrg = await getConnection() + .getRepository(Organization) + .findOne(1); + const assessments: Assessment[] = []; + const asset: Asset = { + id: null, + name: 'Test Asset', + status: 'A', + assessment: assessments, + organization: savedOrg, + jira: null, + teams: null, + }; + const savedAsset = await getConnection().getRepository(Asset).save(asset); + const request = new MockExpressRequest({ + params: { + assetId: savedAsset.id, + }, + userAssets: [999], + }); + const response = new MockExpressResponse(); + await assetController.getOpenVulnsByAsset(request, response); + expect(response.statusCode).toBe(404); + }); }); diff --git a/src/routes/asset.controller.ts b/src/routes/asset.controller.ts index 394226be..7a603f3b 100644 --- a/src/routes/asset.controller.ts +++ b/src/routes/asset.controller.ts @@ -135,7 +135,15 @@ export const getOpenVulnsByAsset = async (req: UserRequest, res: Response) => { .andWhere('vuln.status = :status', { status: 'Open', }) - .select(['vuln']) + .select([ + 'vuln.id', + 'vuln.name', + 'vuln.risk', + 'vuln.systemic', + 'vuln.cvssScore', + 'vuln.cvssUrl', + 'assessment.id', + ]) .getMany(); return res.status(200).json(vulns); };