diff --git a/orion-visor-modules/orion-visor-module-common/src/main/java/org/dromara/visor/module/common/utils/SftpUtils.java b/orion-visor-modules/orion-visor-module-common/src/main/java/org/dromara/visor/module/common/utils/SftpUtils.java index 2c662e1f..6dda7b46 100644 --- a/orion-visor-modules/orion-visor-module-common/src/main/java/org/dromara/visor/module/common/utils/SftpUtils.java +++ b/orion-visor-modules/orion-visor-module-common/src/main/java/org/dromara/visor/module/common/utils/SftpUtils.java @@ -22,10 +22,8 @@ */ package org.dromara.visor.module.common.utils; -import cn.orionsec.kit.lang.constant.Letters; import cn.orionsec.kit.lang.utils.Booleans; import cn.orionsec.kit.lang.utils.Strings; -import cn.orionsec.kit.lang.utils.io.Files1; import cn.orionsec.kit.net.host.sftp.SftpExecutor; import cn.orionsec.kit.net.host.sftp.SftpFile; import cn.orionsec.kit.spring.SpringHolder; @@ -69,21 +67,4 @@ public class SftpUtils { } } - /** - * 获取移动目标路径 - * - * @param source source - * @param target target - * @return absolute target - */ - public static String getAbsoluteTargetPath(String source, String target) { - if (target.charAt(0) == Letters.SLASH) { - // 绝对路径 - return Files1.getPath(Files1.normalize(target)); - } else { - // 相对路径 - return Files1.getPath(Files1.normalize(Files1.getPath(source + "/../" + target))); - } - } - } diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/operator/TerminalOperatorType.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/operator/TerminalOperatorType.java index 162c6e59..9752e2f5 100644 --- a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/operator/TerminalOperatorType.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/operator/TerminalOperatorType.java @@ -74,15 +74,15 @@ public class TerminalOperatorType extends InitializingOperatorTypes { new OperatorType(OperatorRiskLevel.L, SFTP_MKDIR, "创建文件夹 ${hostName} ${path}"), new OperatorType(OperatorRiskLevel.L, SFTP_TOUCH, "创建文件 ${hostName} ${path}"), new OperatorType(OperatorRiskLevel.M, SFTP_MOVE, "移动文件 ${hostName} ${path}${target}"), - new OperatorType(OperatorRiskLevel.H, SFTP_REMOVE, "删除文件 ${hostName} ${path}"), + new OperatorType(OperatorRiskLevel.H, SFTP_REMOVE, "删除文件 ${hostName} ${count}个\n${path}"), new OperatorType(OperatorRiskLevel.H, SFTP_TRUNCATE, "截断文件 ${hostName} ${path}"), new OperatorType(OperatorRiskLevel.M, SFTP_CHMOD, "文件提权 ${hostName} ${path} ${mod}"), new OperatorType(OperatorRiskLevel.M, SFTP_CHOWN, "修改文件归属 ${hostName} ${path} ${id}"), new OperatorType(OperatorRiskLevel.M, SFTP_CHGRP, "修改文件分组 ${hostName} ${path} ${id}"), new OperatorType(OperatorRiskLevel.L, SFTP_GET_CONTENT, "获取文件内容 ${hostName} ${path}"), new OperatorType(OperatorRiskLevel.M, SFTP_SET_CONTENT, "修改文件内容 ${hostName} ${path}"), - new OperatorType(OperatorRiskLevel.M, SFTP_UPLOAD, "上传文件 ${hostName} ${path}"), - new OperatorType(OperatorRiskLevel.M, SFTP_DOWNLOAD, "下载文件 ${hostName} ${path}"), + new OperatorType(OperatorRiskLevel.M, SFTP_UPLOAD, "上传文件 ${hostName} (${count}个)\n${path}"), + new OperatorType(OperatorRiskLevel.M, SFTP_DOWNLOAD, "下载文件 ${hostName} (${count}个)\n${path}"), new OperatorType(OperatorRiskLevel.M, RDP_UPLOAD, "上传文件 ${hostName} ${path}"), new OperatorType(OperatorRiskLevel.M, RDP_DOWNLOAD, "下载文件 ${hostName} ${path}"), }; diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpDownloadFlatDirectoryHandler.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpDownloadFlatDirectoryHandler.java index eaa03ac8..6dc9b143 100644 --- a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpDownloadFlatDirectoryHandler.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpDownloadFlatDirectoryHandler.java @@ -29,6 +29,7 @@ import org.dromara.visor.module.terminal.handler.terminal.model.request.SftpDown import org.dromara.visor.module.terminal.handler.terminal.model.response.SftpFileVO; import org.dromara.visor.module.terminal.handler.terminal.sender.ISftpTerminalSender; import org.dromara.visor.module.terminal.handler.terminal.session.ISftpSession; +import org.dromara.visor.module.terminal.utils.SftpFileUtils; import org.springframework.stereotype.Component; import java.util.Arrays; @@ -50,7 +51,7 @@ public class SftpDownloadFlatDirectoryHandler extends AbstractTerminalHandler files = Lists.empty(); diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpRemoveHandler.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpRemoveHandler.java index 81693ce7..df595b10 100644 --- a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpRemoveHandler.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpRemoveHandler.java @@ -24,12 +24,14 @@ package org.dromara.visor.module.terminal.handler.terminal.handler; import cn.orionsec.kit.lang.utils.collect.Maps; import lombok.extern.slf4j.Slf4j; +import org.dromara.visor.common.constant.Const; import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs; import org.dromara.visor.module.terminal.define.operator.TerminalOperatorType; import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps; import org.dromara.visor.module.terminal.handler.terminal.model.request.SftpBaseRequest; import org.dromara.visor.module.terminal.handler.terminal.sender.ISftpTerminalSender; import org.dromara.visor.module.terminal.handler.terminal.session.ISftpSession; +import org.dromara.visor.module.terminal.utils.SftpFileUtils; import org.springframework.stereotype.Component; import java.util.Arrays; @@ -49,11 +51,11 @@ public class SftpRemoveHandler extends AbstractTerminalHandler extra = Maps.newMap(); extra.put(OperatorLogs.PATH, path); + extra.put(OperatorLogs.COUNT, paths.length); this.saveOperatorLog(props, extra, TerminalOperatorType.SFTP_REMOVE, startTime, ex); diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/TerminalConnectHandler.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/TerminalConnectHandler.java index d2aab8b7..14555223 100644 --- a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/TerminalConnectHandler.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/TerminalConnectHandler.java @@ -129,6 +129,7 @@ public class TerminalConnectHandler extends AbstractTerminalHandler extra = Maps.newMap(); - extra.put(OperatorLogs.PATH, path); - extra.put(OperatorLogs.HOST_ID, connectConfig.getHostId()); - extra.put(OperatorLogs.HOST_NAME, connectConfig.getHostName()); - extra.put(OperatorLogs.ADDRESS, connectConfig.getHostAddress()); - // 获取日志 - TerminalChannelProps props = WebSockets.getAttr(channel, FieldConst.PROPS); - OperatorLogModel model = TerminalUtils.getOperatorLogModel(props, extra, type, System.currentTimeMillis(), null); - // 保存 + protected void saveOperatorLog(Long logId, String type, List paths) { + String path = String.join(Const.LF, paths); + int count = paths.size(); + // 获取操作日志 + OperatorLogModel model = TransferUtils.getOperatorLogModel(type, path, count, connectConfig, WebSockets.getAttr(channel, FieldConst.PROPS)); + // 保存操作日志 TerminalAsyncSaver.saveOperatorLog(model); } diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/session/UploadSession.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/session/UploadSession.java index 30955a2b..447aa69b 100644 --- a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/session/UploadSession.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/session/UploadSession.java @@ -22,6 +22,7 @@ */ package org.dromara.visor.module.terminal.handler.transfer.session; +import cn.orionsec.kit.lang.utils.collect.Lists; import cn.orionsec.kit.lang.utils.io.Streams; import cn.orionsec.kit.net.host.SessionStore; import lombok.extern.slf4j.Slf4j; @@ -58,7 +59,7 @@ public class UploadSession extends TransferSession { try { log.info("UploadSession.startUpload start channelId: {}, path: {}", channelId, path); // 保存操作日志 - this.saveOperatorLog(TerminalOperatorType.SFTP_UPLOAD, path); + this.saveOperatorLog(request.getLogId(), TerminalOperatorType.SFTP_UPLOAD, Lists.singleton(path)); // 检查连接 this.init(); // 检查文件是否存在 diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/utils/TransferUtils.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/utils/TransferUtils.java index d4b0cf2a..8dcf85d3 100644 --- a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/utils/TransferUtils.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/utils/TransferUtils.java @@ -23,14 +23,21 @@ package org.dromara.visor.module.terminal.handler.transfer.utils; import cn.orionsec.kit.lang.utils.Strings; +import cn.orionsec.kit.lang.utils.collect.Maps; import com.alibaba.fastjson.JSON; import org.apache.catalina.connector.ClientAbortException; import org.dromara.visor.common.constant.ErrorMessage; +import org.dromara.visor.common.session.config.BaseConnectConfig; +import org.dromara.visor.framework.biz.operator.log.core.model.OperatorLogModel; +import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs; import org.dromara.visor.framework.websocket.core.utils.WebSockets; +import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps; +import org.dromara.visor.module.terminal.handler.terminal.utils.TerminalUtils; import org.dromara.visor.module.terminal.handler.transfer.enums.TransferReceiver; import org.dromara.visor.module.terminal.handler.transfer.model.TransferOperatorResponse; import org.springframework.web.socket.WebSocketSession; +import java.util.Map; import java.util.function.Consumer; /** @@ -45,6 +52,30 @@ public class TransferUtils { private TransferUtils() { } + /** + * 获取传输操作日志 + * + * @param type type + * @param path path + * @param count count + * @param config config + * @param props props + */ + public static OperatorLogModel getOperatorLogModel(String type, + String path, Integer count, + BaseConnectConfig config, + TerminalChannelProps props) { + // 设置参数 + Map extra = Maps.newMap(); + extra.put(OperatorLogs.PATH, path); + extra.put(OperatorLogs.COUNT, count); + extra.put(OperatorLogs.HOST_ID, config.getHostId()); + extra.put(OperatorLogs.HOST_NAME, config.getHostName()); + extra.put(OperatorLogs.ADDRESS, config.getHostAddress()); + // 获取操作日志 + return TerminalUtils.getOperatorLogModel(props, extra, type, System.currentTimeMillis(), null); + } + /** * 发送消息 * diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/utils/SftpFileUtils.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/utils/SftpFileUtils.java index 27eb64e5..8c97c447 100644 --- a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/utils/SftpFileUtils.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/utils/SftpFileUtils.java @@ -22,6 +22,7 @@ */ package org.dromara.visor.module.terminal.utils; +import cn.orionsec.kit.lang.constant.Letters; import cn.orionsec.kit.lang.utils.io.FileType; import cn.orionsec.kit.lang.utils.io.Files1; import cn.orionsec.kit.net.host.sftp.SftpFile; @@ -41,6 +42,33 @@ public class SftpFileUtils { private SftpFileUtils() { } + /** + * 获取移动目标路径 + * + * @param source source + * @param target target + * @return absolute target + */ + public static String getAbsoluteTargetPath(String source, String target) { + if (target.charAt(0) == Letters.SLASH) { + // 绝对路径 + return Files1.getPath(Files1.normalize(target)); + } else { + // 相对路径 + return Files1.getPath(Files1.normalize(Files1.getPath(source + "/../" + target))); + } + } + + /** + * 分割文件路径 + * + * @param path path + * @return paths + */ + public static String[] fromMultiPaths(String path) { + return path.split("\\|"); + } + /** * 转为文件 *