diff --git a/config/application-dispose.properties b/config/application-dispose.properties index 9b50ba12..a87de4a8 100644 --- a/config/application-dispose.properties +++ b/config/application-dispose.properties @@ -22,6 +22,10 @@ auth.token-timeout-minute=30 # 安全配置 crypto.security-protocol-type=0 -crypto.aes-key="hkoUV5ZWh0q1jSxMnpjovVn19Qg99HY6DD40" -crypto.des-key="P3mq9iSIvQcvfyfdWR8sAnfAadO" +crypto.aes-key=hkoUV5ZWh0q1jSxMnpjovVn19Qg99HY6DD40 +crypto.des-key=P3mq9iSIvQcvfyfdWR8sAnfAadO + +#信任主机配置 +trust.auth-host-token=165B2AA40395fA27278E59eEd4DD5EA490DA175344DE2673A5B17D3760E12F0 +trust.auth-hosts=127.0.0.12,::1 diff --git a/src/main/java/com/dispose/common/AuthConfigValue.java b/src/main/java/com/dispose/common/AuthConfigValue.java index 4230f7bb..40a9f433 100644 --- a/src/main/java/com/dispose/common/AuthConfigValue.java +++ b/src/main/java/com/dispose/common/AuthConfigValue.java @@ -1,5 +1,7 @@ package com.dispose.common; +import java.util.HashMap; + /** * The type Auth config value. * @@ -31,4 +33,9 @@ public class AuthConfigValue { * The constant MYSQL_REGEX_CHARS. */ public static final String MYSQL_REGEX_CHARS = "^((?!(--|\\s|\\*|%|\\+|'|;])).)*$"; + + /** + * The constant TRUST_INFO_CACHE. + */ + public static volatile HashMap TRUST_INFO_CACHE = new HashMap<>(); } diff --git a/src/main/java/com/dispose/common/ErrorCode.java b/src/main/java/com/dispose/common/ErrorCode.java index 9eda310a..2576f75b 100644 --- a/src/main/java/com/dispose/common/ErrorCode.java +++ b/src/main/java/com/dispose/common/ErrorCode.java @@ -161,6 +161,21 @@ public enum ErrorCode { */ ERR_DATABASE(35, "操作数据库失败"), + /** + * The Err ipnodevice. + */ + ERR_IPNODEVICE(36, "找不到处置该IP的设备"), + + /** + * Err untrusthost error code. + */ + ERR_UNTRUSTHOST(37, "未经授权的客户端"), + + /** + * Err untrusttoken error code. + */ + ERR_UNTRUSTTOKEN(37, "未经授权的Token"), + /** * The Err decrypt base 64. */ @@ -195,11 +210,11 @@ public enum ErrorCode { ERR_ENCRYPT_UNKNOWN(107, "不支持的加密算法"), /** - * Err json encode error code. + * The Err json encode. */ ERR_JSON_ENCODE(108, "Json 序列号错误"), /** - * Err json decode error code. + * The Err json decode. */ ERR_JSON_DECODE(109, "Json 反序列化错误"), ; diff --git a/src/main/java/com/dispose/config/AuthConfigure.java b/src/main/java/com/dispose/config/AuthConfigure.java index 43163302..0cbc9f45 100644 --- a/src/main/java/com/dispose/config/AuthConfigure.java +++ b/src/main/java/com/dispose/config/AuthConfigure.java @@ -1,11 +1,15 @@ package com.dispose.config; import com.dispose.common.AuthConfigValue; +import com.dispose.interceptor.TokenInterceptor; import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.annotation.PostConstruct; import java.util.Optional; @@ -20,7 +24,7 @@ import java.util.Optional; @Component @ConfigurationProperties(prefix = "auth") @Configuration -public class AuthConfigure { +public class AuthConfigure implements WebMvcConfigurer { /** * The Token timeout minute. */ @@ -39,4 +43,21 @@ public class AuthConfigure { AuthConfigValue.TOKEN_EXPIRED_TIME_MS = Optional.ofNullable(tokenTimeoutMinute).orElse((long) 30 * 60 * 1000); AuthConfigValue.VERIFY_REQUEST_TOKEN = Optional.ofNullable(verifyRequestToken).orElse(true); } + + @Bean + public TokenInterceptor initAuthInterceptor(){ + return new TokenInterceptor(); + } + + /** + * Add interceptors. + * + * @param registry the registry + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册需要检查token的控制器接口 + registry.addInterceptor(initAuthInterceptor()).addPathPatterns("/information/**"); + registry.addInterceptor(initAuthInterceptor()).addPathPatterns("/task/**"); + } } diff --git a/src/main/java/com/dispose/config/AuthTokenConfig.java b/src/main/java/com/dispose/config/AuthTokenConfig.java deleted file mode 100644 index 3124dfb2..00000000 --- a/src/main/java/com/dispose/config/AuthTokenConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.dispose.config; - -import com.dispose.interceptor.TokenInterceptor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - * The type Auth token config. - * - * @author - */ -@Configuration -public class AuthTokenConfig implements WebMvcConfigurer { - /** - * Init auth interceptor token interceptor. - * - * @return the token interceptor - */ - @Bean - public TokenInterceptor initAuthInterceptor(){ - return new TokenInterceptor(); - } - - /** - * Add interceptors. - * - * @param registry the registry - */ - @Override - public void addInterceptors(InterceptorRegistry registry) { - // 注册需要检查token的控制器接口 - registry.addInterceptor(initAuthInterceptor()).addPathPatterns("/information/**"); - registry.addInterceptor(initAuthInterceptor()).addPathPatterns("/task/**"); - } -} diff --git a/src/main/java/com/dispose/config/TrustHostConfig.java b/src/main/java/com/dispose/config/TrustHostConfig.java new file mode 100644 index 00000000..48907f9e --- /dev/null +++ b/src/main/java/com/dispose/config/TrustHostConfig.java @@ -0,0 +1,74 @@ +package com.dispose.config; + +import com.dispose.common.AuthConfigValue; +import com.dispose.common.Helper; +import com.dispose.interceptor.TrustHostInterceptor; +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import javax.annotation.PostConstruct; +import java.util.Optional; + +/** + * The type Trust host config. + * + * @author + */ +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "trust") +@Configuration +public class TrustHostConfig implements WebMvcConfigurer { + + /** + * The Auth host token. + */ + private String[] authHostToken; + + /** + * The Auth hosts. + */ + private String[] authHosts; + + /** + * Init global value. + */ + @PostConstruct + private void initGlobalValue() { + for (String s : Optional.ofNullable(authHostToken).orElse(new String[]{""})) { + AuthConfigValue.TRUST_INFO_CACHE.put(s, System.currentTimeMillis()); + } + + for (String s : Optional.ofNullable(authHosts).orElse(new String[]{"127.0.0.1"})) { + AuthConfigValue.TRUST_INFO_CACHE.put(Helper.ipAddressNormalize(s), System.currentTimeMillis()); + } + } + + /** + * Init front view interceptor trust host interceptor. + * + * @return the trust host interceptor + */ + @Bean + public TrustHostInterceptor initFrontViewInterceptor() { + return new TrustHostInterceptor(); + } + + /** + * Add interceptors. + * + * @param registry the registry + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册需要检查token的控制器接口 + registry.addInterceptor(initFrontViewInterceptor()).addPathPatterns("/frontview/**"); + } +} diff --git a/src/main/java/com/dispose/controller/DisposeDeviceManagerController.java b/src/main/java/com/dispose/controller/DisposeDeviceManagerController.java index 80c5f6a2..86abfb38 100644 --- a/src/main/java/com/dispose/controller/DisposeDeviceManagerController.java +++ b/src/main/java/com/dispose/controller/DisposeDeviceManagerController.java @@ -238,7 +238,7 @@ public class DisposeDeviceManagerController { * @param mr the mr * @return the all dispose device */ - @PostMapping("/device_list") + @PostMapping("/deviceList") @ResponseBody @ApiOperation("获取处置能力节点") public ProtocolRespDTO getAllDisposeDevice( diff --git a/src/main/java/com/dispose/controller/DisposeTaskController.java b/src/main/java/com/dispose/controller/DisposeTaskController.java index 8bcb40ba..bd943f64 100644 --- a/src/main/java/com/dispose/controller/DisposeTaskController.java +++ b/src/main/java/com/dispose/controller/DisposeTaskController.java @@ -7,13 +7,13 @@ import com.dispose.common.DisposeConfigValue; import com.dispose.common.ErrorCode; import com.dispose.common.Helper; import com.dispose.common.NetflowDirection; -import com.dispose.pojo.dto.protocol.base.BaseIdResp; import com.dispose.pojo.dto.protocol.base.BaseRespStatus; import com.dispose.pojo.dto.protocol.base.IdArraysReq; import com.dispose.pojo.dto.protocol.base.ProtocolReqDTO; import com.dispose.pojo.dto.protocol.base.ProtocolRespDTO; import com.dispose.pojo.dto.protocol.task.TaskStartReq; -import com.dispose.pojo.dto.protocol.task.TaskStopResp; +import com.dispose.pojo.dto.protocol.task.TaskStartRsp; +import com.dispose.pojo.dto.protocol.task.TaskStopRsp; import com.dispose.pojo.entity.DeviceTask; import com.dispose.pojo.entity.DisposeTask; import com.dispose.pojo.po.MulReturnType; @@ -84,7 +84,7 @@ public class DisposeTaskController { @NotNull @RequestHeader HttpHeaders headers) { TaskStartReq req = mr.getMsgContent(); - // 构成处置任务参数 + // 构造处置任务参数 DisposeTask task = DisposeTask.builder() .deviceId(Long.parseLong(Optional.ofNullable(req.getId()).orElse("-1"))) .accountId(userAccountService.getUserIdByAuthHead(Objects.requireNonNull(headers.get("Authorization")).get(0))) @@ -101,22 +101,86 @@ public class DisposeTaskController { .build(); // 创建处置任务 - MulReturnType ret = disposeTaskService.createTask(task); - - // 启动任务失败 - if (ret.getFirstParam() != ErrorCode.ERR_OK) { - log.error("Start task failed, error: {}", ret.getFirstParam().getMsg()); - return ProtocolRespDTO.result(ret.getFirstParam()); - } + MulReturnType ret = disposeTaskService.createTask(task); // 设置返回消息 - BaseIdResp rspInfo = new BaseIdResp(); + TaskStartRsp rspInfo = TaskStartRsp.builder() + .disposeIp(task.getDisposeIp()) + .build(); - rspInfo.setTaskId(ret.getSecondParam().toString()); rspInfo.setStatus(ret.getFirstParam().getCode()); rspInfo.setMessage(new String[]{ret.getFirstParam().getMsg()}); - return ProtocolRespDTO.result(ErrorCode.ERR_OK, rspInfo); + if (ret.getFirstParam() != ErrorCode.ERR_OK) { + log.error("Start task failed, error: {}", ret.getFirstParam().getMsg()); + + if (ret.getFirstParam() != ErrorCode.ERR_TASKRUNNING) { + return ProtocolRespDTO.result(ret.getFirstParam(), rspInfo); + } + } + + rspInfo.setTaskId(ret.getSecondParam().getId().toString()); + rspInfo.setExpireTime(ret.getSecondParam().getPlanEndTime()); + + return ProtocolRespDTO.result(ret.getFirstParam(), rspInfo); + } + + @PostMapping("/startMulIp") + @ResponseBody + @ApiOperation("启动处置任务") + public ProtocolRespDTO> startTaskMulIp(@Validated(ValidGroups.TaskStartMulReqValid.class) + @RequestBody ProtocolReqDTO mr, + @NotNull @RequestHeader HttpHeaders headers) { + TaskStartReq req = mr.getMsgContent(); + Long devId = Long.parseLong(Optional.ofNullable(req.getId()).orElse("-1")); + Long aId = userAccountService.getUserIdByAuthHead(Objects.requireNonNull(headers.get("Authorization")).get(0)); + DisposeCapacityType capType = CommonEnumHandler.codeOf(DisposeCapacityType.class, req.getType()); + String endTime = String.valueOf(req.getDisposeTime()); + NetflowDirection netDir = CommonEnumHandler.codeOf(NetflowDirection.class, + Optional.ofNullable(req.getFlowDirection()).orElse(2)); + Long attackType = DDoSAttackType.getTypeMaskFromAttackType(Optional.ofNullable(req.getAttackType()) + .orElse(new Integer[]{DDoSAttackType.ALL_ATTACKS.getValue()})); + Integer flowBand = Optional.ofNullable(req.getFlowBandwidth()) + .orElse(DisposeConfigValue.DEFAULT_DISPOSE_BANDWIDTH); + + List rspList = new ArrayList<>(); + + for (String ip : req.getMulDisposeIp()) { + // 构造处置任务参数 + DisposeTask task = DisposeTask.builder() + .deviceId(devId) + .accountId(aId) + .disposeCapacity(capType) + .disposeIp(Helper.ipAddressNormalize(ip)) + .planEndTime(endTime) + .flowDirection(netDir) + .attackType(attackType) + .flowBandWidth(flowBand) + .build(); + + // 创建处置任务 + MulReturnType ret = disposeTaskService.createTask(task); + + // 设置返回消息 + TaskStartRsp rspInfo = TaskStartRsp.builder() + .disposeIp(ip) + .build(); + + // 启动任务成功 + if (ret.getFirstParam() == ErrorCode.ERR_OK || + ret.getFirstParam() == ErrorCode.ERR_TASKRUNNING) { + rspInfo.setTaskId(ret.getSecondParam().getId().toString()); + rspInfo.setExpireTime(ret.getSecondParam().getPlanEndTime()); + } + + + rspInfo.setStatus(ret.getFirstParam().getCode()); + rspInfo.setMessage(new String[]{ret.getFirstParam().getMsg()}); + + rspList.add(rspInfo); + } + + return ProtocolRespDTO.result(ErrorCode.ERR_OK, rspList); } /** @@ -132,13 +196,13 @@ public class DisposeTaskController { @RequestBody ProtocolReqDTO mr) { // 记录多个任务停止信息 - List rspList = new ArrayList<>(); + List rspList = new ArrayList<>(); for (String tId : mr.getMsgContent().getTaskId()) { // 停止处置任务 MulReturnType ret = disposeTaskService.stopTask(Long.parseLong(tId)); - TaskStopResp rspInfo = TaskStopResp.builder().build(); + TaskStopRsp rspInfo = TaskStopRsp.builder().build(); // 停止成功 if (ret.getFirstParam() == ErrorCode.ERR_OK) { diff --git a/src/main/java/com/dispose/interceptor/TrustHostInterceptor.java b/src/main/java/com/dispose/interceptor/TrustHostInterceptor.java new file mode 100644 index 00000000..48de3f1d --- /dev/null +++ b/src/main/java/com/dispose/interceptor/TrustHostInterceptor.java @@ -0,0 +1,69 @@ +package com.dispose.interceptor; + +import com.dispose.common.AuthConfigValue; +import com.dispose.common.ErrorCode; +import com.dispose.common.Helper; +import com.dispose.pojo.dto.protocol.base.ProtocolRespDTO; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.servlet.HandlerInterceptor; +import reactor.util.annotation.NonNull; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * The type Trust host interceptor. + * + * @author + */ +@Slf4j +public class TrustHostInterceptor implements HandlerInterceptor { + /** + * Pre handle boolean. + * + * @param request the request + * @param response the response + * @param handler the handler + * @return the boolean + */ + @Override + public boolean preHandle(@NonNull HttpServletRequest request, + @NonNull HttpServletResponse response, + @NonNull Object handler) throws IOException { + ErrorCode err; + + // 获取访问接口的客户端IP + String remoteIp = request.getRemoteAddr(); + // 判断该IP是否在信任列表内 + if (AuthConfigValue.TRUST_INFO_CACHE.containsKey(Helper.ipAddressNormalize(remoteIp))) { + // 提取header中的Authorization字段里面的token值 + String token = request.getHeader("Authorization"); + + if (token != null && token.length() > 0) { + // 判断token是否在信任列表中 + if(AuthConfigValue.TRUST_INFO_CACHE.containsKey(token)) { + return true; + } else { + err = ErrorCode.ERR_UNTRUSTTOKEN; + log.error("http request token [{}] is not trust", token); + } + + } else { + err = ErrorCode.ERR_MISSAUTHHEAD; + log.error("Http request token [{}] is does not trust token", token); + } + } else { + err = ErrorCode.ERR_UNTRUSTHOST; + log.error("Remote host {} not trust", remoteIp); + } + + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json;charset=UTF-8"); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.getWriter().write(new ObjectMapper().writeValueAsString(ProtocolRespDTO.result(err))); + + return false; + } +} diff --git a/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStartReq.java b/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStartReq.java index c841db50..4c1c9841 100644 --- a/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStartReq.java +++ b/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStartReq.java @@ -1,6 +1,7 @@ package com.dispose.pojo.dto.protocol.task; import com.dispose.validation.group.ValidGroups; +import com.dispose.validation.valids.ValidArrayIpAddr; import com.dispose.validation.valids.ValidDDosAttackType; import com.dispose.validation.valids.ValidIpAddr; import com.fasterxml.jackson.annotation.JsonInclude; @@ -32,10 +33,10 @@ public class TaskStartReq { /** * The Type. */ - @NotNull(message = "type 处置类型不能为空", groups = ValidGroups.TaskStartReqValid.class) + @NotNull(message = "type 处置类型不能为空", groups = ValidGroups.TaskStartReqCommonValid.class) @Range(min = 0, max = 3, message = "type 字段取值为 [0, 3]", - groups = ValidGroups.TaskStartReqValid.class) + groups = ValidGroups.TaskStartReqCommonValid.class) private Integer type; /** * The Dispose ip. @@ -43,24 +44,32 @@ public class TaskStartReq { @NotBlank(message = "disposeIp 处置IP地址不能为空", groups = ValidGroups.TaskStartReqValid.class) @ValidIpAddr(message = "disposeIp Ip地址格式错误", groups = ValidGroups.TaskStartReqValid.class) private String disposeIp; + /** + * The Mul dispose ip. + */ + @NotNull(message = "mulDisposeIp 处置IP地址不能为空", groups = ValidGroups.TaskStartMulReqValid.class) + @ValidArrayIpAddr(message = "mulDisposeIp Ip地址格式错误", groups = ValidGroups.TaskStartMulReqValid.class) + @Size(min = 1, max = 255, message = "mulDisposeIp 必须包含 1-255 个元素", + groups = ValidGroups.TaskStartMulReqValid.class) + private String[] mulDisposeIp; /** * The Dispose time. */ - @NotNull(message = "disposeTime 处置时间不能为空", groups = ValidGroups.TaskStartReqValid.class) + @NotNull(message = "disposeTime 处置时间不能为空", groups = ValidGroups.TaskStartReqCommonValid.class) private Integer disposeTime; /** * The Flow direction. */ @Range(min = 0, max = 2, message = "flowDirection 字段取值为 [0, 2]", - groups = ValidGroups.TaskStartReqValid.class) + groups = ValidGroups.TaskStartReqCommonValid.class) private Integer flowDirection; /** * The Attack type. */ - @ValidDDosAttackType(message = "attackType 攻击类型参数错误", groups = ValidGroups.TaskStartReqValid.class) + @ValidDDosAttackType(message = "attackType 攻击类型参数错误", groups = ValidGroups.TaskStartReqCommonValid.class) @Size(min = 1, message = "attackType 必须指定最少一种攻击类型", - groups = ValidGroups.ProtocolCommonValid.class) + groups = ValidGroups.TaskStartReqCommonValid.class) private Integer[] attackType; /** * The Flow bandwidth. diff --git a/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStartRsp.java b/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStartRsp.java new file mode 100644 index 00000000..30126516 --- /dev/null +++ b/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStartRsp.java @@ -0,0 +1,31 @@ +package com.dispose.pojo.dto.protocol.task; + +import com.dispose.pojo.dto.protocol.base.BaseIdResp; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * The type Task start rsp. + * + * @author + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Builder +@AllArgsConstructor +@JsonPropertyOrder({"taskId", "disposeIp", "expireTime", "status", "message"}) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class TaskStartRsp extends BaseIdResp { + /** + * The Dispose ip. + */ + private String disposeIp; + /** + * The Expire time. + */ + private String expireTime; +} diff --git a/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStopResp.java b/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStopRsp.java similarity index 95% rename from src/main/java/com/dispose/pojo/dto/protocol/task/TaskStopResp.java rename to src/main/java/com/dispose/pojo/dto/protocol/task/TaskStopRsp.java index 8004f500..c4c90582 100644 --- a/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStopResp.java +++ b/src/main/java/com/dispose/pojo/dto/protocol/task/TaskStopRsp.java @@ -21,7 +21,7 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @JsonPropertyOrder({"taskId", "disposeDevice", "type", "disposeIp", "leftTime", "status", "message"}) @JsonInclude(JsonInclude.Include.NON_NULL) -public class TaskStopResp extends BaseIdResp { +public class TaskStopRsp extends BaseIdResp { /** * The Dispose device. diff --git a/src/main/java/com/dispose/service/DisposeAbilityRouterService.java b/src/main/java/com/dispose/service/DisposeAbilityRouterService.java index 1ccebb2f..c6b09ca1 100644 --- a/src/main/java/com/dispose/service/DisposeAbilityRouterService.java +++ b/src/main/java/com/dispose/service/DisposeAbilityRouterService.java @@ -1,5 +1,6 @@ package com.dispose.service; +import com.dispose.common.DisposeCapacityType; import com.dispose.common.ErrorCode; import com.dispose.pojo.entity.DisposeDevice; import com.dispose.pojo.po.AbilityInfo; @@ -43,4 +44,14 @@ public interface DisposeAbilityRouterService { * @return the error code */ ErrorCode addDisposeAbilityDevice(DisposeDevice dev); + + /** + * Verify dispose capacity error code. + * + * @param deviceId the device id + * @param disposeIp the dispose ip + * @param capacityType the capacity type + * @return the error code + */ + ErrorCode verifyDisposeCapacity(Long deviceId, String disposeIp, DisposeCapacityType capacityType); } diff --git a/src/main/java/com/dispose/service/DisposeTaskService.java b/src/main/java/com/dispose/service/DisposeTaskService.java index a8860bd2..6bbfd558 100644 --- a/src/main/java/com/dispose/service/DisposeTaskService.java +++ b/src/main/java/com/dispose/service/DisposeTaskService.java @@ -17,7 +17,7 @@ public interface DisposeTaskService { * @param task the task * @return the mul return type */ - MulReturnType createTask(DisposeTask task); + MulReturnType createTask(DisposeTask task); /** * Stop task mul return type. diff --git a/src/main/java/com/dispose/service/impl/DisposeAbilityRouterServiceImpl.java b/src/main/java/com/dispose/service/impl/DisposeAbilityRouterServiceImpl.java index ec81e052..c58507cc 100644 --- a/src/main/java/com/dispose/service/impl/DisposeAbilityRouterServiceImpl.java +++ b/src/main/java/com/dispose/service/impl/DisposeAbilityRouterServiceImpl.java @@ -4,6 +4,7 @@ import com.dispose.ability.DisposeAbility; import com.dispose.ability.impl.DpTechAbilityImpl; import com.dispose.ability.impl.HaoHanAbilityImpl; import com.dispose.ability.impl.VirtualAbilityImpl; +import com.dispose.common.DisposeCapacityType; import com.dispose.common.ErrorCode; import com.dispose.common.HttpType; import com.dispose.manager.DisposeDeviceManager; @@ -132,6 +133,36 @@ public class DisposeAbilityRouterServiceImpl implements DisposeAbilityRouterServ return ErrorCode.ERR_OK; } + /** + * Verify dispose capacity error code. + * + * @param deviceId the device id + * @param disposeIp the dispose ip + * @param capacityType the capacity type + * @return the error code + */ + @Override + public ErrorCode verifyDisposeCapacity(Long deviceId, String disposeIp, DisposeCapacityType capacityType) { + + if (getAllAbilityDevices().stream() + .noneMatch(f -> deviceId == -1 || f.getDev().getId().equals(deviceId))) { + return ErrorCode.ERR_NOSUCHDEVICE; + } + + if(getAllAbilityDevices().stream() + .noneMatch(c -> c.getDev().getDevCapacity().stream() + .anyMatch(m -> m.getCapacityType() == capacityType))) { + return ErrorCode.ERR_NOSUCHTYPE; + } + + if(getAllAbilityDevices().stream() + .noneMatch(c -> c.getDb().isCarryProtectIp(disposeIp))) { + return ErrorCode.ERR_IPNODEVICE; + } + + return ErrorCode.ERR_OK; + } + /** * Gets ability device hash key. * diff --git a/src/main/java/com/dispose/service/impl/DisposeTaskServiceImpl.java b/src/main/java/com/dispose/service/impl/DisposeTaskServiceImpl.java index bfc77d21..722bd1db 100644 --- a/src/main/java/com/dispose/service/impl/DisposeTaskServiceImpl.java +++ b/src/main/java/com/dispose/service/impl/DisposeTaskServiceImpl.java @@ -5,6 +5,7 @@ import com.dispose.common.ErrorCode; import com.dispose.manager.DisposeTaskManager; import com.dispose.pojo.entity.DisposeTask; import com.dispose.pojo.po.MulReturnType; +import com.dispose.service.DisposeAbilityRouterService; import com.dispose.service.DisposeTaskService; import org.springframework.stereotype.Service; @@ -23,6 +24,9 @@ public class DisposeTaskServiceImpl implements DisposeTaskService { @Resource DisposeTaskManager disposeTaskManager; + @Resource + DisposeAbilityRouterService disposeAbilityRouterService; + /** * Create task mul return type. * @@ -30,15 +34,24 @@ public class DisposeTaskServiceImpl implements DisposeTaskService { * @return the mul return type */ @Override - public MulReturnType createTask(DisposeTask task) { + public MulReturnType createTask(DisposeTask task) { DisposeTask exitTask = disposeTaskManager.getDisposeTask(task.getDeviceId(), task.getDisposeIp(), task.getDisposeCapacity()); if (exitTask != null) { - return new MulReturnType<>(ErrorCode.ERR_TASKRUNNING, exitTask.getId()); + return new MulReturnType<>(ErrorCode.ERR_TASKRUNNING, exitTask); } - return new MulReturnType<>(disposeTaskManager.addDisposeTask(task), task.getId()); + ErrorCode err = disposeAbilityRouterService.verifyDisposeCapacity( + task.getDeviceId(), task.getDisposeIp(), task.getDisposeCapacity() + ); + + if(err != ErrorCode.ERR_OK) { + return new MulReturnType<>(err, task); + } + + return new MulReturnType<>(disposeTaskManager.addDisposeTask(task), + disposeTaskManager.getDisposeTaskById(task.getId())); } /** diff --git a/src/main/java/com/dispose/validation/group/ValidGroups.java b/src/main/java/com/dispose/validation/group/ValidGroups.java index bcf2a756..d46ecfdd 100644 --- a/src/main/java/com/dispose/validation/group/ValidGroups.java +++ b/src/main/java/com/dispose/validation/group/ValidGroups.java @@ -67,7 +67,18 @@ public interface ValidGroups { * * @author */ - interface TaskStartReqValid extends ProtocolCommonValid { + interface TaskStartReqCommonValid extends ProtocolCommonValid { + } + + interface TaskStartReqValid extends TaskStartReqCommonValid { + } + + /** + * The interface Task start mul req valid. + * + * @author + */ + interface TaskStartMulReqValid extends TaskStartReqCommonValid { } /** diff --git a/src/main/java/com/dispose/validation/valids/ValidArrayIpAddr.java b/src/main/java/com/dispose/validation/valids/ValidArrayIpAddr.java new file mode 100644 index 00000000..2eb9b6f6 --- /dev/null +++ b/src/main/java/com/dispose/validation/valids/ValidArrayIpAddr.java @@ -0,0 +1,43 @@ +package com.dispose.validation.valids; + +import com.dispose.validation.valids.impl.ValidArrayIpAddrImpl; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The interface Valid array ip addr. + * + * @author + */ +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint(validatedBy = {ValidArrayIpAddrImpl.class}) +public @interface ValidArrayIpAddr { + /** + * Message string. + * + * @return the string + */ + String message(); + + /** + * Groups class [ ]. + * + * @return the class [ ] + */ + Class[] groups() default {}; + + /** + * Payload class [ ]. + * + * @return the class [ ] + */ + Class[] payload() default {}; +} diff --git a/src/main/java/com/dispose/validation/valids/impl/ValidArrayIpAddrImpl.java b/src/main/java/com/dispose/validation/valids/impl/ValidArrayIpAddrImpl.java new file mode 100644 index 00000000..6a213a26 --- /dev/null +++ b/src/main/java/com/dispose/validation/valids/impl/ValidArrayIpAddrImpl.java @@ -0,0 +1,49 @@ +package com.dispose.validation.valids.impl; + +import com.dispose.common.ConstValue; +import com.dispose.validation.valids.ValidArrayIpAddr; +import inet.ipaddr.IPAddress; +import inet.ipaddr.IPAddressString; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.regex.Pattern; + +/** + * The type Valid array ip addr. + * + * @author + */ +public class ValidArrayIpAddrImpl implements ConstraintValidator { + @Override + public boolean isValid(String[] strings, ConstraintValidatorContext constraintValidatorContext) { + + if (strings == null || strings.length == 0) { + return false; + } + + for (String s : strings) { + if (!Pattern.matches(ConstValue.IP_ADDR_REG, s)) { + return false; + } + + IPAddressString addrString = new IPAddressString(s); + + IPAddress addr = addrString.getAddress(); + + if (addr == null) { + return false; + } + + if (!addr.isIPv4() && !addr.isIPv6()) { + return false; + } + } + + return true; + } + + @Override + public void initialize(ValidArrayIpAddr constraintAnnotation) { + } +} diff --git a/src/main/java/com/dispose/validation/valids/impl/ValidIpAddrImpl.java b/src/main/java/com/dispose/validation/valids/impl/ValidIpAddrImpl.java index 7b2cc128..51a52ed5 100644 --- a/src/main/java/com/dispose/validation/valids/impl/ValidIpAddrImpl.java +++ b/src/main/java/com/dispose/validation/valids/impl/ValidIpAddrImpl.java @@ -34,6 +34,11 @@ public class ValidIpAddrImpl implements ConstraintValidator */ @Override public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { + + if(s == null || s.length() == 0) { + return false; + } + if (!Pattern.matches(ConstValue.IP_ADDR_REG, s)) { return false; } diff --git a/src/test/java/com/dispose/test/controller/DisposeTaskControllerTest.java b/src/test/java/com/dispose/test/controller/DisposeTaskControllerTest.java index afde1c32..08f6a3d6 100644 --- a/src/test/java/com/dispose/test/controller/DisposeTaskControllerTest.java +++ b/src/test/java/com/dispose/test/controller/DisposeTaskControllerTest.java @@ -1,6 +1,13 @@ package com.dispose.test.controller; -import com.dispose.common.*; +import com.dispose.common.ConstValue; +import com.dispose.common.DDoSAttackType; +import com.dispose.common.DisposeCapacityType; +import com.dispose.common.DisposeConfigValue; +import com.dispose.common.DisposeTaskStatus; +import com.dispose.common.ErrorCode; +import com.dispose.common.NetflowDirection; +import com.dispose.common.ProtoCryptoType; import com.dispose.mapper.DisposeDeviceMapper; import com.dispose.mapper.DisposeTaskMapper; import com.dispose.pojo.dto.protocol.base.BaseIdResp; @@ -8,9 +15,10 @@ import com.dispose.pojo.dto.protocol.base.IdArraysReq; import com.dispose.pojo.dto.protocol.base.ProtocolReqDTO; import com.dispose.pojo.dto.protocol.base.ProtocolRespDTO; import com.dispose.pojo.dto.protocol.task.TaskStartReq; -import com.dispose.pojo.dto.protocol.task.TaskStopResp; +import com.dispose.pojo.dto.protocol.task.TaskStopRsp; import com.dispose.pojo.entity.DisposeTask; import com.dispose.test.Global.InitTestEnvironment; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import jodd.net.HttpStatus; import lombok.extern.slf4j.Slf4j; @@ -28,10 +36,8 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.transaction.annotation.Transactional; -import com.fasterxml.jackson.core.type.TypeReference; import javax.annotation.Resource; - import java.util.ArrayList; import java.util.List; @@ -234,14 +240,14 @@ public class DisposeTaskControllerTest extends InitTestEnvironment { .getResponse() .getContentAsString(); - ProtocolRespDTO> rspInfo = objectMapper.readValue(ret, - new TypeReference>>() { + ProtocolRespDTO> rspInfo = objectMapper.readValue(ret, + new TypeReference>>() { }); verifyRespProtocol(rspInfo); log.debug(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(rspInfo)); - for (TaskStopResp t : rspInfo.getMsgContent() + for (TaskStopRsp t : rspInfo.getMsgContent() ) { Assert.assertNotNull(t.getTaskId()); Assert.assertNotNull(t.getStatus()); diff --git a/src/test/java/com/dispose/test/service/DisposeTaskServiceTest.java b/src/test/java/com/dispose/test/service/DisposeTaskServiceTest.java index ca99adf9..50b4cab8 100644 --- a/src/test/java/com/dispose/test/service/DisposeTaskServiceTest.java +++ b/src/test/java/com/dispose/test/service/DisposeTaskServiceTest.java @@ -1,6 +1,10 @@ package com.dispose.test.service; -import com.dispose.common.*; +import com.dispose.common.DDoSAttackType; +import com.dispose.common.DisposeCapacityType; +import com.dispose.common.DisposeConfigValue; +import com.dispose.common.ErrorCode; +import com.dispose.common.NetflowDirection; import com.dispose.manager.DisposeTaskManager; import com.dispose.mapper.DisposeDeviceMapper; import com.dispose.mapper.UserAccountMapper; @@ -107,20 +111,20 @@ public class DisposeTaskServiceTest extends InitTestEnvironment { log.info("creat new task: {}", objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(newTask)); - MulReturnType ret = disposeTaskService.createTask(newTask); + MulReturnType ret = disposeTaskService.createTask(newTask); if (ret.getFirstParam() == ErrorCode.ERR_OK) { Assert.assertNotNull(ret.getSecondParam()); } else { Assert.assertNotEquals(ret.getFirstParam().getCode(), ErrorCode.ERR_OK.getCode()); } - Assert.assertEquals(ret.getSecondParam(), disposeTaskManager.getDisposeTask(newTask.getDeviceId(), + Assert.assertEquals(ret.getSecondParam().getId(), disposeTaskManager.getDisposeTask(newTask.getDeviceId(), newTask.getDisposeIp(), newTask.getDisposeCapacity()).getId()); ret = disposeTaskService.createTask(newTask); Assert.assertEquals(ret.getFirstParam().getCode(), ErrorCode.ERR_TASKRUNNING.getCode()); - Assert.assertEquals(ret.getSecondParam(), disposeTaskManager.getDisposeTask(newTask.getDeviceId(), + Assert.assertEquals(ret.getSecondParam().getId(), disposeTaskManager.getDisposeTask(newTask.getDeviceId(), newTask.getDisposeIp(), newTask.getDisposeCapacity()).getId()); } }