Source/UBCS/ubcs-common/src/main/java/com/vci/ubcs/common/validator/ComprehensiveFileValidator.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,477 @@ package com.vci.ubcs.common.validator; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import javax.annotation.PostConstruct; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; /** * æä»¶å®å ¨éªè¯å¨ */ @Component @Slf4j public class ComprehensiveFileValidator { /** * æä»¶ç½åå */ @Value("${app.upload.security.allowed-extensions:jpg,jpeg,png,pdf}") private String allowedExtensionsConfig; /** * å¤éæ©å±åæä»¶ç¦æ¢ */ @Value("${app.upload.security.prevent-multiple-extensions:true}") private boolean preventMultipleExtensions; /** * éå¶çå±é©æä»¶ç±»å */ @Value("${app.upload.security.dangerous-primary-extensions:jsp,jspx,php,asp,aspx,war,exe,sh,bat}") private String dangerousExtensionsConfig; /** * æä»¶å å®¹ç±»åæ¯å¦å¹é æ ¡éª */ @Value("${app.upload.security.validate-content-type:true}") private boolean validateContentType; /** * æä»¶å¤´éªè¯ */ @Value("${app.upload.security.validate-file-header:true}") private boolean validateFileHeader; /** * ä¸¥æ ¼æ¨¡å¼ */ @Value("${app.upload.security.strict-mode:false}") private boolean strictMode; /** * å 许ä¸ä¼ çåç¼ */ private Set<String> allowedExtensions; /** * å±é©çæä»¶åç¼ */ private Set<String> dangerousPrimaryExtensions; @PostConstruct public void init() { // è§£æéå·åéçé ç½® this.allowedExtensions = parseCommaSeparatedConfig(allowedExtensionsConfig); this.dangerousPrimaryExtensions = parseCommaSeparatedConfig(dangerousExtensionsConfig); log.info("æä»¶ä¸ä¼ éªè¯å¨åå§å宿"); log.info("å è®¸çæ©å±å: {}", allowedExtensions); log.info("å±é©æ©å±å: {}", dangerousPrimaryExtensions); } private Set<String> parseCommaSeparatedConfig(String config) { if (config == null || config.trim().isEmpty()) { return new HashSet<>(); } return Arrays.stream(config.split(",")) .map(String::trim) .map(String::toLowerCase) .collect(Collectors.toSet()); } /** * éªè¯å个æä»¶ */ public UploadValidationResult validateFile(MultipartFile file) { UploadValidationResult result = new UploadValidationResult(); try { // åºç¡æ£æ¥ if (!basicValidation(file, result)) { return result; } String filename = file.getOriginalFilename(); // æä»¶åå®å ¨éªè¯ if (!filenameSecurityValidation(filename, result)) { return result; } // å 容å®å ¨éªè¯ if (!contentSecurityValidation(file, result)) { return result; } result.setValid(true); result.setMessage("æä»¶éªè¯éè¿"); } catch (Exception e) { log.error("æä»¶éªè¯å¼å¸¸", e); result.setValid(false); result.setMessage("éªè¯è¿ç¨åçå¼å¸¸"); } return result; } /** * éªè¯å¤ä¸ªæä»¶ * @param files æä»¶å表 * @return å¤ä¸ªæä»¶çéªè¯ç»æ */ public MultiUploadValidationResult validateFiles(List<MultipartFile> files) { return validateFiles(files, false); } /** * éªè¯å¤ä¸ªæä»¶ * @param files æä»¶å表 * @param stopOnFirstError éå°ç¬¬ä¸ä¸ªé误æ¯å¦åæ¢éªè¯ * @return å¤ä¸ªæä»¶çéªè¯ç»æ */ public MultiUploadValidationResult validateFiles(List<MultipartFile> files, boolean stopOnFirstError) { MultiUploadValidationResult result = new MultiUploadValidationResult(); if (files == null || files.isEmpty()) { result.setValid(false); result.setMessage("æä»¶å表为空"); return result; } List<FileValidationDetail> details = new ArrayList<>(); boolean allValid = true; for (int i = 0; i < files.size(); i++) { MultipartFile file = files.get(i); FileValidationDetail detail = new FileValidationDetail(); detail.setFileName(file.getOriginalFilename()); detail.setFileIndex(i); detail.setFileSize(file.getSize()); // éªè¯å个æä»¶ UploadValidationResult singleResult = validateFile(file); detail.setValid(singleResult.isValid()); detail.setMessage(singleResult.getMessage()); detail.setDetectedType(singleResult.getDetectedType()); details.add(detail); if (!singleResult.isValid()) { allValid = false; if (stopOnFirstError) { // éå°é误ä¸è®¾ç½®ä¸ºå¿«é失败ï¼ç«å³è¿å result.setValid(false); result.setMessage("第" + (i + 1) + "个æä»¶éªè¯å¤±è´¥: " + file.getOriginalFilename()); result.setDetails(details); result.setFailedIndex(i); return result; } } } result.setValid(allValid); result.setMessage(allValid ? "æææä»¶éªè¯éè¿" : "é¨åæä»¶éªè¯å¤±è´¥"); result.setDetails(details); result.setTotalFiles(files.size()); result.setValidFiles((int) details.stream().filter(FileValidationDetail::isValid).count()); result.setInvalidFiles((int) details.stream().filter(d -> !d.isValid()).count()); return result; } /** * éªè¯å¤ä¸ªæä»¶ï¼æ°ç»çæ¬ï¼ */ public MultiUploadValidationResult validateFiles(MultipartFile[] files) { return validateFiles(Arrays.asList(files)); } /** * éªè¯å¤ä¸ªæä»¶ï¼æ°ç»çæ¬ï¼å¯è®¾ç½®æ¯å¦å¿«éå¤±è´¥ï¼ */ public MultiUploadValidationResult validateFiles(MultipartFile[] files, boolean stopOnFirstError) { return validateFiles(Arrays.asList(files), stopOnFirstError); } /** * æ¹ééªè¯æä»¶å¹¶è¿åææçæä»¶å表 */ public List<MultipartFile> getValidFiles(List<MultipartFile> files) { MultiUploadValidationResult result = validateFiles(files); List<MultipartFile> validFiles = new ArrayList<>(); for (int i = 0; i < files.size(); i++) { if (result.getDetails().get(i).isValid()) { validFiles.add(files.get(i)); } } return validFiles; } /** * æ£æ¥æ¯å¦æææä»¶é½ææ */ public boolean areAllFilesValid(List<MultipartFile> files) { MultiUploadValidationResult result = validateFiles(files); return result.isValid(); } // åæçç§ææ¹æ³ä¿æä¸å private boolean basicValidation(MultipartFile file, UploadValidationResult result) { if (file == null || file.isEmpty()) { result.setMessage("æä»¶ä¸ºç©º"); return false; } String filename = file.getOriginalFilename(); if (filename == null || filename.trim().isEmpty()) { result.setMessage("æä»¶å为空"); return false; } return true; } private boolean filenameSecurityValidation(String filename, UploadValidationResult result) { // è·¯å¾éåæ£æ¥ if (filename.contains("..") || filename.contains("/") || filename.contains("\\")) { result.setMessage("æä»¶åå å«å±é©å符"); return false; } // æ©å±åæ£æ¥ String finalExtension = getFinalExtension(filename); if (finalExtension.isEmpty() || !allowedExtensions.contains(finalExtension.toLowerCase())) { result.setMessage("䏿¯æçæä»¶ç±»å: " + finalExtension); return false; } // å¤éæ©å±åæ£æ¥ if (preventMultipleExtensions && hasMultipleExtensions(filename)) { if (strictMode) { // ä¸¥æ ¼æ¨¡å¼ï¼æ¦æªææå¤éæ©å±å result.setMessage("å¤éæ©å±åæä»¶è¢«ç¦æ¢"); return false; } else { // æ®é模å¼ï¼åªæ¦æªå å«å±é©æ©å±åçå¤éæ©å±å if (containsDangerousExtension(filename)) { result.setMessage("æ£æµå°ä¼ªè£ Webshellæä»¶: " + filename); return false; } } } return true; } private boolean contentSecurityValidation(MultipartFile file, UploadValidationResult result) { // å 容类åéªè¯ if (validateContentType && !validateContentType(file)) { result.setMessage("æä»¶å 容类åä¸å¹é "); return false; } // æä»¶å¤´éªè¯ if (validateFileHeader && !validateFileHeader(file)) { result.setMessage("æä»¶å¤´éªè¯å¤±è´¥"); return false; } return true; } private boolean hasMultipleExtensions(String filename) { String name = getFileNameWithoutPath(filename); return name.chars().filter(ch -> ch == '.').count() > 1; } private boolean containsDangerousExtension(String filename) { String name = getFileNameWithoutPath(filename); String[] parts = name.split("\\."); // æ£æ¥é¤æåä¸ä¸ªæ©å±åä¹å¤çææé¨å for (int i = 0; i < parts.length - 1; i++) { String part = parts[i].toLowerCase(); if (dangerousPrimaryExtensions.contains(part)) { return true; } } return false; } private boolean validateContentType(MultipartFile file) { try { String declaredType = file.getContentType(); if (declaredType == null) { return true; // 没æå£°æç±»åï¼æ¾è¿ } // ç®åçç±»åå¹é æ£æ¥ String finalExtension = getFinalExtension(file.getOriginalFilename()).toLowerCase(); return isContentTypeConsistent(declaredType, finalExtension); } catch (Exception e) { log.error("å 容类åéªè¯å¤±è´¥", e); return false; } } /** * éªè¯æä»¶çå 容类åï¼Content-Typeï¼æ¯å¦ä¸æä»¶æ©å±åä¸è´ * @param contentType * @param extension * @return */ private boolean isContentTypeConsistent(String contentType, String extension) { // æ©å±æ´å ¨é¢çç±»åæ å° Map<String, String> expectedTypes = new HashMap<>(); // å¾çç±»å expectedTypes.put("jpg", "image/jpeg"); expectedTypes.put("jpeg", "image/jpeg"); expectedTypes.put("png", "image/png"); expectedTypes.put("gif", "image/gif"); expectedTypes.put("bmp", "image/bmp"); expectedTypes.put("webp", "image/webp"); expectedTypes.put("svg", "image/svg+xml"); // ææ¡£ç±»å expectedTypes.put("pdf", "application/pdf"); expectedTypes.put("doc", "application/msword"); expectedTypes.put("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); expectedTypes.put("xls", "application/vnd.ms-excel"); expectedTypes.put("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); expectedTypes.put("ppt", "application/vnd.ms-powerpoint"); expectedTypes.put("pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"); expectedTypes.put("txt", "text/plain"); // å缩æä»¶ expectedTypes.put("zip", "application/zip"); expectedTypes.put("rar", "application/x-rar-compressed"); expectedTypes.put("7z", "application/x-7z-compressed"); String expectedType = expectedTypes.get(extension); return expectedType == null || expectedType.equalsIgnoreCase(contentType); } private boolean validateFileHeader(MultipartFile file) { try { byte[] header = new byte[8]; int bytesRead = file.getInputStream().read(header); if (bytesRead < 4) { return false; } String finalExtension = getFinalExtension(file.getOriginalFilename()).toLowerCase(); // åºç¡çæä»¶å¤´éªè¯ switch (finalExtension) { case "jpg": case "jpeg": return isJpeg(header); case "png": return isPng(header); case "pdf": return isPdf(header); case "gif": return isGif(header); default: return true; // å ¶ä»ç±»åä¸éªè¯æä»¶å¤´ } } catch (IOException e) { log.error("æä»¶å¤´éªè¯å¤±è´¥", e); return false; } } /** * æä»¶å¤´éªè¯æ¹æ³ * @param header * @return */ private boolean isJpeg(byte[] header) { return (header[0] & 0xFF) == 0xFF && (header[1] & 0xFF) == 0xD8; } private boolean isPng(byte[] header) { return header[0] == (byte) 0x89 && header[1] == 0x50 && header[2] == 0x4E && header[3] == 0x47; } private boolean isPdf(byte[] header) { return header[0] == 0x25 && header[1] == 0x50 && header[2] == 0x44 && header[3] == 0x46; } private boolean isGif(byte[] header) { return header[0] == 'G' && header[1] == 'I' && header[2] == 'F' && header[3] == '8'; } // è¾ å©æ¹æ³ private String getFinalExtension(String filename) { if (filename == null || !filename.contains(".")) return ""; String[] parts = filename.split("\\."); return parts[parts.length - 1]; } private String getFileNameWithoutPath(String filename) { if (filename == null) return ""; filename = filename.replace('\\', '/'); int lastSlash = filename.lastIndexOf('/'); return lastSlash >= 0 ? filename.substring(lastSlash + 1) : filename; } @Data public static class UploadValidationResult { private boolean valid; private String message; private String detectedType; public UploadValidationResult() { this.valid = false; this.message = ""; } } /** * 夿件éªè¯ç»æ */ @Data public static class MultiUploadValidationResult { private boolean valid; private String message; private int totalFiles; private int validFiles; private int invalidFiles; private int failedIndex = -1; // 第ä¸ä¸ªå¤±è´¥çæä»¶ç´¢å¼ private List<FileValidationDetail> details; public MultiUploadValidationResult() { this.valid = false; this.message = ""; this.details = new ArrayList<>(); } } /** * å个æä»¶éªè¯è¯¦æ */ @Data public static class FileValidationDetail { private String fileName; private int fileIndex; private long fileSize; private boolean valid; private String message; private String detectedType; } } Source/UBCS/ubcs-gateway/src/main/java/com/vci/ubcs/gateway/filter/EssentialSecurityFilter.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,42 @@ package com.vci.ubcs.gateway.filter; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; /** * ç½å ³è¿æ»¤å¨ï¼æ¦æªæç¡®çæ»å»ç¹å¾ */ public class EssentialSecurityFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); String path = request.getPath().value(); // åªæ¦æªæå±é©çè¯·æ± if (isDefinitelyDangerous(path)) { return blockRequest(exchange, "å±é©è¯·æ±è¢«æ¦æªï¼"); } return chain.filter(exchange); } private boolean isDefinitelyDangerous(String path) { // åªæ¦æªæç¡®çæ»å»ç¹å¾ return path.contains("../") || path.contains("/WEB-INF/") || path.matches(".*\\.(jsp|war|sh|bat|exe)$") || path.contains("cmd.exe") || path.contains("/bin/"); } private Mono<Void> blockRequest(ServerWebExchange exchange, String message) { exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN); return exchange.getResponse().setComplete(); } } Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowManagerController.java
@@ -18,6 +18,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.vci.ubcs.common.validator.ComprehensiveFileValidator; import com.vci.ubcs.flow.engine.entity.FlowProcess; import com.vci.ubcs.flow.engine.service.FlowEngineService; import io.swagger.annotations.Api; @@ -31,6 +32,7 @@ import org.springblade.core.tool.support.Kv; import org.springblade.core.tool.utils.Func; import com.vci.ubcs.flow.engine.constant.FlowEngineConstant; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -47,10 +49,15 @@ @RequestMapping("manager") @AllArgsConstructor @Api(value = "æµç¨ç®¡çæ¥å£", tags = "æµç¨ç®¡çæ¥å£") //@PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR) public class FlowManagerController { private final FlowEngineService flowEngineService; /** * æä»¶å®å ¨æ£æ¥ */ @Autowired private ComprehensiveFileValidator fileValidator; /** * å页 @@ -98,6 +105,11 @@ @ApiOperationSupport(order = 4) @ApiOperation(value = "ä¸ä¼ é¨ç½²æµç¨æä»¶", notes = "ä¼ å ¥æä»¶") public R checkUpload(@RequestParam MultipartFile file) { // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.UploadValidationResult result = fileValidator.validateFile(file); if (!result.isValid()) { return R.fail(result.getMessage()); } boolean temp = Objects.requireNonNull(file.getOriginalFilename()).endsWith(FlowEngineConstant.SUFFIX); return R.data(Kv.create().set("name", file.getOriginalFilename()).set("success", temp)); } @@ -114,6 +126,11 @@ public R deployUpload(@RequestParam List<MultipartFile> files, @RequestParam String category, @RequestParam(required = false, defaultValue = "") String tenantIds) { // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.MultiUploadValidationResult result = fileValidator.validateFiles(files,true); if (!result.isValid()) { return R.fail(result.getMessage()); } return R.status(flowEngineService.deployUpload(files, category, Func.toStrList(tenantIds))); } Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/FileController.java
@@ -1,8 +1,8 @@ package com.vci.ubcs.resource.controller; import com.alibaba.fastjson.JSON; import com.alibaba.nacos.common.utils.StringUtils; import com.baomidou.mybatisplus.core.metadata.IPage; import com.vci.ubcs.common.validator.ComprehensiveFileValidator; import com.vci.ubcs.resource.dto.FileObjectDTO; import com.vci.ubcs.resource.dto.FileReleaseDTO; import com.vci.ubcs.resource.dto.FileShareDTO; @@ -10,14 +10,11 @@ import com.vci.ubcs.resource.service.IFileService; import com.vci.ubcs.resource.utils.FileDownloadUtil; import com.vci.ubcs.resource.vo.FileObjectVO; import com.vci.ubcs.starter.exception.VciBaseException; import com.vci.ubcs.starter.web.util.ControllerUtil; import com.vci.ubcs.starter.web.util.LangBaseUtil; import com.vci.ubcs.starter.web.util.VciBaseUtil; import lombok.extern.java.Log; import lombok.extern.slf4j.Slf4j; import org.springblade.core.mp.support.Query; import org.springblade.core.oss.MinioTemplate; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; import org.springframework.beans.factory.annotation.Autowired; @@ -45,6 +42,12 @@ */ @Autowired private IFileService fileService; /** * æä»¶å®å ¨æ£æ¥ */ @Autowired private ComprehensiveFileValidator fileValidator; /** * æ ¹æ®æä»¶ä¸»é®ä¸è½½æä»¶ @@ -82,7 +85,7 @@ if(StringUtil.isBlank(msg)){ msg = "æªç¥é误"; } log.debug(msg); log.error(msg); return R.fail(msg); } return R.success("å 餿å"); @@ -97,6 +100,12 @@ @PostMapping("/uploadFile") public R<FileObjectVO> uploadFile(MultipartFile file, FileObjectDTO fileObjectDTO){ if (file != null ) { // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.UploadValidationResult result = fileValidator.validateFile(file); if (!result.isValid()) { return R.fail(result.getMessage()); } //ä¸ä¼ æä»¶ return fileService.uploadFile(file, fileObjectDTO); } else { return R.fail("æ ä¸ä¼ çæä»¶"); Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/endpoint/OssEndpoint.java
@@ -17,6 +17,7 @@ package com.vci.ubcs.resource.endpoint; import com.vci.ubcs.resource.entity.Attach; import com.vci.ubcs.common.validator.ComprehensiveFileValidator; import io.swagger.annotations.Api; import lombok.AllArgsConstructor; import lombok.SneakyThrows; @@ -31,8 +32,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; /** * 对象åå¨ç«¯ç¹ @@ -59,6 +58,11 @@ */ private final IAttachService attachService; /** * æä»¶å®å ¨æ£æ¥ */ @Autowired private ComprehensiveFileValidator fileValidator; /** * å建å卿¡¶ @@ -150,6 +154,11 @@ @SneakyThrows @PostMapping("/put-file") public R<BladeFile> putFile(@RequestParam MultipartFile file) { // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.UploadValidationResult result = fileValidator.validateFile(file); if (!result.isValid()) { return R.fail(result.getMessage()); } BladeFile bladeFile = ossBuilder.template().putFile(file.getOriginalFilename(), file.getInputStream()); return R.data(bladeFile); } @@ -164,41 +173,14 @@ @SneakyThrows @PostMapping("/put-file-by-name") public R<BladeFile> putFile(@RequestParam String fileName, @RequestParam MultipartFile file) { // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.UploadValidationResult result = fileValidator.validateFile(file); if (!result.isValid()) { return R.fail(result.getMessage()); } BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); return R.data(bladeFile); } // /** // * ä¸ä¼ æä»¶å¹¶ä¿åè³é件表 // * // * @param file æä»¶ // * @return ObjectStat // */ // @SneakyThrows // @PostMapping("/put-file-attach") // public R<BladeFile> putFileAttach(@RequestParam MultipartFile file) { // String fileName = file.getOriginalFilename(); // BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); // Long attachId = buildAttach(fileName, file.getSize(), bladeFile); // bladeFile.setAttachId(attachId); // return R.data(bladeFile); // } // /** // * ä¸ä¼ æä»¶å¹¶ä¿åè³é件表 // * // * @param fileName å卿¡¶å¯¹è±¡åç§° // * @param file æä»¶ // * @return ObjectStat // */ // @SneakyThrows // @PostMapping("/put-file-attach-by-name") // public R<BladeFile> putFileAttach(@RequestParam String fileName, @RequestParam MultipartFile file) { // BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); // Long attachId = buildAttach(fileName, file.getSize(), bladeFile); // bladeFile.setAttachId(attachId); // return R.data(bladeFile); // } /** * æå»ºé件表 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyController.java
@@ -25,6 +25,7 @@ import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO; import com.vci.ubcs.code.vo.pagemodel.CodeImProtRusultVO; import com.vci.ubcs.code.wrapper.CodeClassifyWrapper; import com.vci.ubcs.common.validator.ComprehensiveFileValidator; import com.vci.ubcs.omd.vo.BtmTypeAttributeVO; import com.vci.ubcs.starter.revision.model.TreeQueryObject; import com.vci.ubcs.starter.util.LocalFileUtil; @@ -47,6 +48,7 @@ import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; @@ -77,6 +79,12 @@ private final ICodeClassifyService codeClassifyService; CodeClassifyMapper codeClassifyMapper; /** * æä»¶å®å ¨æ£æ¥ */ @Autowired private ComprehensiveFileValidator fileValidator; /** * 主é¢åºå®ä¹è¡¨ 详æ @@ -277,6 +285,12 @@ */ @PostMapping("/importClassify") public R importClassify(MultipartFile file) { // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.UploadValidationResult result = fileValidator.validateFile(file); if (!result.isValid()) { return R.fail(result.getMessage()); } String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + LocalFileUtil.getFileNameForIE(file.getOriginalFilename()); File file1 = new File(excelFileName); try { Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java
@@ -10,6 +10,7 @@ import com.vci.ubcs.code.service.MdmEngineService; import com.vci.ubcs.code.service.MdmIOService; import com.vci.ubcs.code.vo.pagemodel.*; import com.vci.ubcs.common.validator.ComprehensiveFileValidator; import com.vci.ubcs.flow.core.dto.FlowStatusDTO; import com.vci.ubcs.starter.annotation.VciBusinessLog; import com.vci.ubcs.starter.revision.model.BaseModel; @@ -43,21 +44,31 @@ * æ¥å¿ */ private Logger logger = LoggerFactory.getLogger(getClass()); /** * ä¸»æ°æ®å¼ææå¡ */ @Autowired private MdmEngineService engineService; /** * ä¸»æ°æ®å¯¼å ¥å¯¼åºæå¡ */ @Autowired private MdmIOService mdmIOService; /** * æ¥å¿ä¿åå·¥å ·ç±» */ @Autowired private SaveLogUtil saveLogUtil; /** * æä»¶å®å ¨æ£æ¥ */ @Autowired private ComprehensiveFileValidator fileValidator; /** * ä¸è½½æ¹éç³è¯·çå¯¼å ¥æ¨¡æ¿ @@ -112,6 +123,12 @@ @VciBusinessLog(operateName = "å¯¼å ¥æ¹éç¼è¾æ°æ®") @PostMapping("/batchImportEdit") public R batchImportEdit(String codeClassifyOid, String classifyAttr,MultipartFile file,HttpServletResponse response) throws Throwable { // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.UploadValidationResult validationResult = fileValidator.validateFile(file); if (!validationResult.isValid()) { return R.fail(validationResult.getMessage()); } String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + file.getOriginalFilename(); File file1 = new File(excelFileName); try { @@ -218,6 +235,12 @@ @VciBusinessLog(operateName = "æ¹éç³è¯·ç¼ç çä¿¡æ¯") @PostMapping("/batchImportCode") public R batchImportCode(String secDTOList, String codeClassifyOid, MultipartFile file, HttpServletResponse response) throws Throwable { // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.UploadValidationResult validationResult = fileValidator.validateFile(file); if (!validationResult.isValid()) { return R.fail(validationResult.getMessage()); } CodeOrderDTO orderDTO = new CodeOrderDTO(); orderDTO.setCodeClassifyOid(codeClassifyOid); if(StringUtils.isNotBlank(secDTOList)){ @@ -269,6 +292,12 @@ @VciBusinessLog(operateName = "å¯¼å ¥ç¼ç çå岿°æ®") @PostMapping("/batchImportHistoryData") public R batchImportHistoryData(String codeClassifyOid, String classifyAttr,MultipartFile file,HttpServletResponse response) throws Throwable { // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.UploadValidationResult validationResult = fileValidator.validateFile(file); if (!validationResult.isValid()) { return R.fail(validationResult.getMessage()); } String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + file.getOriginalFilename(); File file1 = new File(excelFileName); try { @@ -312,6 +341,12 @@ @VciBusinessLog(operateName = "æ¹éç³è¯·ç¼ç çä¿¡æ¯") @PostMapping("/batchTopImportCode") public R batchTopImportCode(String codeClassifyOid, String classifyAttr,MultipartFile file,HttpServletResponse response) throws Throwable { // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.UploadValidationResult result = fileValidator.validateFile(file); if (!result.isValid()) { return R.fail(result.getMessage()); } String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + file.getOriginalFilename(); File file1 = new File(excelFileName); try { @@ -867,6 +902,11 @@ */ @PostMapping("/importGroupCode") public R importGroupCode(String codeClassifyOid,MultipartFile file,HttpServletResponse response){ // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.UploadValidationResult result = fileValidator.validateFile(file); if (!result.isValid()) { return R.fail(result.getMessage()); } String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + file.getOriginalFilename(); File file1 = new File(excelFileName); Source/UBCS/ubcs-service/ubcs-deploy/src/main/java/com/vci/ubcs/deploy/controller/DeployAppsController.java
@@ -1,6 +1,7 @@ package com.vci.ubcs.deploy.controller; import com.alibaba.nacos.shaded.com.google.protobuf.ServiceException; import com.vci.ubcs.common.validator.ComprehensiveFileValidator; import com.vci.ubcs.deploy.entity.DeployApps; import com.vci.ubcs.deploy.service.IDeployAppsService; import com.vci.ubcs.deploy.vo.DeployAppsVO; @@ -10,6 +11,7 @@ import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import springfox.documentation.annotations.ApiIgnore; @@ -32,6 +34,12 @@ public class DeployAppsController { private final IDeployAppsService deployAppsService; /** * æä»¶å®å ¨æ£æ¥ */ @Autowired private ComprehensiveFileValidator fileValidator; /** * è·åæå¡è¿è¡å表 @@ -86,6 +94,11 @@ */ @PostMapping("/importUpdateServiceJar") public R importClassify(@RequestParam("files") MultipartFile[] files,@RequestParam String serverName) throws ServiceException { // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.MultiUploadValidationResult quickResult = fileValidator.validateFiles(files, true); if (!quickResult.isValid()) { return R.fail(quickResult.getMessage()); } if(Func.isBlank(serverName)){ return R.fail("Mandatory parameter service name not found!"); } Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/RegionController.java
@@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.vci.ubcs.common.validator.ComprehensiveFileValidator; import com.vci.ubcs.system.entity.Region; import com.vci.ubcs.system.excel.RegionExcel; import com.vci.ubcs.system.excel.RegionImporter; @@ -35,6 +36,7 @@ import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import springfox.documentation.annotations.ApiIgnore; @@ -58,6 +60,12 @@ public class RegionController extends BladeController { private final IRegionService regionService; /** * æä»¶å®å ¨æ£æ¥ */ @Autowired private ComprehensiveFileValidator fileValidator; /** * 详æ @@ -170,6 +178,11 @@ @ApiOperationSupport(order = 10) @ApiOperation(value = "å¯¼å ¥è¡æ¿åºå", notes = "ä¼ å ¥excel") public R importRegion(MultipartFile file, Integer isCovered) { // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.UploadValidationResult result = fileValidator.validateFile(file); if (!result.isValid()) { return R.fail(result.getMessage()); } RegionImporter regionImporter = new RegionImporter(regionService, isCovered == 1); ExcelUtil.save(file, regionImporter, RegionExcel.class); return R.success("æä½æå"); Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/controller/UserController.java
@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.vci.ubcs.common.validator.ComprehensiveFileValidator; import com.vci.ubcs.system.cache.NacosConfigCache; import com.vci.ubcs.system.user.entity.User; import com.vci.ubcs.system.user.excel.UserExcel; @@ -32,8 +33,7 @@ import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; import com.vci.ubcs.common.cache.CacheNames; import org.apache.ibatis.annotations.Param; import org.hibernate.validator.internal.util.logging.Log; import lombok.extern.slf4j.Slf4j; import org.springblade.core.cache.utils.CacheUtil; import org.springblade.core.excel.util.ExcelUtil; import org.springblade.core.mp.support.Condition; @@ -50,6 +50,7 @@ import org.springblade.core.tool.utils.StringUtil; import com.vci.ubcs.system.user.service.IUserService; import com.vci.ubcs.system.user.vo.UserVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import springfox.documentation.annotations.ApiIgnore; @@ -71,12 +72,19 @@ @RestController @RequestMapping @AllArgsConstructor @lombok.extern.java.Log @Slf4j public class UserController { private final IUserService userService; private final BladeRedis bladeRedis; private final NacosConfigCache nacosConfigCache; /** * æä»¶å®å ¨æ£æ¥ */ private ComprehensiveFileValidator fileValidator; /** * æ¥è¯¢åæ¡ @@ -263,6 +271,11 @@ @ApiOperationSupport(order = 12) @ApiOperation(value = "å¯¼å ¥ç¨æ·", notes = "ä¼ å ¥excel") public R importUser(MultipartFile file, Integer isCovered) { // ä½¿ç¨æä»¶å®å ¨éªè¯å¨ ComprehensiveFileValidator.UploadValidationResult result = fileValidator.validateFile(file); if (!result.isValid()) { return R.fail(result.getMessage()); } UserImporter userImporter = new UserImporter(userService, isCovered == 1); ExcelUtil.save(file, userImporter, UserExcel.class); return R.success("æä½æå");