package com.nis.web.controller.configuration; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.taglibs.standard.functions.Functions; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.nis.domain.FunctionRegionDict; import com.nis.domain.Page; import com.nis.domain.SysDataDictionaryItem; import com.nis.domain.configuration.AppBuiltInFeatureFile; import com.nis.domain.configuration.AppByteCfg; import com.nis.domain.configuration.AppComplexFeatureCfg; import com.nis.domain.configuration.AppDomainCfg; import com.nis.domain.configuration.AppFeatureIndex; import com.nis.domain.configuration.AppHeaderCfg; import com.nis.domain.configuration.AppHttpCfg; import com.nis.domain.configuration.AppIpCfg; import com.nis.domain.configuration.AppPolicyCfg; import com.nis.domain.configuration.AppSslCertCfg; import com.nis.domain.configuration.AppStringFeatureCfg; import com.nis.domain.configuration.AppTcpCfg; import com.nis.domain.configuration.AppTopicDomainCfg; import com.nis.domain.configuration.BaseStringCfg; import com.nis.domain.configuration.CfgIndexInfo; import com.nis.domain.configuration.IpPortCfg; import com.nis.domain.configuration.NtcSubscribeIdCfg; import com.nis.domain.configuration.PxyObjTrustedCaCert; import com.nis.domain.configuration.WebsiteDomainTopic; import com.nis.domain.maat.ToMaatResult; import com.nis.domain.maat.ToMaatResult.ResponseData; import com.nis.domain.specific.SpecificServiceCfg; import com.nis.exceptions.CallExternalProceduresException; import com.nis.exceptions.MaatConvertException; import com.nis.util.ConfigServiceUtil; import com.nis.util.Constants; import com.nis.util.DictUtils; import com.nis.util.FileUtils; import com.nis.util.JsonMapper; import com.nis.util.StringUtil; import com.nis.web.controller.BaseController; import com.nis.web.security.UserUtils; /** * 特定协议相关配置控制类 * * @author zhangwei * */ @Controller @RequestMapping("${adminPath}/app/feature/") public class AppFeatureCfgController extends BaseController { /** * app协议复杂特征配置列表 * * @param model * @param cfg * @param request * @param response * @return */ @RequestMapping(value = { "multiFeatureCfgList" }) public String multiFeatureCfgList(Model model, @ModelAttribute("cfg") AppFeatureIndex cfg, HttpServletRequest request, HttpServletResponse response) { Page searchPage = new Page(request, response, "r"); Page page = appMultiFeatureCfgService.findAppFeatureIndexList(searchPage, cfg); for (AppFeatureIndex entity : page.getList()) { SpecificServiceCfg app = specificServiceCfgService.getBySpecServiceId(entity.getSpecServiceId()); entity.setAppName(app.getSpecServiceName()); } model.addAttribute("page", page); initPageCondition(model, cfg); return "/cfg/app/appMultiFeatureCfgList"; } /** * 特征配置表单 * * @param model * @param ids * @param entity * @return */ @RequestMapping(value = { "multiFeatureCfgForm" }) public String multiFeatureCfgForm(Model model, String ids, AppFeatureIndex entity) { if (StringUtils.isNotBlank(ids)) { entity = appMultiFeatureCfgService.getAppFeatureIndex(Long.parseLong(ids)); entity.setIpPortList( appMultiFeatureCfgService.getAppIpRangeCfg(entity.getCompileId(), entity.getFunctionId())); entity.setStrList(appMultiFeatureCfgService.getAppStringFeatureCfg(entity.getCompileId(), entity.getFunctionId(), null)); entity.setComplexList(appMultiFeatureCfgService.getAppComplexFeatureCfg(entity.getCompileId(), entity.getFunctionId(), null)); entity.setNumCfgList( appMultiFeatureCfgService.getAppTcpCfg(entity.getCompileId(), entity.getFunctionId(), null)); initUpdateFormCondition(model, entity); } else { initFormCondition(model, entity); } model.addAttribute("_cfg", entity); return "/cfg/app/appMultiFeatureCfgForm"; } /** * 特征配置新增修改 * * @param model * @param request * @param response * @param entity * @param redirectAttributes * @return */ @RequestMapping(value = { "saveAppMultiFeatureCfg" }) public String saveAppMultiFeatureCfg(Model model, HttpServletRequest request, HttpServletResponse response, AppFeatureIndex entity, RedirectAttributes redirectAttributes) { try { SpecificServiceCfg specificService = specificServiceCfgService .getBySpecServiceId(entity.getSpecServiceId()); if (specificService != null) { entity.setAppCode(specificService.getSpecServiceCode()); } appMultiFeatureCfgService.saveOrUpdateAppFeatureCfg(entity); addMessage(redirectAttributes, "success", "save_success"); } catch (Exception e) { e.printStackTrace(); if (e instanceof MaatConvertException) { addMessage(redirectAttributes, "error", "request_service_failed"); } else { addMessage(redirectAttributes, "error", "save_failed"); } } return "redirect:" + adminPath + "/app/feature/multiFeatureCfgList?functionId=" + entity.getFunctionId(); } /** * 特征配置审核 * * @param isAudit * @param isValid * @param ids * @param functionId * @param redirectAttributes * @return */ @RequestMapping(value = { "auditAppFeatureCfg" }) public String auditAppFeatureCfg(Model model, @ModelAttribute("cfg") AppFeatureIndex cfg, Integer isValid, Integer isAudit, String ids, Integer functionId, RedirectAttributes redirectAttributes, HttpServletResponse response, HttpServletRequest request) { if (!StringUtil.isEmpty(ids)) { AppFeatureIndex entity = new AppFeatureIndex(); String[] idArray = ids.split(","); for (String id : idArray) { entity = appMultiFeatureCfgService.getAppFeatureIndex(Long.parseLong(id)); entity.setIsAudit(isAudit); entity.setIsValid(isValid); entity.setAuditorId(UserUtils.getUser().getId()); entity.setAuditTime(new Date()); entity.setFunctionId(functionId); try { appMultiFeatureCfgService.auditAppFeatureCfg(entity, isAudit); addMessage(redirectAttributes, "success", "audit_success"); } catch (MaatConvertException e) { e.printStackTrace(); logger.error("app 特征配置下发失败:" + e.getMessage()); addMessage(redirectAttributes, "error", "request_service_failed"); } catch (Exception e) { e.printStackTrace(); logger.error("app 特征配置下发失败:" + e.getMessage()); addMessage(redirectAttributes, "error", "audit_failed"); } } } else { Page searchPage = new Page(request, response, "r"); Page auditPage = new Page(request, response, "r"); try { BeanUtils.copyProperties(searchPage, auditPage); auditAll(auditPage, isValid, cfg); addMessage(redirectAttributes, "success", "audit_success"); } catch (Exception e) { logger.error("配置下发失败:", e); if (e instanceof MaatConvertException) { addMessage(redirectAttributes, "error", "request_service_failed"); } else { addMessage(redirectAttributes, "error", "audit_failed"); } } return multiFeatureCfgList(model, cfg, request, response); } return "redirect:" + adminPath + "/app/feature/multiFeatureCfgList?functionId=" + functionId; } /** * 特征配置删除 * * @param isValid * @param ids * @param functionId * @return */ @RequestMapping(value = { "updateAppFeatureCfgValid" }) public String updateAppFeatureCfgValid(Integer isValid, String ids, Integer functionId) { appMultiFeatureCfgService.updateAppFeatureCfgValid(isValid, ids, functionId); return "redirect:" + adminPath + "/app/feature/multiFeatureCfgList?functionId=" + functionId; } /** * 查询特征子配置 * * @param model * @param cfgId * @param index * @return */ @RequestMapping(value = { "ajaxAppFeatureList" }) public String ajaxAppFeatureList(Model model, Long cfgId, Integer compileId, Integer functionId, Integer index) { List ipRangeList = appMultiFeatureCfgService.getAppIpRangeCfg(compileId, functionId); AppFeatureIndex cfg = appMultiFeatureCfgService.getAppFeatureIndex(cfgId); List> tabList = new ArrayList(); String[] cfgRegionValue = cfg.getCfgRegionValue().split(","); String[] cfgRegionType = cfg.getCfgRegionType().split(","); String[] cfgRegionCode = cfg.getCfgRegionCode1().split(","); if (cfgRegionValue.length == cfgRegionType.length && cfgRegionValue.length == cfgRegionCode.length) { for (int i = 0; i < cfgRegionValue.length; i++) { Map map = new HashMap(); map.put("regionType", cfgRegionType[i]); map.put("regionValue", cfgRegionValue[i]); if ("1".equals(cfgRegionType[i])) { map.put("ipRangeList", ipRangeList); } if ("2".equals(cfgRegionType[i])) { List strList = appMultiFeatureCfgService.getAppStringFeatureCfg(compileId, functionId, Integer.valueOf(cfgRegionCode[i])); map.put("strList", strList); } if ("3".equals(cfgRegionType[i])) { List complexList = appMultiFeatureCfgService .getAppComplexFeatureCfg(compileId, functionId, Integer.valueOf(cfgRegionCode[i])); map.put("complexList", complexList); } if ("4".equals(cfgRegionType[i])) { List numCfgList = appMultiFeatureCfgService.getAppTcpCfg(compileId, functionId, Integer.valueOf(cfgRegionCode[i])); map.put("numCfgList", numCfgList); } tabList.add(map); } } else { Map map = new HashMap(); map.put("regionType", "0"); map.put("regionValue", "query config detail error"); tabList.add(map); } /* * if(ipRangeList!=null){ String cfgType = null; for(AppIpCfg * ip:ipRangeList){ if(!ip.getCfgType().equals(cfgType)){ * tabList.add(new String[]{"1",ip.getCfgType()}); cfgType = * ip.getCfgType(); } } } if(strList!=null){ String cfgType = null; * for(AppStringFeatureCfg cfg:strList){ * if(!cfg.getCfgType().equals(cfgType)){ tabList.add(new * String[]{"2",cfg.getCfgType()}); cfgType = cfg.getCfgType(); } } } * if(complexList!=null){ String cfgType = null; * for(AppComplexFeatureCfg cfg:complexList){ * if(!cfg.getCfgType().equals(cfgType)){ tabList.add(new * String[]{"3",cfg.getCfgType()}); cfgType = cfg.getCfgType();0. * * } } } */ model.addAttribute("index", index); model.addAttribute("tabList", tabList); return "/cfg/app/appSubFeatureList"; } // appfeature配置导出 @RequestMapping(value = "exportFeature") public void exportFeature(Model model, HttpServletRequest request, HttpServletResponse response, @ModelAttribute("cfg") AppFeatureIndex entity, String ids, RedirectAttributes redirectAttributes) { try { // export data info List titleList = new ArrayList(); Map> classMap = new HashMap>(); Map dataMap = new HashMap(); Map noExportMap = new HashMap(); List ipLists = new ArrayList(); // 导出选中记录 if (!StringUtil.isEmpty(ids)) { ipLists = appMultiFeatureCfgService.findAppByFeatureIndexList(ids); } else { Page pageInfo = new Page(request, response, "r"); pageInfo.setPageNo(1); pageInfo.setPageSize(Constants.MAX_EXPORT_SIZE); Page page = appMultiFeatureCfgService.findAppFeatureIndexList(pageInfo, entity); ipLists = page.getList(); } for (AppFeatureIndex feature : ipLists) { SpecificServiceCfg app = specificServiceCfgService.getBySpecServiceId(feature.getSpecServiceId()); feature.setAppName(app.getSpecServiceName()); } String cfgIndexInfoNoExport = ",letter,whether_area_block,classification,attribute,label,do_log,block_type,client_port,ir_type,group_name,userregion1,userregion2,userregion3,userregion4,userregion5,"; String appComplexNoExport = ",do_log,block_type,config_describe,valid_identifier,is_audit,creator,creator" + ",config_time,editor,edit_time,auditor,audit_time" + ",letter,whether_area_block,classification,attribute,label" + ",userregion1,userregion2,userregion3,userregion4,userregion5,"; String ipPortInfoNoExport = ",do_log,block_type,config_describe,valid_identifier,is_audit,creator,creator" + ",config_time,editor,edit_time,auditor,audit_time" + ",letter,whether_area_block,classification,attribute,label" + ",userregion1,userregion2,userregion3,userregion4,userregion5,ir_type,group_name,"; // 时间过滤 if (entity.getSearch_create_time_start() == null && entity.getSearch_create_time_end() == null) { cfgIndexInfoNoExport = ",config_time" + cfgIndexInfoNoExport; } if (entity.getSearch_edit_time_start() == null && entity.getSearch_edit_time_end() == null) { cfgIndexInfoNoExport = ",edit_time" + cfgIndexInfoNoExport; } if (entity.getSearch_audit_time_start() == null && entity.getSearch_audit_time_end() == null) { cfgIndexInfoNoExport = ",audit_time" + cfgIndexInfoNoExport; } if (!StringUtil.isEmpty(entity.gethColumns())) { cfgIndexInfoNoExport = "," + entity.gethColumns() + "," + cfgIndexInfoNoExport; } titleList.add(entity.getMenuNameCode()); classMap.put(entity.getMenuNameCode(), AppFeatureIndex.class); noExportMap.put(entity.getMenuNameCode(), cfgIndexInfoNoExport); List ipList = new ArrayList(); List keywordList = new ArrayList(); List strList = new ArrayList(); for (AppFeatureIndex cfg : ipLists) { Map maps = appMultiFeatureCfgService.exportFeature(cfg); if (entity.getFunctionId() != 567) { keywordList.addAll(maps.get("APP_KEYWORDS")); } else { strList.addAll(maps.get("APP_DK_GL")); } ipList.addAll(maps.get("APP_IP_RANGE")); } dataMap.put(entity.getMenuNameCode(), ipLists); if (entity.getFunctionId() != 564 && entity.getFunctionId() != 567) { keywordList = replaceKeyList(keywordList); titleList.add("APP_IP_RANGE"); classMap.put("APP_IP_RANGE", IpPortCfg.class); noExportMap.put("APP_IP_RANGE", ipPortInfoNoExport); dataMap.put("APP_IP_RANGE", ipList); } if (entity.getFunctionId() == 563) { titleList.add("APP_PAYLOAD"); classMap.put("APP_PAYLOAD", AppComplexFeatureCfg.class); noExportMap.put("APP_PAYLOAD", appComplexNoExport); dataMap.put("APP_PAYLOAD", keywordList); } else if (entity.getFunctionId() == 565) { titleList.add("APP_HTTP"); classMap.put("APP_HTTP", AppComplexFeatureCfg.class); noExportMap.put("APP_HTTP", appComplexNoExport); dataMap.put("APP_HTTP", keywordList); } else if (entity.getFunctionId() == 566) { titleList.add("APP_SSL"); classMap.put("APP_SSL", AppComplexFeatureCfg.class); noExportMap.put("APP_SSL", appComplexNoExport); dataMap.put("APP_SSL", keywordList); } else if (entity.getFunctionId() == 564) { keywordList = replaceKeyList(keywordList); titleList.add("APP_DNS"); classMap.put("APP_DNS", AppComplexFeatureCfg.class); noExportMap.put("APP_DNS", appComplexNoExport); dataMap.put("APP_DNS", keywordList); } else if (entity.getFunctionId() == 567) { strList = replaceFeatureList(strList); appComplexNoExport = appComplexNoExport + "district,"; titleList.add("APP_DK"); classMap.put("APP_DK", AppStringFeatureCfg.class); noExportMap.put("APP_DK", appComplexNoExport); dataMap.put("APP_DK", strList); } /* } */ String timeRange = initTimeMap(entity); noExportMap.put("timeRange", timeRange); if ("csv".equals(entity.getExType())) { this._exportCsv(model, request, response, redirectAttributes, entity.getMenuNameCode(), titleList, classMap, dataMap, noExportMap); } else { this._export(model, request, response, redirectAttributes, entity.getMenuNameCode(), titleList, classMap, dataMap, noExportMap); } } catch (Exception e) { logger.error("Appfeature export failed", e); addMessage(redirectAttributes, "error", "export_failed"); } // return "redirect:" + adminPath // +"/ntc/iplist/list?functionId="+entity.getFunctionId(); } public static List replaceKeyList(List list) { for (int i = 0; i < list.size(); i++) { AppComplexFeatureCfg base = (AppComplexFeatureCfg) list.get(i); base.setIsHex(base.getIsHexbin()); // '默认为0:大小写不敏感,且非HEX;1:HEX格式二进制;2:大小写敏感,且非HEX', if(base.getIsHexbin()==2){ base.setIsCaseInsenstive(1); }else{ base.setIsCaseInsenstive(0); } base.setCfgKeywords(Functions.replace(base.getCfgKeywords(), "***and***", " ")); } return list; } public static List replaceFeatureList(List list) { for (int i = 0; i < list.size(); i++) { AppStringFeatureCfg base = (AppStringFeatureCfg) list.get(i); base.setIsHex(base.getIsHexbin()); // '默认为0:大小写不敏感,且非HEX;1:HEX格式二进制;2:大小写敏感,且非HEX', if(base.getIsHexbin()==2){ base.setIsCaseInsenstive(1); }else{ base.setIsCaseInsenstive(0); } base.setCfgKeywords(Functions.replace(base.getCfgKeywords(), "***and***", " ")); } return list; } }