From f3bd58acfe5e6d0a6133869046a619530bdcc88f Mon Sep 17 00:00:00 2001 From: lin <648540858@qq.com> Date: Tue, 29 Jul 2025 19:34:33 +0800 Subject: [PATCH] =?UTF-8?q?[1078]=20FTP=E4=BD=BF=E7=94=A8=E9=9A=8F?= =?UTF-8?q?=E6=9C=BA=E7=94=A8=E6=88=B7=E5=92=8C=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/vmp/conf/ftpServer/FtpSetting.java | 2 - .../iot/vmp/conf/ftpServer/Ftplet.java | 15 ---- .../iot/vmp/conf/ftpServer/UserManager.java | 74 +++++++++---------- .../service/impl/jt1078ServiceImpl.java | 26 +++++-- 4 files changed, 53 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpSetting.java b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpSetting.java index 35caacdbb..91acc8bb0 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpSetting.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpSetting.java @@ -17,7 +17,5 @@ public class FtpSetting { private Boolean enable = Boolean.FALSE; private int port = 21; - private String username = "admin"; - private String password = "admin"; private String passivePorts = "10000-10500"; } diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/Ftplet.java b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/Ftplet.java index 51b4c82b0..b413a427d 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/Ftplet.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/Ftplet.java @@ -17,22 +17,9 @@ public class Ftplet extends DefaultFtplet { private final Logger logger = LoggerFactory.getLogger(Ftplet.class); - @Value("${ftp.username}") - private String username; - @Autowired private ApplicationEventPublisher applicationEventPublisher; - @Override - public FtpletResult beforeCommand(FtpSession session, FtpRequest request) throws FtpException, IOException { - System.out.println("beforeCommand"); - if (request.getCommand().equalsIgnoreCase("USER") && !username.equals(request.getArgument())) { - return FtpletResult.DISCONNECT; - } - super.beforeCommand(session, request); - return FtpletResult.DEFAULT; - } - @Override public FtpletResult onUploadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { FtpFile file = session.getFileSystemView().getFile(request.getArgument()); @@ -43,8 +30,6 @@ public class Ftplet extends DefaultFtplet { return super.onUploadUniqueEnd(session, request); } - - @Override public FtpletResult onAppendEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { FtpFile file = session.getFileSystemView().getFile(request.getArgument()); diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/UserManager.java b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/UserManager.java index 68f0eb214..da5c5ed69 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/UserManager.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/UserManager.java @@ -1,90 +1,86 @@ package com.genersoft.iot.vmp.conf.ftpServer; +import org.apache.commons.lang3.RandomStringUtils; import org.apache.ftpserver.ftplet.*; import org.apache.ftpserver.usermanager.UsernamePasswordAuthentication; import org.apache.ftpserver.usermanager.impl.BaseUser; import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.io.File; +import java.time.Duration; import java.util.ArrayList; import java.util.List; @Component public class UserManager implements org.apache.ftpserver.ftplet.UserManager { - @Value("${ftp.username}") - private String username; + private static final String PREFIX = "VMP_FTP_USER_"; - @Value("${ftp.password}") - private String password; + @Autowired + private RedisTemplate redisTemplate; @Override public User getUserByName(String username) throws FtpException { - System.out.println("getUserByName"); - if (!username.equals(this.username)) { - return null; - } - return getUser(); + return (BaseUser)redisTemplate.opsForValue().get(PREFIX + username); } @Override public String[] getAllUserNames() throws FtpException { - String[] strings = new String[1]; - strings[0] = this.username; - return strings; + return new String[0]; } @Override - public void delete(String username) throws FtpException {} + public void delete(String username) throws FtpException { + + } @Override public void save(User user) throws FtpException {} @Override public boolean doesExist(String username) throws FtpException { - return this.username.equals(username); + return redisTemplate.opsForValue().get(PREFIX + username) != null; } @Override public User authenticate(Authentication authentication) throws AuthenticationFailedException { UsernamePasswordAuthentication usernamePasswordAuthentication = (UsernamePasswordAuthentication) authentication; - if (usernamePasswordAuthentication.getUsername().equals(this.username) - && usernamePasswordAuthentication.getPassword().equals(this.password)) { - return getUser(); + BaseUser user = (BaseUser)redisTemplate.opsForValue().get(PREFIX + usernamePasswordAuthentication.getUsername()); + if (user != null && usernamePasswordAuthentication.getPassword().equals(user.getPassword())) { + return user; } return null; } - @NotNull - private User getUser() { - BaseUser use = new BaseUser(); - use.setName(this.username); - use.setPassword(this.password); - use.setEnabled(true); - File file = new File("ftp"); - if (!file.exists()) { - file.mkdirs(); - }else if (file.isFile()) { - file.delete(); - file.mkdirs(); - } - use.setHomeDirectory(file.getAbsolutePath()); - List authorities = new ArrayList<>(); - authorities.add(new FtpAuthority()); - use.setAuthorities(authorities); - return use; - } - @Override public String getAdminName() throws FtpException { - return this.username; + return null; } @Override public boolean isAdmin(String username) throws FtpException { - return username.equals(this.username); + return false; + } + + public BaseUser getRandomUser(){ + BaseUser use = new BaseUser(); + use.setName(RandomStringUtils.randomAlphabetic(6).toLowerCase()); + use.setPassword(RandomStringUtils.randomAlphabetic(6).toLowerCase()); + use.setEnabled(true); + use.setHomeDirectory("/"); + List authorities = new ArrayList<>(); + authorities.add(new FtpAuthority()); + use.setAuthorities(authorities); + String key = PREFIX + use.getName(); + + // 随机用户信息十分钟自动失效 + Duration duration = Duration.ofMinutes(10); + redisTemplate.opsForValue().set(key, use, duration); + return use; } } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java index f91889a5e..86994d460 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java @@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.conf.ftpServer.FtpFileSystemFactory; import com.genersoft.iot.vmp.conf.ftpServer.FtpSetting; import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.exception.ControllerException; +import com.genersoft.iot.vmp.conf.ftpServer.UserManager; import com.genersoft.iot.vmp.gb28181.service.IGbChannelService; import com.genersoft.iot.vmp.jt1078.bean.*; import com.genersoft.iot.vmp.jt1078.bean.common.ConfigAttribute; @@ -32,6 +33,7 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; +import org.apache.ftpserver.usermanager.impl.BaseUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.event.EventListener; import org.springframework.data.redis.core.RedisTemplate; @@ -77,6 +79,9 @@ public class jt1078ServiceImpl implements Ijt1078Service { @Autowired private FtpSetting ftpSetting; + @Autowired + private UserManager ftpUserManager; + @Autowired private FtpFileSystemFactory fileSystemFactory; @@ -205,8 +210,11 @@ public class jt1078ServiceImpl implements Ijt1078Service { Assert.notNull(session, "连接不存在"); InetSocketAddress socketAddress = session.getLoadAddress(); String hostName = socketAddress.getHostName(); - log.info("[JT-录像] 下载,设备:{}, 通道: {}, 开始时间: {}, 结束时间: {} 上传IP: {} 等待上传文件路径: {} ", - phoneNumber, channelId, startTime, endTime, hostName, filePath); + + BaseUser randomUser = ftpUserManager.getRandomUser(); + + log.info("[JT-录像] 下载,设备:{}, 通道: {}, 开始时间: {}, 结束时间: {} 上传IP: {} 等待上传文件路径: {} 用户名: {}, 密码: {} ", + phoneNumber, channelId, startTime, endTime, hostName, filePath, randomUser.getName(), randomUser.getPassword()); // 发送停止命令 J9206 j92026 = new J9206(); j92026.setChannelId(channelId); @@ -214,8 +222,8 @@ public class jt1078ServiceImpl implements Ijt1078Service { j92026.setEndTime(DateUtil.yyyy_MM_dd_HH_mm_ssTo1078(endTime)); j92026.setServerIp(hostName); j92026.setPort(ftpSetting.getPort()); - j92026.setUsername(ftpSetting.getUsername()); - j92026.setPassword(ftpSetting.getPassword()); + j92026.setUsername(randomUser.getName()); + j92026.setPassword(randomUser.getPassword()); j92026.setPath(filePath); if (mediaType != null) { @@ -733,8 +741,10 @@ public class jt1078ServiceImpl implements Ijt1078Service { InetSocketAddress socketAddress = session.getLoadAddress(); String hostName = socketAddress.getHostName(); - log.info("[JT-录像] 下载,设备:{}, 通道: {}, 开始时间: {}, 结束时间: {} 上传IP: {} 等待上传文件路径: {} ", - phoneNumber, channelId, startTime, endTime, hostName, filePath); + BaseUser randomUser = ftpUserManager.getRandomUser(); + + log.info("[JT-录像] 下载,设备:{}, 通道: {}, 开始时间: {}, 结束时间: {} 上传IP: {} 等待上传文件路径: {} 用户名: {}, 密码: {} ", + phoneNumber, channelId, startTime, endTime, hostName, filePath, randomUser.getName(), randomUser.getPassword()); // 文件上传指令 J9206 j9206 = new J9206(); j9206.setChannelId(channelId); @@ -742,8 +752,8 @@ public class jt1078ServiceImpl implements Ijt1078Service { j9206.setEndTime(DateUtil.yyyy_MM_dd_HH_mm_ssTo1078(endTime)); j9206.setServerIp(hostName); j9206.setPort(ftpSetting.getPort()); - j9206.setUsername(ftpSetting.getUsername()); - j9206.setPassword(ftpSetting.getPassword()); + j9206.setUsername(randomUser.getName()); + j9206.setPassword(randomUser.getPassword()); j9206.setPath(filePath); if (mediaType != null) {