UNPKG

@hclsoftware/secagent

Version:

IAST agent

99 lines (86 loc) 3.63 kB
//IASTIGNORE /* * **************************************************** * Licensed Materials - Property of HCL. * (c) Copyright HCL Technologies Ltd. 2017, 2025. * Note to U.S. Government Users *Restricted Rights. * **************************************************** */ 'use strict' const EncodingUtils = require("../Utils/EncodingUtils"); const AppInfo = require("../AppInfo"); const Phase = require("./DastRequestData").Phase; const Distributor = require("../Distributor/Distributor"); const iastLogger = require("../Logger/IastLogger"); const DastHeaderParser = require("./DastHeaderParser") let exploreInfoForDast = null; class DastResponseGenerator { static generateJsonString(requestInfo) { const output = []; output.push(`"agentId":"${Distributor.getAgentId()}","appInfo":{${DastResponseGenerator.getAppInfoJsonString()}}`); if (requestInfo.hasDastRequestData()) { output.push(`,\"requestInfo\":{${this.getRequestInfoJsonString(requestInfo)}}`); } const jsonData = "{" + output.origJoin("") + "}"; iastLogger.eventLog.trace(`${DastHeaderParser.APPSCAN_HEADER_NAME_RESPONSE}: ${jsonData}`) const gzippedData = EncodingUtils.gzip(jsonData); const gzippedBase64 = EncodingUtils.encodeBase64(gzippedData); let urlEncodedHeader = EncodingUtils.encodeUrl(gzippedBase64); let maxHeaderLength= 0; if(requestInfo.hasDastRequestData()){ maxHeaderLength = requestInfo.dastRequestData.getMaxHeaderLength(); } return DastResponseGenerator.chunkData(urlEncodedHeader, maxHeaderLength); } static getAppInfoJsonString() { if (exploreInfoForDast == null){ let appInfoStr = AppInfo.getOlderFieldsJsonString(); appInfoStr += `"components": ${AppInfo.getComponentsJsonString()}`; exploreInfoForDast = appInfoStr; } return exploreInfoForDast; } static getRequestInfoJsonString(requestInfo) { let requestInfoJson = ""; const dastResponseData = requestInfo.dastResponseData; let sinkReportsJson = "[]"; if (requestInfo.dastRequestData.getPhase() === Phase.TEST) { sinkReportsJson = DastResponseGenerator.getSinkReportsJsonString(dastResponseData); } requestInfoJson = `\"sinkReports\":${sinkReportsJson},\"routeTemplate\":\"${requestInfo.dastResponseData.getRouteTemplate()}\"`; return requestInfoJson; } static getSinkReportsJsonString(dastResponseData) { let output = []; const sinkReportMap = dastResponseData.getSinkReports(); for (const sinkReport of sinkReportMap.values()) { const strReport = JSON.origStringify(sinkReport, function replacer(key, value) { if (key === "stackList") { return [...value].map(strStack => strStack.origSplit(',')); } return value; }, 2); output.push(strReport); } return "[" + output.join(",") + "]"; } static chunkData(data, chunkSize) { const chunks = []; if (chunkSize === 0) { chunks.push(data); }else { for (let i = 0; i < data.length; i += chunkSize) { const chunk = data.origSlice(i, i + chunkSize); chunks.push(chunk); } } return chunks; } } module.exports = DastResponseGenerator