@hclsoftware/secagent
Version:
IAST agent
99 lines (86 loc) • 3.63 kB
JavaScript
//IASTIGNORE
/*
* ****************************************************
* Licensed Materials - Property of HCL.
* (c) Copyright HCL Technologies Ltd. 2017, 2025.
* Note to U.S. Government Users *Restricted Rights.
* ****************************************************
*/
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