package cd.casic.server;

import cd.casic.ci.process.constant.PipelineTargetTypeConstant;
import cd.casic.ci.process.dto.req.sast.SastVulInfoReq;
import cd.casic.ci.process.dto.req.testCase.TestCaseAITaskCreateReq;
import cd.casic.ci.process.dto.resp.ScaVulInfoResp;
import cd.casic.ci.process.process.converter.VulInfoConverter;
import cd.casic.ci.process.process.dataObject.target.TargetVersion;
import cd.casic.ci.process.process.dataObject.volumnInfo.VulInfo;
import cd.casic.ci.process.process.service.sast.SastService;
import cd.casic.ci.process.process.service.testCase.TestCaseAIGeneratorService;
import cd.casic.ci.process.process.service.vulInfo.VulInfoService;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.web.WebAppConfiguration;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.List;


@SpringBootTest(classes = {OpsServerApplication.class})
@ActiveProfiles("local")
@Slf4j
@WebAppConfiguration
public class VulInfoTest {
    @Resource
    private VulInfoService vulInfoService;
    @Resource
    private VulInfoConverter converter;
    @Resource
    private SastService sastService;
    @Test
    public void test() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        System.out.println(vulInfoService.scaVulCountGet(681));
    }
    @Test
    public void scaVulListGet() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        String targetType = PipelineTargetTypeConstant.SOURCE_CODE;
        Integer scaTaskId = 681;
        String targetName="测试目标名称";
        String city = "长沙市";
        String instanceId = "instanceId";
        String taskId = "taskId";
        String taskType ="taskType";
        List<ScaVulInfoResp> scaVulInfoResps = vulInfoService.scaVulListGet(scaTaskId);
        System.out.println(scaVulInfoResps.size());
        System.out.println(scaVulInfoResps);
        List<VulInfo> vulInfos = converter.scaToVulInfo(scaVulInfoResps);
        vulInfos.forEach(item->{
            item.setTargetType(targetType);
            item.setTargetName(targetName);
            item.setCity(city);
            item.setInstanceId(instanceId);
            item.setTaskId(taskId);
            item.setTaskType(taskType);
        });
        vulInfoService.saveBatch(vulInfos);

    }
    @Test
    public void sastTest(){
        String json = "{\"CWE\":[{\"severity\":\"高危\",\"name\":\"CWE-426: 不受信任的搜索路径\",\"count\":2,\"id\":\"8920a916-ecb2-4ce8-a7f1-cc2c5b84a6e0\",\"defect_details\":[{\"path\":\"constant_system\",\"file\":\"constant_system\",\"potential_risk\":\"1. 在使用外部库或组件时，使用其绝对路径以避免被恶意文件或库劫持。\\n\\n2. 验证环境变量和外部输入，确保他们包含与期望一致的值。\\n\\n3. 确保你的应用在运行时拥有正确的权限级别，不应该给予不必要的高权限。\\n\\n4. 使用安全库和框架，允许你加载安全路径，并避免加载不安全路径。\\n\\n5. 尽可能地改变应用程序使其不依赖当前的工作目录以查找其资源。\\n\\n6. 在加载插件或其他可执行代码时，尤其要小心。确保只执行或加载来自可信源的代码。\\n\\n7. 使用操作系统或运行时环境提供的机制来限制可执行路径的搜索范围。例如，Windows具有安全库加载功能，该功能可以限制加载库的目录。\\n\\n8. 对于使用动态链接库(DLL)的Windows应用程序，通过Windows的SafeDllSearchMode机制，可以改变搜索DLL文件的方式。默认情况下，在查找当前目录中的DLL之前，系统将首先在其他目录中查找DLL。避免将应用程序的安装目录设置为当前目录。\",\"line\":4198710,\"propagation_path\":[\"[{\\\"bugId\\\":null,\\\"filePath\\\":null,\\\"line\\\":4198719,\\\"methodName\\\":null,\\\"message\\\":null,\\\"codeSource\\\":null,\\\"variable\\\":null}]\"],\"description\":\"产品使用可指向非产品直接控制下的资源的外部提供的搜索路径来搜索关键资源。\"},{\"path\":\"main\",\"file\":\"main\",\"potential_risk\":\"1. 在使用外部库或组件时，使用其绝对路径以避免被恶意文件或库劫持。\\n\\n2. 验证环境变量和外部输入，确保他们包含与期望一致的值。\\n\\n3. 确保你的应用在运行时拥有正确的权限级别，不应该给予不必要的高权限。\\n\\n4. 使用安全库和框架，允许你加载安全路径，并避免加载不安全路径。\\n\\n5. 尽可能地改变应用程序使其不依赖当前的工作目录以查找其资源。\\n\\n6. 在加载插件或其他可执行代码时，尤其要小心。确保只执行或加载来自可信源的代码。\\n\\n7. 使用操作系统或运行时环境提供的机制来限制可执行路径的搜索范围。例如，Windows具有安全库加载功能，该功能可以限制加载库的目录。\\n\\n8. 对于使用动态链接库(DLL)的Windows应用程序，通过Windows的SafeDllSearchMode机制，可以改变搜索DLL文件的方式。默认情况下，在查找当前目录中的DLL之前，系统将首先在其他目录中查找DLL。避免将应用程序的安装目录设置为当前目录。\",\"line\":4198727,\"propagation_path\":[\"[{\\\"bugId\\\":null,\\\"filePath\\\":null,\\\"line\\\":4198819,\\\"methodName\\\":null,\\\"message\\\":null,\\\"codeSource\\\":null,\\\"variable\\\":null}]\"],\"description\":\"产品使用可指向非产品直接控制下的资源的外部提供的搜索路径来搜索关键资源。\"}]},{\"severity\":\"高危\",\"name\":\"CWE-78: 操作系统命令中对特殊元素的不正确中和处理（'操作系统命令注入'）\",\"count\":1,\"id\":\"348e72d7-6af7-4c63-8bad-68430f45af28\",\"defect_details\":[{\"path\":\"main\",\"file\":\"main\",\"potential_risk\":\"操作系统命令注入（OS Command Injection）是一种严重的安全漏洞，它可能导致以下后果：\\n\\n1. 不授权访问：攻击者可能会利用这个漏洞执行未经授权的系统命令，这可能导致系统信息泄露或者更严重的后果，例如删除重要文件，下载恶意软件，甚至获取管理员权限。\\n\\n2. 数据丢失： 如果攻击者得以执行删除或修改数据的命令，可能会导致重要数据丢失。\\n\\n3. 系统崩溃：在某些情况下，攻击者可能能够通过执行某些命令导致操作系统崩溃，从而一定程度上拒绝服务（Denial of Service，简称DoS）。\\n\\n4. 恶意软件的传播：攻击者可以通过命令注入下载并执行恶意软件，攻击其他系统或者进行勒索软件等攻击。\\n\\n5. 系统控制：在最极端的情况下，攻击者可能会完全接管操作系统，获得对系统的完全控制权。\",\"line\":4198727,\"propagation_path\":[\"[{\\\"bugId\\\":null,\\\"filePath\\\":null,\\\"line\\\":4198819,\\\"methodName\\\":null,\\\"message\\\":null,\\\"codeSource\\\":null,\\\"variable\\\":null}]\"],\"description\":\"产品使用来自上游组件的受外部影响的输入构造操作系统命令的全部或部分，但它未能抵消或错误地抵消可能在发送到下游组件时修改预期操作系统命令的特殊元素。\"}]}]}";
        JSONObject jsonObject = JSONObject.parseObject(json);
        for (String key : jsonObject.keySet()) {
            String string = jsonObject.getString(key);
            List<SastVulInfoReq> sastVulInfoReqs = JSONArray.parseArray(string, SastVulInfoReq.class);
            sastService.saveReportVulInfo(sastVulInfoReqs,"targetType","targetName","city","instanceId","taskId","taskType");
        }
    }
}
