From f00d8d1479c3bc7321c5a3177028a4d42c88f1b1 Mon Sep 17 00:00:00 2001 From: Yohanes <“Y0hanes@outlook.com”> Date: Wed, 26 Jul 2023 13:43:13 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=89=93=E5=8D=B0msg=E4=B8=BAnull?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/neutrinoproxy/server/base/rest/ServiceException.java | 1 + 1 file changed, 1 insertion(+) diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/rest/ServiceException.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/rest/ServiceException.java index f04351f8..d7655e2c 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/rest/ServiceException.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/rest/ServiceException.java @@ -42,6 +42,7 @@ public class ServiceException extends RuntimeException { private String msg; public ServiceException(int code, String msg) { + super(msg); this.code = code; this.msg = msg; } From b737535b0f1efd4bb8de24e238d63771d3a9b2dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B5=A9=E6=9D=B0?= <897546244@qq.com> Date: Sat, 29 Jul 2023 15:52:33 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=88=A0=E9=99=A4?= =?UTF-8?q?license=E6=97=B6=E6=9C=AA=E5=81=9A=E7=AB=AF=E5=8F=A3=E6=98=A0?= =?UTF-8?q?=E5=B0=84=E6=A3=80=E6=9F=A5BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/constant/ExceptionConstant.java | 1 + .../server/service/LicenseService.java | 395 +++++++++--------- 2 files changed, 205 insertions(+), 191 deletions(-) diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/ExceptionConstant.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/ExceptionConstant.java index ef2ba6f9..0c6ff94c 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/ExceptionConstant.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/ExceptionConstant.java @@ -50,6 +50,7 @@ public enum ExceptionConstant { ORIGIN_PASSWORD_CHECK_FAIL(12002, "原密码验证失败"), LOGIN_PASSWORD_LENGTH_CHECK_FAIL(12003, "登录密码不能小于6位数"), LOGIN_PASSWORD_NO_CHANGE_MODIFY_FAIL(12004, "密码没有变化,修改失败"), + LICENSE_CANNOT_BE_DELETED(12005, "license下存在[{}]个端口映射!"), // 端口池管理(13000) PORT_CANNOT_REPEAT(13000,"端口不能重复"), PORT_NOT_EXIST(13001, "该端口在端口池中不存在"), diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/LicenseService.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/LicenseService.java index 7b96fda3..62affcde 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/LicenseService.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/LicenseService.java @@ -6,9 +6,12 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.google.common.collect.Sets; +import ma.glasnost.orika.MapperFacade; +import org.apache.ibatis.solon.annotation.Db; import org.dromara.neutrinoproxy.server.base.db.DBInitialize; import org.dromara.neutrinoproxy.server.base.page.PageInfo; import org.dromara.neutrinoproxy.server.base.page.PageQuery; +import org.dromara.neutrinoproxy.server.base.rest.ServiceException; import org.dromara.neutrinoproxy.server.base.rest.SystemContextHolder; import org.dromara.neutrinoproxy.server.constant.EnableStatusEnum; import org.dromara.neutrinoproxy.server.constant.ExceptionConstant; @@ -19,17 +22,15 @@ import org.dromara.neutrinoproxy.server.controller.req.proxy.LicenseUpdateEnable import org.dromara.neutrinoproxy.server.controller.req.proxy.LicenseUpdateReq; import org.dromara.neutrinoproxy.server.controller.res.proxy.*; import org.dromara.neutrinoproxy.server.dal.LicenseMapper; +import org.dromara.neutrinoproxy.server.dal.PortMappingMapper; import org.dromara.neutrinoproxy.server.dal.UserMapper; import org.dromara.neutrinoproxy.server.dal.entity.LicenseDO; +import org.dromara.neutrinoproxy.server.dal.entity.PortMappingDO; import org.dromara.neutrinoproxy.server.dal.entity.UserDO; import org.dromara.neutrinoproxy.server.util.ParamCheckUtil; -import ma.glasnost.orika.MapperFacade; -import org.apache.ibatis.solon.annotation.Db; -import org.dromara.neutrinoproxy.server.controller.res.proxy.*; import org.noear.solon.annotation.Component; import org.noear.solon.annotation.Init; import org.noear.solon.annotation.Inject; -import org.noear.solon.core.Lifecycle; import org.noear.solon.core.bean.LifecycleBean; import java.util.*; @@ -38,219 +39,231 @@ import java.util.stream.Collectors; /** * license服务 + * * @author: aoshiguchen * @date: 2022/8/6 */ @Component public class LicenseService implements LifecycleBean { - @Inject - private MapperFacade mapperFacade; - @Db - private LicenseMapper licenseMapper; - @Db - private UserMapper userMapper; - @Inject - private VisitorChannelService visitorChannelService; - @Inject - private DBInitialize dbInitialize; + @Inject + private MapperFacade mapperFacade; + @Db + private LicenseMapper licenseMapper; + @Db + private PortMappingMapper portMappingMapper; + @Db + private UserMapper userMapper; + @Inject + private VisitorChannelService visitorChannelService; + @Inject + private DBInitialize dbInitialize; - public PageInfo page(PageQuery pageQuery, LicenseListReq req) { - Page result = PageHelper.startPage(pageQuery.getCurrent(), pageQuery.getSize()); - List list = licenseMapper.selectList(new LambdaQueryWrapper() - .eq(req.getUserId() != null, LicenseDO::getUserId, req.getUserId()) - .eq(req.getIsOnline() != null, LicenseDO::getIsOnline, req.getIsOnline()) - .eq(req.getEnable() != null, LicenseDO::getEnable, req.getEnable()) - .orderByAsc(Arrays.asList(LicenseDO::getUserId, LicenseDO::getId)) - ); - List respList = mapperFacade.mapAsList(list, LicenseListRes.class); - if (CollectionUtils.isEmpty(list)) { - return PageInfo.of(respList, result.getTotal(), pageQuery.getCurrent(), pageQuery.getSize()); - } - if (!CollectionUtil.isEmpty(respList)) { - Set userIds = respList.stream().map(LicenseListRes::getUserId).collect(Collectors.toSet()); - List userList = userMapper.findByIds(userIds); - Map userMap = userList.stream().collect(Collectors.toMap(UserDO::getId, Function.identity())); - for (LicenseListRes item : respList) { - UserDO userDO = userMap.get(item.getUserId()); - if (null != userDO) { - item.setUserName(userDO.getName()); - } - item.setKey(desensitization(item.getUserId(), item.getKey())); - } - } - return PageInfo.of(respList, result.getTotal(), pageQuery.getCurrent(), pageQuery.getSize()); - } + public PageInfo page(PageQuery pageQuery, LicenseListReq req) { + Page result = PageHelper.startPage(pageQuery.getCurrent(), pageQuery.getSize()); + List list = licenseMapper.selectList(new LambdaQueryWrapper() + .eq(req.getUserId() != null, LicenseDO::getUserId, req.getUserId()) + .eq(req.getIsOnline() != null, LicenseDO::getIsOnline, req.getIsOnline()) + .eq(req.getEnable() != null, LicenseDO::getEnable, req.getEnable()) + .orderByAsc(Arrays.asList(LicenseDO::getUserId, LicenseDO::getId)) + ); + List respList = mapperFacade.mapAsList(list, LicenseListRes.class); + if (CollectionUtils.isEmpty(list)) { + return PageInfo.of(respList, result.getTotal(), pageQuery.getCurrent(), pageQuery.getSize()); + } + if (!CollectionUtil.isEmpty(respList)) { + Set userIds = respList.stream().map(LicenseListRes::getUserId).collect(Collectors.toSet()); + List userList = userMapper.findByIds(userIds); + Map userMap = userList.stream().collect(Collectors.toMap(UserDO::getId, Function.identity())); + for (LicenseListRes item : respList) { + UserDO userDO = userMap.get(item.getUserId()); + if (null != userDO) { + item.setUserName(userDO.getName()); + } + item.setKey(desensitization(item.getUserId(), item.getKey())); + } + } + return PageInfo.of(respList, result.getTotal(), pageQuery.getCurrent(), pageQuery.getSize()); + } - public List list(LicenseListReq req) { - List list = licenseMapper.selectList(new LambdaQueryWrapper() - .eq(null != req.getEnable(), LicenseDO::getEnable, req.getEnable()) - ); - List licenseList = assembleConvertLicenses(list); - return licenseList; - } + public List list(LicenseListReq req) { + List list = licenseMapper.selectList(new LambdaQueryWrapper() + .eq(null != req.getEnable(), LicenseDO::getEnable, req.getEnable()) + ); + List licenseList = assembleConvertLicenses(list); + return licenseList; + } - private List assembleConvertLicenses(List list) { - List licenseList = mapperFacade.mapAsList(list, LicenseListRes.class); - if (!CollectionUtil.isEmpty(licenseList)) { - Set userIds = licenseList.stream().map(LicenseListRes::getUserId).collect(Collectors.toSet()); - List userList = userMapper.findByIds(userIds); - Map userMap = userList.stream().collect(Collectors.toMap(UserDO::getId, Function.identity())); - for (LicenseListRes item : licenseList) { - UserDO userDO = userMap.get(item.getUserId()); - if (null != userDO) { - item.setUserName(userDO.getName()); - } - item.setKey(desensitization(item.getUserId(), item.getKey())); - } - } - return licenseList; - } + private List assembleConvertLicenses(List list) { + List licenseList = mapperFacade.mapAsList(list, LicenseListRes.class); + if (!CollectionUtil.isEmpty(licenseList)) { + Set userIds = licenseList.stream().map(LicenseListRes::getUserId).collect(Collectors.toSet()); + List userList = userMapper.findByIds(userIds); + Map userMap = userList.stream().collect(Collectors.toMap(UserDO::getId, Function.identity())); + for (LicenseListRes item : licenseList) { + UserDO userDO = userMap.get(item.getUserId()); + if (null != userDO) { + item.setUserName(userDO.getName()); + } + item.setKey(desensitization(item.getUserId(), item.getKey())); + } + } + return licenseList; + } - /** - * 创建license - * @param req - * @return - */ - public LicenseCreateRes create(LicenseCreateReq req) { - LicenseDO licenseDO = licenseMapper.checkRepeat(req.getUserId(), req.getName()); - ParamCheckUtil.checkExpression(null == licenseDO, ExceptionConstant.LICENSE_NAME_CANNOT_REPEAT); + /** + * 创建license + * + * @param req + * @return + */ + public LicenseCreateRes create(LicenseCreateReq req) { + LicenseDO licenseDO = licenseMapper.checkRepeat(req.getUserId(), req.getName()); + ParamCheckUtil.checkExpression(null == licenseDO, ExceptionConstant.LICENSE_NAME_CANNOT_REPEAT); - String key = UUID.randomUUID().toString().replaceAll("-", ""); - Date now = new Date(); + String key = UUID.randomUUID().toString().replaceAll("-", ""); + Date now = new Date(); - licenseMapper.insert(new LicenseDO() - .setName(req.getName()) - .setKey(key) - .setUserId(req.getUserId()) - .setIsOnline(OnlineStatusEnum.OFFLINE.getStatus()) - .setEnable(EnableStatusEnum.ENABLE.getStatus()) - .setCreateTime(now) - .setUpdateTime(now) - ); - return new LicenseCreateRes(); - } + licenseMapper.insert(new LicenseDO() + .setName(req.getName()) + .setKey(key) + .setUserId(req.getUserId()) + .setIsOnline(OnlineStatusEnum.OFFLINE.getStatus()) + .setEnable(EnableStatusEnum.ENABLE.getStatus()) + .setCreateTime(now) + .setUpdateTime(now) + ); + return new LicenseCreateRes(); + } - public LicenseUpdateRes update(LicenseUpdateReq req) { - LicenseDO oldLicenseDO = licenseMapper.findById(req.getId()); - ParamCheckUtil.checkNotNull(oldLicenseDO, ExceptionConstant.LICENSE_NOT_EXIST); + public LicenseUpdateRes update(LicenseUpdateReq req) { + LicenseDO oldLicenseDO = licenseMapper.findById(req.getId()); + ParamCheckUtil.checkNotNull(oldLicenseDO, ExceptionConstant.LICENSE_NOT_EXIST); - LicenseDO licenseCheck = licenseMapper.checkRepeat(oldLicenseDO.getUserId(), req.getName(), Sets.newHashSet(oldLicenseDO.getId())); - ParamCheckUtil.checkMustNull(licenseCheck, ExceptionConstant.LICENSE_NAME_CANNOT_REPEAT); + LicenseDO licenseCheck = licenseMapper.checkRepeat(oldLicenseDO.getUserId(), req.getName(), Sets.newHashSet(oldLicenseDO.getId())); + ParamCheckUtil.checkMustNull(licenseCheck, ExceptionConstant.LICENSE_NAME_CANNOT_REPEAT); - licenseMapper.update(req.getId(), req.getName(), new Date()); - return new LicenseUpdateRes(); - } + licenseMapper.update(req.getId(), req.getName(), new Date()); + return new LicenseUpdateRes(); + } - public LicenseDetailRes detail(Integer id) { - LicenseDO licenseDO = licenseMapper.findById(id); - if (null == licenseDO) { - return null; - } - UserDO userDO = userMapper.findById(licenseDO.getUserId()); - String userName = ""; - if (null != userDO) { - userName = userDO.getName(); - } - return new LicenseDetailRes() - .setId(licenseDO.getId()) - .setName(licenseDO.getName()) - .setKey(desensitization(licenseDO.getUserId(), licenseDO.getKey())) - .setUserId(licenseDO.getUserId()) - .setUserName(userName) - .setIsOnline(licenseDO.getIsOnline()) - .setEnable(licenseDO.getEnable()) - .setCreateTime(licenseDO.getCreateTime()) - .setUpdateTime(licenseDO.getUpdateTime()) - ; - } + public LicenseDetailRes detail(Integer id) { + LicenseDO licenseDO = licenseMapper.findById(id); + if (null == licenseDO) { + return null; + } + UserDO userDO = userMapper.findById(licenseDO.getUserId()); + String userName = ""; + if (null != userDO) { + userName = userDO.getName(); + } + return new LicenseDetailRes() + .setId(licenseDO.getId()) + .setName(licenseDO.getName()) + .setKey(desensitization(licenseDO.getUserId(), licenseDO.getKey())) + .setUserId(licenseDO.getUserId()) + .setUserName(userName) + .setIsOnline(licenseDO.getIsOnline()) + .setEnable(licenseDO.getEnable()) + .setCreateTime(licenseDO.getCreateTime()) + .setUpdateTime(licenseDO.getUpdateTime()) + ; + } - /** - * 更新license启用状态 - * @param req - * @return - */ - public LicenseUpdateEnableStatusRes updateEnableStatus(LicenseUpdateEnableStatusReq req) { - licenseMapper.updateEnableStatus(req.getId(), req.getEnable(), new Date()); - // 更新VisitorChannel - visitorChannelService.updateVisitorChannelByLicenseId(req.getId(), req.getEnable()); - return new LicenseUpdateEnableStatusRes(); - } + /** + * 更新license启用状态 + * + * @param req + * @return + */ + public LicenseUpdateEnableStatusRes updateEnableStatus(LicenseUpdateEnableStatusReq req) { + licenseMapper.updateEnableStatus(req.getId(), req.getEnable(), new Date()); + // 更新VisitorChannel + visitorChannelService.updateVisitorChannelByLicenseId(req.getId(), req.getEnable()); + return new LicenseUpdateEnableStatusRes(); + } - /** - * 删除license - * @param id - */ - public void delete(Integer id) { - licenseMapper.deleteById(id); - // 更新VisitorChannel - visitorChannelService.updateVisitorChannelByLicenseId(id, EnableStatusEnum.DISABLE.getStatus()); - } + /** + * 删除license + * + * @param id + */ + public void delete(Integer id) { + List portMappingDOList = portMappingMapper.findListByLicenseId(id); + if (CollectionUtil.isNotEmpty(portMappingDOList)) { + throw ServiceException.create(ExceptionConstant.LICENSE_CANNOT_BE_DELETED, portMappingDOList.size()); + } + licenseMapper.deleteById(id); + // 更新VisitorChannel + visitorChannelService.updateVisitorChannelByLicenseId(id, EnableStatusEnum.DISABLE.getStatus()); + } - /** - * 重置license - * @param id - */ - public void reset(Integer id) { - String key = UUID.randomUUID().toString().replaceAll("-", ""); - Date now = new Date(); + /** + * 重置license + * + * @param id + */ + public void reset(Integer id) { + String key = UUID.randomUUID().toString().replaceAll("-", ""); + Date now = new Date(); - licenseMapper.reset(id, key, now); - } + licenseMapper.reset(id, key, now); + } - public LicenseDO findByKey(String license) { - return licenseMapper.findByKey(license); - } + public LicenseDO findByKey(String license) { + return licenseMapper.findByKey(license); + } - /** - * 脱敏处理 - * 非当前登录人的license,一律脱敏 - * @param userId - * @param licenseKey - * @return - */ - private String desensitization(Integer userId, String licenseKey) { - Integer currentUserId = SystemContextHolder.getUser().getId(); - if (currentUserId.equals(userId)) { - return licenseKey; - } - return licenseKey.substring(0, 10) + "****" + licenseKey.substring(licenseKey.length() - 10); - } + /** + * 脱敏处理 + * 非当前登录人的license,一律脱敏 + * + * @param userId + * @param licenseKey + * @return + */ + private String desensitization(Integer userId, String licenseKey) { + Integer currentUserId = SystemContextHolder.getUser().getId(); + if (currentUserId.equals(userId)) { + return licenseKey; + } + return licenseKey.substring(0, 10) + "****" + licenseKey.substring(licenseKey.length() - 10); + } - /** - * 服务端项目停止、启动时,更新在线状态为离线 - */ - @Init - public void init() { - licenseMapper.updateOnlineStatus(OnlineStatusEnum.OFFLINE.getStatus(), new Date()); - } + /** + * 服务端项目停止、启动时,更新在线状态为离线 + */ + @Init + public void init() { + licenseMapper.updateOnlineStatus(OnlineStatusEnum.OFFLINE.getStatus(), new Date()); + } - @Override - public void start() throws Throwable { + @Override + public void start() throws Throwable { - } + } - /** - * 服务端项目停止、启动时,更新在线状态为离线 - */ - @Override - public void stop() throws Throwable { - licenseMapper.updateOnlineStatus(OnlineStatusEnum.OFFLINE.getStatus(), new Date()); - } + /** + * 服务端项目停止、启动时,更新在线状态为离线 + */ + @Override + public void stop() throws Throwable { + licenseMapper.updateOnlineStatus(OnlineStatusEnum.OFFLINE.getStatus(), new Date()); + } - /** - * 查询当前角色下的license,若为管理员 则返回全部license - */ - public List queryCurUserLicense(LicenseListReq req) { - if(SystemContextHolder.isAdmin()){ - return this.list(req); - } + /** + * 查询当前角色下的license,若为管理员 则返回全部license + */ + public List queryCurUserLicense(LicenseListReq req) { + if (SystemContextHolder.isAdmin()) { + return this.list(req); + } - List list = licenseMapper.selectList(new LambdaQueryWrapper() - .eq(LicenseDO::getEnable, EnableStatusEnum.ENABLE.getStatus()) - .eq(LicenseDO::getUserId,SystemContextHolder.getUserId()) - ); - List licenseList = assembleConvertLicenses(list); - return licenseList; - } + List list = licenseMapper.selectList(new LambdaQueryWrapper() + .eq(LicenseDO::getEnable, EnableStatusEnum.ENABLE.getStatus()) + .eq(LicenseDO::getUserId, SystemContextHolder.getUserId()) + ); + List licenseList = assembleConvertLicenses(list); + return licenseList; + } }