diff --git a/.gitignore b/.gitignore index d6c537d47f..ec130b46f9 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,4 @@ https: **/data-kafka-data **/data-zoo-data **/data-zoo-logs - +run-cyborg.sh diff --git a/apps/database-abstractor/src/main/java/com/akto/action/DbAction.java b/apps/database-abstractor/src/main/java/com/akto/action/DbAction.java index d389c28933..cef97d6b13 100644 --- a/apps/database-abstractor/src/main/java/com/akto/action/DbAction.java +++ b/apps/database-abstractor/src/main/java/com/akto/action/DbAction.java @@ -4109,4 +4109,66 @@ public void setTestingRunResultId(String testingRunResultId) { public void setUrlType(String urlType) { this.urlType = urlType; } + + // Fields for fetchMCPThreatProtectionTemplates API + private List mcpThreatProtectionTemplates; + private Integer updatedAfter; + + public List getMcpThreatProtectionTemplates() { + return mcpThreatProtectionTemplates; + } + + public void setMcpThreatProtectionTemplates(List mcpThreatProtectionTemplates) { + this.mcpThreatProtectionTemplates = mcpThreatProtectionTemplates; + } + + public Integer getUpdatedAfter() { + return updatedAfter; + } + + public void setUpdatedAfter(Integer updatedAfter) { + this.updatedAfter = updatedAfter; + } + + public String fetchMCPThreatProtectionTemplates() { + try { + loggerMaker.infoAndAddToDb("Fetching MCP threat protection templates with updatedAfter: " + updatedAfter, LogDb.DB_ABS); + this.mcpThreatProtectionTemplates = DbLayer.fetchMCPThreatProtectionTemplates(updatedAfter); + } catch (Exception e) { + loggerMaker.errorAndAddToDb(e, "Error in fetchMCPThreatProtectionTemplates: " + e.toString()); + return Action.ERROR.toUpperCase(); + } + return Action.SUCCESS.toUpperCase(); + } + + // Fields for fetchMcpAuditInfo API + private List mcpAuditInfoList; + private List remarksList; + + public List getMcpAuditInfoList() { + return mcpAuditInfoList; + } + + public void setMcpAuditInfoList(List mcpAuditInfoList) { + this.mcpAuditInfoList = mcpAuditInfoList; + } + + public List getRemarksList() { + return remarksList; + } + + public void setRemarksList(List remarksList) { + this.remarksList = remarksList; + } + + public String fetchMcpAuditInfo() { + try { + loggerMaker.infoAndAddToDb("Fetching MCP audit info with updatedAfter: " + updatedAfter + ", remarksList: " + remarksList, LogDb.DB_ABS); + this.mcpAuditInfoList = DbLayer.fetchMcpAuditInfo(updatedAfter, remarksList); + } catch (Exception e) { + loggerMaker.errorAndAddToDb(e, "Error in fetchMcpAuditInfo: " + e.toString()); + return Action.ERROR.toUpperCase(); + } + return Action.SUCCESS.toUpperCase(); + } } diff --git a/apps/database-abstractor/src/main/resources/struts.xml b/apps/database-abstractor/src/main/resources/struts.xml index d1713349a0..3fc0db6cc6 100644 --- a/apps/database-abstractor/src/main/resources/struts.xml +++ b/apps/database-abstractor/src/main/resources/struts.xml @@ -1793,6 +1793,32 @@ + + + + + ^mcpThreatProtectionTemplates.* + + + 422 + false + ^actionErrors.* + + + + + + + + ^mcpAuditInfoList.* + + + 422 + false + ^actionErrors.* + + + diff --git a/libs/utils/src/main/java/com/akto/data_actor/ClientActor.java b/libs/utils/src/main/java/com/akto/data_actor/ClientActor.java index cb5f5180c1..e2b045c026 100644 --- a/libs/utils/src/main/java/com/akto/data_actor/ClientActor.java +++ b/libs/utils/src/main/java/com/akto/data_actor/ClientActor.java @@ -4201,4 +4201,73 @@ public void storeMcpReconResultsBatch(List serverDataList) { } } + public List fetchMCPThreatProtectionTemplates(Integer updatedAfter) { + List templates = new ArrayList<>(); + + Map> headers = buildHeaders(); + BasicDBObject obj = new BasicDBObject(); + if (updatedAfter != null) { + obj.put("updatedAfter", updatedAfter); + } + OriginalHttpRequest request = new OriginalHttpRequest(url + "/fetchMCPThreatProtectionTemplates", "", "POST", obj.toString(), headers, ""); + try { + OriginalHttpResponse response = ApiExecutor.sendRequest(request, true, null, false, null); + String responsePayload = response.getBody(); + if (response.getStatusCode() != 200 || responsePayload == null) { + loggerMaker.errorAndAddToDb("invalid response in fetchMCPThreatProtectionTemplates", LoggerMaker.LogDb.RUNTIME); + return templates; + } + BasicDBObject payloadObj; + try { + payloadObj = BasicDBObject.parse(responsePayload); + BasicDBList objList = (BasicDBList) payloadObj.get("mcpThreatProtectionTemplates"); + for (Object obj2: objList) { + BasicDBObject templateObj = (BasicDBObject) obj2; + templates.add(objectMapper.readValue(templateObj.toJson(), YamlTemplate.class)); + } + } catch(Exception e) { + loggerMaker.errorAndAddToDb("error extracting response in fetchMCPThreatProtectionTemplates" + e, LoggerMaker.LogDb.RUNTIME); + } + } catch (Exception e) { + loggerMaker.errorAndAddToDb("error in fetchMCPThreatProtectionTemplates" + e, LoggerMaker.LogDb.RUNTIME); + } + return templates; + } + + public List fetchMcpAuditInfo(Integer updatedAfter, List remarksList) { + List mcpAuditInfoList = new ArrayList<>(); + + Map> headers = buildHeaders(); + BasicDBObject obj = new BasicDBObject(); + if (updatedAfter != null) { + obj.put("updatedAfter", updatedAfter); + } + if (remarksList != null && !remarksList.isEmpty()) { + obj.put("remarksList", remarksList); + } + OriginalHttpRequest request = new OriginalHttpRequest(url + "/fetchMcpAuditInfo", "", "POST", obj.toString(), headers, ""); + try { + OriginalHttpResponse response = ApiExecutor.sendRequest(request, true, null, false, null); + String responsePayload = response.getBody(); + if (response.getStatusCode() != 200 || responsePayload == null) { + loggerMaker.errorAndAddToDb("invalid response in fetchMcpAuditInfo", LoggerMaker.LogDb.RUNTIME); + return mcpAuditInfoList; + } + BasicDBObject payloadObj; + try { + payloadObj = BasicDBObject.parse(responsePayload); + BasicDBList objList = (BasicDBList) payloadObj.get("mcpAuditInfoList"); + for (Object obj2: objList) { + BasicDBObject auditInfoObj = (BasicDBObject) obj2; + mcpAuditInfoList.add(objectMapper.readValue(auditInfoObj.toJson(), McpAuditInfo.class)); + } + } catch(Exception e) { + loggerMaker.errorAndAddToDb("error extracting response in fetchMcpAuditInfo" + e, LoggerMaker.LogDb.RUNTIME); + } + } catch (Exception e) { + loggerMaker.errorAndAddToDb("error in fetchMcpAuditInfo" + e, LoggerMaker.LogDb.RUNTIME); + } + return mcpAuditInfoList; + } + } diff --git a/libs/utils/src/main/java/com/akto/data_actor/DataActor.java b/libs/utils/src/main/java/com/akto/data_actor/DataActor.java index 7034d26033..1fc2fff83e 100644 --- a/libs/utils/src/main/java/com/akto/data_actor/DataActor.java +++ b/libs/utils/src/main/java/com/akto/data_actor/DataActor.java @@ -378,4 +378,8 @@ public void updateNewNodesInBatches(List updateNodes) { public abstract void storeMcpReconResultsBatch(List serverDataList); + public abstract List fetchMCPThreatProtectionTemplates(Integer updatedAfter); + + public abstract List fetchMcpAuditInfo(Integer updatedAfter, List remarksList); + } diff --git a/libs/utils/src/main/java/com/akto/data_actor/DbActor.java b/libs/utils/src/main/java/com/akto/data_actor/DbActor.java index 36d25eab7d..cb8917424c 100644 --- a/libs/utils/src/main/java/com/akto/data_actor/DbActor.java +++ b/libs/utils/src/main/java/com/akto/data_actor/DbActor.java @@ -691,6 +691,14 @@ public void storeMcpReconResultsBatch(List serverDataList) { DbLayer.storeMcpReconResultsBatch(serverDataList); } + public List fetchMCPThreatProtectionTemplates(Integer updatedAfter) { + return DbLayer.fetchMCPThreatProtectionTemplates(updatedAfter); + } + + public List fetchMcpAuditInfo(Integer updatedAfter, List remarksList) { + return DbLayer.fetchMcpAuditInfo(updatedAfter, remarksList); + } + public List fetchSlackWebhooks() { return DbLayer.fetchSlackWebhooks(); } diff --git a/libs/utils/src/main/java/com/akto/data_actor/DbLayer.java b/libs/utils/src/main/java/com/akto/data_actor/DbLayer.java index bf0d00b839..60594afbf0 100644 --- a/libs/utils/src/main/java/com/akto/data_actor/DbLayer.java +++ b/libs/utils/src/main/java/com/akto/data_actor/DbLayer.java @@ -1813,4 +1813,67 @@ public static void storeMcpReconResultsBatch(List serverDataList // Batch store MCP server discovery results using DAO McpReconResultDao.instance.insertMany(serverDataList); } + + public static List fetchMCPThreatProtectionTemplates(Integer updatedAfter) { + try { + // Use regex filter for case-insensitive "contains" match of "mcp" in content field + Bson contentFilter = Filters.regex(YamlTemplate.CONTENT, "mcp", "i"); + + // Build filter based on whether updatedAfter is specified + Bson filter; + if (updatedAfter != null && updatedAfter > 0) { + // Combine content filter with updatedAt filter (greater than specified timestamp) + Bson updatedAtFilter = Filters.gt(YamlTemplate.UPDATED_AT, updatedAfter); + filter = Filters.and(contentFilter, updatedAtFilter); + } else { + // Only content filter + filter = contentFilter; + } + + // Fetch templates matching the filter + List mcpTemplates = FilterYamlTemplateDao.instance.findAll(filter); + + return mcpTemplates; + } catch (Exception e) { + loggerMaker.errorAndAddToDb(e, "Error in fetchMCPThreatProtectionTemplates: " + e.getMessage()); + return new ArrayList<>(); + } + } + + public static List fetchMcpAuditInfo(Integer updatedAfter, List remarksList) { + try { + List filters = new ArrayList<>(); + + // Add updatedTimestamp filter if specified + if (updatedAfter != null && updatedAfter > 0) { + filters.add(Filters.gt("updatedTimestamp", updatedAfter)); + } + + // Add remarks filter if specified (exact match any of the values, case-insensitive) + if (remarksList != null && !remarksList.isEmpty()) { + List remarksFilters = new ArrayList<>(); + for (String remark : remarksList) { + if (remark != null && !remark.isEmpty()) { + // Using ^...$ for exact match with case-insensitive flag + remarksFilters.add(Filters.regex("remarks", "^" + remark + "$", "i")); + } + } + // If we have any remarks filters, combine them with OR + if (!remarksFilters.isEmpty()) { + filters.add(Filters.or(remarksFilters)); + } + } + + // Combine filters with AND (handles 0, 1, or multiple filters) + Bson finalFilter = filters.isEmpty() ? Filters.empty() : Filters.and(filters); + + // Fetch MCP audit info matching the filter + List mcpAuditInfoList = McpAuditInfoDao.instance.findAll(finalFilter); + + return mcpAuditInfoList; + } catch (Exception e) { + loggerMaker.errorAndAddToDb(e, "Error in fetchMcpAuditInfo: " + e.getMessage()); + return new ArrayList<>(); + } + } }