diff --git a/modules/core/src/main/java/com/bytedesk/core/ip/IP2RegionConfig.java b/modules/core/src/main/java/com/bytedesk/core/ip/IP2RegionConfig.java index 58e0f6f1f6..01a3d21688 100644 --- a/modules/core/src/main/java/com/bytedesk/core/ip/IP2RegionConfig.java +++ b/modules/core/src/main/java/com/bytedesk/core/ip/IP2RegionConfig.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2022-03-10 14:41:11 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2024-10-29 21:34:58 + * @LastEditTime: 2025-03-06 12:35:41 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -14,13 +14,13 @@ */ package com.bytedesk.core.ip; -import java.io.File; -import java.io.IOException; +import java.io.InputStream; -import org.apache.commons.io.FileUtils; import org.lionsoul.ip2region.xdb.Searcher; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.util.StreamUtils; import lombok.extern.slf4j.Slf4j; @@ -33,49 +33,27 @@ import lombok.extern.slf4j.Slf4j; @Configuration public class IP2RegionConfig { - // @Value("${bytedesk.ip2region-db-path}") - // private String dbPath; + private static final String DB_FILE_NAME = "ip2region.xdb"; @Bean public Searcher searcher() { - // 获取当前Java进程的工作目录(Working Directory) - // String currentPath = System.getProperty("user.dir"); - String dbPath = IP2RegionConfig.class.getClassLoader().getResource("ip2region.xdb").getPath(); - // String dbPath = currentPath + "/ip2region.xdb"; - log.info("ip2region path {}", dbPath); - // 打成 jar 包后,无法正常读取jar包内的ip2region.xdb文件,需要将ip2region.xdb文件复制到临时目录 - File file = new File(dbPath); - if (!file.exists()) { - // classpath:ip2region.xdb - log.error("Error: Invalid ip2region.xdb file"); - String tmpDir = System.getProperties().getProperty("java.io.tmpdir"); - dbPath = tmpDir + "ip.db"; - log.info("temp dir {}", dbPath); - file = new File(dbPath); - try { - FileUtils.copyInputStreamToFile(IP2RegionConfig.class.getClassLoader().getResourceAsStream("ip2region.xdb"), file); - } catch (IOException e) { - e.printStackTrace(); + try { + // 1. 直接从 classpath 读取文件到内存 + ClassPathResource resource = new ClassPathResource(DB_FILE_NAME); + try (InputStream inputStream = resource.getInputStream()) { + // 2. 将文件内容读入字节数组 + byte[] cBuff = StreamUtils.copyToByteArray(inputStream); + if (cBuff == null || cBuff.length == 0) { + log.error("Failed to read ip2region.xdb content"); + return null; + } + + // 3. 创建查询对象 + return Searcher.newWithBuffer(cBuff); } - } - // 1、从 dbPath 加载整个 xdb 到内存。 - byte[] cBuff = null; - try { - cBuff = Searcher.loadContentFromFile(dbPath); } catch (Exception e) { - log.error("failed to load content from `%s`: %s\n", dbPath, e); + log.error("Failed to initialize ip2region searcher: {}", e.getMessage()); + return null; } - - // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。 - Searcher searcher = null; - try { - searcher = Searcher.newWithBuffer(cBuff); - } catch (Exception e) { - log.error("failed to create content cached searcher: %s\n", e); - } - - return searcher; } - - } diff --git a/modules/core/src/main/java/com/bytedesk/core/ip/IpService.java b/modules/core/src/main/java/com/bytedesk/core/ip/IpService.java index c5dffb9e42..459ed8c5db 100644 --- a/modules/core/src/main/java/com/bytedesk/core/ip/IpService.java +++ b/modules/core/src/main/java/com/bytedesk/core/ip/IpService.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2024-03-16 13:28:03 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-01-15 14:30:59 + * @LastEditTime: 2025-03-06 12:40:50 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -68,67 +68,6 @@ public class IpService { return getIpLocation(ip); } - // 封禁IP, TODO: cache区分org - // @CachePut(value = "ip", key = "#ipRequest.ip") - // public IpResponse blockIp(IpRequest ipRequest) { - // // - // Optional ipOptional = findByOrgUid(ipRequest.getOrgUid()); - // if (ipOptional.isPresent()) { - // // 更新 - // if (StringUtils.hasText(ipRequest.getIp())) { - // ipOptional.get().getIps().add(ipRequest.getIp()); - // } - // ipOptional.get().setIpRangeStart(ipRequest.getIpRangeStart()); - // ipOptional.get().setIpRangeEnd(ipRequest.getIpRangeEnd()); - // ipOptional.get().setType(IpTypeEnum.fromValue(ipRequest.getType()).name()); - // ipOptional.get().setUntilDate(DateUtils.formatStringToDateTime(ipRequest.getUntilDate())); - // ipOptional.get().setReason(ipRequest.getReason()); - - // IpEntity savedIp = save(ipOptional.get()); - // if (savedIp == null) { - // throw new RuntimeException("failed to update ip"); - // } - - // return convertToResponse(ipOptional.get()); - // } - // // - // IpEntity ip = modelMapper.map(ipRequest, IpEntity.class); - // ip.setUid(uidUtils.getCacheSerialUid()); - // if (StringUtils.hasText(ipRequest.getIp())) { - // ip.getIps().add(ipRequest.getIp()); - // } - // ip.setUntilDate(DateUtils.formatStringToDateTime(ipRequest.getUntilDate())); - // // - // IpEntity savedIp = save(ip); - // if (savedIp == null) { - // throw new RuntimeException("failed to save ip"); - // } - // // - // return convertToResponse(ip); - // } - - // public IpResponse unblockIp(IpRequest ipRequest) { - - // Optional ipOptional = findByOrgUid(ipRequest.getOrgUid()); - // if (ipOptional.isPresent()) { - // ipOptional.get().getIps().remove(ipRequest.getIp()); - - // IpEntity savedIp = save(ipOptional.get()); - // if (savedIp == null) { - // throw new RuntimeException("failed to unblock ip"); - // } - - // return convertToResponse(ipOptional.get()); - // } - - // throw new RuntimeException("failed to unblock ip"); - // } - - // public Boolean isBlocked(HttpServletRequest request) { - // String ip = IpUtils.getIp(request); - // return isBlocked(ip, ""); - // } - // TODO: cache区分org @Cacheable(value = "ip", key = "#ip-#orgUid") public Boolean isBlocked(String ip, String orgUid) { diff --git a/modules/service/src/main/java/com/bytedesk/service/queue_member/QueueMemberEntityListener.java b/modules/service/src/main/java/com/bytedesk/service/queue_member/QueueMemberEntityListener.java index 20277c60d9..64d2c1119a 100644 --- a/modules/service/src/main/java/com/bytedesk/service/queue_member/QueueMemberEntityListener.java +++ b/modules/service/src/main/java/com/bytedesk/service/queue_member/QueueMemberEntityListener.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2024-10-18 07:52:29 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2024-12-20 12:31:21 + * @LastEditTime: 2025-03-06 12:47:34 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -30,7 +30,7 @@ public class QueueMemberEntityListener { @PostPersist public void onPostPersist(QueueMemberEntity queueMember) { - log.info("QueueMemberEntityListener onPostPersist: {}", queueMember); + log.info("QueueMemberEntityListener onPostPersist: {}", queueMember.getQueueNickname()); QueueMemberEntity clonedEntity = SerializationUtils.clone(queueMember); // ApplicationEventPublisher eventPublisher = ApplicationContextHolder.getBean(ApplicationEventPublisher.class); @@ -39,7 +39,7 @@ public class QueueMemberEntityListener { @PostUpdate public void onPostUpdate(QueueMemberEntity queueMember) { - log.info("QueueMemberEntityListener onPostUpdate: {}", queueMember); + log.info("QueueMemberEntityListener onPostUpdate: {}", queueMember.getQueueNickname()); } } diff --git a/modules/service/src/main/java/com/bytedesk/service/routing/RouteService.java b/modules/service/src/main/java/com/bytedesk/service/routing/RouteService.java index 5084fff989..6a438dab12 100644 --- a/modules/service/src/main/java/com/bytedesk/service/routing/RouteService.java +++ b/modules/service/src/main/java/com/bytedesk/service/routing/RouteService.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2024-09-19 18:59:41 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-03-05 23:50:20 + * @LastEditTime: 2025-03-06 12:45:42 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -74,7 +74,7 @@ public class RouteService { @Nonnull RobotEntity robot) { // 排队计数 QueueMemberEntity queueMemberEntity = queueService.enqueueRobot(thread, robot, request); - log.info("routeRobot Enqueued to queue {}", queueMemberEntity.toString()); + log.info("routeRobot Enqueued to queue {}", queueMemberEntity.getQueueNickname()); // thread.setState(ThreadStateEnum.STARTED.name()); // 使用robot的serviceSettings配置 diff --git a/modules/service/src/main/java/com/bytedesk/service/visitor/VisitorRestService.java b/modules/service/src/main/java/com/bytedesk/service/visitor/VisitorRestService.java index 8902e05f9d..51d7fdac3f 100644 --- a/modules/service/src/main/java/com/bytedesk/service/visitor/VisitorRestService.java +++ b/modules/service/src/main/java/com/bytedesk/service/visitor/VisitorRestService.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2024-01-29 16:21:24 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-03-05 17:04:36 + * @LastEditTime: 2025-03-06 12:38:31 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -19,9 +19,7 @@ import org.modelmapper.ModelMapper; import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Caching; import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.orm.ObjectOptimisticLockingFailureException; import org.springframework.cache.annotation.CachePut;