From 0f712618f263ada18361e474e6e7bfe3173fc497 Mon Sep 17 00:00:00 2001 From: EnderByEndera <707475564@qq.com> Date: Thu, 11 Jan 2024 19:49:07 +0800 Subject: [PATCH] =?UTF-8?q?1.=20application.yml=E4=BF=AE=E6=94=B9=E4=B8=BA?= =?UTF-8?q?application-dev.yml=E5=92=8Capplication-prod.yml=202.=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9B=B4=E5=A4=9AException=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E5=99=A8=203.=20=E7=BC=96=E5=86=99=E7=8A=B6=E6=80=81=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=A4=84=E7=90=86task=E7=8A=B6=E6=80=81=E7=9A=84?= =?UTF-8?q?=E6=9B=B4=E6=94=B9=204.=20=E6=B7=BB=E5=8A=A0StateChangeService?= =?UTF-8?q?=EF=BC=8C=E7=94=A8=E4=BB=A5=E5=A4=84=E7=90=86=E6=89=80=E6=9C=89?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=8A=B6=E6=80=81=E8=BD=AC=E6=8D=A2=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=9A=84=E5=86=85=E5=AE=B9=205.=20=E6=B7=BB=E5=8A=A0S?= =?UTF-8?q?tateEnum,=20ProtocolEnum=EF=BC=8CTaskTypeEnum=E7=94=A8=E4=BB=A5?= =?UTF-8?q?=E5=A4=84=E7=90=86=E4=BB=BB=E5=8A=A1=E5=92=8C=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=9A=84=E6=89=80=E6=9C=89=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=92=8C=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradlew.bat | 4 +- .../protection/ProtectionApplication.java | 11 +- .../entity/defense/template/Template.java | 8 +- .../rule/dynamicrule/DynamicRuleObject.java | 2 +- .../configuration/entity/task/Command.java | 33 +++--- .../entity/task/FiveTupleWithMask.java | 19 ++++ .../configuration/entity/task/Task.java | 11 +- .../entity/task/TaskCommandInfo.java | 19 ++++ .../exception/DorisStartException.java | 19 ++++ .../exception/GlobalExceptionHandler.java | 48 +++++++-- .../response/ResponseResult.java | 1 + .../configuration/satoken/Nameable.java | 5 + .../satoken/SaTokenConfigure.java | 25 +++-- .../satoken/permission/Nameable.java | 5 - .../satoken/permission/Permission.java | 2 + .../configuration/satoken/role/Admin.java | 5 + .../configuration/satoken/role/Role.java | 10 ++ .../configuration/utils/EntityUtils.java | 18 ++++ .../utils/SqlSessionWrapper.java | 14 +-- .../utils/enums/ProtocolEnum.java | 30 ++++++ .../configuration/utils/enums/StateEnum.java | 51 +++++++++ .../utils/enums/TaskTypeEnum.java | 33 ++++++ .../utils/status/AuditStatus.java | 17 +++ .../utils/status/AuditStatusValidator.java | 12 ++- .../configuration/utils/status/State.java | 9 ++ .../configuration/utils/status/StateNum.java | 20 ++++ .../server/command/CommandMapper.java | 22 ++++ .../server/command/CommandService.java | 101 ++++++++++++++++++ .../object/ProtectObjectController.java | 27 ++--- .../defense/object/ProtectObjectService.java | 4 +- .../defense/template/TemplateController.java | 25 +++-- .../defense/template/TemplateMapper.java | 4 +- .../defense/template/TemplateService.java | 9 +- .../dynamicrule/DynamicRuleController.java | 6 +- .../dynamicrule/DynamicRuleDataListener.java | 1 - .../rule/dynamicrule/DynamicRuleMapper.java | 4 +- .../rule/staticrule/StaticRuleController.java | 42 ++++---- .../staticrule/StaticRuleDataListener.java | 1 - .../rule/staticrule/StaticRuleMapper.java | 2 - .../rule/staticrule/StaticRuleService.java | 5 +- .../protection/server/task/StatusChanger.java | 20 ---- .../server/task/TaskController.java | 50 ++++----- .../protection/server/task/TaskMapper.java | 27 +++-- .../protection/server/task/TaskService.java | 60 +++++------ .../server/task/state/PauseState.java | 19 ---- .../server/task/state/RunningState.java | 28 ----- .../protection/server/task/state/State.java | 6 -- .../server/task/state/StateMapper.java | 8 -- .../server/task/state/StopState.java | 17 --- .../task/status/StateChangeService.java | 46 ++++++++ .../server/task/status/StateHandler.java | 89 +++++++++++++++ .../task/status/states/FailedState.java | 20 ++++ .../task/status/states/FinishedState.java | 12 +++ .../server/task/status/states/PauseState.java | 20 ++++ .../task/status/states/PendingState.java | 19 ++++ .../task/status/states/RunningState.java | 21 ++++ .../server/task/status/states/StopState.java | 20 ++++ .../server/whitelist/WhiteListController.java | 16 ++- .../whitelist/WhiteListDataListener.java | 3 +- .../server/whitelist/WhiteListMapper.java | 7 +- .../server/whitelist/WhiteListService.java | 3 +- .../{application.yml => application-dev.yml} | 13 +-- .../resources/config/application-prod.yml | 37 +++++++ src/main/resources/mappers/CommandMapper.xml | 58 ++++++++++ src/main/resources/mappers/StateMapper.xml | 9 -- src/main/resources/mappers/TaskMapper.xml | 77 +++++++++++-- src/main/resources/mappers/TemplateMapper.xml | 69 +++++------- .../defense/template/TemplateServiceTest.java | 25 ++--- .../server/task/TaskServiceTest.java | 48 ++++++--- .../task/status/CommandServiceTest.java | 78 ++++++++++++++ 70 files changed, 1209 insertions(+), 400 deletions(-) create mode 100644 src/main/java/com/realtime/protection/configuration/entity/task/FiveTupleWithMask.java create mode 100644 src/main/java/com/realtime/protection/configuration/entity/task/TaskCommandInfo.java create mode 100644 src/main/java/com/realtime/protection/configuration/exception/DorisStartException.java create mode 100644 src/main/java/com/realtime/protection/configuration/satoken/Nameable.java delete mode 100644 src/main/java/com/realtime/protection/configuration/satoken/permission/Nameable.java create mode 100644 src/main/java/com/realtime/protection/configuration/satoken/role/Admin.java create mode 100644 src/main/java/com/realtime/protection/configuration/satoken/role/Role.java create mode 100644 src/main/java/com/realtime/protection/configuration/utils/EntityUtils.java create mode 100644 src/main/java/com/realtime/protection/configuration/utils/enums/ProtocolEnum.java create mode 100644 src/main/java/com/realtime/protection/configuration/utils/enums/StateEnum.java create mode 100644 src/main/java/com/realtime/protection/configuration/utils/enums/TaskTypeEnum.java create mode 100644 src/main/java/com/realtime/protection/configuration/utils/status/AuditStatus.java create mode 100644 src/main/java/com/realtime/protection/configuration/utils/status/State.java create mode 100644 src/main/java/com/realtime/protection/configuration/utils/status/StateNum.java create mode 100644 src/main/java/com/realtime/protection/server/command/CommandMapper.java create mode 100644 src/main/java/com/realtime/protection/server/command/CommandService.java delete mode 100644 src/main/java/com/realtime/protection/server/task/StatusChanger.java delete mode 100644 src/main/java/com/realtime/protection/server/task/state/PauseState.java delete mode 100644 src/main/java/com/realtime/protection/server/task/state/RunningState.java delete mode 100644 src/main/java/com/realtime/protection/server/task/state/State.java delete mode 100644 src/main/java/com/realtime/protection/server/task/state/StateMapper.java delete mode 100644 src/main/java/com/realtime/protection/server/task/state/StopState.java create mode 100644 src/main/java/com/realtime/protection/server/task/status/StateChangeService.java create mode 100644 src/main/java/com/realtime/protection/server/task/status/StateHandler.java create mode 100644 src/main/java/com/realtime/protection/server/task/status/states/FailedState.java create mode 100644 src/main/java/com/realtime/protection/server/task/status/states/FinishedState.java create mode 100644 src/main/java/com/realtime/protection/server/task/status/states/PauseState.java create mode 100644 src/main/java/com/realtime/protection/server/task/status/states/PendingState.java create mode 100644 src/main/java/com/realtime/protection/server/task/status/states/RunningState.java create mode 100644 src/main/java/com/realtime/protection/server/task/status/states/StopState.java rename src/main/resources/config/{application.yml => application-dev.yml} (71%) create mode 100644 src/main/resources/config/application-prod.yml create mode 100644 src/main/resources/mappers/CommandMapper.xml delete mode 100644 src/main/resources/mappers/StateMapper.xml create mode 100644 src/test/java/com/realtime/protection/server/task/status/CommandServiceTest.java diff --git a/gradlew.bat b/gradlew.bat index 6689b85..8023476 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -44,7 +44,7 @@ set JAVA_EXE=java.exe if %ERRORLEVEL% equ 0 goto execute echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo ERROR: JAVA_HOME is not set and no 'java' commandInfo could be found in your PATH. echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. @@ -66,7 +66,7 @@ echo location of your Java installation. goto fail :execute -@rem Setup the command line +@rem Setup the commandInfo line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar diff --git a/src/main/java/com/realtime/protection/ProtectionApplication.java b/src/main/java/com/realtime/protection/ProtectionApplication.java index 4effcda..d25ea83 100644 --- a/src/main/java/com/realtime/protection/ProtectionApplication.java +++ b/src/main/java/com/realtime/protection/ProtectionApplication.java @@ -1,13 +1,20 @@ package com.realtime.protection; -import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication +@EnableAsync public class ProtectionApplication { public static void main(String[] args) { - SpringApplication.run(ProtectionApplication.class, args); + SpringApplicationBuilder builder = new SpringApplicationBuilder(ProtectionApplication.class); + + // 在实际环境中应该修改为prod + builder.application().setAdditionalProfiles("dev"); + + builder.run(args); } } diff --git a/src/main/java/com/realtime/protection/configuration/entity/defense/template/Template.java b/src/main/java/com/realtime/protection/configuration/entity/defense/template/Template.java index 74f9fe4..327c12f 100644 --- a/src/main/java/com/realtime/protection/configuration/entity/defense/template/Template.java +++ b/src/main/java/com/realtime/protection/configuration/entity/defense/template/Template.java @@ -4,8 +4,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.validation.constraints.NotNull; import lombok.Data; -import java.util.List; - @Data public class Template { @JsonProperty("template_id") @@ -37,6 +35,12 @@ public class Template { @NotNull(message = "protect_level_high should not be empty. ") private ProtectLevel protectLevelHigh; + @JsonProperty("template_used_times") + private Integer usedTimes; + + @JsonProperty("running_tasks") + private Integer runningTasks; + private Integer createUserId; private String createUsername; diff --git a/src/main/java/com/realtime/protection/configuration/entity/rule/dynamicrule/DynamicRuleObject.java b/src/main/java/com/realtime/protection/configuration/entity/rule/dynamicrule/DynamicRuleObject.java index e48a9ea..f4237bc 100644 --- a/src/main/java/com/realtime/protection/configuration/entity/rule/dynamicrule/DynamicRuleObject.java +++ b/src/main/java/com/realtime/protection/configuration/entity/rule/dynamicrule/DynamicRuleObject.java @@ -26,7 +26,7 @@ public class DynamicRuleObject { @JsonProperty("dynamic_rule_create_username") private String dynamicRuleCreateUsername; -// @JsonProperty("dynamic_rule_audit_status") + // @JsonProperty("dynamic_rule_audit_status") // private Integer dynamicRuleAuditStatus; @JsonProperty("dynamic_rule_create_depart") private String dynamicRuleCreateDepart; diff --git a/src/main/java/com/realtime/protection/configuration/entity/task/Command.java b/src/main/java/com/realtime/protection/configuration/entity/task/Command.java index 8c6725a..27fafb7 100644 --- a/src/main/java/com/realtime/protection/configuration/entity/task/Command.java +++ b/src/main/java/com/realtime/protection/configuration/entity/task/Command.java @@ -1,25 +1,32 @@ package com.realtime.protection.configuration.entity.task; +import com.realtime.protection.configuration.utils.enums.ProtocolEnum; import lombok.Data; import java.time.LocalDateTime; @Data public class Command { - private Integer id; + private FiveTupleWithMask fiveTupleWithMask; + private Long taskId; - private Integer type; - private String sourceIP; - private String sourcePort; - private String destinationIP; - private String destinationPort; - private Integer protocol; + private String operation; + private LocalDateTime validTime; + private LocalDateTime invalidTime; - private String maskSourceIP; - private String maskSourcePort; - private String maskDestinationIP; - private String maskDestinationPort; - private Integer direction; + public static Command generateCommand(TaskCommandInfo info, LocalDateTime validTime) { + Command command = new Command(); - private LocalDateTime datetime; + FiveTupleWithMask fiveTupleWithMask = info.getFiveTupleWithMask(); + if (fiveTupleWithMask.getProtocol() != null) + fiveTupleWithMask.setProtocolNum(ProtocolEnum.valueOf(fiveTupleWithMask.getProtocol()).getProtocolNumber()); + + command.setFiveTupleWithMask(fiveTupleWithMask); + command.setTaskId(info.getTaskId()); + command.setOperation(info.getOperation()); + command.setValidTime(validTime); + command.setInvalidTime(info.getEndTime()); + + return command; + } } diff --git a/src/main/java/com/realtime/protection/configuration/entity/task/FiveTupleWithMask.java b/src/main/java/com/realtime/protection/configuration/entity/task/FiveTupleWithMask.java new file mode 100644 index 0000000..55b563a --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/entity/task/FiveTupleWithMask.java @@ -0,0 +1,19 @@ +package com.realtime.protection.configuration.entity.task; + +import lombok.Data; + +@Data +public class FiveTupleWithMask { + private Integer addrType; + private String sourceIP; + private String sourcePort; + private String destinationIP; + private String destinationPort; + private String protocol; + private Integer protocolNum; + + private String maskSourceIP; + private String maskSourcePort; + private String maskDestinationIP; + private String maskDestinationPort; +} diff --git a/src/main/java/com/realtime/protection/configuration/entity/task/Task.java b/src/main/java/com/realtime/protection/configuration/entity/task/Task.java index 9e6cabf..edcffe0 100644 --- a/src/main/java/com/realtime/protection/configuration/entity/task/Task.java +++ b/src/main/java/com/realtime/protection/configuration/entity/task/Task.java @@ -11,7 +11,7 @@ import java.util.List; @Data public class Task { @JsonProperty("task_id") - private Integer taskId; + private Long taskId; @JsonProperty("task_name") @NotNull(message = "task_name should not be empty. ") @@ -19,6 +19,7 @@ public class Task { @JsonProperty("task_start_time") @NotNull(message = "task_start_time should not be empty. ") + @Future(message = "task_start_time should be a future time") private LocalDateTime taskStartTime; @JsonProperty("task_end_time") @@ -34,7 +35,7 @@ public class Task { @JsonProperty("task_type") @NotNull(message = "task_type should not be empty. ") - private String taskType; + private Integer taskType; @JsonProperty("task_act") @NotNull(message = "task_act should not be empty. ") @@ -47,13 +48,13 @@ public class Task { private String taskCreateDepart; @JsonProperty("task_create_userid") - private Integer taskCreateUserId; + private Long taskCreateUserId; @JsonProperty("static_rule_ids") - private List staticRuleIds; + private List staticRuleIds; @JsonProperty("dynamic_rule_ids") - private List dynamicRuleIds; + private List dynamicRuleIds; @JsonProperty("task_status") private Integer taskStatus; diff --git a/src/main/java/com/realtime/protection/configuration/entity/task/TaskCommandInfo.java b/src/main/java/com/realtime/protection/configuration/entity/task/TaskCommandInfo.java new file mode 100644 index 0000000..d420a94 --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/entity/task/TaskCommandInfo.java @@ -0,0 +1,19 @@ +package com.realtime.protection.configuration.entity.task; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class TaskCommandInfo { + private FiveTupleWithMask fiveTupleWithMask; + + private Long taskId; + private Long ruleId; + + // 额外字段 + private String operation; + private Integer frequency; + private LocalDateTime startTime; + private LocalDateTime endTime; +} diff --git a/src/main/java/com/realtime/protection/configuration/exception/DorisStartException.java b/src/main/java/com/realtime/protection/configuration/exception/DorisStartException.java new file mode 100644 index 0000000..2921ce6 --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/exception/DorisStartException.java @@ -0,0 +1,19 @@ +package com.realtime.protection.configuration.exception; + +public class DorisStartException extends Exception { + public Long taskId; + + public DorisStartException(Exception e, Long taskId) { + super(e.getMessage(), e.getCause()); + this.taskId = taskId; + } + + public DorisStartException(Exception e) { + super(e.getMessage(), e.getCause()); + } + + public DorisStartException(String message, Long taskId) { + super(message); + this.taskId = taskId; + } +} diff --git a/src/main/java/com/realtime/protection/configuration/exception/GlobalExceptionHandler.java b/src/main/java/com/realtime/protection/configuration/exception/GlobalExceptionHandler.java index 00309a2..f123d4f 100644 --- a/src/main/java/com/realtime/protection/configuration/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/realtime/protection/configuration/exception/GlobalExceptionHandler.java @@ -3,6 +3,8 @@ package com.realtime.protection.configuration.exception; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.SaTokenException; import com.realtime.protection.configuration.response.ResponseResult; +import com.realtime.protection.configuration.utils.enums.StateEnum; +import com.realtime.protection.server.task.status.StateChangeService; import org.apache.ibatis.exceptions.PersistenceException; import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.core.annotation.Order; @@ -16,20 +18,18 @@ import java.util.stream.Collectors; @RestControllerAdvice public class GlobalExceptionHandler { + private final StateChangeService stateChangeService; + + public GlobalExceptionHandler(StateChangeService stateChangeService) { + this.stateChangeService = stateChangeService; + } + @Order(3) @ExceptionHandler(value = Exception.class) public ResponseResult handleGlobalException(Exception e) { return ResponseResult.error().setMessage(e.getMessage()); } - @Order(2) - @ExceptionHandler(value = NotLoginException.class) - public ResponseResult handleNotLoginException(NotLoginException e) { - return new ResponseResult( - 401, - e.getMessage() - ); - } @Order(2) @ExceptionHandler(value = PersistenceException.class) @@ -48,14 +48,42 @@ public class GlobalExceptionHandler { } @Order(2) - @ExceptionHandler(value = {HandlerMethodValidationException.class, IllegalArgumentException.class}) - public ResponseResult handleHandlerMethodValidationException(HandlerMethodValidationException e) { + @ExceptionHandler(value = { + HandlerMethodValidationException.class, + IllegalArgumentException.class, + IllegalStateException.class + }) + public ResponseResult handleHandlerMethodValidationException(Exception e) { return ResponseResult.invalid().setMessage(e.getMessage()); } + @Order(2) + @ExceptionHandler(value = NotLoginException.class) + public ResponseResult handleNotLoginException(NotLoginException e) { + return new ResponseResult( + 401, + e.getMessage() + ); + } + @Order(2) @ExceptionHandler(value = SaTokenException.class) public ResponseResult handleSaTokenException(SaTokenException e) { return ResponseResult.unAuthorized().setMessage(e.getMessage()); } + + @Order(2) + @ExceptionHandler(value = DorisStartException.class) + public ResponseResult handleDorisStartException(DorisStartException e) { + ResponseResult responseResult = ResponseResult.error() + .setMessage("Doris command creation meets error: " + e.getMessage()); + + try { + stateChangeService.changeState(StateEnum.FAILED.getStateNum(), e.taskId); + } catch (Exception another) { + responseResult.setAnother(ResponseResult.error().setMessage(e.getMessage())); + } + + return responseResult; + } } diff --git a/src/main/java/com/realtime/protection/configuration/response/ResponseResult.java b/src/main/java/com/realtime/protection/configuration/response/ResponseResult.java index af93b56..07bc679 100644 --- a/src/main/java/com/realtime/protection/configuration/response/ResponseResult.java +++ b/src/main/java/com/realtime/protection/configuration/response/ResponseResult.java @@ -12,6 +12,7 @@ public class ResponseResult implements Serializable { private int code; private String message; private Map data; + private ResponseResult another; public ResponseResult(int code, String message, LinkedHashMap data) { this.code = code; diff --git a/src/main/java/com/realtime/protection/configuration/satoken/Nameable.java b/src/main/java/com/realtime/protection/configuration/satoken/Nameable.java new file mode 100644 index 0000000..310a123 --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/satoken/Nameable.java @@ -0,0 +1,5 @@ +package com.realtime.protection.configuration.satoken; + +public interface Nameable { + String name(); +} diff --git a/src/main/java/com/realtime/protection/configuration/satoken/SaTokenConfigure.java b/src/main/java/com/realtime/protection/configuration/satoken/SaTokenConfigure.java index a619da5..48fc079 100644 --- a/src/main/java/com/realtime/protection/configuration/satoken/SaTokenConfigure.java +++ b/src/main/java/com/realtime/protection/configuration/satoken/SaTokenConfigure.java @@ -1,11 +1,9 @@ package com.realtime.protection.configuration.satoken; import cn.dev33.satoken.interceptor.SaInterceptor; -import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.stp.StpUtil; import com.realtime.protection.configuration.satoken.permission.Permission; -import com.realtime.protection.configuration.satoken.permission.SystemConfiguration; -import com.realtime.protection.configuration.satoken.permission.WhiteList; +import com.realtime.protection.configuration.satoken.role.Role; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -15,13 +13,15 @@ public class SaTokenConfigure implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SaInterceptor(handler -> { - SaRouter.match("/whiteobj/new", r -> - this.checkPermissions(SystemConfiguration.NEW, WhiteList.NEW)); - SaRouter.match("/whiteobj/update", r -> - this.checkPermissions(SystemConfiguration.UPDATE, WhiteList.UPDATE)); - })) - .addPathPatterns("/**") - .excludePathPatterns("/user/doLogin"); +// SaRouter.match("/**") +// .notMatch("/user/doLogin") +// .check(r -> StpUtil.checkLogin()); + +// SaRouter.match("/whiteobj/new", r -> +// this.checkPermissions(WhiteList.NEW)); +// SaRouter.match("/whiteobj/{id}/update", r -> +// this.checkPermissions(WhiteList.UPDATE)); + })).addPathPatterns("/**"); } void checkPermissions(Permission... permissions) { @@ -30,5 +30,10 @@ public class SaTokenConfigure implements WebMvcConfigurer { } } + void checkRole(Role... roles) { + for (Role role : roles) { + StpUtil.checkRole(role.getName()); + } + } } diff --git a/src/main/java/com/realtime/protection/configuration/satoken/permission/Nameable.java b/src/main/java/com/realtime/protection/configuration/satoken/permission/Nameable.java deleted file mode 100644 index 0c4e0d3..0000000 --- a/src/main/java/com/realtime/protection/configuration/satoken/permission/Nameable.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.realtime.protection.configuration.satoken.permission; - -public interface Nameable { - String name(); -} diff --git a/src/main/java/com/realtime/protection/configuration/satoken/permission/Permission.java b/src/main/java/com/realtime/protection/configuration/satoken/permission/Permission.java index 763eeaa..dbf0ec9 100644 --- a/src/main/java/com/realtime/protection/configuration/satoken/permission/Permission.java +++ b/src/main/java/com/realtime/protection/configuration/satoken/permission/Permission.java @@ -1,5 +1,7 @@ package com.realtime.protection.configuration.satoken.permission; +import com.realtime.protection.configuration.satoken.Nameable; + public interface Permission extends Nameable { default String getName() { return this.getClass().getSimpleName() + ":" + this.name(); diff --git a/src/main/java/com/realtime/protection/configuration/satoken/role/Admin.java b/src/main/java/com/realtime/protection/configuration/satoken/role/Admin.java new file mode 100644 index 0000000..c6c39a2 --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/satoken/role/Admin.java @@ -0,0 +1,5 @@ +package com.realtime.protection.configuration.satoken.role; + +public enum Admin implements Role { + ADMIN +} diff --git a/src/main/java/com/realtime/protection/configuration/satoken/role/Role.java b/src/main/java/com/realtime/protection/configuration/satoken/role/Role.java new file mode 100644 index 0000000..d3bdd89 --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/satoken/role/Role.java @@ -0,0 +1,10 @@ +package com.realtime.protection.configuration.satoken.role; + +import com.realtime.protection.configuration.satoken.Nameable; + +public interface Role extends Nameable { + default String getName() { + return this.getClass().getSimpleName() + ":" + this.name(); + } + +} diff --git a/src/main/java/com/realtime/protection/configuration/utils/EntityUtils.java b/src/main/java/com/realtime/protection/configuration/utils/EntityUtils.java new file mode 100644 index 0000000..bf7fc64 --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/utils/EntityUtils.java @@ -0,0 +1,18 @@ +package com.realtime.protection.configuration.utils; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +public class EntityUtils { + public static Map entityToMap(Object object) throws IllegalAccessException { + Map resultMap = new HashMap<>(); + for (Field field : object.getClass().getDeclaredFields()) { + field.setAccessible(true); + Object o = field.get(object); + resultMap.put(field.getName(), o); + } + + return resultMap; + } +} diff --git a/src/main/java/com/realtime/protection/configuration/utils/SqlSessionWrapper.java b/src/main/java/com/realtime/protection/configuration/utils/SqlSessionWrapper.java index e336f31..b62f1e9 100644 --- a/src/main/java/com/realtime/protection/configuration/utils/SqlSessionWrapper.java +++ b/src/main/java/com/realtime/protection/configuration/utils/SqlSessionWrapper.java @@ -16,13 +16,15 @@ public class SqlSessionWrapper { this.sqlSessionFactory = sqlSessionFactory; } - /** 启动批量SQL会话 - * @param mapperClass MyBatis Mapper类型 + /** + * 启动批量SQL会话 + * + * @param mapperClass MyBatis Mapper类型 * @param batchFunction 批量函数(批量添加、批量删除、批量更新等) - * @param arguments 函数附带的所有参数,可以使用Map进行包装 - * @param Mapper class - * @param Function input - * @param Function output + * @param arguments 函数附带的所有参数,可以使用Map进行包装 + * @param Mapper class + * @param Function input + * @param Function output * @return 被包装的批量函数返回值 */ public O startBatchSession(Class mapperClass, diff --git a/src/main/java/com/realtime/protection/configuration/utils/enums/ProtocolEnum.java b/src/main/java/com/realtime/protection/configuration/utils/enums/ProtocolEnum.java new file mode 100644 index 0000000..2d578ab --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/utils/enums/ProtocolEnum.java @@ -0,0 +1,30 @@ +package com.realtime.protection.configuration.utils.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum ProtocolEnum { + TCP(6), + UDP(17); + + private final Integer number; + private static final Map map = new HashMap<>(); + + static { + for (ProtocolEnum protocol : ProtocolEnum.values()) { + map.put(protocol.getProtocolNumber(), protocol); + } + } + + ProtocolEnum(int protocolNumber) { + this.number = protocolNumber; + } + + public Integer getProtocolNumber() { + return this.number; + } + + public static ProtocolEnum getProtocolEnumByNumber(Integer protocolNum) { + return map.get(protocolNum); + } +} diff --git a/src/main/java/com/realtime/protection/configuration/utils/enums/StateEnum.java b/src/main/java/com/realtime/protection/configuration/utils/enums/StateEnum.java new file mode 100644 index 0000000..6668121 --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/utils/enums/StateEnum.java @@ -0,0 +1,51 @@ +package com.realtime.protection.configuration.utils.enums; + +import com.realtime.protection.configuration.utils.status.State; +import com.realtime.protection.server.task.status.states.*; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +@Getter +public enum StateEnum { + // 仅需修改此处即可将任务状态以及对应的State和Num进行对应 + PENDING(0, new PendingState()), + RUNNING(1, new RunningState()), + PAUSED(2, new PauseState()), + STOP(3, new StopState()), + FINISHED(4, new FinishedState()), + FAILED(5, new FailedState()); + // ---------------------------------------------- + + private final State state; + private final Integer stateNum; + private static final Map numToStateMap = new HashMap<>(); + private static final Map stateToNumMap = new HashMap<>(); + private static final Map stateToStateEnumMap = new HashMap<>(); + + static { + for (StateEnum stateEnum : StateEnum.values()) { + numToStateMap.put(stateEnum.getStateNum(), stateEnum.getState()); + stateToNumMap.put(stateEnum.getState(), stateEnum.getStateNum()); + stateToStateEnumMap.put(stateEnum.getState(), stateEnum); + } + } + + StateEnum(int stateNum, State state) { + this.stateNum = stateNum; + this.state = state; + } + + public static State getStateByNum(Integer stateNum) { + return numToStateMap.get(stateNum); + } + + public static Integer getNumByState(State state) { + return stateToNumMap.get(state); + } + + public static StateEnum getStateEnumByState(State state) { + return stateToStateEnumMap.get(state); + } +} diff --git a/src/main/java/com/realtime/protection/configuration/utils/enums/TaskTypeEnum.java b/src/main/java/com/realtime/protection/configuration/utils/enums/TaskTypeEnum.java new file mode 100644 index 0000000..37226af --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/utils/enums/TaskTypeEnum.java @@ -0,0 +1,33 @@ +package com.realtime.protection.configuration.utils.enums; + +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +@Getter +public enum TaskTypeEnum { + STATIC(1), + DYNAMIC(2), + JUDGED(3); + + private final int taskType; + private static final Map map = new HashMap<>(); + + static { + for (TaskTypeEnum taskType : TaskTypeEnum.values()) { + map.put(taskType.getTaskType(), taskType); + } + } + + TaskTypeEnum(int taskType) { + this.taskType = taskType; + } + + public static TaskTypeEnum getTaskTypeByNum(Integer taskType) { + if (taskType == null) { + return null; + } + return map.get(taskType); + } +} diff --git a/src/main/java/com/realtime/protection/configuration/utils/status/AuditStatus.java b/src/main/java/com/realtime/protection/configuration/utils/status/AuditStatus.java new file mode 100644 index 0000000..42edaa1 --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/utils/status/AuditStatus.java @@ -0,0 +1,17 @@ +package com.realtime.protection.configuration.utils.status; + +import lombok.Getter; + +@Getter +public enum AuditStatus { + PENDING(0), + UNAUDITED(1), + AUDITED(2); + + private final int auditStatus; + + AuditStatus(int auditStatus) { + this.auditStatus = auditStatus; + } + +} diff --git a/src/main/java/com/realtime/protection/configuration/utils/status/AuditStatusValidator.java b/src/main/java/com/realtime/protection/configuration/utils/status/AuditStatusValidator.java index 1a50828..9226059 100644 --- a/src/main/java/com/realtime/protection/configuration/utils/status/AuditStatusValidator.java +++ b/src/main/java/com/realtime/protection/configuration/utils/status/AuditStatusValidator.java @@ -14,9 +14,15 @@ public class AuditStatusValidator { public Boolean checkValidate(Integer auditStatusNow) { switch (auditStatusNow) { - case 0, 1 -> {return auditStatusOriginal != 2;} - case 2 -> {return auditStatusOriginal != 1;} - default -> {return false;} + case 0, 1 -> { + return auditStatusOriginal != 2; + } + case 2 -> { + return auditStatusOriginal != 1; + } + default -> { + return false; + } } } } diff --git a/src/main/java/com/realtime/protection/configuration/utils/status/State.java b/src/main/java/com/realtime/protection/configuration/utils/status/State.java new file mode 100644 index 0000000..3a1e596 --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/utils/status/State.java @@ -0,0 +1,9 @@ +package com.realtime.protection.configuration.utils.status; + +import com.realtime.protection.configuration.exception.DorisStartException; +import com.realtime.protection.server.command.CommandService; +import com.realtime.protection.server.task.TaskService; + +public interface State { + Boolean handle(State newState, CommandService commandService, TaskService taskService, Long taskId) throws DorisStartException; +} diff --git a/src/main/java/com/realtime/protection/configuration/utils/status/StateNum.java b/src/main/java/com/realtime/protection/configuration/utils/status/StateNum.java new file mode 100644 index 0000000..af6a1b8 --- /dev/null +++ b/src/main/java/com/realtime/protection/configuration/utils/status/StateNum.java @@ -0,0 +1,20 @@ +package com.realtime.protection.configuration.utils.status; + +import lombok.Getter; + +@Getter +public enum StateNum { + PENDING(0), + RUNNING(1), + PAUSED(2), + STOPPED(3), + FAILED(4), + FINISHED(5); + + private final int stateNum; + + StateNum(int stateNum) { + this.stateNum = stateNum; + } + +} diff --git a/src/main/java/com/realtime/protection/server/command/CommandMapper.java b/src/main/java/com/realtime/protection/server/command/CommandMapper.java new file mode 100644 index 0000000..94d1747 --- /dev/null +++ b/src/main/java/com/realtime/protection/server/command/CommandMapper.java @@ -0,0 +1,22 @@ +package com.realtime.protection.server.command; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.realtime.protection.configuration.entity.task.Command; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@DS("doris") +@Mapper +public interface CommandMapper { + Boolean createCommand(@Param("command") Command command); + + void createCommands(@Param("commands") List commands); + + Boolean stopCommandsByTaskId(@Param("task_id") Long taskId); + + Boolean removeCommandsByTaskId(@Param("task_id") Long taskId); + + Boolean startCommandsByTaskId(@Param("task_id") Long taskId); +} diff --git a/src/main/java/com/realtime/protection/server/command/CommandService.java b/src/main/java/com/realtime/protection/server/command/CommandService.java new file mode 100644 index 0000000..ce19da3 --- /dev/null +++ b/src/main/java/com/realtime/protection/server/command/CommandService.java @@ -0,0 +1,101 @@ +package com.realtime.protection.server.command; + +import com.alibaba.excel.util.ListUtils; +import com.realtime.protection.configuration.entity.task.Command; +import com.realtime.protection.configuration.entity.task.TaskCommandInfo; +import com.realtime.protection.configuration.exception.DorisStartException; +import com.realtime.protection.configuration.utils.SqlSessionWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.function.Function; + +@Service +@Slf4j +public class CommandService { + + private final CommandMapper commandMapper; + private final SqlSessionWrapper sqlSessionWrapper; + private static final int BatchSize = 1000; + private final Function> createCommandBatchFunction; + + public CommandService(CommandMapper commandMapper, SqlSessionWrapper sqlSessionWrapper) { + this.commandMapper = commandMapper; + this.sqlSessionWrapper = sqlSessionWrapper; + this.createCommandBatchFunction = mapper -> info -> { + if (info.getFrequency() == null) { + Command command = Command.generateCommand(info, info.getStartTime()); + commandMapper.createCommand(command); + } + + List commandBatch = ListUtils.newArrayListWithExpectedSize(BatchSize); + LocalDateTime validTime = info.getStartTime(); + + while (validTime.isBefore(info.getEndTime())) { + Command command = Command.generateCommand(info, validTime); + commandBatch.add(command); + + validTime = validTime.plusMinutes(info.getFrequency()); + + if (commandBatch.size() < BatchSize) { + continue; + } + commandMapper.createCommands(commandBatch); + commandBatch.clear(); + } + + if (!commandBatch.isEmpty()) { + commandMapper.createCommands(commandBatch); + commandBatch.clear(); + } + + log.debug(String.format("create all the commands from task(%d), rule(%d)", + info.getTaskId(), info.getRuleId())); + return null; + }; + } + + @Async + public void createCommand(TaskCommandInfo commandInfo) throws DorisStartException { + try { + sqlSessionWrapper.startBatchSession(CommandMapper.class, createCommandBatchFunction, commandInfo); + } catch (Exception e) { + throw new DorisStartException(e); + } + } + + @Async + public void createCommands(List taskCommandInfos) throws DorisStartException { + Function, Void>> function = mapper -> list -> { + if (list == null || list.isEmpty()) { + return null; + } + + for (TaskCommandInfo info : list) { + createCommandBatchFunction.apply(mapper).apply(info); + } + return null; + }; + + try { + sqlSessionWrapper.startBatchSession(CommandMapper.class, function, taskCommandInfos); + } catch (Exception e) { + throw new DorisStartException(e); + } + } + + public Boolean startCommandsByTaskId(Long taskId) { + return commandMapper.startCommandsByTaskId(taskId); + } + + public Boolean stopCommandsByTaskId(Long taskId) { + return commandMapper.stopCommandsByTaskId(taskId); + } + + public Boolean removeCommandsByTaskId(Long taskId) { + return commandMapper.removeCommandsByTaskId(taskId); + } +} diff --git a/src/main/java/com/realtime/protection/server/defense/object/ProtectObjectController.java b/src/main/java/com/realtime/protection/server/defense/object/ProtectObjectController.java index f6bf6c3..1d6dee4 100644 --- a/src/main/java/com/realtime/protection/server/defense/object/ProtectObjectController.java +++ b/src/main/java/com/realtime/protection/server/defense/object/ProtectObjectController.java @@ -3,6 +3,7 @@ package com.realtime.protection.server.defense.object; import com.alibaba.excel.EasyExcel; import com.realtime.protection.configuration.entity.defense.object.ProtectObject; import com.realtime.protection.configuration.response.ResponseResult; +import com.realtime.protection.configuration.utils.EntityUtils; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.Min; @@ -76,21 +77,15 @@ public class ProtectObjectController { } - @GetMapping("/{id}/query") - public ResponseResult queryProtectObject(@PathVariable("id") Integer protectObjectId) { + @GetMapping("/{protectObjectId}/query") + public ResponseResult queryProtectObject(@PathVariable Integer protectObjectId) throws IllegalAccessException { ProtectObject protectObject = protectObjectService.queryProtectObject(protectObjectId); return ResponseResult.ok() - .setData("proobj_id", protectObject.getProtectObjectId()) - .setData("proobj_name", protectObject.getProtectObjectName()) - .setData("proobj_system_name", protectObject.getProtectObjectSystemName()) - .setData("proobj_ip_address", protectObject.getProtectObjectIPAddress()) - .setData("proobj_port", protectObject.getProtectObjectPort()) - .setData("proobj_url", protectObject.getProtectObjectURL()) - .setData("proobj_protocol", protectObject.getProtectObjectProtocol()); + .setDataMap(EntityUtils.entityToMap(protectObject)); } - @PostMapping("/{id}/update") - public ResponseResult updateProtectObject(@PathVariable("id") Integer protectObjectId, + @PostMapping("/{protectObjectId}/update") + public ResponseResult updateProtectObject(@PathVariable Integer protectObjectId, @RequestBody @Valid ProtectObject protectObject) { protectObject.setProtectObjectId(protectObjectId); return ResponseResult.ok() @@ -98,8 +93,8 @@ public class ProtectObjectController { .setData("success", protectObjectService.updateProtectObject(protectObject)); } - @DeleteMapping("/{id}/delete") - public ResponseResult deleteProtectObject(@PathVariable("id") Integer protectObjectId) { + @DeleteMapping("/{protectObjectId}/delete") + public ResponseResult deleteProtectObject(@PathVariable Integer protectObjectId) { return ResponseResult.ok() .setData("proobj_id", protectObjectId) .setData("success", protectObjectService.deleteProtectObject(protectObjectId)); @@ -112,9 +107,9 @@ public class ProtectObjectController { .setData("success", protectObjectService.deleteProtectObjects(protectObjectIds)); } - @PostMapping("/{id}/audit/{status}") - public ResponseResult changeProtectObjectAuditStatus(@PathVariable("id") Integer protectObjectId, - @PathVariable("status") Integer auditStatus) { + @PostMapping("/{protectObjectId}/audit/{auditStatus}") + public ResponseResult changeProtectObjectAuditStatus(@PathVariable Integer protectObjectId, + @PathVariable Integer auditStatus) { return ResponseResult.ok() .setDataMap(protectObjectService.changeProtectObjectAuditStatus(protectObjectId, auditStatus)) .setData("proobj_id", protectObjectId); diff --git a/src/main/java/com/realtime/protection/server/defense/object/ProtectObjectService.java b/src/main/java/com/realtime/protection/server/defense/object/ProtectObjectService.java index 2f713e5..164e999 100644 --- a/src/main/java/com/realtime/protection/server/defense/object/ProtectObjectService.java +++ b/src/main/java/com/realtime/protection/server/defense/object/ProtectObjectService.java @@ -2,8 +2,8 @@ package com.realtime.protection.server.defense.object; import com.alibaba.excel.util.ListUtils; import com.realtime.protection.configuration.entity.defense.object.ProtectObject; -import com.realtime.protection.configuration.utils.status.AuditStatusValidator; import com.realtime.protection.configuration.utils.SqlSessionWrapper; +import com.realtime.protection.configuration.utils.status.AuditStatusValidator; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -90,7 +90,7 @@ public class ProtectObjectService { protectObjectBatch.clear(); } if (!protectObjectBatch.isEmpty()) { - mapper.deleteProtectObjects(protectObjectBatch);; + mapper.deleteProtectObjects(protectObjectBatch); } return success; }; diff --git a/src/main/java/com/realtime/protection/server/defense/template/TemplateController.java b/src/main/java/com/realtime/protection/server/defense/template/TemplateController.java index ea1448e..3efaff1 100644 --- a/src/main/java/com/realtime/protection/server/defense/template/TemplateController.java +++ b/src/main/java/com/realtime/protection/server/defense/template/TemplateController.java @@ -2,6 +2,7 @@ package com.realtime.protection.server.defense.template; import com.realtime.protection.configuration.entity.defense.template.Template; import com.realtime.protection.configuration.response.ResponseResult; +import com.realtime.protection.configuration.utils.EntityUtils; import jakarta.validation.Valid; import jakarta.validation.constraints.Min; import org.springframework.web.bind.annotation.*; @@ -43,16 +44,22 @@ public class TemplateController { @GetMapping("/query") public ResponseResult queryTemplates(@RequestParam(value = "template_name", required = false) String templateName, - @RequestParam("page") @Min(1) Integer page, - @RequestParam("page_size") @Min(1) Integer pageSize) { + @RequestParam("page") @Min(1) Integer page, + @RequestParam("page_size") @Min(1) Integer pageSize) { List