FINISH_STATUS_LIST = Lists.of(COMPLETE.name(), FAILED.name(), FORCE_OFFLINE.name());
public static TerminalConnectStatusEnum of(String type) {
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/enums/TerminalConnectTypeEnum.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/enums/TerminalConnectTypeEnum.java
similarity index 91%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/enums/TerminalConnectTypeEnum.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/enums/TerminalConnectTypeEnum.java
index ab6b9e24..cb57c60c 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/enums/TerminalConnectTypeEnum.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/enums/TerminalConnectTypeEnum.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.enums;
+package org.dromara.visor.module.terminal.enums;
/**
* 终端连接类型
@@ -41,6 +41,16 @@ public enum TerminalConnectTypeEnum {
*/
SFTP,
+ /**
+ * rdp
+ */
+ RDP,
+
+ /**
+ * vnc
+ */
+ // VNC,
+
;
public static TerminalConnectTypeEnum of(String type) {
diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/CustomGuacamoleTunnel.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/CustomGuacamoleTunnel.java
new file mode 100644
index 00000000..0eadf520
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/CustomGuacamoleTunnel.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.guacd;
+
+import lombok.Getter;
+import org.apache.guacamole.net.AbstractGuacamoleTunnel;
+import org.apache.guacamole.net.GuacamoleSocket;
+
+import java.util.UUID;
+
+/**
+ * 自定义 guacamole 隧道
+ *
+ * 为了保证与 websocket 的 uuid 一致
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/4/1 0:23
+ */
+public class CustomGuacamoleTunnel extends AbstractGuacamoleTunnel {
+
+ private final UUID uuid;
+
+ @Getter
+ private final GuacamoleSocket socket;
+
+ public CustomGuacamoleTunnel(String uuid, GuacamoleSocket socket) {
+ this.uuid = UUID.fromString(uuid);
+ this.socket = socket;
+ }
+
+ @Override
+ public UUID getUUID() {
+ return uuid;
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/GuacdException.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/GuacdException.java
new file mode 100644
index 00000000..8967f2d9
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/GuacdException.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.guacd;
+
+import lombok.Getter;
+import org.apache.guacamole.GuacamoleException;
+import org.apache.guacamole.protocol.GuacamoleStatus;
+
+/**
+ * guacd code 异常
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/3/31 16:13
+ */
+public class GuacdException extends RuntimeException {
+
+ @Getter
+ private final int code;
+
+ public GuacdException(GuacamoleException ex) {
+ this(ex.getMessage(), ex);
+ }
+
+ public GuacdException(String message, GuacamoleException ex) {
+ super(message, ex);
+ this.code = ex.getStatus().getGuacamoleStatusCode();
+ }
+
+ /**
+ * 获取 guacd 状态码
+ *
+ * @return status
+ */
+ public GuacamoleStatus getStatus() {
+ return GuacamoleStatus.fromGuacamoleStatusCode(code);
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/GuacdTunnel.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/GuacdTunnel.java
new file mode 100644
index 00000000..2c08d300
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/GuacdTunnel.java
@@ -0,0 +1,309 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.guacd;
+
+import cn.orionsec.kit.lang.support.Attempt;
+import cn.orionsec.kit.lang.utils.Objects1;
+import cn.orionsec.kit.lang.utils.Valid;
+import cn.orionsec.kit.lang.utils.collect.Lists;
+import cn.orionsec.kit.lang.utils.io.Streams;
+import lombok.Getter;
+import org.apache.guacamole.GuacamoleException;
+import org.apache.guacamole.io.GuacamoleReader;
+import org.apache.guacamole.io.GuacamoleWriter;
+import org.apache.guacamole.net.GuacamoleSocket;
+import org.apache.guacamole.net.GuacamoleTunnel;
+import org.apache.guacamole.net.InetGuacamoleSocket;
+import org.apache.guacamole.protocol.*;
+import org.dromara.visor.common.constant.Const;
+import org.dromara.visor.module.terminal.handler.guacd.constant.GuacdConst;
+import org.dromara.visor.module.terminal.handler.guacd.constant.GuacdProtocol;
+
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+
+/**
+ * guacd tunnel
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/3/31 0:20
+ */
+public class GuacdTunnel implements IGuacdTunnel {
+
+ private final String uuid;
+
+ private final String serverAddress;
+
+ private final int serverPort;
+
+ @Getter
+ private final GuacamoleConfiguration serverConfig;
+
+ @Getter
+ private final GuacamoleClientInformation clientConfig;
+
+ @Getter
+ private GuacamoleSocket socket;
+
+ @Getter
+ private GuacamoleTunnel tunnel;
+
+ private Runnable callback;
+
+ private volatile boolean closed;
+
+ private Attempt.UncheckedConsumer streamHandler;
+
+ public GuacdTunnel(GuacdProtocol protocol, String uuid, String serverAddress, int serverPort) {
+ this.uuid = uuid;
+ this.serverAddress = serverAddress;
+ this.serverPort = serverPort;
+ this.serverConfig = new GuacamoleConfiguration();
+ this.clientConfig = new GuacamoleClientInformation();
+ serverConfig.setProtocol(protocol.getValue());
+ clientConfig.setName(uuid);
+ }
+
+ @Override
+ public void connect() throws GuacdException {
+ try {
+ // TODO 端口转发
+ this.socket = new ConfiguredGuacamoleSocket(new InetGuacamoleSocket(serverAddress, serverPort), serverConfig, clientConfig);
+ this.tunnel = new CustomGuacamoleTunnel(uuid, socket);
+ } catch (GuacamoleException e) {
+ throw new GuacdException("connect guacd tunnel error", e);
+ }
+ }
+
+ @Override
+ public void run() {
+ this.exec();
+ }
+
+ @Override
+ public void exec() throws GuacdException {
+ Valid.notNull(socket, "server is null");
+ Valid.notNull(streamHandler, "streamHandler is null");
+ // 读取
+ try {
+ GuacamoleReader reader = tunnel.acquireReader();
+ streamHandler.accept(reader);
+ } catch (GuacamoleException e) {
+ throw new GuacdException(e);
+ } finally {
+ // 释放
+ tunnel.releaseReader();
+ }
+ // 回调
+ if (callback != null) {
+ try {
+ callback.run();
+ } catch (Exception e) {
+ // ignored
+ }
+ }
+ // 释放资源
+ Streams.close(this);
+ }
+
+ @Override
+ public void write(String data) throws GuacdException {
+ this.write(data.toCharArray());
+ }
+
+ @Override
+ public void write(byte[] data) throws GuacdException {
+ this.write(new String(data));
+ }
+
+ @Override
+ public void write(char[] data) throws GuacdException {
+ this.write(s -> s.write(data));
+ }
+
+ @Override
+ public void writeInstruction(String opcode, String... args) throws GuacdException {
+ this.write(s -> s.writeInstruction(new GuacamoleInstruction(opcode, args)));
+ }
+
+ @Override
+ public void writeInstruction(String opcode, List args) throws GuacdException {
+ this.write(s -> s.writeInstruction(new GuacamoleInstruction(opcode, args)));
+ }
+
+ /**
+ * 写入
+ *
+ * @param writer writer
+ * @throws GuacdException GuacdCodeException
+ */
+ private void write(Attempt.UncheckedConsumer writer) throws GuacdException {
+ try {
+ // 创建过滤写入器
+ GuacamoleWriter write = new FilteredGuacamoleWriter(tunnel.acquireWriter(), s -> {
+ // 过滤交互指令
+ if (GuacamoleTunnel.INTERNAL_DATA_OPCODE.equals(s.getOpcode())) {
+ return null;
+ }
+ return s;
+ });
+ // 写入
+ writer.accept(write);
+ } catch (GuacamoleException e) {
+ throw new GuacdException(e);
+ } finally {
+ // 释放
+ tunnel.releaseWriter();
+ }
+ }
+
+ @Override
+ public void remote(String address, int port) {
+ this.setParameter(GuacdConst.HOSTNAME, address);
+ this.setParameter(GuacdConst.PORT, port);
+ }
+
+ @Override
+ public void auth(String username, String password) {
+ this.setParameter(GuacdConst.USERNAME, username);
+ this.setParameter(GuacdConst.PASSWORD, password);
+ }
+
+ @Override
+ public void size(int width, int height, int dpi) {
+ clientConfig.setOptimalScreenWidth(width);
+ clientConfig.setOptimalScreenHeight(height);
+ clientConfig.setOptimalResolution(dpi);
+ this.setParameter(GuacdConst.WIDTH, width);
+ this.setParameter(GuacdConst.HEIGHT, height);
+ this.setParameter(GuacdConst.DPI, dpi);
+ }
+
+ @Override
+ public void timezone(String timezone) {
+ clientConfig.setTimezone(timezone);
+ this.setParameter(GuacdConst.TIMEZONE, timezone);
+ }
+
+ @Override
+ public void setParameter(String key, Object value) {
+ if (value != null) {
+ serverConfig.setParameter(key, Objects1.toString(value));
+ } else {
+ serverConfig.unsetParameter(key);
+ }
+ }
+
+ @Override
+ public void setParameter(Map params) {
+ params.forEach(this::setParameter);
+ }
+
+ @Override
+ public void setAudioMimeTypes(List mimeTypes) {
+ if (Lists.isEmpty(mimeTypes)) {
+ return;
+ }
+ clientConfig.getAudioMimetypes().addAll(mimeTypes);
+ }
+
+ @Override
+ public void setVideoMimeTypes(List mimeTypes) {
+ if (Lists.isEmpty(mimeTypes)) {
+ return;
+ }
+ clientConfig.getVideoMimetypes().addAll(mimeTypes);
+ }
+
+ @Override
+ public void setImageMimeTypes(List mimeTypes) {
+ if (Lists.isEmpty(mimeTypes)) {
+ return;
+ }
+ clientConfig.getImageMimetypes().addAll(mimeTypes);
+ }
+
+ @Override
+ public void setConnectionId(String connectionId) {
+ serverConfig.setConnectionID(connectionId);
+ }
+
+ @Override
+ public void callback(Runnable callback) {
+ this.callback = callback;
+ }
+
+ @Override
+ public void transfer(Consumer out) {
+ this.streamHandler = (reader) -> {
+ // 读取消息
+ StringBuilder buffer = new StringBuilder(Const.BUFFER_KB_8);
+ char[] readMessage;
+ while ((readMessage = reader.read()) != null && !closed) {
+ // 插入消息
+ buffer.append(readMessage);
+ // 响应消息
+ if (!reader.available() || buffer.length() >= Const.BUFFER_KB_8) {
+ out.accept(buffer.toString());
+ buffer.setLength(0);
+ }
+ }
+ };
+ }
+
+ @Override
+ public void streamHandler(Attempt.UncheckedConsumer streamHandler) {
+ this.streamHandler = streamHandler;
+ }
+
+ @Override
+ public String getConnectionId() {
+ return serverConfig.getConnectionID();
+ }
+
+ @Override
+ public boolean isOpen() {
+ if (tunnel != null) {
+ return tunnel.isOpen();
+ }
+ return false;
+ }
+
+ @Override
+ public void close() {
+ if (closed) {
+ return;
+ }
+ this.closed = true;
+ if (tunnel != null) {
+ try {
+ tunnel.close();
+ } catch (Exception e) {
+ // ignored
+ }
+ }
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/IGuacdTunnel.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/IGuacdTunnel.java
new file mode 100644
index 00000000..be72804e
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/IGuacdTunnel.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.guacd;
+
+import cn.orionsec.kit.lang.able.Executable;
+import cn.orionsec.kit.lang.able.SafeCloseable;
+import cn.orionsec.kit.lang.support.Attempt;
+import org.apache.guacamole.GuacamoleException;
+import org.apache.guacamole.io.GuacamoleReader;
+import org.apache.guacamole.protocol.GuacamoleClientInformation;
+import org.apache.guacamole.protocol.GuacamoleConfiguration;
+
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+
+/**
+ * guacd tunnel 定义
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/3/31 0:51
+ */
+public interface IGuacdTunnel extends Runnable, Executable, SafeCloseable {
+
+ /**
+ * 设置主机地址
+ *
+ * @param address address
+ * @param port port
+ */
+ void remote(String address, int port);
+
+ /**
+ * 设置远程连接认证
+ *
+ * @param username username
+ * @param password password
+ */
+ void auth(String username, String password);
+
+ /**
+ * 大小
+ *
+ * @param width width
+ * @param height height
+ * @param dpi dpi
+ */
+ void size(int width, int height, int dpi);
+
+ /**
+ * 设置时区
+ *
+ * @param timezone 时区
+ */
+ void timezone(String timezone);
+
+ /**
+ * 设置参数
+ *
+ * @param key key
+ * @param value value
+ */
+ void setParameter(String key, Object value);
+
+ /**
+ * 设置参数
+ *
+ * @param params params
+ */
+ void setParameter(Map params);
+
+ /**
+ * 设置音频类型
+ *
+ * @param mimeTypes mimeTypes
+ */
+ void setAudioMimeTypes(List mimeTypes);
+
+ /**
+ * 设置视频类型
+ *
+ * @param mimeTypes mimeTypes
+ */
+ void setVideoMimeTypes(List mimeTypes);
+
+ /**
+ * 设置图像类型
+ *
+ * @param mimeTypes mimeTypes
+ */
+ void setImageMimeTypes(List mimeTypes);
+
+ /**
+ * 设置连接的id
+ *
+ * @param connectionId connectionId
+ */
+ void setConnectionId(String connectionId);
+
+ /**
+ * 设置回调
+ *
+ * @param callback callback
+ */
+ void callback(Runnable callback);
+
+ /**
+ * 设置传输
+ */
+ void transfer(Consumer out);
+
+ /**
+ * 设置 streamHandler
+ *
+ * @param streamHandler streamHandler
+ */
+ void streamHandler(Attempt.UncheckedConsumer streamHandler);
+
+ /**
+ * 连接
+ *
+ * @throws GuacdException GuacdCodeException
+ */
+ void connect() throws GuacdException;
+
+ /**
+ * 输入命令
+ *
+ * @param data data
+ * @throws GuacdException GuacdCodeException
+ */
+ void write(String data) throws GuacdException;
+
+ /**
+ * 输入命令
+ *
+ * @param data data
+ * @throws GuacdException GuacdCodeException
+ */
+ void write(byte[] data) throws GuacdException;
+
+ /**
+ * 输入命令
+ *
+ * @param data data
+ * @throws GuacdException GuacdCodeException
+ */
+ void write(char[] data) throws GuacdException;
+
+ /**
+ * 写入指令
+ *
+ * @param opcode opcode
+ * @param args args
+ * @throws GuacdException GuacdCodeException
+ */
+ void writeInstruction(String opcode, String... args) throws GuacdException;
+
+ /**
+ * 写入指令
+ *
+ * @param opcode opcode
+ * @param args args
+ * @throws GuacdException GuacdCodeException
+ */
+ void writeInstruction(String opcode, List args) throws GuacdException;
+
+ /**
+ * 获取 connectionId
+ *
+ * @return connectionId
+ */
+ String getConnectionId();
+
+ /**
+ * 获取服务端配置
+ *
+ * @return config
+ */
+ GuacamoleConfiguration getServerConfig();
+
+ /**
+ * 获取客户端配置
+ *
+ * @return config
+ */
+ GuacamoleClientInformation getClientConfig();
+
+ /**
+ * 是否开启会话
+ *
+ * @return open
+ */
+ boolean isOpen();
+
+}
diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/constant/GuacdConst.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/constant/GuacdConst.java
new file mode 100644
index 00000000..16c927ec
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/constant/GuacdConst.java
@@ -0,0 +1,402 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.guacd.constant;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * guacd tunnel 常量
+ *
+ * docs
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/3/31 13:04
+ */
+public interface GuacdConst {
+
+ // -------------------- common --------------------
+
+ /**
+ * 主机
+ */
+ String HOSTNAME = "hostname";
+
+ /**
+ * 端口
+ */
+ String PORT = "port";
+
+ /**
+ * 用户名
+ */
+ String USERNAME = "username";
+
+ /**
+ * 密码
+ */
+ String PASSWORD = "password";
+
+ /**
+ * 颜色深度 8/16/24
+ */
+ String COLOR_DEPTH = "color-depth";
+
+ /**
+ * 无损压缩 boolean
+ */
+ String FORCE_LOSSLESS = "force-lossless";
+
+ /**
+ * 禁用复制 boolean
+ */
+ String DISABLE_COPY = "disable-copy";
+
+ /**
+ * 禁用粘贴 boolean
+ */
+ String DISABLE_PASTE = "disable-paste";
+
+ /**
+ * 屏幕录制文件的目录
+ */
+ String RECORDING_PATH = "recording-path";
+
+ /**
+ * 是否自动创建录屏目录 boolean
+ */
+ String CREATE_RECORDING_PATH = "create-recording-path";
+
+ // -------------------- rdp --------------------
+
+ /**
+ * 域
+ */
+ String DOMAIN = "domain";
+
+ /**
+ * 安全模式 默认: any any/nla/nla-ext/tls/vmconnect/rdp
+ */
+ String SECURITY = "security";
+
+ /**
+ * 是否忽略证书 boolean
+ */
+ String IGNORE_CERT = "ignore-cert";
+
+ /**
+ * 是否禁用身份验证 boolean
+ */
+ String DISABLE_AUTH = "disable-auth";
+
+ /**
+ * 剪切板尾行规范化 默认: preserve preserve/unix/windows
+ */
+ String NORMALIZE_CLIPBOARD = "normalize-clipboard";
+
+ /**
+ * 客户端名称 默认为 hostname
+ */
+ String CLIENT_NAME = "client-name";
+
+ /**
+ * 宽度 像素点
+ */
+ String WIDTH = "width";
+
+ /**
+ * 高度 像素点
+ */
+ String HEIGHT = "height";
+
+ /**
+ * 分辨率 dpi
+ */
+ String DPI = "dpi";
+
+ /**
+ * 时区
+ */
+ String TIMEZONE = "timezone";
+
+ /**
+ * 是否连接到控制台会话 boolean
+ */
+ String CONSOLE = "console";
+
+ /**
+ * 立即运行的程序完整路径
+ */
+ String INITIAL_PROGRAM = "initial-program";
+
+ /**
+ * 键盘布局
+ */
+ String SERVER_LAYOUT = "server-layout";
+
+ /**
+ * 重置大小时机 display-update/reconnect
+ */
+ String RESIZE_METHOD = "resize-method";
+
+ /**
+ * 禁用声音输出 boolean
+ */
+ String DISABLE_AUDIO_OUTPUT = "disable-audio";
+
+ /**
+ * 启用麦克风 boolean
+ */
+ String ENABLE_AUDIO_INPUT = "enable-audio-input";
+
+ /**
+ * 启用多点触控 boolean
+ */
+ String ENABLE_TOUCH = "enable-touch";
+
+ /**
+ * 启用打印机 boolean
+ */
+ String ENABLE_PRINTING = "enable-printing";
+
+ /**
+ * 打印机名称 依赖 enable-printing
+ */
+ String PRINTER_NAME = "printer-name";
+
+ /**
+ * 启用文件传输驱动 boolean
+ */
+ String ENABLE_DRIVE = "enable-drive";
+
+ /**
+ * 禁用下载 boolean 依赖 enable-drive
+ */
+ String DISABLE_DOWNLOAD = "disable-download";
+
+ /**
+ * 禁用上传 boolean 依赖 enable-drive
+ */
+ String DISABLE_UPLOAD = "disable-upload";
+
+ /**
+ * 文件系统驱动名称 依赖 enable-drive
+ */
+ String DRIVE_NAME = "drive-name";
+
+ /**
+ * 驱动路径 string 依赖 enable-drive
+ */
+ String DRIVE_PATH = "drive-path";
+
+ /**
+ * 自动创建驱动 boolean 依赖 enable-drive
+ */
+ String CREATE_DRIVE_PATH = "create-drive-path";
+
+ /**
+ * 启动控制台音频 boolean 依赖 console
+ */
+ String CONSOLE_AUDIO = "console-audio";
+
+ /**
+ * 静态管道名称 最大7个字符 多个用,分割
+ */
+ String STATIC_CHANNELS = "static-channels";
+
+ /**
+ * 预连接 id 依赖 security 为 security
+ */
+ String PRE_CONNECTION_ID = "preconnection-id";
+
+ /**
+ * 预连接信息 依赖 security 为 security
+ */
+ String PRE_CONNECTION_BLOB = "preconnection-blob";
+
+ /**
+ * 网关主机名
+ */
+ String GATEWAY_HOSTNAME = "gateway-hostname";
+
+ /**
+ * 网关端口 默认 443
+ */
+ String GATEWAY_PORT = "gateway-port";
+
+ /**
+ * 网关用户名
+ */
+ String GATEWAY_USERNAME = "gateway-username";
+
+ /**
+ * 网关密码
+ */
+ String GATEWAY_PASSWORD = "gateway-password";
+
+ /**
+ * 网关域
+ */
+ String GATEWAY_DOMAIN = "gateway-domain";
+
+ /**
+ * 负载均衡信息
+ */
+ String LOAD_BALANCE_INFO = "load-balance-info";
+
+ /**
+ * 启用壁纸 boolean
+ */
+ String ENABLE_WALLPAPER = "enable-wallpaper";
+
+ /**
+ * 启用主题 boolean
+ */
+ String ENABLE_THEMING = "enable-theming";
+
+ /**
+ * 启动平滑字体 boolean
+ */
+ String ENABLE_FONT_SMOOTHING = "enable-font-smoothing";
+
+ /**
+ * 启用窗口拖动 boolean
+ */
+ String ENABLE_FULL_WINDOW_DRAG = "enable-full-window-drag";
+
+ /**
+ * 启用桌面合成 boolean
+ */
+ String ENABLE_DESKTOP_COMPOSITION = "enable-desktop-composition";
+
+ /**
+ * 启用菜单动画 boolean
+ */
+ String ENABLE_MENU_ANIMATIONS = "enable-menu-animations";
+
+ /**
+ * 禁用位图缓存 boolean
+ */
+ String DISABLE_BITMAP_CACHING = "disable-bitmap-caching";
+
+ /**
+ * 禁用离屏缓存 boolean
+ */
+ String DISABLE_OFFSCREEN_CACHING = "disable-offscreen-caching";
+
+ /**
+ * 禁用字形缓存 boolean 默认禁用
+ */
+ String DISABLE_GLYPH_CACHING = "disable-glyph-caching";
+
+ /**
+ * 远程应用名称
+ */
+ String REMOTE_APP = "remote-app";
+
+ /**
+ * 远程应用程序的工作目录
+ */
+ String REMOTE_APP_DIR = "remote-app-dir";
+
+ /**
+ * 远程应用程序的命令行参数
+ */
+ String REMOTE_APP_ARGS = "remote-app-args";
+
+ // -------------------- vnc --------------------
+
+ /**
+ * 重试次数
+ */
+ String AUTO_RETRY = "autoretry";
+
+ /**
+ * 红蓝交换 boolean
+ */
+ String SWAP_RED_BLUE = "swap-red-blue";
+
+ /**
+ * 鼠标指针 remote/local
+ */
+ String CURSOR = "cursor";
+
+ /**
+ * 编码方式
+ */
+ String ENCODINGS = "encodings";
+
+ /**
+ * 是否只读 boolean
+ */
+ String READ_ONLY = "read-only";
+
+ /**
+ * 代理主机
+ */
+ String DEST_HOST = "dest-host";
+
+ /**
+ * 代理端口
+ */
+ String DEST_PORT = "dest-port";
+
+ /**
+ * 反向连接 boolean
+ */
+ String REVERSE_CONNECT = "reverse-connect";
+
+ /**
+ * 监听超时时间 ms
+ */
+ String LISTEN_TIMEOUT = "listen-timeout";
+
+ /**
+ * 是否开启音频 boolean
+ */
+ String ENABLE_AUDIO = "enable-audio";
+
+ /**
+ * 音频服务器 通常为 hostname
+ */
+ String AUDIO_SERVERNAME = "audio-servername";
+
+ /**
+ * 剪贴板编码
+ */
+ String CLIPBOARD_ENCODING = "clipboard-encoding";
+
+ // -------------------- const --------------------
+
+ String RESIZE_METHOD_DISPLAY_UPDATE = "display-update";
+
+ String RESIZE_METHOD_RECONNECT = "reconnect";
+
+ String DRIVE_DRIVE_NAME = "Drive";
+
+ String SECURITY_VMCONNECT = "vmconnect";
+
+ List AUDIO_MIMETYPES = Arrays.asList("audio/L8", "audio/L16");
+
+}
diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/constant/GuacdProtocol.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/constant/GuacdProtocol.java
new file mode 100644
index 00000000..e2b4e8dd
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/guacd/constant/GuacdProtocol.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.guacd.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * guacd 协议
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/3/31 15:58
+ */
+@Getter
+@AllArgsConstructor
+public enum GuacdProtocol {
+
+ /**
+ * VNC
+ */
+ VNC("vnc"),
+
+ /**
+ * RDP
+ */
+ RDP("rdp"),
+
+ ;
+
+ private final String value;
+
+ public static GuacdProtocol of(String protocol) {
+ if (protocol == null) {
+ return null;
+ }
+ for (GuacdProtocol value : values()) {
+ if (value.value.equals(protocol) || value.name().equals(protocol)) {
+ return value;
+ }
+ }
+ return null;
+ }
+
+}
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/AbstractTerminalAccessHandler.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/AbstractTerminalAccessHandler.java
new file mode 100644
index 00000000..c117392f
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/AbstractTerminalAccessHandler.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.visor.common.constant.FieldConst;
+import org.dromara.visor.framework.websocket.core.utils.WebSockets;
+import org.dromara.visor.module.terminal.handler.terminal.manager.TerminalManager;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ITerminalSender;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.CloseStatus;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+import org.springframework.web.socket.handler.AbstractWebSocketHandler;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 终端处理器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/12/28 14:33
+ */
+@Slf4j
+@Component
+public abstract class AbstractTerminalAccessHandler extends AbstractWebSocketHandler {
+
+ @Resource
+ protected TerminalManager terminalManager;
+
+ @Override
+ public void afterConnectionEstablished(WebSocketSession channel) {
+ String id = channel.getId();
+ log.info("AbstractTerminalAccessHandler-afterConnectionEstablished id: {}", id);
+ Map attr = channel.getAttributes();
+ // 设置消息发送器
+ T sender = this.createSender(channel);
+ attr.put(FieldConst.SENDER, sender);
+ // 设置 sessionId
+ TerminalChannelProps props = WebSockets.getAttr(channel, FieldConst.PROPS);
+ props.setId(id);
+ // 发送 sessionId
+ sender.sendSetId(id);
+ // 初始化会话
+ this.initSession(channel, props);
+ }
+
+ /**
+ * 创建 sender
+ *
+ * @param channel sender
+ * @return sender
+ */
+ protected abstract T createSender(WebSocketSession channel);
+
+ /**
+ * 初始化会话
+ *
+ * @param channel channel
+ * @param props props
+ */
+ protected void initSession(WebSocketSession channel, TerminalChannelProps props) {
+ }
+
+ /**
+ * 处理消息
+ *
+ * @param channel channel
+ * @param message message
+ * @param props props
+ * @param sender sender
+ */
+ protected abstract void handleMessage(WebSocketSession channel,
+ TextMessage message,
+ TerminalChannelProps props,
+ T sender);
+
+ @Override
+ protected void handleTextMessage(WebSocketSession channel, TextMessage message) {
+ // 包装处理消息
+ this.handleMessage(channel, message, this.getProps(channel), this.getSender(channel));
+ }
+
+ @Override
+ public void handleTransportError(WebSocketSession channel, Throwable exception) {
+ log.error("AbstractTerminalAccessHandler-handleTransportError id: {}", channel.getId(), exception);
+ }
+
+ @Override
+ public void afterConnectionClosed(WebSocketSession channel, CloseStatus status) {
+ String id = channel.getId();
+ log.info("AbstractTerminalAccessHandler-afterConnectionClosed id: {}, code: {}, reason: {}", id, status.getCode(), status.getReason());
+ // 设置 sender 为已关闭
+ T sender = this.getSender(channel);
+ if (sender != null) {
+ sender.setClosed();
+ }
+ // 关闭会话
+ terminalManager.closeSession(id);
+ }
+
+ /**
+ * 获取 sender
+ *
+ * @param channel channel
+ * @return sender
+ */
+ protected T getSender(WebSocketSession channel) {
+ return WebSockets.getAttr(channel, FieldConst.SENDER);
+ }
+
+ /**
+ * 获取 props
+ *
+ * @param channel channel
+ * @return props
+ */
+ protected TerminalChannelProps getProps(WebSocketSession channel) {
+ return WebSockets.getAttr(channel, FieldConst.PROPS);
+ }
+
+}
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/TerminalAccessRdpHandler.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/TerminalAccessRdpHandler.java
new file mode 100644
index 00000000..51ec6d7f
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/TerminalAccessRdpHandler.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.visor.module.terminal.handler.terminal.enums.InputProtocolEnum;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.sender.IGuacdTerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.sender.WebsocketGuacdTerminalSender;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+
+/**
+ * RDP 终端处理器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/12/28 14:33
+ */
+@Slf4j
+@Component
+public class TerminalAccessRdpHandler extends AbstractTerminalAccessHandler {
+
+ @Override
+ protected IGuacdTerminalSender createSender(WebSocketSession channel) {
+ return new WebsocketGuacdTerminalSender(channel);
+ }
+
+ @Override
+ protected void handleMessage(WebSocketSession channel, TextMessage message, TerminalChannelProps props, IGuacdTerminalSender sender) {
+ String payload = message.getPayload();
+ try {
+ // 解析类型
+ InputProtocolEnum type = InputProtocolEnum.of(payload);
+ if (type == null) {
+ return;
+ }
+ // 解析并处理消息
+ type.getHandler().handle(props, sender, type.parse(payload));
+ } catch (Exception e) {
+ log.error("TerminalAccessRdpHandler-handleMessage-error id: {}, msg: {}", channel.getId(), payload, e);
+ }
+ }
+
+}
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/TerminalAccessSftpHandler.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/TerminalAccessSftpHandler.java
new file mode 100644
index 00000000..bc6554e9
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/TerminalAccessSftpHandler.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.visor.module.common.config.AppSftpConfig;
+import org.dromara.visor.module.terminal.handler.terminal.enums.InputProtocolEnum;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ISftpTerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.sender.WebsocketSftpTerminalSender;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+
+import javax.annotation.Resource;
+
+/**
+ * sftp 终端处理器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/12/28 14:33
+ */
+@Slf4j
+@Component
+public class TerminalAccessSftpHandler extends AbstractTerminalAccessHandler {
+
+ @Resource
+ private AppSftpConfig appSftpConfig;
+
+ @Override
+ protected ISftpTerminalSender createSender(WebSocketSession channel) {
+ return new WebsocketSftpTerminalSender(channel);
+ }
+
+ @Override
+ protected void initSession(WebSocketSession channel, TerminalChannelProps props) {
+ // 预览大小
+ props.getExtra().setFilePreviewSize(appSftpConfig.getPreviewSize());
+ }
+
+ @Override
+ protected void handleMessage(WebSocketSession channel, TextMessage message, TerminalChannelProps props, ISftpTerminalSender sender) {
+ String payload = message.getPayload();
+ try {
+ // 解析类型
+ InputProtocolEnum type = InputProtocolEnum.of(payload);
+ if (type == null) {
+ return;
+ }
+ // 解析并处理消息
+ type.getHandler().handle(props, sender, type.parse(payload));
+ } catch (Exception e) {
+ log.error("TerminalAccessSftpHandler-handleMessage-error id: {}, msg: {}", channel.getId(), payload, e);
+ }
+ }
+
+}
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/TerminalAccessSshHandler.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/TerminalAccessSshHandler.java
new file mode 100644
index 00000000..f4e0f459
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/TerminalAccessSshHandler.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.visor.module.terminal.handler.terminal.enums.InputProtocolEnum;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ISshTerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.sender.WebsocketSshTerminalSender;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+
+/**
+ * ssh 终端处理器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/12/28 14:33
+ */
+@Slf4j
+@Component
+public class TerminalAccessSshHandler extends AbstractTerminalAccessHandler {
+
+ @Override
+ protected ISshTerminalSender createSender(WebSocketSession channel) {
+ return new WebsocketSshTerminalSender(channel);
+ }
+
+ @Override
+ protected void handleMessage(WebSocketSession channel, TextMessage message, TerminalChannelProps props, ISshTerminalSender sender) {
+ String payload = message.getPayload();
+ try {
+ // 解析类型
+ InputProtocolEnum type = InputProtocolEnum.of(payload);
+ if (type == null) {
+ return;
+ }
+ // 解析并处理消息
+ type.getHandler().handle(props, sender, type.parse(payload));
+ } catch (Exception e) {
+ log.error("TerminalAccessSshHandler-handleMessage-error id: {}, msg: {}", channel.getId(), payload, e);
+ }
+ }
+
+}
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/constant/SessionCloseCode.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/constant/SessionCloseCode.java
new file mode 100644
index 00000000..54ba3be4
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/constant/SessionCloseCode.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.constant;
+
+/**
+ * 会话关闭码
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/4/1 13:53
+ */
+public interface SessionCloseCode {
+
+ /**
+ * 正常关闭
+ */
+ Integer NORMAL = 0;
+
+ /**
+ * 强制关闭
+ */
+ Integer FORCE_OFFLINE = 10000;
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/constant/TerminalMessage.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/constant/TerminalMessage.java
similarity index 73%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/constant/TerminalMessage.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/constant/TerminalMessage.java
index 7f99c45b..2791d8e6 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/constant/TerminalMessage.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/constant/TerminalMessage.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.constant;
+package org.dromara.visor.module.terminal.handler.terminal.constant;
/**
* 终端信息常量
@@ -31,18 +31,14 @@ package org.dromara.visor.module.asset.handler.host.terminal.constant;
*/
public interface TerminalMessage {
- String CONFIG_DISABLED = "SSH configuration has been disabled.";
-
- String AUTHENTICATION_FAILURE = "authentication failed. please check the configuration.";
-
- String SERVER_UNREACHABLE = "remote server unreachable. please check the configuration.";
+ String CONFIG_DISABLED = "configuration has been disabled.";
String CONNECTION_FAILED = "connection failed.";
- String CONNECTION_TIMEOUT = "connection timeout.";
-
String CONNECTION_CLOSED = "connection closed.";
+ String GUACD_SERVICE = "check your guacd service.";
+
String FORCED_OFFLINE = "forced offline.";
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/enums/InputTypeEnum.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/enums/InputProtocolEnum.java
similarity index 55%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/enums/InputTypeEnum.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/enums/InputProtocolEnum.java
index 2c8e3ac6..4a192be7 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/enums/InputTypeEnum.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/enums/InputProtocolEnum.java
@@ -20,53 +20,43 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.enums;
+package org.dromara.visor.module.terminal.handler.terminal.enums;
import cn.orionsec.kit.spring.SpringHolder;
import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
-import org.dromara.visor.module.asset.handler.host.terminal.handler.*;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
-import org.dromara.visor.module.asset.handler.host.terminal.model.request.*;
+import org.dromara.visor.module.terminal.handler.terminal.handler.*;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
+import org.dromara.visor.module.terminal.handler.terminal.model.request.*;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ITerminalSender;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
- * 输入操作类型枚举
+ * 输入协议枚举
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/12/29 15:33
*/
-public enum InputTypeEnum {
+public enum InputProtocolEnum {
/**
- * 终端连接检查
- */
- CHECK("ck",
- TerminalCheckHandler.class,
- new String[]{"type", "sessionId", "hostId", "connectType"},
- TerminalCheckRequest.class,
- true),
-
- /**
- * 连接主机
+ * 连接终端
*/
CONNECT("co",
TerminalConnectHandler.class,
- new String[]{"type", "sessionId", "terminalType", "cols", "rows"},
- TerminalConnectRequest.class,
- true),
+ new String[]{"type", "body"},
+ TerminalConnectRequest.class),
/**
* 关闭连接
*/
CLOSE("cl",
TerminalCloseHandler.class,
- new String[]{"type", "sessionId"},
- TerminalBasePayload.class,
- true),
+ new String[]{"type"},
+ TerminalBasePayload.class),
/**
* ping
@@ -74,116 +64,133 @@ public enum InputTypeEnum {
PING("p",
TerminalPingHandler.class,
new String[]{"type"},
- TerminalBasePayload.class,
- true),
+ TerminalBasePayload.class),
/**
- * SSH 修改大小
+ * 修改大小
*/
- SSH_RESIZE("rs",
- SshResizeHandler.class,
- new String[]{"type", "sessionId", "cols", "rows"},
- SshResizeRequest.class,
- true),
+ RESIZE("rs",
+ TerminalResizeHandler.class,
+ new String[]{"type", "width", "height"},
+ TerminalResizeRequest.class),
+
+ // ----------------------- SSH ----------------------
/**
* SSH 输入
*/
SSH_INPUT("i",
SshInputHandler.class,
- new String[]{"type", "sessionId", "command"},
- SshInputRequest.class,
- false),
+ new String[]{"type", "command"},
+ SshInputRequest.class),
+
+ // ----------------------- SFTP ----------------------
/**
* SFTP 文件列表
*/
SFTP_LIST("ls",
SftpListHandler.class,
- new String[]{"type", "sessionId", "showHiddenFile", "path"},
- SftpListRequest.class,
- true),
+ new String[]{"type", "showHiddenFile", "path"},
+ SftpListRequest.class),
/**
* SFTP 创建文件夹
*/
SFTP_MKDIR("mk",
SftpMakeDirectoryHandler.class,
- new String[]{"type", "sessionId", "path"},
- SftpBaseRequest.class,
- true),
+ new String[]{"type", "path"},
+ SftpBaseRequest.class),
/**
* SFTP 创建文件
*/
SFTP_TOUCH("to",
SftpTouchHandler.class,
- new String[]{"type", "sessionId", "path"},
- SftpBaseRequest.class,
- true),
+ new String[]{"type", "path"},
+ SftpBaseRequest.class),
/**
* SFTP 移动文件
*/
SFTP_MOVE("mv",
SftpMoveHandler.class,
- new String[]{"type", "sessionId", "path", "target"},
- SftpMoveRequest.class,
- true),
+ new String[]{"type", "path", "target"},
+ SftpMoveRequest.class),
/**
* SFTP 删除文件
*/
SFTP_REMOVE("rm",
SftpRemoveHandler.class,
- new String[]{"type", "sessionId", "path"},
- SftpBaseRequest.class,
- true),
+ new String[]{"type", "path"},
+ SftpBaseRequest.class),
/**
* SFTP 截断文件
*/
SFTP_TRUNCATE("tc",
SftpTruncateHandler.class,
- new String[]{"type", "sessionId", "path"},
- SftpBaseRequest.class,
- true),
+ new String[]{"type", "path"},
+ SftpBaseRequest.class),
/**
* SFTP 修改文件权限
*/
- SFTP_CHMOD("cm",
+ SFTP_CHMOD("chm",
SftpChangeModeHandler.class,
- new String[]{"type", "sessionId", "path", "mod"},
- SftpChangeModeRequest.class,
- true),
+ new String[]{"type", "path", "mod"},
+ SftpChangeModeRequest.class),
+
+ /**
+ * SFTP 修改文件归属
+ */
+ SFTP_CHOWN("cho",
+ SftpChangeOwnerHandler.class,
+ new String[]{"type", "path", "uid"},
+ SftpChangeOwnerRequest.class),
+
+ /**
+ * SFTP 修改文件分组
+ */
+ SFTP_CHGRP("chg",
+ SftpChangeGroupHandler.class,
+ new String[]{"type", "path", "gid"},
+ SftpChangeGroupRequest.class),
/**
* SFTP 下载文件夹展开文件
*/
SFTP_DOWNLOAD_FLAT_DIRECTORY("df",
SftpDownloadFlatDirectoryHandler.class,
- new String[]{"type", "sessionId", "currentPath", "path"},
- SftpDownloadFlatDirectoryRequest.class,
- true),
+ new String[]{"type", "currentPath", "path"},
+ SftpDownloadFlatDirectoryRequest.class),
/**
* SFTP 获取内容
*/
SFTP_GET_CONTENT("gc",
SftpGetContentHandler.class,
- new String[]{"type", "sessionId", "path"},
- SftpBaseRequest.class,
- true),
+ new String[]{"type", "path"},
+ SftpBaseRequest.class),
/**
* SFTP 修改内容
*/
SFTP_SET_CONTENT("sc",
SftpSetContentHandler.class,
- new String[]{"type", "sessionId", "path"},
- SftpBaseRequest.class,
- true),
+ new String[]{"type", "path"},
+ SftpBaseRequest.class),
+
+ // ----------------------- guacd ----------------------
+
+ /**
+ * guacd 指令
+ */
+ GUACD_INSTRUCTION("gi",
+ GuacdInstructionHandler.class,
+ new String[]{"type", "instruction"},
+ GuacdInstructionRequest.class),
;
@@ -192,35 +199,29 @@ public enum InputTypeEnum {
@Getter
private final String type;
- private final Class extends ITerminalHandler extends TerminalBasePayload>> handlerBean;
+ private final Class extends ITerminalHandler extends ITerminalSender, ? extends TerminalBasePayload>> handlerBean;
private final String[] payloadDefine;
private final Class extends TerminalBasePayload> payloadClass;
- @Getter
- private final boolean asyncExec;
+ private ITerminalHandler extends ITerminalSender, ? extends TerminalBasePayload> handler;
- @Getter
- private ITerminalHandler extends TerminalBasePayload> handler;
-
- InputTypeEnum(String type,
- Class extends ITerminalHandler> handlerBean,
- String[] payloadDefine,
- Class payloadClass,
- boolean asyncExec) {
+ InputProtocolEnum(String type,
+ Class extends ITerminalHandler> handlerBean,
+ String[] payloadDefine,
+ Class payloadClass) {
this.type = type;
this.handlerBean = handlerBean;
this.payloadDefine = payloadDefine;
this.payloadClass = payloadClass;
- this.asyncExec = asyncExec;
}
- public static InputTypeEnum of(String payload) {
+ public static InputProtocolEnum of(String payload) {
if (payload == null) {
return null;
}
- for (InputTypeEnum value : values()) {
+ for (InputProtocolEnum value : values()) {
if (payload.startsWith(value.type + SEPARATOR) || payload.equals(value.type)) {
return value;
}
@@ -262,6 +263,11 @@ public enum InputTypeEnum {
return (T) object.toJavaObject(payloadClass);
}
+ @SuppressWarnings("unchecked")
+ public ITerminalHandler getHandler() {
+ return (ITerminalHandler) handler;
+ }
+
/**
* 类型字段定义
*/
@@ -270,7 +276,7 @@ public enum InputTypeEnum {
@PostConstruct
public void init() {
- for (InputTypeEnum value : InputTypeEnum.values()) {
+ for (InputProtocolEnum value : InputProtocolEnum.values()) {
value.handler = SpringHolder.getBean(value.handlerBean);
}
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/enums/OutputTypeEnum.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/enums/OutputProtocolEnum.java
similarity index 53%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/enums/OutputTypeEnum.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/enums/OutputProtocolEnum.java
index 2f4ff78c..99abd79b 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/enums/OutputTypeEnum.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/enums/OutputProtocolEnum.java
@@ -20,14 +20,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.enums;
+package org.dromara.visor.module.terminal.handler.terminal.enums;
import cn.orionsec.kit.lang.utils.json.matcher.ReplacementFormatters;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
- * 输出操作类型枚举
+ * 输出协议枚举
*
* @author Jiahang Li
* @version 1.0.0
@@ -35,82 +35,120 @@ import lombok.Getter;
*/
@Getter
@AllArgsConstructor
-public enum OutputTypeEnum {
+public enum OutputProtocolEnum {
+
+ // ----------------------- base ----------------------
/**
- * 终端连接检查
+ * 设置id
*/
- CHECK("ck", "${type}|${sessionId}|${result}|${msg}"),
+ SET_ID("id", "${type}|${sessionId}"),
/**
- * 终端连接
+ * 设置会话信息
*/
- CONNECT("co", "${type}|${sessionId}|${result}|${msg}"),
+ SET_INFO("if", "${type}|${info}"),
/**
- * 关闭连接
+ * 已连接
*/
- CLOSE("cl", "${type}|${sessionId}|${forceClose}|${msg}"),
+ CONNECTED("co", "${type}"),
+
+ /**
+ * 已关闭
+ */
+ CLOSED("cl", "${type}|${code}|${msg}"),
/**
* pong
*/
PONG("p", "${type}"),
+ /**
+ * 修改大小
+ */
+ RESIZE("rs", "${type}|${width}|${height}"),
+
+ // ----------------------- ssh ----------------------
+
/**
* SSH 输出
*/
- SSH_OUTPUT("o", "${type}|${sessionId}|${body}"),
+ SSH_OUTPUT("o", "${type}|${body}"),
+
+ /**
+ * SSH sz 下载文件
+ */
+ SSH_SZ_DOWNLOAD("szd", "${type}|${paths}"),
+
+ // ----------------------- sftp ----------------------
/**
* SFTP 文件列表
*/
- SFTP_LIST("ls", "${type}|${sessionId}|${path}|${result}|${msg}|${body}"),
+ SFTP_LIST("ls", "${type}|${path}|${result}|${msg}|${body}"),
/**
* SFTP 创建文件夹
*/
- SFTP_MKDIR("mk", "${type}|${sessionId}|${result}|${msg}"),
+ SFTP_MKDIR("mk", "${type}|${result}|${msg}"),
/**
* SFTP 创建文件
*/
- SFTP_TOUCH("to", "${type}|${sessionId}|${result}|${msg}"),
+ SFTP_TOUCH("to", "${type}|${result}|${msg}"),
/**
* SFTP 移动文件
*/
- SFTP_MOVE("mv", "${type}|${sessionId}|${result}|${msg}"),
+ SFTP_MOVE("mv", "${type}|${result}|${msg}"),
/**
* SFTP 删除文件
*/
- SFTP_REMOVE("rm", "${type}|${sessionId}|${result}|${msg}"),
+ SFTP_REMOVE("rm", "${type}|${result}|${msg}"),
/**
* SFTP 截断文件
*/
- SFTP_TRUNCATE("tc", "${type}|${sessionId}|${result}|${msg}"),
+ SFTP_TRUNCATE("tc", "${type}|${result}|${msg}"),
/**
* SFTP 修改文件权限
*/
- SFTP_CHMOD("cm", "${type}|${sessionId}|${result}|${msg}"),
+ SFTP_CHMOD("chm", "${type}|${result}|${msg}"),
+
+ /**
+ * SFTP 修改文件归属
+ */
+ SFTP_CHOWN("cho", "${type}|${result}|${msg}"),
+
+ /**
+ * SFTP 修改文件分组
+ */
+ SFTP_CHGRP("chg", "${type}|${result}|${msg}"),
/**
* SFTP 下载文件夹展开文件
*/
- SFTP_DOWNLOAD_FLAT_DIRECTORY("df", "${type}|${sessionId}|${currentPath}|${result}|${msg}|${body}"),
+ SFTP_DOWNLOAD_FLAT_DIRECTORY("df", "${type}|${currentPath}|${result}|${msg}|${body}"),
/**
* SFTP 获取文件内容
*/
- SFTP_GET_CONTENT("gc", "${type}|${sessionId}|${result}|${msg}|${token}"),
+ SFTP_GET_CONTENT("gc", "${type}|${result}|${msg}|${token}"),
/**
* SFTP 修改文件内容
*/
- SFTP_SET_CONTENT("sc", "${type}|${sessionId}|${result}|${msg}|${token}"),
+ SFTP_SET_CONTENT("sc", "${type}|${result}|${msg}|${token}"),
+
+ // ----------------------- guacd ----------------------
+
+ /**
+ * guacd 指令
+ */
+ GUACD_INSTRUCTION("gi", "${type}|${instruction}"),
;
@@ -128,11 +166,11 @@ public enum OutputTypeEnum {
return ReplacementFormatters.format(this.template, o);
}
- public static OutputTypeEnum of(String type) {
+ public static OutputProtocolEnum of(String type) {
if (type == null) {
return null;
}
- for (OutputTypeEnum value : values()) {
+ for (OutputProtocolEnum value : values()) {
if (value.type.equals(type)) {
return value;
}
diff --git a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-provider/src/main/java/org/dromara/visor/module/infra/constant/DataExtraItems.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/enums/SessionChannelEnum.java
similarity index 82%
rename from orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-provider/src/main/java/org/dromara/visor/module/infra/constant/DataExtraItems.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/enums/SessionChannelEnum.java
index cde5030b..aeccea15 100644
--- a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-provider/src/main/java/org/dromara/visor/module/infra/constant/DataExtraItems.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/enums/SessionChannelEnum.java
@@ -20,15 +20,20 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.infra.constant;
+package org.dromara.visor.module.terminal.handler.terminal.enums;
/**
- * 数据额外字段常量
+ * session channel
*
* @author Jiahang Li
* @version 1.0.0
- * @since 2023/12/19 22:26
+ * @since 2024/8/19 15:04
*/
-public interface DataExtraItems {
+public enum SessionChannelEnum {
+
+ /**
+ * web
+ */
+ WEB,
}
diff --git a/orion-visor-common/src/main/java/org/dromara/visor/common/validator/group/Export.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/enums/SessionTypeEnum.java
similarity index 78%
rename from orion-visor-common/src/main/java/org/dromara/visor/common/validator/group/Export.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/enums/SessionTypeEnum.java
index 7ca74a1d..911e6b96 100644
--- a/orion-visor-common/src/main/java/org/dromara/visor/common/validator/group/Export.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/enums/SessionTypeEnum.java
@@ -20,14 +20,25 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.common.validator.group;
+package org.dromara.visor.module.terminal.handler.terminal.enums;
/**
- * 导出验证分组
+ * session 类型
*
* @author Jiahang Li
* @version 1.0.0
- * @since 2023/9/1 19:13
+ * @since 2024/7/5 10:51
*/
-public interface Export {
+public enum SessionTypeEnum {
+
+ /**
+ * 终端
+ */
+ TERMINAL,
+
+ /**
+ * 传输
+ */
+ TRANSFER,
+
}
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/AbstractTerminalHandler.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/AbstractTerminalHandler.java
new file mode 100644
index 00000000..8cc88d4a
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/AbstractTerminalHandler.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.handler;
+
+import org.dromara.visor.common.constant.ErrorMessage;
+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.module.terminal.handler.terminal.constant.SessionCloseCode;
+import org.dromara.visor.module.terminal.handler.terminal.manager.TerminalManager;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.model.config.ITerminalSessionConfig;
+import org.dromara.visor.module.terminal.handler.terminal.record.TerminalAsyncSaver;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ITerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.session.ITerminalSession;
+import org.dromara.visor.module.terminal.handler.terminal.utils.TerminalUtils;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 终端消息处理器 基类
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/12/29 18:59
+ */
+public abstract class AbstractTerminalHandler
+ implements ITerminalHandler {
+
+ @Resource
+ protected TerminalManager terminalManager;
+
+ /**
+ * 保存操作日志
+ *
+ * @param props props
+ * @param extra extra
+ * @param type type
+ * @param startTime startTime
+ * @param ex ex
+ * @return model
+ */
+ protected OperatorLogModel saveOperatorLog(TerminalChannelProps props,
+ Map extra,
+ String type,
+ long startTime,
+ Exception ex) {
+ String sessionId = props.getId();
+ // 获取会话并且设置参数
+ ITerminalSession session = terminalManager.getSession(sessionId);
+ if (session != null) {
+ ITerminalSessionConfig config = session.getConfig();
+ extra.put(OperatorLogs.HOST_ID, config.getHostId());
+ extra.put(OperatorLogs.HOST_NAME, config.getHostName());
+ extra.put(OperatorLogs.ADDRESS, config.getHostAddress());
+ }
+ extra.put(OperatorLogs.SESSION_ID, sessionId);
+ // 获取日志
+ OperatorLogModel model = TerminalUtils.getOperatorLogModel(props, extra, type, startTime, ex);
+ // 保存操作日志
+ TerminalAsyncSaver.saveOperatorLog(model);
+ return model;
+ }
+
+ /**
+ * 获取错误信息
+ *
+ * @param ex ex
+ * @return msg
+ */
+ protected String getErrorMessage(Exception ex) {
+ // 获取错误信息
+ return ErrorMessage.getErrorMessage(ex, ErrorMessage.OPERATE_ERROR);
+ }
+
+ /**
+ * 发送 closed 消息以及关闭
+ *
+ * @param sender sender
+ * @param message message
+ */
+ protected void sendClosedAndClose(S sender, String message) {
+ this.sendClosedAndClose(sender, SessionCloseCode.NORMAL, message);
+ }
+
+ /**
+ * 发送 closed 消息以及关闭
+ *
+ * @param sender sender
+ * @param code code
+ * @param message message
+ */
+ protected void sendClosedAndClose(S sender, int code, String message) {
+ // 发送消息
+ sender.sendClosed(code, message);
+ // 关闭 sender
+ sender.close();
+ }
+
+}
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/GuacdInstructionHandler.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/GuacdInstructionHandler.java
new file mode 100644
index 00000000..a46472f9
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/GuacdInstructionHandler.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.handler;
+
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.model.request.GuacdInstructionRequest;
+import org.dromara.visor.module.terminal.handler.terminal.sender.IGuacdTerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.session.IRdpSession;
+import org.dromara.visor.module.terminal.handler.terminal.session.ITerminalSession;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * guacd 指令处理器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/2/19 11:13
+ */
+@Slf4j
+@Component
+public class GuacdInstructionHandler extends AbstractTerminalHandler {
+
+ @Override
+ public void handle(TerminalChannelProps props, IGuacdTerminalSender sender, GuacdInstructionRequest payload) {
+ // 获取会话
+ ITerminalSession session = terminalManager.getSession(props.getId());
+ if (session instanceof IRdpSession) {
+ // 处理 rdp 指令
+ this.processRdpInstruction((IRdpSession) session, payload.getInstruction());
+ }
+ }
+
+ /**
+ * 处理 rdp 指令
+ *
+ * @param session session
+ * @param instruction instruction
+ */
+ private void processRdpInstruction(IRdpSession session, String instruction) {
+ session.write(instruction);
+ }
+
+}
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/ITerminalHandler.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/ITerminalHandler.java
new file mode 100644
index 00000000..038d1fff
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/ITerminalHandler.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.handler;
+
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ITerminalSender;
+
+/**
+ * 终端消息处理器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/12/29 18:53
+ */
+public interface ITerminalHandler {
+
+ /**
+ * 处理消息
+ *
+ * @param props props
+ * @param sender sender
+ * @param payload payload
+ */
+ void handle(TerminalChannelProps props, S sender, T payload);
+
+}
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/SftpChangeGroupHandler.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/SftpChangeGroupHandler.java
new file mode 100644
index 00000000..1e593abc
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpChangeGroupHandler.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+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.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.SftpChangeGroupRequest;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ISftpTerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.session.ISftpSession;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * sftp 修改分组权限 处理器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/2/19 11:13
+ */
+@Slf4j
+@Component
+public class SftpChangeGroupHandler extends AbstractTerminalHandler {
+
+ @Override
+ public void handle(TerminalChannelProps props, ISftpTerminalSender sender, SftpChangeGroupRequest payload) {
+ long startTime = System.currentTimeMillis();
+ // 获取会话
+ String sessionId = props.getId();
+ ISftpSession session = terminalManager.getSession(sessionId);
+ String path = payload.getPath();
+ Integer gid = payload.getGid();
+ log.info("SftpChangeGroupHandler-handle start sessionId: {}, path: {}, gid: {}", sessionId, path, gid);
+ Exception ex = null;
+ // 修改权限
+ try {
+ session.changeGroup(path, gid);
+ log.info("SftpChangeGroupHandler-handle success sessionId: {}, path: {}, gid: {}", sessionId, path, gid);
+ } catch (Exception e) {
+ log.error("SftpChangeGroupHandler-handle error sessionId: {}", sessionId, e);
+ ex = e;
+ }
+ // 返回结果
+ sender.sendChangeGroupResult(ex == null, this.getErrorMessage(ex));
+ // 保存操作日志
+ Map extra = Maps.newMap();
+ extra.put(OperatorLogs.PATH, path);
+ extra.put(OperatorLogs.ID, gid);
+ this.saveOperatorLog(props,
+ extra, TerminalOperatorType.SFTP_CHGRP,
+ startTime, ex);
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpChangeModeHandler.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/SftpChangeModeHandler.java
similarity index 61%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpChangeModeHandler.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpChangeModeHandler.java
index 38368aba..41370fdf 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpChangeModeHandler.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/SftpChangeModeHandler.java
@@ -20,24 +20,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.handler;
+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.enums.BooleanBit;
import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs;
-import org.dromara.visor.module.asset.define.operator.TerminalOperatorType;
-import org.dromara.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
-import org.dromara.visor.module.asset.handler.host.terminal.model.request.SftpChangeModeRequest;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SftpBaseResponse;
-import org.dromara.visor.module.asset.handler.host.terminal.session.ISftpSession;
+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.SftpChangeModeRequest;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ISftpTerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.session.ISftpSession;
import org.springframework.stereotype.Component;
-import org.springframework.web.socket.WebSocketSession;
import java.util.Map;
/**
- * sftp 修改文件权限
+ * sftp 修改文件权限 处理器
*
* @author Jiahang Li
* @version 1.0.0
@@ -45,39 +43,33 @@ import java.util.Map;
*/
@Slf4j
@Component
-public class SftpChangeModeHandler extends AbstractTerminalHandler {
+public class SftpChangeModeHandler extends AbstractTerminalHandler {
@Override
- public void handle(WebSocketSession channel, SftpChangeModeRequest payload) {
+ public void handle(TerminalChannelProps props, ISftpTerminalSender sender, SftpChangeModeRequest payload) {
long startTime = System.currentTimeMillis();
// 获取会话
- String sessionId = payload.getSessionId();
- ISftpSession session = terminalManager.getSession(channel.getId(), sessionId);
+ String sessionId = props.getId();
+ ISftpSession session = terminalManager.getSession(sessionId);
String path = payload.getPath();
Integer mod = payload.getMod();
log.info("SftpChangeModeHandler-handle start sessionId: {}, path: {}, mod: {}", sessionId, path, mod);
Exception ex = null;
// 修改权限
try {
- session.chmod(path, mod);
+ session.changeMode(path, mod);
log.info("SftpChangeModeHandler-handle success sessionId: {}, path: {}, mod: {}", sessionId, path, mod);
} catch (Exception e) {
log.error("SftpChangeModeHandler-handle error sessionId: {}", sessionId, e);
ex = e;
}
- // 返回
- this.send(channel,
- OutputTypeEnum.SFTP_CHMOD,
- SftpBaseResponse.builder()
- .sessionId(sessionId)
- .result(BooleanBit.of(ex == null).getValue())
- .msg(this.getErrorMessage(ex))
- .build());
+ // 返回结果
+ sender.sendChangeModeResult(ex == null, this.getErrorMessage(ex));
// 保存操作日志
Map extra = Maps.newMap();
extra.put(OperatorLogs.PATH, path);
extra.put(OperatorLogs.MOD, mod);
- this.saveOperatorLog(payload, channel,
+ this.saveOperatorLog(props,
extra, TerminalOperatorType.SFTP_CHMOD,
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/SftpChangeOwnerHandler.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/SftpChangeOwnerHandler.java
new file mode 100644
index 00000000..6501a366
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpChangeOwnerHandler.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+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.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.SftpChangeOwnerRequest;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ISftpTerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.session.ISftpSession;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * sftp 修改文件归属 处理器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/2/19 11:13
+ */
+@Slf4j
+@Component
+public class SftpChangeOwnerHandler extends AbstractTerminalHandler {
+
+ @Override
+ public void handle(TerminalChannelProps props, ISftpTerminalSender sender, SftpChangeOwnerRequest payload) {
+ long startTime = System.currentTimeMillis();
+ // 获取会话
+ String sessionId = props.getId();
+ ISftpSession session = terminalManager.getSession(sessionId);
+ String path = payload.getPath();
+ Integer uid = payload.getUid();
+ log.info("SftpChangeOwnerHandler-handle start sessionId: {}, path: {}, uid: {}", sessionId, path, uid);
+ Exception ex = null;
+ // 修改归属
+ try {
+ session.changeOwner(path, uid);
+ log.info("SftpChangeOwnerHandler-handle success sessionId: {}, path: {}, uid: {}", sessionId, path, uid);
+ } catch (Exception e) {
+ log.error("SftpChangeOwnerHandler-handle error sessionId: {},", sessionId, e);
+ ex = e;
+ }
+ // 返回结果
+ sender.sendChangeOwnerResult(ex == null, this.getErrorMessage(ex));
+ // 保存操作日志
+ Map extra = Maps.newMap();
+ extra.put(OperatorLogs.PATH, path);
+ extra.put(OperatorLogs.ID, uid);
+ this.saveOperatorLog(props,
+ extra, TerminalOperatorType.SFTP_CHOWN,
+ startTime, ex);
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/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
similarity index 55%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpDownloadFlatDirectoryHandler.java
rename to 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 5ac61934..a0890570 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/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
@@ -20,25 +20,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.handler;
+package org.dromara.visor.module.terminal.handler.terminal.handler;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.model.request.SftpDownloadFlatDirectoryRequest;
+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 cn.orionsec.kit.lang.utils.collect.Lists;
-import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.common.enums.BooleanBit;
-import org.dromara.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
-import org.dromara.visor.module.asset.handler.host.terminal.model.request.SftpDownloadFlatDirectoryRequest;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SftpDownloadFlatDirectoryResponse;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SftpFileVO;
-import org.dromara.visor.module.asset.handler.host.terminal.session.ISftpSession;
import org.springframework.stereotype.Component;
-import org.springframework.web.socket.WebSocketSession;
import java.util.Arrays;
import java.util.List;
/**
- * sftp 下载文件夹展开文件
+ * sftp 下载文件夹展开文件 处理器
*
* @author Jiahang Li
* @version 1.0.0
@@ -46,13 +43,13 @@ import java.util.List;
*/
@Slf4j
@Component
-public class SftpDownloadFlatDirectoryHandler extends AbstractTerminalHandler {
+public class SftpDownloadFlatDirectoryHandler extends AbstractTerminalHandler {
@Override
- public void handle(WebSocketSession channel, SftpDownloadFlatDirectoryRequest payload) {
+ public void handle(TerminalChannelProps props, ISftpTerminalSender sender, SftpDownloadFlatDirectoryRequest payload) {
// 获取会话
- String sessionId = payload.getSessionId();
- ISftpSession session = terminalManager.getSession(channel.getId(), sessionId);
+ String sessionId = props.getId();
+ ISftpSession session = terminalManager.getSession(props.getId());
String[] paths = payload.getPath().split("\\|");
log.info("SftpDownloadFlatDirectoryHandler-handle start sessionId: {}, paths: {}", sessionId, Arrays.toString(paths));
Exception ex = null;
@@ -65,16 +62,8 @@ public class SftpDownloadFlatDirectoryHandler extends AbstractTerminalHandler {
+public class SftpGetContentHandler extends AbstractTerminalHandler {
@Override
- public void handle(WebSocketSession channel, SftpBaseRequest payload) {
+ public void handle(TerminalChannelProps props, ISftpTerminalSender sender, SftpBaseRequest payload) {
+ long startTime = System.currentTimeMillis();
// 获取会话
- String sessionId = payload.getSessionId();
- ISftpSession session = terminalManager.getSession(channel.getId(), sessionId);
+ String sessionId = props.getId();
+ ISftpSession session = terminalManager.getSession(sessionId);
String path = payload.getPath();
log.info("SftpGetContentHandler-handle start sessionId: {}, path: {}", sessionId, path);
String token = UUIds.random32();
Exception ex = null;
try {
- // 检查文件是否可编辑
- session.checkCanEdit(path);
+ // 检查文件编辑权限
+ session.checkEditPermission(path);
// 设置缓存
String key = TerminalCacheKeyDefine.TERMINAL_SFTP_GET_CONTENT.format(token);
SftpGetContentCacheDTO cache = SftpGetContentCacheDTO.builder()
@@ -70,15 +74,14 @@ public class SftpGetContentHandler extends AbstractTerminalHandler extra = Maps.newMap();
+ extra.put(OperatorLogs.PATH, path);
+ this.saveOperatorLog(props,
+ extra, TerminalOperatorType.SFTP_GET_CONTENT,
+ startTime, ex);
}
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpListHandler.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/SftpListHandler.java
similarity index 59%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpListHandler.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpListHandler.java
index db2fa591..06a3aa15 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpListHandler.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/SftpListHandler.java
@@ -20,24 +20,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.handler;
+package org.dromara.visor.module.terminal.handler.terminal.handler;
import cn.orionsec.kit.lang.utils.collect.Lists;
-import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.dromara.visor.common.enums.BooleanBit;
-import org.dromara.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
-import org.dromara.visor.module.asset.handler.host.terminal.model.request.SftpListRequest;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SftpFileVO;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SftpListResponse;
-import org.dromara.visor.module.asset.handler.host.terminal.session.ISftpSession;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.model.request.SftpListRequest;
+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.springframework.stereotype.Component;
-import org.springframework.web.socket.WebSocketSession;
import java.util.List;
/**
- * sftp 文件列表
+ * sftp 文件列表 处理器
*
* @author Jiahang Li
* @version 1.0.0
@@ -45,15 +43,15 @@ import java.util.List;
*/
@Slf4j
@Component
-public class SftpListHandler extends AbstractTerminalHandler {
+public class SftpListHandler extends AbstractTerminalHandler {
private static final String HOME_PATH = "~";
@Override
- public void handle(WebSocketSession channel, SftpListRequest payload) {
+ public void handle(TerminalChannelProps props, ISftpTerminalSender sender, SftpListRequest payload) {
// 获取会话
- String sessionId = payload.getSessionId();
- ISftpSession session = terminalManager.getSession(channel.getId(), sessionId);
+ String sessionId = props.getId();
+ ISftpSession session = terminalManager.getSession(sessionId);
String path = payload.getPath();
log.info("SftpListHandler-handle start sessionId: {}, path: {}", sessionId, path);
Exception ex = null;
@@ -70,15 +68,8 @@ public class SftpListHandler extends AbstractTerminalHandler {
log.error("SftpListHandler-handle error sessionId: {}", sessionId, e);
ex = e;
}
- // 返回
- this.send(channel,
- OutputTypeEnum.SFTP_LIST,
- SftpListResponse.builder()
- .sessionId(sessionId)
- .result(BooleanBit.of(ex == null).getValue())
- .path(path)
- .body(JSON.toJSONString(list))
- .build());
+ // 返回结果
+ sender.sendFileList(path, ex == null, this.getErrorMessage(ex), list);
}
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpMakeDirectoryHandler.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/SftpMakeDirectoryHandler.java
similarity index 61%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpMakeDirectoryHandler.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpMakeDirectoryHandler.java
index ccb655bb..1312577f 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpMakeDirectoryHandler.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/SftpMakeDirectoryHandler.java
@@ -20,24 +20,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.handler;
+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.enums.BooleanBit;
import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs;
-import org.dromara.visor.module.asset.define.operator.TerminalOperatorType;
-import org.dromara.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
-import org.dromara.visor.module.asset.handler.host.terminal.model.request.SftpBaseRequest;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SftpBaseResponse;
-import org.dromara.visor.module.asset.handler.host.terminal.session.ISftpSession;
+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.springframework.stereotype.Component;
-import org.springframework.web.socket.WebSocketSession;
import java.util.Map;
/**
- * sftp 创建文件夹
+ * sftp 创建文件夹 处理器
*
* @author Jiahang Li
* @version 1.0.0
@@ -45,14 +43,14 @@ import java.util.Map;
*/
@Slf4j
@Component
-public class SftpMakeDirectoryHandler extends AbstractTerminalHandler {
+public class SftpMakeDirectoryHandler extends AbstractTerminalHandler {
@Override
- public void handle(WebSocketSession channel, SftpBaseRequest payload) {
+ public void handle(TerminalChannelProps props, ISftpTerminalSender sender, SftpBaseRequest payload) {
long startTime = System.currentTimeMillis();
// 获取会话
- String sessionId = payload.getSessionId();
- ISftpSession session = terminalManager.getSession(channel.getId(), sessionId);
+ String sessionId = props.getId();
+ ISftpSession session = terminalManager.getSession(sessionId);
String path = payload.getPath();
log.info("SftpMakeDirectoryHandler-handle start sessionId: {}, path: {}", sessionId, path);
Exception ex = null;
@@ -64,18 +62,12 @@ public class SftpMakeDirectoryHandler extends AbstractTerminalHandler extra = Maps.newMap();
extra.put(OperatorLogs.PATH, path);
- this.saveOperatorLog(payload, channel,
+ this.saveOperatorLog(props,
extra, TerminalOperatorType.SFTP_MKDIR,
startTime, ex);
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpMoveHandler.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/SftpMoveHandler.java
similarity index 61%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpMoveHandler.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpMoveHandler.java
index f9df119f..70a1c28d 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpMoveHandler.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/SftpMoveHandler.java
@@ -20,24 +20,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.handler;
+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.enums.BooleanBit;
import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs;
-import org.dromara.visor.module.asset.define.operator.TerminalOperatorType;
-import org.dromara.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
-import org.dromara.visor.module.asset.handler.host.terminal.model.request.SftpMoveRequest;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SftpBaseResponse;
-import org.dromara.visor.module.asset.handler.host.terminal.session.ISftpSession;
+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.SftpMoveRequest;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ISftpTerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.session.ISftpSession;
import org.springframework.stereotype.Component;
-import org.springframework.web.socket.WebSocketSession;
import java.util.Map;
/**
- * sftp 移动文件
+ * sftp 移动文件 处理器
*
* @author Jiahang Li
* @version 1.0.0
@@ -45,14 +43,14 @@ import java.util.Map;
*/
@Slf4j
@Component
-public class SftpMoveHandler extends AbstractTerminalHandler {
+public class SftpMoveHandler extends AbstractTerminalHandler {
@Override
- public void handle(WebSocketSession channel, SftpMoveRequest payload) {
+ public void handle(TerminalChannelProps props, ISftpTerminalSender sender, SftpMoveRequest payload) {
long startTime = System.currentTimeMillis();
// 获取会话
- String sessionId = payload.getSessionId();
- ISftpSession session = terminalManager.getSession(channel.getId(), sessionId);
+ String sessionId = props.getId();
+ ISftpSession session = terminalManager.getSession(sessionId);
String path = payload.getPath();
String target = payload.getTarget();
log.info("SftpMoveHandler-handle start sessionId: {}, path: {}, target: {}", sessionId, path, target);
@@ -65,19 +63,13 @@ public class SftpMoveHandler extends AbstractTerminalHandler {
log.error("SftpMoveHandler-handle error sessionId: {}", sessionId, e);
ex = e;
}
- // 返回
- this.send(channel,
- OutputTypeEnum.SFTP_MOVE,
- SftpBaseResponse.builder()
- .sessionId(sessionId)
- .result(BooleanBit.of(ex == null).getValue())
- .msg(this.getErrorMessage(ex))
- .build());
+ // 返回结果
+ sender.sendMoveResult(ex == null, this.getErrorMessage(ex));
// 保存操作日志
Map extra = Maps.newMap();
extra.put(OperatorLogs.PATH, path);
extra.put(OperatorLogs.TARGET, target);
- this.saveOperatorLog(payload, channel,
+ this.saveOperatorLog(props,
extra, TerminalOperatorType.SFTP_MOVE,
startTime, ex);
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/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
similarity index 60%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpRemoveHandler.java
rename to 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 9522e542..81693ce7 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/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
@@ -20,25 +20,23 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.handler;
+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.enums.BooleanBit;
import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs;
-import org.dromara.visor.module.asset.define.operator.TerminalOperatorType;
-import org.dromara.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
-import org.dromara.visor.module.asset.handler.host.terminal.model.request.SftpBaseRequest;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SftpBaseResponse;
-import org.dromara.visor.module.asset.handler.host.terminal.session.ISftpSession;
+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.springframework.stereotype.Component;
-import org.springframework.web.socket.WebSocketSession;
import java.util.Arrays;
import java.util.Map;
/**
- * sftp 删除文件
+ * sftp 删除文件 处理器
*
* @author Jiahang Li
* @version 1.0.0
@@ -46,15 +44,15 @@ import java.util.Map;
*/
@Slf4j
@Component
-public class SftpRemoveHandler extends AbstractTerminalHandler {
+public class SftpRemoveHandler extends AbstractTerminalHandler {
@Override
- public void handle(WebSocketSession channel, SftpBaseRequest payload) {
+ public void handle(TerminalChannelProps props, ISftpTerminalSender sender, SftpBaseRequest payload) {
long startTime = System.currentTimeMillis();
String path = payload.getPath();
- String sessionId = payload.getSessionId();
+ String sessionId = props.getId();
// 获取会话
- ISftpSession session = terminalManager.getSession(channel.getId(), sessionId);
+ ISftpSession session = terminalManager.getSession(sessionId);
String[] paths = path.split("\\|");
log.info("SftpRemoveHandler-handle start sessionId: {}, path: {}", sessionId, Arrays.toString(paths));
Exception ex = null;
@@ -66,18 +64,12 @@ public class SftpRemoveHandler extends AbstractTerminalHandler
log.error("SftpRemoveHandler-handle error sessionId: {}", sessionId, e);
ex = e;
}
- // 返回
- this.send(channel,
- OutputTypeEnum.SFTP_REMOVE,
- SftpBaseResponse.builder()
- .sessionId(sessionId)
- .result(BooleanBit.of(ex == null).getValue())
- .msg(this.getErrorMessage(ex))
- .build());
+ // 返回结果
+ sender.sendRemoveResult(ex == null, this.getErrorMessage(ex));
// 保存操作日志
Map extra = Maps.newMap();
extra.put(OperatorLogs.PATH, path);
- this.saveOperatorLog(payload, channel,
+ this.saveOperatorLog(props,
extra, TerminalOperatorType.SFTP_REMOVE,
startTime, ex);
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpSetContentHandler.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/SftpSetContentHandler.java
similarity index 61%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpSetContentHandler.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpSetContentHandler.java
index d9ef13f9..59c356de 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpSetContentHandler.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/SftpSetContentHandler.java
@@ -20,28 +20,26 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.handler;
+package org.dromara.visor.module.terminal.handler.terminal.handler;
import cn.orionsec.kit.lang.id.UUIds;
import cn.orionsec.kit.lang.utils.collect.Maps;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.common.enums.BooleanBit;
import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs;
import org.dromara.visor.framework.redis.core.utils.RedisStrings;
-import org.dromara.visor.module.asset.define.cache.TerminalCacheKeyDefine;
-import org.dromara.visor.module.asset.define.operator.TerminalOperatorType;
-import org.dromara.visor.module.asset.entity.dto.SftpSetContentCacheDTO;
-import org.dromara.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
-import org.dromara.visor.module.asset.handler.host.terminal.model.request.SftpBaseRequest;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SftpSetContentResponse;
-import org.dromara.visor.module.asset.handler.host.terminal.session.ISftpSession;
+import org.dromara.visor.module.terminal.define.cache.TerminalCacheKeyDefine;
+import org.dromara.visor.module.terminal.define.operator.TerminalOperatorType;
+import org.dromara.visor.module.terminal.entity.dto.SftpSetContentCacheDTO;
+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.springframework.stereotype.Component;
-import org.springframework.web.socket.WebSocketSession;
import java.util.Map;
/**
- * sftp 设置文件内容
+ * sftp 设置文件内容 处理器
*
* @author Jiahang Li
* @version 1.0.0
@@ -49,21 +47,21 @@ import java.util.Map;
*/
@Slf4j
@Component
-public class SftpSetContentHandler extends AbstractTerminalHandler {
+public class SftpSetContentHandler extends AbstractTerminalHandler {
@Override
- public void handle(WebSocketSession channel, SftpBaseRequest payload) {
+ public void handle(TerminalChannelProps props, ISftpTerminalSender sender, SftpBaseRequest payload) {
long startTime = System.currentTimeMillis();
+ String sessionId = props.getId();
// 获取会话
- String sessionId = payload.getSessionId();
- ISftpSession session = terminalManager.getSession(channel.getId(), sessionId);
+ ISftpSession session = terminalManager.getSession(sessionId);
String path = payload.getPath();
log.info("SftpSetContentHandler-handle start sessionId: {}, path: {}", sessionId, path);
String token = UUIds.random32();
Exception ex = null;
try {
- // 检查文件是否可编辑
- session.checkCanEdit(path);
+ // 检查文件编辑权限
+ session.checkEditPermission(path);
// 设置缓存
String key = TerminalCacheKeyDefine.TERMINAL_SFTP_SET_CONTENT.format(token);
SftpSetContentCacheDTO cache = SftpSetContentCacheDTO.builder()
@@ -76,19 +74,12 @@ public class SftpSetContentHandler extends AbstractTerminalHandler extra = Maps.newMap();
extra.put(OperatorLogs.PATH, path);
- this.saveOperatorLog(payload, channel,
+ this.saveOperatorLog(props,
extra, TerminalOperatorType.SFTP_SET_CONTENT,
startTime, ex);
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpTouchHandler.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/SftpTouchHandler.java
similarity index 59%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpTouchHandler.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpTouchHandler.java
index eb8e1de9..bcb224a4 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpTouchHandler.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/SftpTouchHandler.java
@@ -20,24 +20,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.handler;
+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.enums.BooleanBit;
import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs;
-import org.dromara.visor.module.asset.define.operator.TerminalOperatorType;
-import org.dromara.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
-import org.dromara.visor.module.asset.handler.host.terminal.model.request.SftpBaseRequest;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SftpBaseResponse;
-import org.dromara.visor.module.asset.handler.host.terminal.session.ISftpSession;
+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.springframework.stereotype.Component;
-import org.springframework.web.socket.WebSocketSession;
import java.util.Map;
/**
- * sftp 创建文件
+ * sftp 创建文件 处理器
*
* @author Jiahang Li
* @version 1.0.0
@@ -45,14 +43,14 @@ import java.util.Map;
*/
@Slf4j
@Component
-public class SftpTouchHandler extends AbstractTerminalHandler {
+public class SftpTouchHandler extends AbstractTerminalHandler {
@Override
- public void handle(WebSocketSession channel, SftpBaseRequest payload) {
+ public void handle(TerminalChannelProps props, ISftpTerminalSender sender, SftpBaseRequest payload) {
long startTime = System.currentTimeMillis();
// 获取会话
- String sessionId = payload.getSessionId();
- ISftpSession session = terminalManager.getSession(channel.getId(), sessionId);
+ String sessionId = props.getId();
+ ISftpSession session = terminalManager.getSession(sessionId);
String path = payload.getPath();
log.info("SftpTouchHandler-handle start sessionId: {}, path: {}", sessionId, path);
Exception ex = null;
@@ -64,18 +62,12 @@ public class SftpTouchHandler extends AbstractTerminalHandler {
log.error("SftpTouchHandler-handle error sessionId: {}", sessionId, e);
ex = e;
}
- // 返回
- this.send(channel,
- OutputTypeEnum.SFTP_TOUCH,
- SftpBaseResponse.builder()
- .sessionId(sessionId)
- .result(BooleanBit.of(ex == null).getValue())
- .msg(this.getErrorMessage(ex))
- .build());
+ // 返回结果
+ sender.sendTouchResult(ex == null, this.getErrorMessage(ex));
// 保存操作日志
Map extra = Maps.newMap();
extra.put(OperatorLogs.PATH, path);
- this.saveOperatorLog(payload, channel,
+ this.saveOperatorLog(props,
extra, TerminalOperatorType.SFTP_TOUCH,
startTime, ex);
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpTruncateHandler.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/SftpTruncateHandler.java
similarity index 61%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpTruncateHandler.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SftpTruncateHandler.java
index fb3c86ae..3cdcce7e 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SftpTruncateHandler.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/SftpTruncateHandler.java
@@ -20,24 +20,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.handler;
+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.enums.BooleanBit;
import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs;
-import org.dromara.visor.module.asset.define.operator.TerminalOperatorType;
-import org.dromara.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
-import org.dromara.visor.module.asset.handler.host.terminal.model.request.SftpBaseRequest;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SftpBaseResponse;
-import org.dromara.visor.module.asset.handler.host.terminal.session.ISftpSession;
+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.springframework.stereotype.Component;
-import org.springframework.web.socket.WebSocketSession;
import java.util.Map;
/**
- * sftp 截断文件
+ * sftp 截断文件 处理器
*
* @author Jiahang Li
* @version 1.0.0
@@ -45,14 +43,14 @@ import java.util.Map;
*/
@Slf4j
@Component
-public class SftpTruncateHandler extends AbstractTerminalHandler {
+public class SftpTruncateHandler extends AbstractTerminalHandler {
@Override
- public void handle(WebSocketSession channel, SftpBaseRequest payload) {
+ public void handle(TerminalChannelProps props, ISftpTerminalSender sender, SftpBaseRequest payload) {
long startTime = System.currentTimeMillis();
// 获取会话
- String sessionId = payload.getSessionId();
- ISftpSession session = terminalManager.getSession(channel.getId(), sessionId);
+ String sessionId = props.getId();
+ ISftpSession session = terminalManager.getSession(sessionId);
String path = payload.getPath();
log.info("SftpTruncateHandler-handle start sessionId: {}, path: {}", sessionId, path);
Exception ex = null;
@@ -64,18 +62,12 @@ public class SftpTruncateHandler extends AbstractTerminalHandler extra = Maps.newMap();
extra.put(OperatorLogs.PATH, path);
- this.saveOperatorLog(payload, channel,
+ this.saveOperatorLog(props,
extra, TerminalOperatorType.SFTP_TRUNCATE,
startTime, ex);
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SshInputHandler.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/SshInputHandler.java
similarity index 60%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SshInputHandler.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/SshInputHandler.java
index ee87359b..2a0b9dd5 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SshInputHandler.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/SshInputHandler.java
@@ -20,16 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.handler;
+package org.dromara.visor.module.terminal.handler.terminal.handler;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.module.asset.handler.host.terminal.model.request.SshInputRequest;
-import org.dromara.visor.module.asset.handler.host.terminal.session.ISshSession;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.model.request.SshInputRequest;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ISshTerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.session.ISshSession;
import org.springframework.stereotype.Component;
-import org.springframework.web.socket.WebSocketSession;
/**
- * ssh 处理输入处理器
+ * ssh 处理输入 处理器
*
* @author Jiahang Li
* @version 1.0.0
@@ -37,12 +38,12 @@ import org.springframework.web.socket.WebSocketSession;
*/
@Slf4j
@Component
-public class SshInputHandler extends AbstractTerminalHandler {
+public class SshInputHandler extends AbstractTerminalHandler {
@Override
- public void handle(WebSocketSession channel, SshInputRequest payload) {
+ public void handle(TerminalChannelProps props, ISshTerminalSender sender, SshInputRequest payload) {
// 获取会话
- ISshSession session = terminalManager.getSession(channel.getId(), payload.getSessionId());
+ ISshSession session = terminalManager.getSession(props.getId());
// 处理输入
session.write(payload.getCommand());
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/TerminalCloseHandler.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/TerminalCloseHandler.java
similarity index 57%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/TerminalCloseHandler.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/TerminalCloseHandler.java
index 92555bf6..7427ee2e 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/TerminalCloseHandler.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/TerminalCloseHandler.java
@@ -20,15 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.handler;
+package org.dromara.visor.module.terminal.handler.terminal.handler;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ITerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.session.ITerminalSession;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
import org.springframework.stereotype.Component;
-import org.springframework.web.socket.WebSocketSession;
/**
- * 关闭处理器
+ * 关闭 处理器
*
* @author Jiahang Li
* @version 1.0.0
@@ -36,13 +38,19 @@ import org.springframework.web.socket.WebSocketSession;
*/
@Slf4j
@Component
-public class TerminalCloseHandler extends AbstractTerminalHandler {
+public class TerminalCloseHandler extends AbstractTerminalHandler {
@Override
- public void handle(WebSocketSession channel, TerminalBasePayload payload) {
- log.info("TerminalCloseHandler-handle start sessionId: {}", payload.getSessionId());
+ public void handle(TerminalChannelProps props, ITerminalSender sender, TerminalBasePayload payload) {
+ String sessionId = props.getId();
+ log.info("TerminalCloseHandler-handle start sessionId: {}", sessionId);
+ // 获取会话
+ ITerminalSession session = terminalManager.getSession(sessionId);
+ if (session == null) {
+ return;
+ }
// 关闭会话
- terminalManager.closeSession(channel.getId(), payload.getSessionId());
+ terminalManager.closeSession(sessionId);
}
}
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
new file mode 100644
index 00000000..d2aab8b7
--- /dev/null
+++ 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
@@ -0,0 +1,379 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.handler;
+
+import cn.orionsec.kit.lang.exception.DisabledException;
+import cn.orionsec.kit.lang.exception.argument.InvalidArgumentException;
+import cn.orionsec.kit.lang.utils.Exceptions;
+import cn.orionsec.kit.lang.utils.collect.Maps;
+import cn.orionsec.kit.lang.utils.io.Streams;
+import cn.orionsec.kit.net.host.SessionStore;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.visor.common.constant.ErrorMessage;
+import org.dromara.visor.common.constant.ExtraFieldConst;
+import org.dromara.visor.common.session.config.BaseConnectConfig;
+import org.dromara.visor.common.session.config.RdpConnectConfig;
+import org.dromara.visor.common.session.config.SshConnectConfig;
+import org.dromara.visor.common.session.ssh.SessionStores;
+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.module.asset.api.HostApi;
+import org.dromara.visor.module.asset.api.HostConnectApi;
+import org.dromara.visor.module.asset.entity.dto.host.HostDTO;
+import org.dromara.visor.module.common.config.GuacdConfig;
+import org.dromara.visor.module.terminal.convert.TerminalSessionConvert;
+import org.dromara.visor.module.terminal.define.operator.TerminalOperatorType;
+import org.dromara.visor.module.terminal.entity.domain.TerminalConnectLogDO;
+import org.dromara.visor.module.terminal.entity.request.terminal.TerminalConnectLogCreateRequest;
+import org.dromara.visor.module.terminal.enums.TerminalConnectStatusEnum;
+import org.dromara.visor.module.terminal.enums.TerminalConnectTypeEnum;
+import org.dromara.visor.module.terminal.handler.terminal.constant.SessionCloseCode;
+import org.dromara.visor.module.terminal.handler.terminal.constant.TerminalMessage;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelExtra;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.model.config.ITerminalSessionConfig;
+import org.dromara.visor.module.terminal.handler.terminal.model.config.TerminalSessionRdpConfig;
+import org.dromara.visor.module.terminal.handler.terminal.model.config.TerminalSessionSftpConfig;
+import org.dromara.visor.module.terminal.handler.terminal.model.config.TerminalSessionSshConfig;
+import org.dromara.visor.module.terminal.handler.terminal.model.request.TerminalConnectRequest;
+import org.dromara.visor.module.terminal.handler.terminal.model.transport.TerminalConnectBody;
+import org.dromara.visor.module.terminal.handler.terminal.model.transport.TerminalSetInfo;
+import org.dromara.visor.module.terminal.handler.terminal.sender.IGuacdTerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ISftpTerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ISshTerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ITerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.session.ITerminalSession;
+import org.dromara.visor.module.terminal.handler.terminal.session.RdpSession;
+import org.dromara.visor.module.terminal.handler.terminal.session.SftpSession;
+import org.dromara.visor.module.terminal.handler.terminal.session.SshSession;
+import org.dromara.visor.module.terminal.service.TerminalConnectLogService;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 连接终端 处理器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/12/29 15:32
+ */
+@Slf4j
+@Component
+public class TerminalConnectHandler extends AbstractTerminalHandler {
+
+ @Resource
+ private GuacdConfig guacdConfig;
+
+ @Resource
+ private HostApi hostApi;
+
+ @Resource
+ private HostConnectApi hostConnectApi;
+
+ @Resource
+ private TerminalConnectLogService terminalConnectLogService;
+
+ @Override
+ public void handle(TerminalChannelProps props, ITerminalSender sender, TerminalConnectRequest payload) {
+ String sessionId = props.getId();
+ Long userId = props.getUserId();
+ Long hostId = props.getHostId();
+ long startTime = System.currentTimeMillis();
+ String connectType = props.getExtra().getConnectType();
+ log.info("TerminalConnectHandler-handle start userId: {}, hostId: {}, sessionId: {}", userId, hostId, sessionId);
+ // 检查会话是否存在
+ if (this.checkSessionPresent(sender, sessionId)) {
+ return;
+ }
+ // 查询终端信息
+ HostDTO host = this.getConnectHost(sender, hostId, sessionId);
+ if (host == null) {
+ return;
+ }
+ // 记录终端日志
+ TerminalConnectLogDO connectLog = this.saveTerminalConnectLog(props, host, startTime, connectType);
+ Long logId = connectLog.getId();
+ // 连接会话
+ ITerminalSession session = null;
+ try {
+ // 获取连接配置
+ BaseConnectConfig connectConfig = this.getConnectConfig(connectType, props, host);
+ // 连接终端
+ session = this.connect(sessionId, connectLog, connectConfig, props, sender, JSON.parseObject(payload.getBody(), TerminalConnectBody.class));
+ // 添加会话到 manager
+ terminalManager.addSession(sessionId, session);
+ // 更新终端日志
+ this.updateTerminalConnectLog(logId, null, null);
+ // 发送设置信息
+ sender.sendSetInfo(TerminalSetInfo.builder()
+ .address(connectConfig.getHostAddress())
+ .port(connectConfig.getHostPort())
+ .username(connectConfig.getUsername())
+ .build()
+ .toJsonString());
+ // 发送已连接
+ sender.sendConnected();
+ } catch (Exception e) {
+ String errorMessage = this.getErrorMessage(e);
+ // 更新终端日志
+ this.updateTerminalConnectLog(logId, e, errorMessage);
+ if (session == null) {
+ // 发送关闭并且关闭
+ this.sendClosedAndClose(sender, errorMessage);
+ } else {
+ // 设置关闭状态
+ session.setCloseStatus(SessionCloseCode.NORMAL, errorMessage);
+ // 关闭会话 - 关闭时候会发送关闭
+ terminalManager.closeSession(sessionId);
+ // 关闭会话 - 兜底
+ Streams.close(session);
+ }
+ }
+ }
+
+ /**
+ * 检查 session 是否存在
+ *
+ * @param sender sender
+ * @param sessionId sessionId
+ * @return 是否存在
+ */
+ private boolean checkSessionPresent(ITerminalSender sender, String sessionId) {
+ // 检查 session 是否存在
+ ITerminalSession session = terminalManager.getSession(sessionId);
+ if (session != null) {
+ log.info("TerminalConnectHandler-handle present session sessionId: {}", sessionId);
+ // 关闭
+ this.sendClosedAndClose(sender, ErrorMessage.SESSION_PRESENT);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * 获取连接的主机
+ *
+ * @param sender sender
+ * @param hostId hostId
+ * @param sessionId sessionId
+ * @return host
+ */
+ private HostDTO getConnectHost(ITerminalSender sender, Long hostId, String sessionId) {
+ HostDTO host = hostApi.selectById(hostId);
+ if (host == null) {
+ log.info("TerminalConnectHandler-handle unknown host hostId: {}, sessionId: {}", hostId, sessionId);
+ // 关闭
+ this.sendClosedAndClose(sender, ErrorMessage.HOST_ABSENT);
+ return null;
+ }
+ return host;
+ }
+
+ /**
+ * 连接终端
+ *
+ * @param sessionId sessionId
+ * @param connectLog connectLog
+ * @param connectConfig connectConfig
+ * @param props props
+ * @param sender sender
+ * @param connectParams connectParams
+ * @return channel
+ */
+ private ITerminalSession connect(String sessionId,
+ TerminalConnectLogDO connectLog,
+ BaseConnectConfig connectConfig,
+ TerminalChannelProps props,
+ ITerminalSender sender,
+ TerminalConnectBody connectParams) {
+ TerminalChannelExtra extra = props.getExtra();
+ String connectType = extra.getConnectType();
+ try {
+ ITerminalSession session;
+ // 获取连接信息
+ if (TerminalConnectTypeEnum.SSH.name().equals(connectType) || (TerminalConnectTypeEnum.SFTP.name().equals(connectType))) {
+ // 建立连接
+ SshConnectConfig sshConnectConfig = (SshConnectConfig) connectConfig;
+ SessionStore sessionStore = SessionStores.openSessionStore(sshConnectConfig);
+ if (TerminalConnectTypeEnum.SSH.name().equals(connectType)) {
+ // 打开 ssh 会话
+ TerminalSessionSshConfig config = TerminalSessionConvert.MAPPER.toSsh(sshConnectConfig);
+ config.setTerminalType(extra.getTerminalType());
+ this.setBaseSessionConfig(config, connectLog, connectParams);
+ session = new SshSession(props, (ISshTerminalSender) sender, config, sessionStore);
+ } else {
+ // 打开 sftp 会话
+ TerminalSessionSftpConfig config = TerminalSessionConvert.MAPPER.toSftp(sshConnectConfig);
+ config.setFilePreviewSize(extra.getFilePreviewSize());
+ this.setBaseSessionConfig(config, connectLog, connectParams);
+ session = new SftpSession(props, (ISftpTerminalSender) sender, config, sessionStore);
+ }
+ } else if (TerminalConnectTypeEnum.RDP.name().equals(connectType)) {
+ // 打开 rdp 会话
+ TerminalSessionRdpConfig config = TerminalSessionConvert.MAPPER.toRdp((RdpConnectConfig) connectConfig);
+ config.setDpi(connectParams.getDpi());
+ this.setBaseSessionConfig(config, connectLog, connectParams);
+ session = new RdpSession(props, (IGuacdTerminalSender) sender, config, guacdConfig);
+ } else {
+ throw Exceptions.unsupported();
+ }
+ // 连接
+ session.connect();
+ log.info("TerminalConnectHandler-handle success sessionId: {}", sessionId);
+ return session;
+ } catch (Exception e) {
+ log.error("TerminalConnectHandler-handle error sessionId: {}", sessionId, e);
+ throw e;
+ }
+ }
+
+ /**
+ * 获取会话连接配置
+ *
+ * @param connectType connectType
+ * @param props props
+ * @param host host
+ * @return connect
+ */
+ @SuppressWarnings("unchecked")
+ private T getConnectConfig(String connectType,
+ TerminalChannelProps props,
+ HostDTO host) {
+ String sessionId = props.getId();
+ Long userId = props.getUserId();
+ Long hostId = host.getId();
+ try {
+ BaseConnectConfig connectConfig;
+ // 获取连接信息
+ if (TerminalConnectTypeEnum.SSH.name().equals(connectType)
+ || TerminalConnectTypeEnum.SFTP.name().equals(connectType)) {
+ // SSH/SFTP
+ connectConfig = hostConnectApi.getSshConnectConfig(host, userId);
+ } else if (TerminalConnectTypeEnum.RDP.name().equals(connectType)) {
+ // RDP
+ connectConfig = hostConnectApi.getRdpConnectConfig(host, userId);
+ } else {
+ throw Exceptions.unsupported();
+ }
+ log.info("TerminalConnectHandler-handle success userId: {}, hostId: {}, sessionId: {}, type: {}", userId, hostId, sessionId, connectType);
+ return (T) connectConfig;
+ } catch (InvalidArgumentException e) {
+ log.error("TerminalConnectHandler-handle start error userId: {}, hostId: {}, sessionId: {}, type: {}", userId, hostId, sessionId, connectType, e);
+ throw e;
+ } catch (DisabledException e) {
+ log.error("TerminalConnectHandler-handle disabled error userId: {}, hostId: {}, sessionId: {}, type: {}", userId, hostId, sessionId, connectType);
+ throw Exceptions.runtime(TerminalMessage.CONFIG_DISABLED);
+ } catch (Exception e) {
+ log.error("TerminalConnectHandler-handle exception userId: {}, hostId: {}, sessionId: {}, type: {}", userId, hostId, sessionId, connectType, e);
+ throw Exceptions.runtime(TerminalMessage.CONNECTION_FAILED);
+ }
+ }
+
+ /**
+ * 设置基本会话配置
+ *
+ * @param config config
+ * @param connectLog connectLog
+ * @param connectParams connectParams
+ */
+ private void setBaseSessionConfig(ITerminalSessionConfig config,
+ TerminalConnectLogDO connectLog,
+ TerminalConnectBody connectParams) {
+ config.setLogId(connectLog.getId());
+ config.setWidth(connectParams.getWidth());
+ config.setHeight(connectParams.getHeight());
+ }
+
+ /**
+ * 保存操作日志/终端日志
+ *
+ * @param props props
+ * @param host host
+ * @param startTime startTime
+ * @param connectType connectType
+ * @return connectLog
+ */
+ private TerminalConnectLogDO saveTerminalConnectLog(TerminalChannelProps props,
+ HostDTO host,
+ long startTime,
+ String connectType) {
+ String sessionId = props.getId();
+ Long hostId = host.getId();
+ String hostName = host.getName();
+ String username = props.getUsername();
+ // 额外参数
+ Map extra = Maps.newMap();
+ extra.put(OperatorLogs.HOST_ID, hostId);
+ extra.put(OperatorLogs.HOST_NAME, hostName);
+ extra.put(OperatorLogs.ADDRESS, host.getAddress());
+ extra.put(OperatorLogs.CONNECT_TYPE, connectType);
+ extra.put(OperatorLogs.CHANNEL, props.getChannel());
+ extra.put(OperatorLogs.SESSION_ID, sessionId);
+ // 记录操作日志
+ OperatorLogModel logModel = this.saveOperatorLog(props,
+ extra, TerminalOperatorType.CONNECT,
+ startTime, null);
+ // 记录连接日志
+ TerminalConnectLogCreateRequest connectLogRequest = TerminalConnectLogCreateRequest.builder()
+ .userId(props.getUserId())
+ .username(username)
+ .hostId(hostId)
+ .hostName(hostName)
+ .hostAddress(host.getAddress())
+ .status(TerminalConnectStatusEnum.CONNECTING.name())
+ .sessionId(sessionId)
+ .extra(extra)
+ .build();
+ // 填充其他信息
+ extra.put(OperatorLogs.TRACE_ID, logModel.getTraceId());
+ extra.put(OperatorLogs.ADDRESS, logModel.getAddress());
+ extra.put(OperatorLogs.LOCATION, logModel.getLocation());
+ extra.put(OperatorLogs.USER_AGENT, logModel.getUserAgent());
+ extra.put(OperatorLogs.ERROR_MESSAGE, logModel.getErrorMessage());
+ // 记录连接日志
+ return terminalConnectLogService.create(connectType, connectLogRequest);
+ }
+
+ /**
+ * 更新终端日志/事件
+ *
+ * @param logId logId
+ * @param ex ex
+ * @param errorMessage errorMessage
+ */
+ public void updateTerminalConnectLog(Long logId,
+ Exception ex,
+ String errorMessage) {
+ if (ex == null) {
+ return;
+ }
+ // 修改日志状态
+ Map extra = Maps.newMap(4);
+ extra.put(ExtraFieldConst.ERROR_MESSAGE, errorMessage);
+ terminalConnectLogService.updateStatusById(logId, TerminalConnectStatusEnum.FAILED, extra);
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/TerminalPingHandler.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/TerminalPingHandler.java
similarity index 56%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/TerminalPingHandler.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/TerminalPingHandler.java
index 2860f7f8..1d5ba295 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/TerminalPingHandler.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/TerminalPingHandler.java
@@ -20,17 +20,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.handler;
+package org.dromara.visor.module.terminal.handler.terminal.handler;
-import cn.orionsec.kit.lang.utils.collect.Maps;
+import org.dromara.visor.module.terminal.handler.terminal.enums.SessionTypeEnum;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ITerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.session.ITerminalSession;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
-import org.dromara.visor.module.asset.handler.host.terminal.session.ITerminalSession;
import org.springframework.stereotype.Component;
-import org.springframework.web.socket.WebSocketSession;
-
-import java.util.Map;
/**
* ping 处理器
@@ -41,19 +39,19 @@ import java.util.Map;
*/
@Slf4j
@Component
-public class TerminalPingHandler extends AbstractTerminalHandler {
+public class TerminalPingHandler extends AbstractTerminalHandler {
@Override
- public void handle(WebSocketSession channel, TerminalBasePayload payload) {
- // 发送 pong
- this.send(channel, OutputTypeEnum.PONG.getType());
- // 活跃 terminal
- Map sessions = terminalManager.getSession(channel.getId());
- if (!Maps.isEmpty(sessions)) {
- for (ITerminalSession session : sessions.values()) {
+ public void handle(TerminalChannelProps props, ITerminalSender sender, TerminalBasePayload payload) {
+ if (SessionTypeEnum.TERMINAL.name().equals(props.getType())) {
+ // 活跃 terminal
+ ITerminalSession session = terminalManager.getSession(props.getId());
+ if (session != null) {
session.keepAlive();
}
}
+ // 发送 pong
+ sender.sendPong();
}
}
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/TerminalResizeHandler.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/TerminalResizeHandler.java
new file mode 100644
index 00000000..9705b592
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/TerminalResizeHandler.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.handler;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.model.request.TerminalResizeRequest;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ITerminalSender;
+import org.dromara.visor.module.terminal.handler.terminal.session.IRdpSession;
+import org.dromara.visor.module.terminal.handler.terminal.session.ISshSession;
+import org.dromara.visor.module.terminal.handler.terminal.session.ITerminalSession;
+import org.springframework.stereotype.Component;
+
+/**
+ * 修改大小 处理器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/12/29 15:32
+ */
+@Slf4j
+@Component
+public class TerminalResizeHandler extends AbstractTerminalHandler {
+
+ @Override
+ public void handle(TerminalChannelProps props, ITerminalSender sender, TerminalResizeRequest payload) {
+ Integer width = payload.getWidth();
+ Integer height = payload.getHeight();
+ // 获取会话
+ ITerminalSession session = terminalManager.getSession(props.getId());
+ if (session instanceof ISshSession) {
+ // SSH
+ ((ISshSession) session).resize(width, height);
+ } else if (session instanceof IRdpSession) {
+ // RDP
+ ((IRdpSession) session).resize(width, height);
+ }
+ }
+
+}
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/manager/TerminalManager.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/manager/TerminalManager.java
new file mode 100644
index 00000000..a39dcac7
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/manager/TerminalManager.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.manager;
+
+import cn.orionsec.kit.lang.utils.io.Streams;
+import lombok.Getter;
+import org.dromara.visor.module.terminal.handler.terminal.session.ITerminalSession;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 终端管理器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/1/3 11:35
+ */
+@Getter
+@Component
+public class TerminalManager {
+
+ /**
+ * 会话映射
+ */
+ private final ConcurrentHashMap channelSessionMap = new ConcurrentHashMap<>();
+
+ /**
+ * 添加会话
+ *
+ * @param sessionId sessionId
+ * @param session session
+ */
+ public void addSession(String sessionId, ITerminalSession session) {
+ channelSessionMap.put(sessionId, session);
+ }
+
+ /**
+ * 通过 channel 关闭会话
+ *
+ * @param sessionId sessionId
+ */
+ public void closeSession(String sessionId) {
+ // 获取并移除
+ ITerminalSession session = channelSessionMap.remove(sessionId);
+ // 关闭会话
+ this.doCloseSession(session);
+ }
+
+ /**
+ * 获取会话
+ *
+ * @param sessionId sessionId
+ * @param T
+ * @return session
+ */
+ @SuppressWarnings("unchecked")
+ public T getSession(String sessionId) {
+ return (T) channelSessionMap.get(sessionId);
+ }
+
+ /**
+ * 执行关闭会话
+ *
+ * @param session session
+ */
+ private void doCloseSession(ITerminalSession session) {
+ if (session == null) {
+ return;
+ }
+ // 关闭会话
+ Streams.close(session);
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/TerminalBasePayload.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/TerminalBasePayload.java
similarity index 89%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/TerminalBasePayload.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/TerminalBasePayload.java
index 5586ad67..d4fb9db7 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/TerminalBasePayload.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/TerminalBasePayload.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model;
+package org.dromara.visor.module.terminal.handler.terminal.model;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -40,11 +40,6 @@ import lombok.experimental.SuperBuilder;
@AllArgsConstructor
public class TerminalBasePayload {
- /**
- * 会话id
- */
- private String sessionId;
-
/**
* 消息类型
*/
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/model/TerminalChannelExtra.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/TerminalChannelExtra.java
new file mode 100644
index 00000000..2dcc9fcb
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/TerminalChannelExtra.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 终端连接额外信息
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/7/31 15:23
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TerminalChannelExtra {
+
+ /**
+ * 连接类型
+ */
+ private String connectType;
+
+ // -------------------- ssh --------------------
+
+ /**
+ * 伪终端类型
+ */
+ private String terminalType;
+
+ // -------------------- sftp --------------------
+
+ /**
+ * 文件预览大小
+ */
+ private Integer filePreviewSize;
+
+ // -------------------- rdp --------------------
+
+ /**
+ * 启用音频输入
+ */
+ private Boolean enableAudioInput;
+
+ /**
+ * 启用音频输出
+ */
+ private Boolean enableAudioOutput;
+
+ /**
+ * 颜色深度
+ */
+ private Integer colorDepth;
+
+ /**
+ * 无损压缩
+ */
+ private Boolean forceLossless;
+
+ /**
+ * 启用壁纸
+ */
+ private Boolean enableWallpaper;
+
+ /**
+ * 启用主题
+ */
+ private Boolean enableTheming;
+
+ /**
+ * 启动平滑字体
+ */
+ private Boolean enableFontSmoothing;
+
+ /**
+ * 启用窗口拖动
+ */
+ private Boolean enableFullWindowDrag;
+
+ /**
+ * 启用桌面合成
+ */
+ private Boolean enableDesktopComposition;
+
+ /**
+ * 启用菜单动画
+ */
+ private Boolean enableMenuAnimations;
+
+ /**
+ * 禁用位图缓存
+ */
+ private Boolean disableBitmapCaching;
+
+ /**
+ * 禁用离屏缓存
+ */
+ private Boolean disableOffscreenCaching;
+
+ /**
+ * 禁用字形缓存
+ */
+ private Boolean disableGlyphCaching;
+
+ // -------------------- vnc --------------------
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/TerminalConfig.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/TerminalChannelProps.java
similarity index 59%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/TerminalConfig.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/TerminalChannelProps.java
index 621e0d14..8675fd96 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/TerminalConfig.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/TerminalChannelProps.java
@@ -20,74 +20,81 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model;
+package org.dromara.visor.module.terminal.handler.terminal.model;
+import org.dromara.visor.common.entity.RequestIdentity;
+import cn.orionsec.kit.lang.define.collect.MutableMap;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
- * 终端连接参数
+ * 终端连接属性
*
* @author Jiahang Li
* @version 1.0.0
- * @since 2024/1/3 23:30
+ * @since 2024/7/31 15:23
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
-public class TerminalConfig {
+public class TerminalChannelProps {
/**
- * logId
+ * 会话id
*/
- private Long logId;
+ private String id;
/**
- * 主机id
+ * hostId
*/
private Long hostId;
/**
- * 主机名称
+ * 会话类型
*/
- private String hostName;
+ private String type;
/**
- * 主机地址
+ * 连接用户
*/
- private String address;
+ private Long userId;
/**
- * cols
+ * 连接用户名
*/
- private Integer cols;
+ private String username;
/**
- * rows
+ * 连接用户昵称
*/
- private Integer rows;
+ private String nickname;
/**
- * SSH输出编码
+ * traceId
*/
- private String charset;
+ private String traceId;
/**
- * 文件名称编码
+ * channel
*/
- private String fileNameCharset;
+ private String channel;
/**
- * 文件内容编码
+ * 请求留痕信息
*/
- private String fileContentCharset;
+ private RequestIdentity identity;
/**
- * 文件预览大小
+ * 额外配置
*/
- private Integer filePreviewSize;
+ private TerminalChannelExtra extra;
+
+ /**
+ * 会话属性
+ */
+ private MutableMap attr;
}
diff --git a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/convert/DataPermissionProviderConvert.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/config/ITerminalSessionConfig.java
similarity index 58%
rename from orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/convert/DataPermissionProviderConvert.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/config/ITerminalSessionConfig.java
index a90da4cd..b73bc7fc 100644
--- a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/convert/DataPermissionProviderConvert.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/config/ITerminalSessionConfig.java
@@ -20,25 +20,37 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.infra.convert;
+package org.dromara.visor.module.terminal.handler.terminal.model.config;
-import org.dromara.visor.module.infra.entity.dto.data.DataPermissionUpdateDTO;
-import org.dromara.visor.module.infra.entity.request.data.DataPermissionUpdateRequest;
-import org.mapstruct.Mapper;
-import org.mapstruct.factory.Mappers;
+import org.dromara.visor.common.session.config.IBaseConnectConfig;
/**
- * 数据权限 对外服务对象转换器
+ * 终端会话配置
*
* @author Jiahang Li
* @version 1.0.0
- * @since 2023-11-21 10:32
+ * @since 2025/6/24 17:10
*/
-@Mapper
-public interface DataPermissionProviderConvert {
+public interface ITerminalSessionConfig extends IBaseConnectConfig {
- DataPermissionProviderConvert MAPPER = Mappers.getMapper(DataPermissionProviderConvert.class);
+ // -------------------- getter/setter --------------------
- DataPermissionUpdateRequest toRequest(DataPermissionUpdateDTO request);
+ Long getLogId();
+
+ void setLogId(Long logId);
+
+ default Integer getWidth() {
+ return 0;
+ }
+
+ default void setWidth(Integer width) {
+ }
+
+ default Integer getHeight() {
+ return 0;
+ }
+
+ default void setHeight(Integer height) {
+ }
}
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/model/config/TerminalSessionRdpConfig.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/config/TerminalSessionRdpConfig.java
new file mode 100644
index 00000000..d394532b
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/config/TerminalSessionRdpConfig.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.model.config;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+import org.dromara.visor.common.session.config.RdpConnectConfig;
+
+/**
+ * 终端会话配置 RDP
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/6/24 17:08
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class TerminalSessionRdpConfig extends RdpConnectConfig implements ITerminalSessionConfig {
+
+ @Schema(description = "logId")
+ private Long logId;
+
+ @Schema(description = "宽")
+ private Integer width;
+
+ @Schema(description = "高")
+ private Integer height;
+
+ @Schema(description = "dpi")
+ private Integer dpi;
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/TerminalCheckRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/config/TerminalSessionSftpConfig.java
similarity index 69%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/TerminalCheckRequest.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/config/TerminalSessionSftpConfig.java
index 77151ddb..f82c0dc7 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/TerminalCheckRequest.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/config/TerminalSessionSftpConfig.java
@@ -20,39 +20,34 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.request;
+package org.dromara.visor.module.terminal.handler.terminal.model.config;
+import org.dromara.visor.common.session.config.SshConnectConfig;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
/**
- * 终端连接检查请求 实体对象
- *
- * ck|eff00a1|1
+ * 终端会话配置 SFTP
*
* @author Jiahang Li
* @version 1.0.0
- * @since 2023/12/29 16:20
+ * @since 2025/6/24 17:08
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
-public class TerminalCheckRequest extends TerminalBasePayload {
+public class TerminalSessionSftpConfig extends SshConnectConfig implements ITerminalSessionConfig {
- /**
- * 主机id
- */
- private Long hostId;
+ @Schema(description = "logId")
+ private Long logId;
- /**
- * 连接类型
- */
- private String connectType;
+ @Schema(description = "文件预览大小")
+ private Integer filePreviewSize;
}
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/model/config/TerminalSessionSshConfig.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/config/TerminalSessionSshConfig.java
new file mode 100644
index 00000000..fe02797c
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/config/TerminalSessionSshConfig.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.model.config;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+import org.dromara.visor.common.session.config.SshConnectConfig;
+
+/**
+ * 终端会话配置 SSH
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/6/24 17:08
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class TerminalSessionSshConfig extends SshConnectConfig implements ITerminalSessionConfig {
+
+ @Schema(description = "logId")
+ private Long logId;
+
+ @Schema(description = "宽")
+ private Integer width;
+
+ @Schema(description = "高")
+ private Integer height;
+
+ @Schema(description = "终端类型")
+ private String terminalType;
+
+}
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/model/request/GuacdInstructionRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/GuacdInstructionRequest.java
new file mode 100644
index 00000000..223d4afc
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/GuacdInstructionRequest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.model.request;
+
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * guacd 指令请求
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/2/6 13:31
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class GuacdInstructionRequest extends TerminalBasePayload {
+
+ /**
+ * 指令
+ */
+ private String instruction;
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpBaseRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpBaseRequest.java
similarity index 86%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpBaseRequest.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpBaseRequest.java
index fb97e2b0..aea2519a 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpBaseRequest.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpBaseRequest.java
@@ -20,17 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.request;
+package org.dromara.visor.module.terminal.handler.terminal.model.request;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
/**
- * sftp 基础请求 实体对象
+ * sftp 基础请求
*
* @author Jiahang Li
* @version 1.0.0
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/model/request/SftpChangeGroupRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpChangeGroupRequest.java
new file mode 100644
index 00000000..02c692d2
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpChangeGroupRequest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.model.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * sftp 修改文件分组请求
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/2/6 13:31
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SftpChangeGroupRequest extends SftpBaseRequest {
+
+ /**
+ * gid
+ */
+ private Integer gid;
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpChangeModeRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpChangeModeRequest.java
similarity index 89%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpChangeModeRequest.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpChangeModeRequest.java
index bdd179cb..608f91af 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpChangeModeRequest.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpChangeModeRequest.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.request;
+package org.dromara.visor.module.terminal.handler.terminal.model.request;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -29,9 +29,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
- * sftp 修改文件权限 实体对象
- *
- * i|eff00a1|path|mod
+ * sftp 修改文件权限请求
*
* @author Jiahang Li
* @version 1.0.0
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/model/request/SftpChangeOwnerRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpChangeOwnerRequest.java
new file mode 100644
index 00000000..8cc09819
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpChangeOwnerRequest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.model.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * sftp 修改文件归属请求
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/2/6 13:31
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SftpChangeOwnerRequest extends SftpBaseRequest {
+
+ /**
+ * uid
+ */
+ private Integer uid;
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpDownloadFlatDirectoryRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpDownloadFlatDirectoryRequest.java
similarity index 88%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpDownloadFlatDirectoryRequest.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpDownloadFlatDirectoryRequest.java
index c7a2a68f..bd3f97d8 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpDownloadFlatDirectoryRequest.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpDownloadFlatDirectoryRequest.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.request;
+package org.dromara.visor.module.terminal.handler.terminal.model.request;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -29,9 +29,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
- * sftp 下载文件夹展开文件 实体对象
- *
- * i|eff00a1|currentPath|path
+ * sftp 下载文件夹展开文件请求
*
* @author Jiahang Li
* @version 1.0.0
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpListRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpListRequest.java
similarity index 90%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpListRequest.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpListRequest.java
index 71023671..f17ff0de 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpListRequest.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpListRequest.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.request;
+package org.dromara.visor.module.terminal.handler.terminal.model.request;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -29,9 +29,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
- * sftp 列表请求 实体对象
- *
- * i|eff00a1|path
+ * sftp 列表请求
*
* @author Jiahang Li
* @version 1.0.0
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpMoveRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpMoveRequest.java
similarity index 89%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpMoveRequest.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpMoveRequest.java
index f75c306c..c42c1c8c 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SftpMoveRequest.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SftpMoveRequest.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.request;
+package org.dromara.visor.module.terminal.handler.terminal.model.request;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -29,9 +29,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
- * sftp 移动文件 实体对象
- *
- * i|eff00a1|path|target
+ * sftp 移动文件
*
* @author Jiahang Li
* @version 1.0.0
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SshInputRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SshInputRequest.java
similarity index 84%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SshInputRequest.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SshInputRequest.java
index 36af9862..291b7200 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SshInputRequest.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/SshInputRequest.java
@@ -20,19 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.request;
+package org.dromara.visor.module.terminal.handler.terminal.model.request;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
/**
- * ssh 输入请求 实体对象
- *
- * i|eff00a1|command
+ * ssh 输入请求
*
* @author Jiahang Li
* @version 1.0.0
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/TerminalConnectRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/TerminalConnectRequest.java
similarity index 75%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/TerminalConnectRequest.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/TerminalConnectRequest.java
index bbb162e7..cded76f4 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/TerminalConnectRequest.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/TerminalConnectRequest.java
@@ -20,19 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.request;
+package org.dromara.visor.module.terminal.handler.terminal.model.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
/**
- * 终端连接请求 实体对象
- *
- * co|eff00a1|100|20
+ * 终端连接请求
*
* @author Jiahang Li
* @version 1.0.0
@@ -46,18 +44,8 @@ import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePa
public class TerminalConnectRequest extends TerminalBasePayload {
/**
- * 伪终端类型
+ * 连接信息
*/
- private String terminalType;
-
- /**
- * 列数
- */
- private Integer cols;
-
- /**
- * 行数
- */
- private Integer rows;
+ private String body;
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/TerminalConnectResponse.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/TerminalResizeRequest.java
similarity index 76%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/TerminalConnectResponse.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/TerminalResizeRequest.java
index cb995377..b5339f70 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/TerminalConnectResponse.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/request/TerminalResizeRequest.java
@@ -20,17 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.response;
+package org.dromara.visor.module.terminal.handler.terminal.model.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
/**
- * 终端连接响应 实体对象
+ * 修改大小请求
*
* @author Jiahang Li
* @version 1.0.0
@@ -41,16 +41,16 @@ import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePa
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
-public class TerminalConnectResponse extends TerminalBasePayload {
+public class TerminalResizeRequest extends TerminalBasePayload {
/**
- * 检查结果
+ * 宽
*/
- private Integer result;
+ private Integer width;
/**
- * 错误信息
+ * 高
*/
- private String msg;
+ private Integer height;
}
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/model/response/GuacdInstructionResponse.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/GuacdInstructionResponse.java
new file mode 100644
index 00000000..7a1674d4
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/GuacdInstructionResponse.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.model.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * guacd 指令响应
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/2/6 16:20
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class GuacdInstructionResponse extends SftpBaseResponse {
+
+ /**
+ * 指令
+ */
+ private String instruction;
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpBaseResponse.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpBaseResponse.java
similarity index 86%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpBaseResponse.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpBaseResponse.java
index cdc34bc8..a83d0239 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpBaseResponse.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpBaseResponse.java
@@ -20,17 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.response;
+package org.dromara.visor.module.terminal.handler.terminal.model.response;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
/**
- * sftp 基础响应 实体对象
+ * sftp 基础响应
*
* @author Jiahang Li
* @version 1.0.0
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpDownloadFlatDirectoryResponse.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpDownloadFlatDirectoryResponse.java
similarity index 91%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpDownloadFlatDirectoryResponse.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpDownloadFlatDirectoryResponse.java
index 83f78d69..40992874 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpDownloadFlatDirectoryResponse.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpDownloadFlatDirectoryResponse.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.response;
+package org.dromara.visor.module.terminal.handler.terminal.model.response;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -29,7 +29,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
- * sftp 下载文件夹展开文件 实体对象
+ * sftp 下载文件夹展开文件响应
*
* @author Jiahang Li
* @version 1.0.0
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpFileVO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpFileVO.java
similarity index 94%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpFileVO.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpFileVO.java
index ee489375..5e8eca80 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpFileVO.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpFileVO.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.response;
+package org.dromara.visor.module.terminal.handler.terminal.model.response;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -30,7 +30,7 @@ import lombok.experimental.SuperBuilder;
import java.util.Date;
/**
- * sftp 文件响应 实体对象
+ * sftp 文件响应
*
* @author Jiahang Li
* @version 1.0.0
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpGetContentResponse.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpGetContentResponse.java
similarity index 90%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpGetContentResponse.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpGetContentResponse.java
index 1259e986..cf8954ea 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpGetContentResponse.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpGetContentResponse.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.response;
+package org.dromara.visor.module.terminal.handler.terminal.model.response;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -29,7 +29,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
- * sftp 获取内容响应 实体对象
+ * sftp 获取内容响应
*
* @author Jiahang Li
* @version 1.0.0
@@ -43,7 +43,7 @@ import lombok.experimental.SuperBuilder;
public class SftpGetContentResponse extends SftpBaseResponse {
/**
- * content
+ * token
*/
private String token;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpListResponse.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpListResponse.java
similarity index 92%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpListResponse.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpListResponse.java
index c1c8d3a6..c5ed6c36 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpListResponse.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpListResponse.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.response;
+package org.dromara.visor.module.terminal.handler.terminal.model.response;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -29,7 +29,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
- * sftp 列表响应 实体对象
+ * sftp 列表响应
*
* @author Jiahang Li
* @version 1.0.0
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpSetContentResponse.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpSetContentResponse.java
similarity index 93%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpSetContentResponse.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpSetContentResponse.java
index 073bf906..c888d06c 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SftpSetContentResponse.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SftpSetContentResponse.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.response;
+package org.dromara.visor.module.terminal.handler.terminal.model.response;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -43,7 +43,7 @@ import lombok.experimental.SuperBuilder;
public class SftpSetContentResponse extends SftpBaseResponse {
/**
- * content
+ * token
*/
private String token;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SshOutputResponse.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SshOutputResponse.java
similarity index 86%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SshOutputResponse.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SshOutputResponse.java
index fe5225cc..fb46e00e 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/SshOutputResponse.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SshOutputResponse.java
@@ -20,17 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.response;
+package org.dromara.visor.module.terminal.handler.terminal.model.response;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
/**
- * ssh 输出响应 实体对象
+ * ssh 输出响应
*
* @author Jiahang Li
* @version 1.0.0
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/TerminalCheckResponse.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SshResizeResponse.java
similarity index 76%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/TerminalCheckResponse.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SshResizeResponse.java
index 638bf7f8..bddd6378 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/TerminalCheckResponse.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/SshResizeResponse.java
@@ -20,17 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.response;
+package org.dromara.visor.module.terminal.handler.terminal.model.response;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
/**
- * 终端连接检查响应 实体对象
+ * ssh 重置大小响应
*
* @author Jiahang Li
* @version 1.0.0
@@ -41,16 +41,16 @@ import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePa
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
-public class TerminalCheckResponse extends TerminalBasePayload {
+public class SshResizeResponse extends TerminalBasePayload {
/**
- * 检查结果
+ * 宽
*/
- private Integer result;
+ private Integer width;
/**
- * 错误信息
+ * 高
*/
- private String msg;
+ private Integer height;
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/TerminalCloseResponse.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/TerminalClosedResponse.java
similarity index 78%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/TerminalCloseResponse.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/TerminalClosedResponse.java
index 21f50b6b..acc9569e 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/response/TerminalCloseResponse.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/TerminalClosedResponse.java
@@ -20,17 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.response;
+package org.dromara.visor.module.terminal.handler.terminal.model.response;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
/**
- * 终端连接关闭响应 实体对象
+ * 终端连接已关闭响应
*
* @author Jiahang Li
* @version 1.0.0
@@ -41,12 +41,12 @@ import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePa
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
-public class TerminalCloseResponse extends TerminalBasePayload {
+public class TerminalClosedResponse extends TerminalBasePayload {
/**
- * 是否为强制关闭
+ * 关闭码
*/
- private Integer forceClose;
+ private Integer code;
/**
* 关闭信息
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SshResizeRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/TerminalSetIdResponse.java
similarity index 74%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SshResizeRequest.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/TerminalSetIdResponse.java
index b7914177..ee8cc475 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/model/request/SshResizeRequest.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/TerminalSetIdResponse.java
@@ -20,19 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.model.request;
+package org.dromara.visor.module.terminal.handler.terminal.model.response;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
/**
- * ssh 修改大小请求 实体对象
- *
- * rs|eff00a1|100|20
+ * 终端设置 id 响应
*
* @author Jiahang Li
* @version 1.0.0
@@ -43,16 +41,11 @@ import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalBasePa
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
-public class SshResizeRequest extends TerminalBasePayload {
+public class TerminalSetIdResponse extends TerminalBasePayload {
/**
- * 列数
+ * 会话 id
*/
- private Integer cols;
-
- /**
- * 行数
- */
- private Integer rows;
+ private String sessionId;
}
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/model/response/TerminalSetInfoResponse.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/TerminalSetInfoResponse.java
new file mode 100644
index 00000000..b033b799
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/response/TerminalSetInfoResponse.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.model.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
+
+/**
+ * 终端设置信息响应
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/12/29 16:20
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class TerminalSetInfoResponse extends TerminalBasePayload {
+
+ /**
+ * 信息
+ */
+ private String info;
+
+}
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/model/transport/TerminalConnectBody.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/transport/TerminalConnectBody.java
new file mode 100644
index 00000000..2067ac0b
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/transport/TerminalConnectBody.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.model.transport;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 终端连接信息
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/12/29 16:20
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TerminalConnectBody {
+
+ /**
+ * 宽
+ */
+ private Integer width;
+
+ /**
+ * 高
+ */
+ private Integer height;
+
+ /**
+ * dpi
+ */
+ private Integer dpi;
+
+}
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/model/transport/TerminalSetInfo.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/transport/TerminalSetInfo.java
new file mode 100644
index 00000000..33219f59
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/model/transport/TerminalSetInfo.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.model.transport;
+
+import cn.orionsec.kit.lang.able.IJsonObject;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * 终端设置信息对象
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/6/23 17:52
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TerminalSetInfo implements IJsonObject {
+
+ /**
+ * 地址
+ */
+ private String address;
+
+ /**
+ * 端口
+ */
+ private Integer port;
+
+ /**
+ * 用户名
+ */
+ private String username;
+
+}
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/record/TerminalAsyncSaver.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/record/TerminalAsyncSaver.java
new file mode 100644
index 00000000..0a334f90
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/record/TerminalAsyncSaver.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.record;
+
+import cn.orionsec.kit.spring.SpringHolder;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.visor.framework.biz.operator.log.core.model.OperatorLogModel;
+import org.dromara.visor.framework.biz.operator.log.core.service.OperatorLogFrameworkService;
+import org.dromara.visor.module.terminal.define.TerminalThreadPools;
+
+/**
+ * 终端异步保存器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/6/28 19:08
+ */
+@Slf4j
+public class TerminalAsyncSaver {
+
+ private static final OperatorLogFrameworkService operatorLogFrameworkService = SpringHolder.getBean(OperatorLogFrameworkService.class);
+
+ private TerminalAsyncSaver() {
+ }
+
+ /**
+ * 保存操作日志
+ *
+ * @param model model
+ */
+ public static void saveOperatorLog(OperatorLogModel model) {
+ TerminalThreadPools.TERMINAL_ASYNC_SAVER.execute(() -> {
+ model.setCreateTime(model.getStartTime());
+ operatorLogFrameworkService.insert(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/terminal/sender/AbstractWebsocketTerminalSender.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/AbstractWebsocketTerminalSender.java
new file mode 100644
index 00000000..4047009f
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/AbstractWebsocketTerminalSender.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.sender;
+
+import org.dromara.visor.framework.websocket.core.utils.WebSockets;
+import org.dromara.visor.module.terminal.handler.terminal.enums.OutputProtocolEnum;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalBasePayload;
+import org.dromara.visor.module.terminal.handler.terminal.model.response.SshResizeResponse;
+import org.dromara.visor.module.terminal.handler.terminal.model.response.TerminalClosedResponse;
+import org.dromara.visor.module.terminal.handler.terminal.model.response.TerminalSetIdResponse;
+import org.dromara.visor.module.terminal.handler.terminal.model.response.TerminalSetInfoResponse;
+import org.springframework.web.socket.WebSocketSession;
+
+/**
+ * websocket 终端 发送器基类
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/4/1 10:43
+ */
+public abstract class AbstractWebsocketTerminalSender implements ITerminalSender {
+
+ protected boolean closed;
+
+ protected final WebSocketSession channel;
+
+ public AbstractWebsocketTerminalSender(WebSocketSession channel) {
+ this.channel = channel;
+ }
+
+ @Override
+ public void sendMessage(String body) {
+ this.send(channel, body);
+ }
+
+ @Override
+ public void sendSetId(String sessionId) {
+ this.sendFormattedMessage(OutputProtocolEnum.SET_ID,
+ TerminalSetIdResponse.builder()
+ .sessionId(sessionId)
+ .build());
+ }
+
+ @Override
+ public void sendSetInfo(String info) {
+ this.sendFormattedMessage(OutputProtocolEnum.SET_INFO,
+ TerminalSetInfoResponse.builder()
+ .info(info)
+ .build());
+ }
+
+ @Override
+ public void sendResize(int width, int height) {
+ this.sendFormattedMessage(OutputProtocolEnum.RESIZE,
+ SshResizeResponse.builder()
+ .width(width)
+ .height(height)
+ .build());
+ }
+
+ @Override
+ public void sendPong() {
+ this.send(channel, OutputProtocolEnum.PONG.getType());
+ }
+
+ @Override
+ public void sendConnected() {
+ this.send(channel, OutputProtocolEnum.CONNECTED.getType());
+ }
+
+ @Override
+ public void sendClosed(int code, String message) {
+ this.sendFormattedMessage(OutputProtocolEnum.CLOSED,
+ TerminalClosedResponse.builder()
+ .code(code)
+ .msg(message)
+ .build());
+ }
+
+ /**
+ * 发送消息
+ *
+ * @param type type
+ * @param body body
+ * @param E
+ */
+ protected void sendFormattedMessage(OutputProtocolEnum type, E body) {
+ body.setType(type.getType());
+ // 发送消息
+ this.send(channel, type.format(body));
+ }
+
+ /**
+ * 发送消息
+ *
+ * @param channel channel
+ * @param message message
+ */
+ protected void send(WebSocketSession channel, String message) {
+ if (this.isOpen()) {
+ WebSockets.sendText(channel, message);
+ }
+ }
+
+ @Override
+ public void setClosed() {
+ this.closed = true;
+ }
+
+ @Override
+ public boolean isOpen() {
+ return !closed && channel.isOpen();
+ }
+
+ @Override
+ public void close() {
+ WebSockets.close(channel);
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/convert/DataPermissionConvert.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/IGuacdTerminalSender.java
similarity index 61%
rename from orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/convert/DataPermissionConvert.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/IGuacdTerminalSender.java
index 3c2374db..a87f1f15 100644
--- a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/convert/DataPermissionConvert.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/IGuacdTerminalSender.java
@@ -20,25 +20,33 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.infra.convert;
+package org.dromara.visor.module.terminal.handler.terminal.sender;
-import org.dromara.visor.module.infra.entity.domain.DataPermissionDO;
-import org.dromara.visor.module.infra.entity.request.data.DataPermissionUpdateRequest;
-import org.mapstruct.Mapper;
-import org.mapstruct.factory.Mappers;
+import org.apache.guacamole.protocol.GuacamoleInstruction;
/**
- * 数据权限 内部对象转换器
+ * guacd 终端发送器
*
* @author Jiahang Li
* @version 1.0.0
- * @since 2023-11-21 10:32
+ * @since 2025/4/1 10:36
*/
-@Mapper
-public interface DataPermissionConvert {
+public interface IGuacdTerminalSender extends ITerminalSender {
- DataPermissionConvert MAPPER = Mappers.getMapper(DataPermissionConvert.class);
+ /**
+ * 发送指令
+ *
+ * @param instruction instruction
+ */
+ default void sendInstruction(String instruction) {
+ }
- DataPermissionDO to(DataPermissionUpdateRequest request);
+ /**
+ * 发送指令
+ *
+ * @param instruction instruction
+ */
+ default void sendInstruction(GuacamoleInstruction instruction) {
+ }
}
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/sender/ISftpTerminalSender.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/ISftpTerminalSender.java
new file mode 100644
index 00000000..e45959d7
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/ISftpTerminalSender.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.sender;
+
+import org.dromara.visor.module.terminal.handler.terminal.model.response.SftpFileVO;
+
+import java.util.List;
+
+/**
+ * SFTP 消息发送器定义
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/7/31 14:33
+ */
+public interface ISftpTerminalSender extends ITerminalSender {
+
+ /**
+ * 发送 SFTP 设置文件列表结果
+ *
+ * @param path path
+ * @param result result
+ * @param message message
+ * @param list list
+ */
+ default void sendFileList(String path, boolean result, String message, List list) {
+ }
+
+ /**
+ * 发送 SFTP 创建文件夹结果
+ *
+ * @param result result
+ * @param message message
+ */
+ default void sendMakeDirectoryResult(boolean result, String message) {
+ }
+
+ /**
+ * 发送 SFTP 创建文件结果
+ *
+ * @param result result
+ * @param message message
+ */
+ default void sendTouchResult(boolean result, String message) {
+ }
+
+ /**
+ * 发送 SFTP 移动文件结果
+ *
+ * @param result result
+ * @param message message
+ */
+ default void sendMoveResult(boolean result, String message) {
+ }
+
+ /**
+ * 发送 SFTP 删除文件结果
+ *
+ * @param result result
+ * @param message message
+ */
+ default void sendRemoveResult(boolean result, String message) {
+ }
+
+ /**
+ * 发送 SFTP 截断文件结果
+ *
+ * @param result result
+ * @param message message
+ */
+ default void sendTruncateResult(boolean result, String message) {
+ }
+
+ /**
+ * 发送 SFTP 修改文件权限结果
+ *
+ * @param result result
+ * @param message message
+ */
+ default void sendChangeModeResult(boolean result, String message) {
+ }
+
+ /**
+ * 发送 SFTP 修改文件归属结果
+ *
+ * @param result result
+ * @param message message
+ */
+ default void sendChangeOwnerResult(boolean result, String message) {
+ }
+
+ /**
+ * 发送 SFTP 修改文件分组结果
+ *
+ * @param result result
+ * @param message message
+ */
+ default void sendChangeGroupResult(boolean result, String message) {
+ }
+
+ /**
+ * 发送 SFTP 下载文件夹展开文件结果
+ *
+ * @param currentPath currentPath
+ * @param result result
+ * @param message message
+ * @param list list
+ */
+ default void sendDownloadFlatDirectory(String currentPath, boolean result, String message, List list) {
+ }
+
+ /**
+ * 发送 SFTP 获取文件内容结果
+ *
+ * @param result result
+ * @param message message
+ * @param token token
+ */
+ default void sendGetContentResult(boolean result, String message, String token) {
+ }
+
+ /**
+ * 发送 SFTP 修改文件内容结果
+ *
+ * @param result result
+ * @param message message
+ * @param token token
+ */
+ default void sendSetContentResult(boolean result, String message, String token) {
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/AssetStatisticsService.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/ISshTerminalSender.java
similarity index 74%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/AssetStatisticsService.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/ISshTerminalSender.java
index bff79191..86e57200 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/AssetStatisticsService.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/ISshTerminalSender.java
@@ -20,24 +20,23 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service;
-
-import org.dromara.visor.common.entity.chart.PieChartData;
+package org.dromara.visor.module.terminal.handler.terminal.sender;
/**
- * 资产模块统计服务
+ * SSH 终端消息发送器
*
* @author Jiahang Li
* @version 1.0.0
- * @since 2025/3/7 16:26
+ * @since 2024/7/31 14:33
*/
-public interface AssetStatisticsService {
+public interface ISshTerminalSender extends ITerminalSender {
/**
- * 获取主机类型图表
+ * 发送 SSH 输出
*
- * @return data
+ * @param body body
*/
- PieChartData getHostTypeChart();
+ default void sendOutput(String body) {
+ }
}
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/sender/ITerminalSender.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/ITerminalSender.java
new file mode 100644
index 00000000..8ee38639
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/ITerminalSender.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.sender;
+
+import cn.orionsec.kit.lang.able.SafeCloseable;
+
+/**
+ * 消息发送器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/7/31 21:55
+ */
+public interface ITerminalSender extends SafeCloseable {
+
+ /**
+ * 发送消息
+ *
+ * @param body body
+ */
+ default void sendMessage(String body) {
+ }
+
+ /**
+ * 发送设置id
+ *
+ * @param sessionId sessionId
+ */
+ default void sendSetId(String sessionId) {
+ }
+
+ /**
+ * 发送设置信息
+ *
+ * @param info info
+ */
+ default void sendSetInfo(String info) {
+ }
+
+ /**
+ * 发送 修改大小
+ *
+ * @param width width
+ * @param height height
+ */
+ default void sendResize(int width, int height) {
+ }
+
+ /**
+ * 发送 pong
+ */
+ default void sendPong() {
+ }
+
+ /**
+ * 发送已连接
+ */
+ default void sendConnected() {
+ }
+
+ /**
+ * 发送关闭结果
+ *
+ * @param code code
+ * @param message message
+ */
+ default void sendClosed(int code, String message) {
+ }
+
+ /**
+ * 设置为已关闭
+ */
+ default void setClosed() {
+ }
+
+ /**
+ * 是否为打开状态
+ *
+ * @return isOpen
+ */
+ default boolean isOpen() {
+ return false;
+ }
+
+}
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/sender/WebsocketGuacdTerminalSender.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/WebsocketGuacdTerminalSender.java
new file mode 100644
index 00000000..147c721f
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/WebsocketGuacdTerminalSender.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.sender;
+
+import org.dromara.visor.module.terminal.handler.terminal.enums.OutputProtocolEnum;
+import org.dromara.visor.module.terminal.handler.terminal.model.response.GuacdInstructionResponse;
+import org.apache.guacamole.protocol.GuacamoleInstruction;
+import org.springframework.web.socket.WebSocketSession;
+
+/**
+ * websocket guacd 发送器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/4/1 10:38
+ */
+public class WebsocketGuacdTerminalSender extends AbstractWebsocketTerminalSender implements IGuacdTerminalSender {
+
+ public WebsocketGuacdTerminalSender(WebSocketSession channel) {
+ super(channel);
+ }
+
+ @Override
+ public void sendConnected() {
+ // guacd 不需要发送 connected 指令, 是通过 guacd 内部消息监听器判断是否已连接
+ // this.send(channel, OutputProtocolEnum.CONNECTED.getType());
+ }
+
+ @Override
+ public void sendInstruction(GuacamoleInstruction instruction) {
+ this.sendInstruction(instruction.toString());
+ }
+
+ @Override
+ public void sendInstruction(String instruction) {
+ this.sendFormattedMessage(OutputProtocolEnum.GUACD_INSTRUCTION,
+ GuacdInstructionResponse.builder()
+ .instruction(instruction)
+ .build());
+ }
+
+}
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/sender/WebsocketSftpTerminalSender.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/WebsocketSftpTerminalSender.java
new file mode 100644
index 00000000..1139b24a
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/WebsocketSftpTerminalSender.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.sender;
+
+import org.dromara.visor.common.enums.BooleanBit;
+import org.dromara.visor.module.terminal.handler.terminal.enums.OutputProtocolEnum;
+import org.dromara.visor.module.terminal.handler.terminal.model.response.*;
+import com.alibaba.fastjson.JSON;
+import org.dromara.visor.module.terminal.handler.terminal.model.response.*;
+import org.springframework.web.socket.WebSocketSession;
+
+import java.util.List;
+
+/**
+ * websocket sftp 消息发送器
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/7/30 14:33
+ */
+public class WebsocketSftpTerminalSender extends AbstractWebsocketTerminalSender implements ISftpTerminalSender {
+
+ public WebsocketSftpTerminalSender(WebSocketSession channel) {
+ super(channel);
+ }
+
+ @Override
+ public void sendFileList(String path, boolean result, String message, List list) {
+ this.sendFormattedMessage(OutputProtocolEnum.SFTP_LIST,
+ SftpListResponse.builder()
+ .path(path)
+ .result(BooleanBit.of(result).getValue())
+ .msg(message)
+ .body(JSON.toJSONString(list))
+ .build());
+ }
+
+ @Override
+ public void sendMakeDirectoryResult(boolean result, String message) {
+ this.sendFormattedMessage(OutputProtocolEnum.SFTP_MKDIR,
+ SftpBaseResponse.builder()
+ .result(BooleanBit.of(result).getValue())
+ .msg(message)
+ .build());
+ }
+
+ @Override
+ public void sendTouchResult(boolean result, String message) {
+ this.sendFormattedMessage(OutputProtocolEnum.SFTP_TOUCH,
+ SftpBaseResponse.builder()
+ .result(BooleanBit.of(result).getValue())
+ .msg(message)
+ .build());
+ }
+
+ @Override
+ public void sendMoveResult(boolean result, String message) {
+ this.sendFormattedMessage(OutputProtocolEnum.SFTP_MOVE,
+ SftpBaseResponse.builder()
+ .result(BooleanBit.of(result).getValue())
+ .msg(message)
+ .build());
+ }
+
+ @Override
+ public void sendRemoveResult(boolean result, String message) {
+ this.sendFormattedMessage(OutputProtocolEnum.SFTP_REMOVE,
+ SftpBaseResponse.builder()
+ .result(BooleanBit.of(result).getValue())
+ .msg(message)
+ .build());
+ }
+
+ @Override
+ public void sendTruncateResult(boolean result, String message) {
+ this.sendFormattedMessage(OutputProtocolEnum.SFTP_TRUNCATE,
+ SftpBaseResponse.builder()
+ .result(BooleanBit.of(result).getValue())
+ .msg(message)
+ .build());
+ }
+
+ @Override
+ public void sendChangeModeResult(boolean result, String message) {
+ this.sendFormattedMessage(OutputProtocolEnum.SFTP_CHMOD,
+ SftpBaseResponse.builder()
+ .result(BooleanBit.of(result).getValue())
+ .msg(message)
+ .build());
+ }
+
+ @Override
+ public void sendChangeOwnerResult(boolean result, String message) {
+ this.sendFormattedMessage(OutputProtocolEnum.SFTP_CHOWN,
+ SftpBaseResponse.builder()
+ .result(BooleanBit.of(result).getValue())
+ .msg(message)
+ .build());
+ }
+
+ @Override
+ public void sendChangeGroupResult(boolean result, String message) {
+ this.sendFormattedMessage(OutputProtocolEnum.SFTP_CHGRP,
+ SftpBaseResponse.builder()
+ .result(BooleanBit.of(result).getValue())
+ .msg(message)
+ .build());
+ }
+
+ @Override
+ public void sendDownloadFlatDirectory(String currentPath, boolean result, String message, List list) {
+ this.sendFormattedMessage(OutputProtocolEnum.SFTP_DOWNLOAD_FLAT_DIRECTORY,
+ SftpDownloadFlatDirectoryResponse.builder()
+ .currentPath(currentPath)
+ .result(BooleanBit.of(result).getValue())
+ .msg(message)
+ .body(JSON.toJSONString(list))
+ .build());
+ }
+
+ @Override
+ public void sendGetContentResult(boolean result, String message, String token) {
+ this.sendFormattedMessage(OutputProtocolEnum.SFTP_GET_CONTENT,
+ SftpGetContentResponse.builder()
+ .result(BooleanBit.of(result).getValue())
+ .msg(message)
+ .token(token)
+ .build());
+ }
+
+ @Override
+ public void sendSetContentResult(boolean result, String message, String token) {
+ this.sendFormattedMessage(OutputProtocolEnum.SFTP_SET_CONTENT,
+ SftpSetContentResponse.builder()
+ .result(BooleanBit.of(result).getValue())
+ .msg(message)
+ .token(token)
+ .build());
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SshResizeHandler.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/WebsocketSshTerminalSender.java
similarity index 54%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SshResizeHandler.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/WebsocketSshTerminalSender.java
index e8c01850..54f15873 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/handler/SshResizeHandler.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/sender/WebsocketSshTerminalSender.java
@@ -20,31 +20,31 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.handler;
+package org.dromara.visor.module.terminal.handler.terminal.sender;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.module.asset.handler.host.terminal.model.request.SshResizeRequest;
-import org.dromara.visor.module.asset.handler.host.terminal.session.ISshSession;
-import org.springframework.stereotype.Component;
+import org.dromara.visor.module.terminal.handler.terminal.enums.OutputProtocolEnum;
+import org.dromara.visor.module.terminal.handler.terminal.model.response.SshOutputResponse;
import org.springframework.web.socket.WebSocketSession;
/**
- * ssh 修改大小处理器
+ * websocket ssh 终端消息发送器
*
* @author Jiahang Li
* @version 1.0.0
- * @since 2023/12/29 15:32
+ * @since 2024/7/30 14:33
*/
-@Slf4j
-@Component
-public class SshResizeHandler extends AbstractTerminalHandler {
+public class WebsocketSshTerminalSender extends AbstractWebsocketTerminalSender implements ISshTerminalSender {
+
+ public WebsocketSshTerminalSender(WebSocketSession channel) {
+ super(channel);
+ }
@Override
- public void handle(WebSocketSession channel, SshResizeRequest payload) {
- // 获取会话
- ISshSession session = terminalManager.getSession(channel.getId(), payload.getSessionId());
- // 修改大小
- session.resize(payload.getCols(), payload.getRows());
+ public void sendOutput(String body) {
+ this.sendFormattedMessage(OutputProtocolEnum.SSH_OUTPUT,
+ SshOutputResponse.builder()
+ .body(body)
+ .build());
}
}
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/session/AbstractGuacdSession.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/AbstractGuacdSession.java
new file mode 100644
index 00000000..0f914558
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/AbstractGuacdSession.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.session;
+
+import org.dromara.visor.module.terminal.define.TerminalThreadPools;
+import org.dromara.visor.module.terminal.handler.guacd.IGuacdTunnel;
+import org.dromara.visor.module.terminal.handler.terminal.constant.TerminalMessage;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.model.config.ITerminalSessionConfig;
+import org.dromara.visor.module.terminal.handler.terminal.sender.IGuacdTerminalSender;
+import cn.orionsec.kit.lang.utils.Exceptions;
+
+/**
+ * guacd 会话基类
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/3/30 17:44
+ */
+public abstract class AbstractGuacdSession
+ extends AbstractTerminalSession
+ implements IGuacdSession {
+
+ protected IGuacdTunnel tunnel;
+
+ public AbstractGuacdSession(TerminalChannelProps props,
+ IGuacdTerminalSender sender,
+ C config) {
+ super(props, sender, config);
+ }
+
+ @Override
+ public void connect() {
+ // 创建 tunnel
+ this.tunnel = this.createTunnel();
+ // 设置 tunnel 参数
+ this.setTunnelParams();
+ try {
+ // 执行连接
+ this.doConnect();
+ } catch (Exception e) {
+ throw Exceptions.app(TerminalMessage.GUACD_SERVICE, e);
+ }
+ }
+
+ /**
+ * 创建 tunnel
+ *
+ * @return tunnel
+ */
+ protected abstract IGuacdTunnel createTunnel();
+
+ /**
+ * 设置 tunnel 参数
+ */
+ protected abstract void setTunnelParams();
+
+ /**
+ * 执行连接
+ */
+ protected void doConnect() {
+ // 监听方式
+ tunnel.transfer(sender::sendInstruction);
+ // 连接
+ tunnel.connect();
+ // 开始监听输出
+ TerminalThreadPools.TERMINAL_STDOUT.execute(tunnel);
+ }
+
+ @Override
+ public void write(String data) {
+ tunnel.write(data);
+ }
+
+ @Override
+ public void keepAlive() {
+ // guacd 有内部实现
+ }
+
+ @Override
+ protected void releaseResource() {
+ tunnel.close();
+ }
+
+}
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/session/AbstractTerminalSession.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/AbstractTerminalSession.java
new file mode 100644
index 00000000..bdc12808
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/AbstractTerminalSession.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.session;
+
+import cn.orionsec.kit.lang.utils.Objects1;
+import cn.orionsec.kit.spring.SpringHolder;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.visor.module.terminal.enums.TerminalConnectStatusEnum;
+import org.dromara.visor.module.terminal.handler.terminal.constant.SessionCloseCode;
+import org.dromara.visor.module.terminal.handler.terminal.constant.TerminalMessage;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.model.config.ITerminalSessionConfig;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ITerminalSender;
+import org.dromara.visor.module.terminal.service.TerminalConnectLogService;
+
+/**
+ * 终端会话基类
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/2/4 16:51
+ */
+@Slf4j
+public abstract class AbstractTerminalSession implements ITerminalSession {
+
+ protected final String sessionId;
+
+ @Getter
+ protected final TerminalChannelProps props;
+
+ @Getter
+ protected final S sender;
+
+ protected final C config;
+
+ @Getter
+ protected volatile boolean closed;
+
+ @Getter
+ protected volatile boolean connected;
+
+ protected Integer closeCode;
+
+ protected String closeMessage;
+
+ public AbstractTerminalSession(TerminalChannelProps props,
+ S sender,
+ C config) {
+ this.sessionId = props.getId();
+ this.props = props;
+ this.sender = sender;
+ this.config = config;
+ }
+
+ /**
+ * 释放资源
+ */
+ protected abstract void releaseResource();
+
+ @Override
+ public void forceOffline() {
+ log.info("terminal forceOffline {}", sessionId);
+ // 设置为强制关闭
+ this.setForcedOffline();
+ // 关闭
+ this.close();
+ }
+
+ @Override
+ public void setForcedOffline() {
+ this.closeCode = SessionCloseCode.FORCE_OFFLINE;
+ this.closeMessage = TerminalMessage.FORCED_OFFLINE;
+ }
+
+ @Override
+ public void setCloseStatus(Integer code, String message) {
+ this.closeCode = code;
+ this.closeMessage = message;
+ }
+
+ @Override
+ public void close() {
+ log.info("terminal close {}", sessionId);
+ // 检查并且关闭
+ if (closed) {
+ return;
+ }
+ this.connected = false;
+ this.closed = true;
+ // 发送关闭信息
+ try {
+ this.sendCloseMessage();
+ } catch (Exception e) {
+ log.error("terminal close send error {}", sessionId, e);
+ }
+ // 释放资源
+ try {
+ this.releaseResource();
+ } catch (Exception e) {
+ log.error("terminal close release error {}", sessionId, e);
+ }
+ try {
+ // 修改连接状态
+ this.updateLogStatus();
+ } catch (Exception e) {
+ log.error("terminal close update error {}", sessionId, e);
+ }
+ }
+
+ /**
+ * 发送关闭消息
+ */
+ protected void sendCloseMessage() {
+ log.info("TerminalSession close {}, forClose: {}, code: {}, message: {}", sessionId, this.closed, this.closeCode, closeMessage);
+ // 发送关闭信息
+ sender.sendClosed(Objects1.def(closeCode, SessionCloseCode.NORMAL), Objects1.def(closeMessage, TerminalMessage.CONNECTION_CLOSED));
+ }
+
+ /**
+ * 修改连接日志状态
+ */
+ protected void updateLogStatus() {
+ SpringHolder.getBean(TerminalConnectLogService.class)
+ .updateStatusById(config.getLogId(), this.isForcedOffline() ? TerminalConnectStatusEnum.FORCE_OFFLINE : TerminalConnectStatusEnum.COMPLETE, null);
+ }
+
+ @Override
+ public boolean isForcedOffline() {
+ return SessionCloseCode.FORCE_OFFLINE.equals(closeCode);
+ }
+
+ @Override
+ public Long getLogId() {
+ return config.getLogId();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public T getConfig() {
+ return (T) config;
+ }
+
+}
diff --git a/orion-visor-common/src/main/java/org/dromara/visor/common/validator/group/Import.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/IGuacdSession.java
similarity index 75%
rename from orion-visor-common/src/main/java/org/dromara/visor/common/validator/group/Import.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/IGuacdSession.java
index 307f0a5e..a9f79372 100644
--- a/orion-visor-common/src/main/java/org/dromara/visor/common/validator/group/Import.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/IGuacdSession.java
@@ -20,14 +20,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.common.validator.group;
+package org.dromara.visor.module.terminal.handler.terminal.session;
/**
- * 导出验证分组
+ * guacd 会话定义
*
* @author Jiahang Li
* @version 1.0.0
- * @since 2023/9/1 19:13
+ * @since 2025/3/30 17:42
*/
-public interface Import {
+public interface IGuacdSession extends ITerminalSession {
+
+ /**
+ * 写入数据
+ *
+ * @param data data
+ */
+ void write(String data);
+
}
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/session/IRdpSession.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/IRdpSession.java
new file mode 100644
index 00000000..de2d5860
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/IRdpSession.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.session;
+
+/**
+ * rdp 会话
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/3/30 17:42
+ */
+public interface IRdpSession extends IGuacdSession {
+
+ /**
+ * 重置大小
+ *
+ * @param width width
+ * @param height height
+ */
+ void resize(int width, int height);
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/ISftpSession.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/ISftpSession.java
similarity index 81%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/ISftpSession.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/ISftpSession.java
index 30c9dff3..0f2394fb 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/ISftpSession.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/ISftpSession.java
@@ -20,9 +20,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.session;
+package org.dromara.visor.module.terminal.handler.terminal.session;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SftpFileVO;
+import org.dromara.visor.module.terminal.handler.terminal.model.response.SftpFileVO;
import java.util.List;
@@ -35,11 +35,6 @@ import java.util.List;
*/
public interface ISftpSession extends ITerminalSession {
- /**
- * 建立连接
- */
- void connect();
-
/**
* 获取 home 路径
*
@@ -98,7 +93,23 @@ public interface ISftpSession extends ITerminalSession {
* @param path path
* @param mod mod
*/
- void chmod(String path, int mod);
+ void changeMode(String path, int mod);
+
+ /**
+ * 修改归属
+ *
+ * @param path path
+ * @param uid uid
+ */
+ void changeOwner(String path, int uid);
+
+ /**
+ * 修改分组
+ *
+ * @param path path
+ * @param gid gid
+ */
+ void changeGroup(String path, int gid);
/**
* 展开文件夹内的所有文件
@@ -125,10 +136,10 @@ public interface ISftpSession extends ITerminalSession {
void setContent(String path, String content);
/**
- * 检测文件是否可编辑
+ * 检测是否有文件编辑的权限
*
* @param path path
*/
- void checkCanEdit(String path);
+ void checkEditPermission(String path);
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/ISshSession.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/ISshSession.java
similarity index 62%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/ISshSession.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/ISshSession.java
index 056ee447..1f621fcc 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/ISshSession.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/ISshSession.java
@@ -20,7 +20,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.session;
+package org.dromara.visor.module.terminal.handler.terminal.session;
+
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ISshTerminalSender;
/**
* ssh 会话定义
@@ -31,35 +34,40 @@ package org.dromara.visor.module.asset.handler.host.terminal.session;
*/
public interface ISshSession extends ITerminalSession {
- /**
- * 连接
- *
- * @param terminalType terminalType
- * @param cols cols
- * @param rows rows
- */
- void connect(String terminalType, int cols, int rows);
-
/**
* 重置大小
*
- * @param cols cols
- * @param rows rows
+ * @param width width
+ * @param height height
*/
- void resize(int cols, int rows);
+ void resize(int width, int height);
/**
* 写入内容
*
- * @param b b
+ * @param in in
*/
- void write(String b);
+ void write(String in);
/**
- * 写入内容
+ * 响应输出
*
- * @param b b
+ * @param body body
*/
- void write(byte[] b);
+ void sendOutput(String body);
+
+ /**
+ * 获取会话属性
+ *
+ * @return props
+ */
+ TerminalChannelProps getProps();
+
+ /**
+ * 获取消息发送器
+ *
+ * @return sender
+ */
+ ISshTerminalSender getSender();
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/ITerminalSession.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/ITerminalSession.java
similarity index 63%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/ITerminalSession.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/ITerminalSession.java
index 43f96f7c..820ea1f5 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/ITerminalSession.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/ITerminalSession.java
@@ -20,10 +20,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.session;
+package org.dromara.visor.module.terminal.handler.terminal.session;
+import org.dromara.visor.module.terminal.handler.terminal.model.config.ITerminalSessionConfig;
import cn.orionsec.kit.lang.able.SafeCloseable;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalConfig;
/**
* 终端会话定义
@@ -35,25 +35,9 @@ import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalConfig
public interface ITerminalSession extends SafeCloseable {
/**
- * 获取 sessionId
- *
- * @return sessionId
+ * 建立连接
*/
- String getSessionId();
-
- /**
- * 获取 channelId
- *
- * @return channelId
- */
- String getChannelId();
-
- /**
- * 获取配置
- *
- * @return config
- */
- TerminalConfig getConfig();
+ void connect();
/**
* 活跃会话
@@ -65,6 +49,19 @@ public interface ITerminalSession extends SafeCloseable {
*/
void forceOffline();
+ /**
+ * 设置强制下线
+ */
+ void setForcedOffline();
+
+ /**
+ * 设置关闭状态
+ *
+ * @param code code
+ * @param message message
+ */
+ void setCloseStatus(Integer code, String message);
+
/**
* 是否已关闭
*
@@ -72,4 +69,32 @@ public interface ITerminalSession extends SafeCloseable {
*/
boolean isClosed();
+ /**
+ * 是否已连接
+ *
+ * @return connected
+ */
+ boolean isConnected();
+
+ /**
+ * 是否已强制下线
+ *
+ * @return forcedOffline
+ */
+ boolean isForcedOffline();
+
+ /**
+ * 获取 logId
+ *
+ * @return logId
+ */
+ Long getLogId();
+
+ /**
+ * 获取配置
+ *
+ * @return config
+ */
+ T getConfig();
+
}
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/session/RdpSession.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/RdpSession.java
new file mode 100644
index 00000000..e9507cad
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/RdpSession.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.handler.terminal.session;
+
+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.lang.utils.time.Dates;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.visor.common.constant.AppConst;
+import org.dromara.visor.common.utils.AesEncryptUtils;
+import org.dromara.visor.module.common.config.GuacdConfig;
+import org.dromara.visor.module.terminal.handler.guacd.GuacdTunnel;
+import org.dromara.visor.module.terminal.handler.guacd.IGuacdTunnel;
+import org.dromara.visor.module.terminal.handler.guacd.constant.GuacdConst;
+import org.dromara.visor.module.terminal.handler.guacd.constant.GuacdProtocol;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelExtra;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.model.config.TerminalSessionRdpConfig;
+import org.dromara.visor.module.terminal.handler.terminal.sender.IGuacdTerminalSender;
+
+/**
+ * rdp 会话
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2025/3/30 17:44
+ */
+@Slf4j
+public class RdpSession extends AbstractGuacdSession implements IRdpSession {
+
+ private final GuacdConfig guacdConfig;
+
+ public RdpSession(TerminalChannelProps props,
+ IGuacdTerminalSender sender,
+ TerminalSessionRdpConfig config,
+ GuacdConfig guacdConfig) {
+ super(props, sender, config);
+ this.guacdConfig = guacdConfig;
+ }
+
+ @Override
+ protected IGuacdTunnel createTunnel() {
+ return new GuacdTunnel(GuacdProtocol.RDP, sessionId, guacdConfig.getHost(), guacdConfig.getPort());
+ }
+
+ @Override
+ protected void setTunnelParams() {
+ TerminalChannelExtra extra = props.getExtra();
+ // 音频输入会导致无法连接先写死
+ extra.setEnableAudioInput(false);
+ // 设置低带宽模式
+ if (Booleans.isTrue(config.getLowBandwidthMode())) {
+ this.setLowBandwidthMode(extra);
+ }
+ // 主机信息
+ tunnel.remote(config.getHostAddress(), config.getHostPort());
+ // 身份信息
+ tunnel.auth(config.getUsername(), AesEncryptUtils.decryptAsString(config.getPassword()));
+ // 大小
+ tunnel.size(config.getWidth(), config.getHeight(), config.getDpi());
+ // 时区
+ tunnel.timezone(config.getTimezone());
+ // 忽略证书
+ tunnel.setParameter(GuacdConst.IGNORE_CERT, true);
+ // 域
+ tunnel.setParameter(GuacdConst.DOMAIN, Strings.def(config.getDomain(), (String) null));
+ // 系统布局
+ tunnel.setParameter(GuacdConst.SERVER_LAYOUT, config.getKeyboardLayout());
+ // 剪切板规范
+ tunnel.setParameter(GuacdConst.NORMALIZE_CLIPBOARD, config.getClipboardNormalize());
+ // 修改大小方法
+ tunnel.setParameter(GuacdConst.RESIZE_METHOD, Booleans.isTrue(config.getVersionGt81()) ? GuacdConst.RESIZE_METHOD_DISPLAY_UPDATE : GuacdConst.RESIZE_METHOD_RECONNECT);
+ // 显示设置
+ tunnel.setParameter(GuacdConst.COLOR_DEPTH, extra.getColorDepth());
+ tunnel.setParameter(GuacdConst.FORCE_LOSSLESS, extra.getForceLossless());
+ // 偏好设置
+ tunnel.setParameter(GuacdConst.ENABLE_WALLPAPER, extra.getEnableWallpaper());
+ tunnel.setParameter(GuacdConst.ENABLE_THEMING, extra.getEnableTheming());
+ tunnel.setParameter(GuacdConst.ENABLE_FONT_SMOOTHING, extra.getEnableFontSmoothing());
+ tunnel.setParameter(GuacdConst.ENABLE_FULL_WINDOW_DRAG, extra.getEnableFullWindowDrag());
+ tunnel.setParameter(GuacdConst.ENABLE_DESKTOP_COMPOSITION, extra.getEnableDesktopComposition());
+ tunnel.setParameter(GuacdConst.ENABLE_MENU_ANIMATIONS, extra.getEnableMenuAnimations());
+ tunnel.setParameter(GuacdConst.DISABLE_OFFSCREEN_CACHING, extra.getDisableOffscreenCaching());
+ tunnel.setParameter(GuacdConst.DISABLE_GLYPH_CACHING, extra.getDisableGlyphCaching());
+ tunnel.setParameter(GuacdConst.DISABLE_BITMAP_CACHING, extra.getDisableBitmapCaching());
+ // 音频
+ tunnel.setAudioMimeTypes(GuacdConst.AUDIO_MIMETYPES);
+ tunnel.setParameter(GuacdConst.ENABLE_AUDIO_INPUT, extra.getEnableAudioInput());
+ tunnel.setParameter(GuacdConst.DISABLE_AUDIO_OUTPUT, Booleans.isFalse(extra.getEnableAudioOutput()));
+ // 驱动
+ tunnel.setParameter(GuacdConst.CLIENT_NAME, AppConst.APP_NAME);
+ tunnel.setParameter(GuacdConst.ENABLE_DRIVE, true);
+ tunnel.setParameter(GuacdConst.CREATE_DRIVE_PATH, true);
+ tunnel.setParameter(GuacdConst.DRIVE_NAME, GuacdConst.DRIVE_DRIVE_NAME);
+ // 父文件夹必须存在 所以只能用 _ 分
+ tunnel.setParameter(GuacdConst.DRIVE_PATH, Files1.getPath(guacdConfig.getDrivePath() + "/" + Dates.current(Dates.YMD2) + "_" + props.getUserId() + "_" + props.getHostId()));
+ // 预连接
+ String preConnectionId = config.getPreConnectionId();
+ if (!Strings.isBlank(preConnectionId)) {
+ tunnel.setParameter(GuacdConst.SECURITY, GuacdConst.SECURITY_VMCONNECT);
+ tunnel.setParameter(GuacdConst.PRE_CONNECTION_ID, preConnectionId);
+ tunnel.setParameter(GuacdConst.PRE_CONNECTION_BLOB, config.getPreConnectionBlob());
+ }
+ // RemoteApp
+ String remoteApp = config.getRemoteApp();
+ if (!Strings.isBlank(remoteApp)) {
+ tunnel.setParameter(GuacdConst.REMOTE_APP, remoteApp);
+ tunnel.setParameter(GuacdConst.REMOTE_APP_DIR, Strings.def(config.getRemoteAppDir(), (String) null));
+ tunnel.setParameter(GuacdConst.REMOTE_APP_ARGS, Strings.def(config.getRemoteAppArgs(), (String) null));
+ }
+ }
+
+ @Override
+ public void resize(int width, int height) {
+ config.setWidth(width);
+ config.setHeight(height);
+ tunnel.writeInstruction("size", String.valueOf(width), String.valueOf(height));
+ }
+
+ /**
+ * 低带宽模式
+ *
+ * @param extra extra
+ */
+ private void setLowBandwidthMode(TerminalChannelExtra extra) {
+ extra.setColorDepth(8);
+ extra.setForceLossless(false);
+ extra.setEnableWallpaper(false);
+ extra.setEnableTheming(false);
+ extra.setEnableFontSmoothing(false);
+ extra.setEnableFullWindowDrag(false);
+ extra.setEnableDesktopComposition(false);
+ extra.setEnableMenuAnimations(false);
+ extra.setDisableBitmapCaching(false);
+ extra.setDisableGlyphCaching(false);
+ extra.setDisableBitmapCaching(false);
+ extra.setEnableAudioInput(false);
+ extra.setEnableAudioOutput(false);
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/SftpSession.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/SftpSession.java
similarity index 74%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/SftpSession.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/SftpSession.java
index 1e93e5aa..0fd5e7b2 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/SftpSession.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/SftpSession.java
@@ -20,12 +20,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.session;
+package org.dromara.visor.module.terminal.handler.terminal.session;
import cn.orionsec.kit.lang.utils.Exceptions;
import cn.orionsec.kit.lang.utils.Objects1;
import cn.orionsec.kit.lang.utils.Strings;
-import cn.orionsec.kit.lang.utils.io.FileType;
import cn.orionsec.kit.lang.utils.io.Files1;
import cn.orionsec.kit.lang.utils.io.Streams;
import cn.orionsec.kit.net.host.SessionStore;
@@ -35,12 +34,18 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.visor.common.constant.Const;
import org.dromara.visor.common.constant.ErrorMessage;
import org.dromara.visor.common.utils.Valid;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalConfig;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SftpFileVO;
-import org.springframework.web.socket.WebSocketSession;
+import org.dromara.visor.module.common.utils.SftpUtils;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.model.config.TerminalSessionSftpConfig;
+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.utils.SftpFileUtils;
import java.io.InputStream;
-import java.util.*;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
import java.util.stream.Collectors;
/**
@@ -51,17 +56,17 @@ import java.util.stream.Collectors;
* @since 2024/1/2 17:28
*/
@Slf4j
-public class SftpSession extends TerminalSession implements ISftpSession {
+public class SftpSession extends AbstractTerminalSession implements ISftpSession {
private final SessionStore sessionStore;
private SftpExecutor executor;
- public SftpSession(String sessionId,
- WebSocketSession channel,
- SessionStore sessionStore,
- TerminalConfig config) {
- super(sessionId, channel, config);
+ public SftpSession(TerminalChannelProps props,
+ ISftpTerminalSender sender,
+ TerminalSessionSftpConfig config,
+ SessionStore sessionStore) {
+ super(props, sender, config);
this.sessionStore = sessionStore;
}
@@ -69,7 +74,9 @@ public class SftpSession extends TerminalSession implements ISftpSession {
public void connect() {
// 打开 sftp
this.executor = sessionStore.getSftpExecutor(config.getFileNameCharset());
+ // 连接会话
executor.connect();
+ this.connected = true;
}
@Override
@@ -79,6 +86,7 @@ public class SftpSession extends TerminalSession implements ISftpSession {
@Override
public List list(String path, boolean showHiddenFile) {
+ // 获取路径
path = Files1.getPath(path);
// 查询文件
List files = executor.listFilesFilter(path,
@@ -94,24 +102,29 @@ public class SftpSession extends TerminalSession implements ISftpSession {
@Override
public void mkdir(String path) {
path = Valid.checkNormalize(path);
+ // 创建文件夹
executor.makeDirectories(path);
}
@Override
public void touch(String path) {
path = Valid.checkNormalize(path);
+ // 创建文件
executor.touch(path);
}
@Override
public void move(String source, String target) {
+ // 计算路径
source = Valid.checkNormalize(source);
+ target = SftpUtils.getAbsoluteTargetPath(source, target);
// 移动
executor.move(source, target);
}
@Override
public void remove(String[] paths) {
+ // 删除
Arrays.stream(paths)
.map(Valid::checkNormalize)
.forEach(executor::remove);
@@ -120,17 +133,34 @@ public class SftpSession extends TerminalSession implements ISftpSession {
@Override
public void truncate(String path) {
path = Valid.checkNormalize(path);
+ // 截断
executor.truncate(path);
}
@Override
- public void chmod(String path, int mod) {
+ public void changeMode(String path, int mod) {
path = Valid.checkNormalize(path);
+ // 修改权限
executor.changeMode(path, mod);
}
+ @Override
+ public void changeOwner(String path, int uid) {
+ path = Valid.checkNormalize(path);
+ // 修改归属
+ executor.changeOwner(path, uid);
+ }
+
+ @Override
+ public void changeGroup(String path, int gid) {
+ path = Valid.checkNormalize(path);
+ // 修改分组
+ executor.changeGroup(path, gid);
+ }
+
@Override
public List flatDirectory(String[] paths) {
+ // 展开
return Arrays.stream(paths)
.map(s -> executor.listFiles(s, true, false))
.flatMap(Collection::stream)
@@ -162,6 +192,7 @@ public class SftpSession extends TerminalSession implements ISftpSession {
@Override
public void setContent(String path, String content) {
path = Valid.checkNormalize(path);
+ // 写入
try {
executor.write(path, Strings.bytes(content, config.getFileContentCharset()));
} catch (Exception e) {
@@ -170,7 +201,7 @@ public class SftpSession extends TerminalSession implements ISftpSession {
}
@Override
- public void checkCanEdit(String path) {
+ public void checkEditPermission(String path) {
path = Valid.checkNormalize(path);
// 检查文件是否存在
Valid.isTrue(executor.isExist(path), ErrorMessage.FILE_ABSENT);
@@ -190,6 +221,7 @@ public class SftpSession extends TerminalSession implements ISftpSession {
protected void releaseResource() {
Streams.close(executor);
Streams.close(sessionStore);
+ Streams.close(sender);
}
/**
@@ -199,20 +231,9 @@ public class SftpSession extends TerminalSession implements ISftpSession {
* @return file
*/
private SftpFileVO fileMapping(SftpFile sftpFile) {
- SftpFileVO file = new SftpFileVO();
- file.setName(sftpFile.getName());
- file.setPath(sftpFile.getPath());
- file.setSuffix(Files1.getSuffix(sftpFile.getName()));
- file.setSize(sftpFile.getSize());
- file.setPermission(sftpFile.getPermission());
- file.setUid(sftpFile.getUid());
- file.setGid(sftpFile.getGid());
- file.setAttr(sftpFile.getPermissionString());
- file.setModifyTime(sftpFile.getModifyTime());
- Boolean isDir = Optional.ofNullable(FileType.of(file.getAttr()))
- .map(FileType.DIRECTORY::equals)
- .orElse(false);
- file.setIsDir(isDir);
+ // 转化文件
+ SftpFileVO file = SftpFileUtils.toFile(sftpFile);
+ // 设置权限
file.setCanPreview(this.calcCanPreview(sftpFile));
return file;
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/SshSession.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/SshSession.java
similarity index 56%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/SshSession.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/SshSession.java
index f16d16b2..6a23872a 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/session/SshSession.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/SshSession.java
@@ -20,20 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.session;
+package org.dromara.visor.module.terminal.handler.terminal.session;
import cn.orionsec.kit.lang.utils.io.Streams;
import cn.orionsec.kit.net.host.SessionStore;
import cn.orionsec.kit.net.host.ssh.shell.ShellExecutor;
-import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.dromara.visor.common.constant.Const;
-import org.dromara.visor.framework.websocket.core.utils.WebSockets;
-import org.dromara.visor.module.asset.define.AssetThreadPools;
-import org.dromara.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalConfig;
-import org.dromara.visor.module.asset.handler.host.terminal.model.response.SshOutputResponse;
-import org.springframework.web.socket.WebSocketSession;
+import org.dromara.visor.module.terminal.define.TerminalThreadPools;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.terminal.model.config.TerminalSessionSshConfig;
+import org.dromara.visor.module.terminal.handler.terminal.sender.ISshTerminalSender;
import java.io.BufferedInputStream;
import java.io.IOException;
@@ -47,58 +44,81 @@ import java.io.InputStream;
* @since 2024/1/2 17:28
*/
@Slf4j
-public class SshSession extends TerminalSession implements ISshSession {
+public class SshSession extends AbstractTerminalSession implements ISshSession {
private final SessionStore sessionStore;
private ShellExecutor executor;
- @Getter
- private String lastLine;
-
- public SshSession(String sessionId,
- WebSocketSession channel,
- SessionStore sessionStore,
- TerminalConfig config) {
- super(sessionId, channel, config);
+ public SshSession(TerminalChannelProps props,
+ ISshTerminalSender sender,
+ TerminalSessionSshConfig config,
+ SessionStore sessionStore) {
+ super(props, sender, config);
this.sessionStore = sessionStore;
}
@Override
- public void connect(String terminalType, int cols, int rows) {
- config.setCols(cols);
- config.setRows(rows);
+ public void connect() {
+ String terminalType = config.getTerminalType();
+ Integer width = config.getWidth();
+ Integer height = config.getHeight();
+ config.setWidth(width);
+ config.setHeight(height);
// 打开 shell
this.executor = sessionStore.getShellExecutor();
- executor.size(cols, rows);
+ executor.size(width, height);
executor.terminalType(terminalType);
executor.streamHandler(this::streamHandler);
executor.callback(this::close);
+ // 连接会话
executor.connect();
+ this.connected = true;
// 开始监听输出
- AssetThreadPools.TERMINAL_STDOUT.execute(executor);
+ TerminalThreadPools.TERMINAL_STDOUT.execute(executor);
+ }
+
+ /**
+ * 标准输出处理
+ *
+ * @param inputStream stream
+ */
+ private void streamHandler(InputStream inputStream) {
+ int bufferSize = Const.BUFFER_KB_4;
+ byte[] bs = new byte[bufferSize];
+ BufferedInputStream in = new BufferedInputStream(inputStream, bufferSize);
+ int read;
+ try {
+ while (sender.isOpen() && (read = in.read(bs)) != -1) {
+ // 响应
+ this.sendOutput(new String(bs, 0, read, config.getCharset()));
+ }
+ } catch (IOException ex) {
+ log.error("terminal 读取流失败", ex);
+ }
}
@Override
- public void resize(int cols, int rows) {
+ public void resize(int width, int height) {
// 大小发生变化 则修改大小
- if (cols != config.getCols() ||
- rows != config.getRows()) {
- config.setCols(cols);
- config.setRows(rows);
- executor.size(cols, rows);
+ if (width != config.getWidth() || height != config.getHeight()) {
+ config.setWidth(width);
+ config.setHeight(height);
+ // 设置会话大小
+ executor.size(width, height);
executor.resize();
}
}
@Override
- public void write(String b) {
- executor.write(b);
+ public void write(String in) {
+ executor.write(in);
}
@Override
- public void write(byte[] b) {
- executor.write(b);
+ public void sendOutput(String body) {
+ // 响应会话
+ sender.sendOutput(body);
}
@Override
@@ -115,31 +135,7 @@ public class SshSession extends TerminalSession implements ISshSession {
protected void releaseResource() {
Streams.close(executor);
Streams.close(sessionStore);
- }
-
- /**
- * 标准输出处理
- *
- * @param inputStream stream
- */
- private void streamHandler(InputStream inputStream) {
- byte[] bs = new byte[Const.BUFFER_KB_4];
- BufferedInputStream in = new BufferedInputStream(inputStream, Const.BUFFER_KB_4);
- int read;
- try {
- while (channel.isOpen() && (read = in.read(bs)) != -1) {
- String body = lastLine = new String(bs, 0, read, config.getCharset());
- // 响应
- SshOutputResponse resp = SshOutputResponse.builder()
- .type(OutputTypeEnum.SSH_OUTPUT.getType())
- .sessionId(sessionId)
- .body(body)
- .build();
- WebSockets.sendText(channel, OutputTypeEnum.SSH_OUTPUT.format(resp));
- }
- } catch (IOException ex) {
- log.error("terminal 读取流失败", ex);
- }
+ Streams.close(sender);
}
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/utils/TerminalUtils.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/utils/TerminalUtils.java
similarity index 74%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/utils/TerminalUtils.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/utils/TerminalUtils.java
index c1c25c75..5c1b8248 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/terminal/utils/TerminalUtils.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/utils/TerminalUtils.java
@@ -20,13 +20,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.terminal.utils;
+package org.dromara.visor.module.terminal.handler.terminal.utils;
-import org.dromara.visor.common.constant.ExtraFieldConst;
import org.dromara.visor.framework.biz.operator.log.core.model.OperatorLogModel;
import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogFiller;
-import org.dromara.visor.framework.websocket.core.utils.WebSockets;
-import org.springframework.web.socket.WebSocketSession;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
import java.util.Map;
@@ -45,27 +43,25 @@ public class TerminalUtils {
/**
* 获取操作日志模型
*
- * @param channel channel
+ * @param props props
* @param extra extra
* @param type type
* @param startTime startTime
* @param ex ex
* @return model
*/
- public static OperatorLogModel getOperatorLogModel(WebSocketSession channel,
+ public static OperatorLogModel getOperatorLogModel(TerminalChannelProps props,
Map extra,
String type,
long startTime,
Exception ex) {
- // 日志参数
return OperatorLogFiller.create()
// 填充用户信息
- .fillUserInfo(WebSockets.getAttr(channel, ExtraFieldConst.USER_ID),
- WebSockets.getAttr(channel, ExtraFieldConst.USERNAME))
+ .fillUserInfo(props.getUserId(), props.getUsername())
// 填充 traceId
- .fillTraceId(WebSockets.getAttr(channel, ExtraFieldConst.TRACE_ID))
+ .fillTraceId(props.getTraceId())
// 填充请求留痕信息
- .fillIdentity(WebSockets.getAttr(channel, ExtraFieldConst.IDENTITY))
+ .fillIdentity(props.getIdentity())
// 填充使用时间
.fillUsedTime(startTime)
// 填充结果信息
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/TransferMessageDispatcher.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/TransferMessageDispatcher.java
similarity index 65%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/TransferMessageDispatcher.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/TransferMessageDispatcher.java
index 54c1f261..ec099bc3 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/TransferMessageDispatcher.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/TransferMessageDispatcher.java
@@ -20,15 +20,18 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer;
+package org.dromara.visor.module.terminal.handler.transfer;
import cn.orionsec.kit.lang.utils.io.Streams;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.module.asset.handler.host.transfer.handler.ITransferHandler;
-import org.dromara.visor.module.asset.handler.host.transfer.handler.TransferHandler;
-import org.dromara.visor.module.asset.handler.host.transfer.manager.TerminalTransferManager;
-import org.dromara.visor.module.asset.handler.host.transfer.model.TransferOperatorRequest;
+import org.dromara.visor.common.constant.FieldConst;
+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.transfer.handler.ITransferHandler;
+import org.dromara.visor.module.terminal.handler.transfer.handler.TransferHandler;
+import org.dromara.visor.module.terminal.handler.transfer.manager.TerminalTransferManager;
+import org.dromara.visor.module.terminal.handler.transfer.model.TransferOperatorRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.BinaryMessage;
import org.springframework.web.socket.CloseStatus;
@@ -53,36 +56,37 @@ public class TransferMessageDispatcher extends AbstractWebSocketHandler {
private TerminalTransferManager terminalTransferManager;
@Override
- public void afterConnectionEstablished(WebSocketSession session) {
- log.info("TransferMessageHandler-afterConnectionEstablished id: {}", session.getId());
+ public void afterConnectionEstablished(WebSocketSession channel) {
+ log.info("TransferMessageHandler-afterConnectionEstablished id: {}", channel.getId());
+ TerminalChannelProps props = WebSockets.getAttr(channel, FieldConst.PROPS);
// 添加处理器
- terminalTransferManager.putHandler(session.getId(), new TransferHandler(session));
+ terminalTransferManager.putHandler(channel.getId(), new TransferHandler(props, channel));
}
@Override
- protected void handleTextMessage(WebSocketSession session, TextMessage message) {
+ protected void handleTextMessage(WebSocketSession channel, TextMessage message) {
// 获取处理器
- ITransferHandler handler = terminalTransferManager.getHandler(session.getId());
+ ITransferHandler handler = terminalTransferManager.getHandler(channel.getId());
// 处理消息
handler.handleMessage(JSON.parseObject(message.getPayload(), TransferOperatorRequest.class));
}
@Override
- protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) {
+ protected void handleBinaryMessage(WebSocketSession channel, BinaryMessage message) {
// 获取处理器
- ITransferHandler handler = terminalTransferManager.getHandler(session.getId());
+ ITransferHandler handler = terminalTransferManager.getHandler(channel.getId());
// 添加数据
handler.handleMessage(message.getPayload().array());
}
@Override
- public void handleTransportError(WebSocketSession session, Throwable exception) {
- log.error("TransferMessageHandler-handleTransportError id: {}", session.getId(), exception);
+ public void handleTransportError(WebSocketSession channelId, Throwable exception) {
+ log.error("TransferMessageHandler-handleTransportError id: {}", channelId.getId(), exception);
}
@Override
- public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
- String id = session.getId();
+ public void afterConnectionClosed(WebSocketSession channel, CloseStatus status) {
+ String id = channel.getId();
log.info("TransferMessageHandler-afterConnectionClosed id: {}, code: {}, reason: {}", id, status.getCode(), status.getReason());
// 关闭会话
Streams.close(terminalTransferManager.removeHandler(id));
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/enums/TransferOperator.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/enums/TransferOperator.java
similarity index 95%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/enums/TransferOperator.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/enums/TransferOperator.java
index 353c2d25..6bd12cfc 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/enums/TransferOperator.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/enums/TransferOperator.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.enums;
+package org.dromara.visor.module.terminal.handler.transfer.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/enums/TransferReceiver.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/enums/TransferReceiver.java
similarity index 96%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/enums/TransferReceiver.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/enums/TransferReceiver.java
index 2d4244f6..409c4ce8 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/enums/TransferReceiver.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/enums/TransferReceiver.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.enums;
+package org.dromara.visor.module.terminal.handler.transfer.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/enums/TransferType.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/enums/TransferType.java
similarity index 95%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/enums/TransferType.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/enums/TransferType.java
index a22c8809..dffde51f 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/enums/TransferType.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/enums/TransferType.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.enums;
+package org.dromara.visor.module.terminal.handler.transfer.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/handler/ITransferHandler.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/handler/ITransferHandler.java
similarity index 85%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/handler/ITransferHandler.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/handler/ITransferHandler.java
index 86f36463..e5fc8d1b 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/handler/ITransferHandler.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/handler/ITransferHandler.java
@@ -20,11 +20,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.handler;
+package org.dromara.visor.module.terminal.handler.transfer.handler;
+import org.dromara.visor.module.terminal.handler.transfer.model.TransferOperatorRequest;
+import org.dromara.visor.module.terminal.handler.transfer.session.ITransferSession;
import cn.orionsec.kit.lang.able.SafeCloseable;
-import org.dromara.visor.module.asset.handler.host.transfer.model.TransferOperatorRequest;
-import org.dromara.visor.module.asset.handler.host.transfer.session.ITransferSession;
/**
* 传输处理器定义
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/handler/TransferHandler.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/handler/TransferHandler.java
similarity index 65%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/handler/TransferHandler.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/handler/TransferHandler.java
index 92e26170..9fcde31d 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/handler/TransferHandler.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/handler/TransferHandler.java
@@ -20,27 +20,26 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.handler;
+package org.dromara.visor.module.terminal.handler.transfer.handler;
import cn.orionsec.kit.lang.id.UUIds;
import cn.orionsec.kit.lang.utils.io.Streams;
import cn.orionsec.kit.net.host.SessionStore;
import cn.orionsec.kit.spring.SpringHolder;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.common.constant.ExtraFieldConst;
-import org.dromara.visor.framework.websocket.core.utils.WebSockets;
-import org.dromara.visor.module.asset.entity.dto.TerminalConnectDTO;
-import org.dromara.visor.module.asset.handler.host.jsch.SessionStores;
-import org.dromara.visor.module.asset.handler.host.transfer.enums.TransferOperator;
-import org.dromara.visor.module.asset.handler.host.transfer.enums.TransferReceiver;
-import org.dromara.visor.module.asset.handler.host.transfer.enums.TransferType;
-import org.dromara.visor.module.asset.handler.host.transfer.model.TerminalConnection;
-import org.dromara.visor.module.asset.handler.host.transfer.model.TransferOperatorRequest;
-import org.dromara.visor.module.asset.handler.host.transfer.session.DownloadSession;
-import org.dromara.visor.module.asset.handler.host.transfer.session.ITransferSession;
-import org.dromara.visor.module.asset.handler.host.transfer.session.UploadSession;
-import org.dromara.visor.module.asset.handler.host.transfer.utils.TransferUtils;
-import org.dromara.visor.module.asset.service.HostConnectService;
+import org.dromara.visor.common.session.config.SshConnectConfig;
+import org.dromara.visor.common.session.ssh.SessionStores;
+import org.dromara.visor.module.asset.api.HostConnectApi;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.handler.transfer.enums.TransferOperator;
+import org.dromara.visor.module.terminal.handler.transfer.enums.TransferReceiver;
+import org.dromara.visor.module.terminal.handler.transfer.enums.TransferType;
+import org.dromara.visor.module.terminal.handler.transfer.model.TerminalConnection;
+import org.dromara.visor.module.terminal.handler.transfer.model.TransferOperatorRequest;
+import org.dromara.visor.module.terminal.handler.transfer.session.DownloadSession;
+import org.dromara.visor.module.terminal.handler.transfer.session.ITransferSession;
+import org.dromara.visor.module.terminal.handler.transfer.session.UploadSession;
+import org.dromara.visor.module.terminal.handler.transfer.utils.TransferUtils;
import org.springframework.web.socket.WebSocketSession;
import java.util.concurrent.ConcurrentHashMap;
@@ -55,7 +54,9 @@ import java.util.concurrent.ConcurrentHashMap;
@Slf4j
public class TransferHandler implements ITransferHandler {
- private static final HostConnectService hostConnectService = SpringHolder.getBean(HostConnectService.class);
+ private static final HostConnectApi hostConnectApi = SpringHolder.getBean(HostConnectApi.class);
+
+ private final TerminalChannelProps props;
private final WebSocketSession channel;
@@ -63,12 +64,13 @@ public class TransferHandler implements ITransferHandler {
private final ConcurrentHashMap sessions;
- private final ConcurrentHashMap terminalConnections;
+ private final ConcurrentHashMap connectionMap;
- public TransferHandler(WebSocketSession channel) {
+ public TransferHandler(TerminalChannelProps props, WebSocketSession channel) {
+ this.props = props;
this.channel = channel;
this.sessions = new ConcurrentHashMap<>();
- this.terminalConnections = new ConcurrentHashMap<>();
+ this.connectionMap = new ConcurrentHashMap<>();
}
@Override
@@ -113,26 +115,25 @@ public class TransferHandler implements ITransferHandler {
String sessionKey = hostId + "_" + type.getType();
try {
// 获取终端连接信息
- TerminalConnection terminalConnection = terminalConnections.get(hostId);
- if (terminalConnection == null) {
+ TerminalConnection connection = connectionMap.get(hostId);
+ if (connection == null) {
// 获取终端连接信息
- Long userId = WebSockets.getAttr(channel, ExtraFieldConst.USER_ID);
- TerminalConnectDTO connectInfo = hostConnectService.getSshConnectInfo(hostId, userId);
- terminalConnection = new TerminalConnection(connectInfo, SessionStores.openSessionStore(connectInfo));
- terminalConnections.put(hostId, terminalConnection);
+ SshConnectConfig connectConfig = hostConnectApi.getSshConnectConfig(hostId, props.getUserId());
+ connection = new TerminalConnection(connectConfig, SessionStores.openSessionStore(connectConfig));
+ connectionMap.put(hostId, connection);
}
- SessionStore sessionStore = terminalConnection.getSessionStore();
- TerminalConnectDTO connectInfo = terminalConnection.getConnectInfo();
+ SessionStore sessionStore = connection.getSessionStore();
+ SshConnectConfig connectConfig = connection.getConnectConfig();
// 获取会话
ITransferSession session = sessions.get(sessionKey);
if (session == null) {
// 打开会话并初始化
if (TransferType.UPLOAD.equals(type)) {
// 上传会话
- session = new UploadSession(connectInfo, sessionStore, this.channel);
+ session = new UploadSession(connectConfig, sessionStore, this.channel);
} else if (TransferType.DOWNLOAD.equals(type)) {
// 下载会话
- session = new DownloadSession(connectInfo, sessionStore, this.channel);
+ session = new DownloadSession(connectConfig, sessionStore, this.channel);
}
session.init();
sessions.put(sessionKey, session);
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/manager/TerminalTransferManager.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/manager/TerminalTransferManager.java
similarity index 91%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/manager/TerminalTransferManager.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/manager/TerminalTransferManager.java
index d888cf4b..f10dcee0 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/manager/TerminalTransferManager.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/manager/TerminalTransferManager.java
@@ -20,9 +20,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.manager;
+package org.dromara.visor.module.terminal.handler.transfer.manager;
-import org.dromara.visor.module.asset.handler.host.transfer.handler.ITransferHandler;
+import org.dromara.visor.module.terminal.handler.transfer.handler.ITransferHandler;
import org.springframework.stereotype.Component;
import java.util.concurrent.ConcurrentHashMap;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/model/TerminalConnection.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/model/TerminalConnection.java
similarity index 86%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/model/TerminalConnection.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/model/TerminalConnection.java
index 878dca5d..1792f9cf 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/model/TerminalConnection.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/model/TerminalConnection.java
@@ -20,14 +20,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.model;
+package org.dromara.visor.module.terminal.handler.transfer.model;
+import org.dromara.visor.common.session.config.SshConnectConfig;
import cn.orionsec.kit.net.host.SessionStore;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import org.dromara.visor.module.asset.entity.dto.TerminalConnectDTO;
/**
* 终端连接信息
@@ -43,9 +43,9 @@ import org.dromara.visor.module.asset.entity.dto.TerminalConnectDTO;
public class TerminalConnection {
/**
- * connectInfo
+ * 连接信息
*/
- private TerminalConnectDTO connectInfo;
+ private SshConnectConfig connectConfig;
/**
* sessionStore
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/model/TransferOperatorRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/model/TransferOperatorRequest.java
similarity index 89%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/model/TransferOperatorRequest.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/model/TransferOperatorRequest.java
index 04f1dada..dd772baa 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/model/TransferOperatorRequest.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/model/TransferOperatorRequest.java
@@ -20,13 +20,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.model;
+package org.dromara.visor.module.terminal.handler.transfer.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
+import java.util.List;
+
/**
* 文件操作请求 实体对象
*
@@ -60,6 +62,11 @@ public class TransferOperatorRequest {
*/
private Long hostId;
+ /**
+ * 被压缩文件路径
+ */
+ private List paths;
+
/**
* 错误信息 后端赋值
*/
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/model/TransferOperatorResponse.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/model/TransferOperatorResponse.java
similarity index 95%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/model/TransferOperatorResponse.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/model/TransferOperatorResponse.java
index af1bfdc8..735f3117 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/model/TransferOperatorResponse.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/model/TransferOperatorResponse.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.model;
+package org.dromara.visor.module.terminal.handler.transfer.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/session/DownloadSession.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/DownloadSession.java
similarity index 89%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/session/DownloadSession.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/session/DownloadSession.java
index 2c5b9a87..2abebf17 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/session/DownloadSession.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/DownloadSession.java
@@ -20,8 +20,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.session;
+package org.dromara.visor.module.terminal.handler.transfer.session;
+import org.dromara.visor.common.constant.Const;
+import org.dromara.visor.common.constant.ErrorMessage;
+import org.dromara.visor.common.session.config.SshConnectConfig;
+import org.dromara.visor.module.terminal.define.TerminalThreadPools;
+import org.dromara.visor.module.terminal.define.operator.TerminalOperatorType;
+import org.dromara.visor.module.terminal.handler.transfer.enums.TransferReceiver;
+import org.dromara.visor.module.terminal.handler.transfer.model.TransferOperatorRequest;
+import org.dromara.visor.module.terminal.handler.transfer.utils.TransferUtils;
import cn.orionsec.kit.lang.define.wrapper.Ref;
import cn.orionsec.kit.lang.utils.Threads;
import cn.orionsec.kit.lang.utils.Valid;
@@ -29,14 +37,6 @@ import cn.orionsec.kit.lang.utils.io.Streams;
import cn.orionsec.kit.net.host.SessionStore;
import cn.orionsec.kit.net.host.sftp.SftpFile;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.common.constant.Const;
-import org.dromara.visor.common.constant.ErrorMessage;
-import org.dromara.visor.module.asset.define.AssetThreadPools;
-import org.dromara.visor.module.asset.define.operator.TerminalOperatorType;
-import org.dromara.visor.module.asset.entity.dto.TerminalConnectDTO;
-import org.dromara.visor.module.asset.handler.host.transfer.enums.TransferReceiver;
-import org.dromara.visor.module.asset.handler.host.transfer.model.TransferOperatorRequest;
-import org.dromara.visor.module.asset.handler.host.transfer.utils.TransferUtils;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
import org.springframework.web.socket.WebSocketSession;
@@ -61,8 +61,8 @@ public class DownloadSession extends TransferSession implements StreamingRespons
private Long fileSize;
- public DownloadSession(TerminalConnectDTO connectInfo, SessionStore sessionStore, WebSocketSession channel) {
- super(connectInfo, sessionStore, channel);
+ public DownloadSession(SshConnectConfig connectConfig, SessionStore sessionStore, WebSocketSession channel) {
+ super(connectConfig, sessionStore, channel);
this.fileSize = 0L;
}
@@ -143,7 +143,7 @@ public class DownloadSession extends TransferSession implements StreamingRespons
ex.set(e);
}
// 传输结束 异步处理
- AssetThreadPools.TERMINAL_OPERATOR.execute(() -> this.onTransferFinish(ex.getValue()));
+ TerminalThreadPools.TERMINAL_OPERATOR.execute(() -> this.onTransferFinish(ex.getValue()));
}
/**
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/session/ITransferSession.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/ITransferSession.java
similarity index 92%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/session/ITransferSession.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/session/ITransferSession.java
index 04615754..37d9e3fe 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/session/ITransferSession.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/ITransferSession.java
@@ -20,10 +20,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.session;
+package org.dromara.visor.module.terminal.handler.transfer.session;
+import org.dromara.visor.module.terminal.handler.transfer.model.TransferOperatorRequest;
import cn.orionsec.kit.lang.able.SafeCloseable;
-import org.dromara.visor.module.asset.handler.host.transfer.model.TransferOperatorRequest;
/**
* 主机传输会话定义
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/session/TransferSession.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/TransferSession.java
similarity index 74%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/session/TransferSession.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/transfer/session/TransferSession.java
index e1f77744..2ce2dcc6 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/session/TransferSession.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/TransferSession.java
@@ -20,25 +20,27 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.session;
+package org.dromara.visor.module.terminal.handler.transfer.session;
+import org.dromara.visor.common.constant.FieldConst;
+import org.dromara.visor.common.session.config.SshConnectConfig;
+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.record.TerminalAsyncSaver;
+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.TransferOperatorRequest;
+import org.dromara.visor.module.terminal.handler.transfer.utils.TransferUtils;
import cn.orionsec.kit.lang.exception.argument.InvalidArgumentException;
import cn.orionsec.kit.lang.utils.collect.Maps;
import cn.orionsec.kit.lang.utils.io.Streams;
import cn.orionsec.kit.net.host.SessionStore;
import cn.orionsec.kit.net.host.sftp.SftpExecutor;
-import cn.orionsec.kit.spring.SpringHolder;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.framework.biz.operator.log.core.model.OperatorLogModel;
-import org.dromara.visor.framework.biz.operator.log.core.service.OperatorLogFrameworkService;
-import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs;
-import org.dromara.visor.module.asset.entity.dto.TerminalConnectDTO;
-import org.dromara.visor.module.asset.handler.host.terminal.utils.TerminalUtils;
-import org.dromara.visor.module.asset.handler.host.transfer.enums.TransferReceiver;
-import org.dromara.visor.module.asset.handler.host.transfer.model.TransferOperatorRequest;
-import org.dromara.visor.module.asset.handler.host.transfer.utils.TransferUtils;
import org.springframework.web.socket.WebSocketSession;
import java.util.Map;
@@ -53,7 +55,7 @@ import java.util.Map;
@Slf4j
public abstract class TransferSession implements ITransferSession {
- protected final TerminalConnectDTO connectInfo;
+ protected final SshConnectConfig connectConfig;
protected final SessionStore sessionStore;
@@ -70,8 +72,8 @@ public abstract class TransferSession implements ITransferSession {
@Setter
protected String token;
- public TransferSession(TerminalConnectDTO connectInfo, SessionStore sessionStore, WebSocketSession channel) {
- this.connectInfo = connectInfo;
+ public TransferSession(SshConnectConfig connectConfig, SessionStore sessionStore, WebSocketSession channel) {
+ this.connectConfig = connectConfig;
this.sessionStore = sessionStore;
this.channel = channel;
this.channelId = channel.getId();
@@ -81,7 +83,7 @@ public abstract class TransferSession implements ITransferSession {
public void init() {
if (executor == null) {
// 建立连接
- this.executor = sessionStore.getSftpExecutor(connectInfo.getFileNameCharset());
+ this.executor = sessionStore.getSftpExecutor(connectConfig.getFileNameCharset());
executor.connect();
} else {
// 检查连接
@@ -139,7 +141,7 @@ public abstract class TransferSession implements ITransferSession {
@Override
public Long getHostId() {
- return connectInfo.getHostId();
+ return connectConfig.getHostId();
}
/**
@@ -152,13 +154,14 @@ public abstract class TransferSession implements ITransferSession {
// 设置参数
Map extra = Maps.newMap();
extra.put(OperatorLogs.PATH, path);
- extra.put(OperatorLogs.HOST_ID, connectInfo.getHostId());
- extra.put(OperatorLogs.HOST_NAME, connectInfo.getHostName());
- extra.put(OperatorLogs.ADDRESS, connectInfo.getHostAddress());
+ extra.put(OperatorLogs.HOST_ID, connectConfig.getHostId());
+ extra.put(OperatorLogs.HOST_NAME, connectConfig.getHostName());
+ extra.put(OperatorLogs.ADDRESS, connectConfig.getHostAddress());
// 获取日志
- OperatorLogModel model = TerminalUtils.getOperatorLogModel(this.channel, extra, type, System.currentTimeMillis(), null);
+ TerminalChannelProps props = WebSockets.getAttr(channel, FieldConst.PROPS);
+ OperatorLogModel model = TerminalUtils.getOperatorLogModel(props, extra, type, System.currentTimeMillis(), null);
// 保存
- SpringHolder.getBean(OperatorLogFrameworkService.class).insert(model);
+ TerminalAsyncSaver.saveOperatorLog(model);
}
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/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
similarity index 82%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/session/UploadSession.java
rename to 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 e63b814c..f1a5998d 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/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
@@ -20,17 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.session;
+package org.dromara.visor.module.terminal.handler.transfer.session;
+import org.dromara.visor.common.session.config.SshConnectConfig;
+import org.dromara.visor.module.common.utils.SftpUtils;
+import org.dromara.visor.module.terminal.define.operator.TerminalOperatorType;
+import org.dromara.visor.module.terminal.handler.transfer.enums.TransferReceiver;
+import org.dromara.visor.module.terminal.handler.transfer.model.TransferOperatorRequest;
+import org.dromara.visor.module.terminal.handler.transfer.utils.TransferUtils;
import cn.orionsec.kit.lang.utils.io.Streams;
import cn.orionsec.kit.net.host.SessionStore;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.module.asset.define.operator.TerminalOperatorType;
-import org.dromara.visor.module.asset.entity.dto.TerminalConnectDTO;
-import org.dromara.visor.module.asset.handler.host.transfer.enums.TransferReceiver;
-import org.dromara.visor.module.asset.handler.host.transfer.model.TransferOperatorRequest;
-import org.dromara.visor.module.asset.handler.host.transfer.utils.TransferUtils;
-import org.dromara.visor.module.asset.utils.SftpUtils;
import org.springframework.web.socket.WebSocketSession;
import java.io.IOException;
@@ -48,8 +48,8 @@ public class UploadSession extends TransferSession {
protected OutputStream outputStream;
- public UploadSession(TerminalConnectDTO connectInfo, SessionStore sessionStore, WebSocketSession channel) {
- super(connectInfo, sessionStore, channel);
+ public UploadSession(SshConnectConfig connectConfig, SessionStore sessionStore, WebSocketSession channel) {
+ super(connectConfig, sessionStore, channel);
}
@Override
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/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
similarity index 92%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/transfer/utils/TransferUtils.java
rename to 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 d95c5963..5736cb25 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/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
@@ -20,15 +20,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.handler.host.transfer.utils;
+package org.dromara.visor.module.terminal.handler.transfer.utils;
+import org.dromara.visor.common.constant.ErrorMessage;
+import org.dromara.visor.framework.websocket.core.utils.WebSockets;
+import org.dromara.visor.module.terminal.handler.transfer.enums.TransferReceiver;
+import org.dromara.visor.module.terminal.handler.transfer.model.TransferOperatorResponse;
import cn.orionsec.kit.lang.utils.Strings;
import com.alibaba.fastjson.JSON;
import org.apache.catalina.connector.ClientAbortException;
-import org.dromara.visor.common.constant.ErrorMessage;
-import org.dromara.visor.framework.websocket.core.utils.WebSockets;
-import org.dromara.visor.module.asset.handler.host.transfer.enums.TransferReceiver;
-import org.dromara.visor.module.asset.handler.host.transfer.model.TransferOperatorResponse;
import org.springframework.web.socket.WebSocketSession;
import java.util.function.Consumer;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/interceptor/TerminalAccessInterceptor.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/interceptor/TerminalAccessInterceptor.java
similarity index 53%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/interceptor/TerminalAccessInterceptor.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/interceptor/TerminalAccessInterceptor.java
index 6869e625..dc5f0447 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/interceptor/TerminalAccessInterceptor.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/interceptor/TerminalAccessInterceptor.java
@@ -20,15 +20,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.interceptor;
+package org.dromara.visor.module.terminal.interceptor;
+import cn.orionsec.kit.lang.define.collect.MutableHashMap;
import cn.orionsec.kit.lang.utils.Urls;
+import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.common.constant.ExtraFieldConst;
+import org.dromara.visor.common.constant.FieldConst;
import org.dromara.visor.common.trace.TraceIdHolder;
import org.dromara.visor.common.utils.Requests;
-import org.dromara.visor.module.asset.entity.dto.TerminalAccessDTO;
-import org.dromara.visor.module.asset.service.TerminalService;
+import org.dromara.visor.framework.websocket.core.utils.WebSockets;
+import org.dromara.visor.module.terminal.entity.dto.TerminalAccessDTO;
+import org.dromara.visor.module.terminal.handler.terminal.enums.SessionChannelEnum;
+import org.dromara.visor.module.terminal.handler.terminal.enums.SessionTypeEnum;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelExtra;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.service.TerminalService;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
@@ -53,7 +60,9 @@ public class TerminalAccessInterceptor implements HandshakeInterceptor {
private TerminalService terminalService;
@Override
- public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception {
+ public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) {
+ // 设置子协议
+ WebSockets.setSubProtocols(request, response);
// 获取 accessToken
String accessToken = Urls.getUrlSource(request.getURI().getPath());
log.info("TerminalAccessInterceptor-beforeHandshake start accessToken: {}", accessToken);
@@ -63,11 +72,20 @@ public class TerminalAccessInterceptor implements HandshakeInterceptor {
log.error("TerminalAccessInterceptor-beforeHandshake absent accessToken: {}", accessToken);
return false;
}
- // 设置参数
- attributes.put(ExtraFieldConst.USER_ID, access.getUserId());
- attributes.put(ExtraFieldConst.USERNAME, access.getUsername());
- attributes.put(ExtraFieldConst.TRACE_ID, TraceIdHolder.get());
- attributes.put(ExtraFieldConst.IDENTITY, Requests.getIdentity());
+ // 设置属性
+ TerminalChannelProps props = TerminalChannelProps.builder()
+ .type(SessionTypeEnum.TERMINAL.name())
+ .channel(SessionChannelEnum.WEB.name())
+ .hostId(access.getHostId())
+ .userId(access.getUserId())
+ .username(access.getUsername())
+ .nickname(access.getNickname())
+ .traceId(TraceIdHolder.get())
+ .identity(Requests.getIdentity())
+ .extra(this.toExtra(access))
+ .attr(new MutableHashMap<>())
+ .build();
+ attributes.put(FieldConst.PROPS, props);
return true;
}
@@ -75,4 +93,23 @@ public class TerminalAccessInterceptor implements HandshakeInterceptor {
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
}
+ /**
+ * 转为 extra
+ *
+ * @param access access
+ * @return extra
+ */
+ private TerminalChannelExtra toExtra(TerminalAccessDTO access) {
+ TerminalChannelExtra extra;
+ // 解析参数
+ Map extraMap = access.getExtra();
+ if (extraMap == null) {
+ extra = new TerminalChannelExtra();
+ } else {
+ extra = JSON.parseObject(JSON.toJSONString(extraMap), TerminalChannelExtra.class);
+ }
+ extra.setConnectType(access.getConnectType());
+ return extra;
+ }
+
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/interceptor/TerminalTransferInterceptor.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/interceptor/TerminalTransferInterceptor.java
similarity index 66%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/interceptor/TerminalTransferInterceptor.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/interceptor/TerminalTransferInterceptor.java
index 6536fb0a..57376ade 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/interceptor/TerminalTransferInterceptor.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/interceptor/TerminalTransferInterceptor.java
@@ -20,15 +20,20 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.interceptor;
+package org.dromara.visor.module.terminal.interceptor;
-import cn.orionsec.kit.lang.utils.Urls;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.common.constant.ExtraFieldConst;
+import org.dromara.visor.common.constant.FieldConst;
import org.dromara.visor.common.trace.TraceIdHolder;
import org.dromara.visor.common.utils.Requests;
-import org.dromara.visor.module.asset.entity.dto.TerminalTransferDTO;
-import org.dromara.visor.module.asset.service.TerminalService;
+import org.dromara.visor.module.terminal.entity.dto.TerminalTransferDTO;
+import org.dromara.visor.module.terminal.handler.terminal.enums.SessionChannelEnum;
+import org.dromara.visor.module.terminal.handler.terminal.enums.SessionTypeEnum;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelExtra;
+import org.dromara.visor.module.terminal.handler.terminal.model.TerminalChannelProps;
+import org.dromara.visor.module.terminal.service.TerminalService;
+import cn.orionsec.kit.lang.define.collect.MutableHashMap;
+import cn.orionsec.kit.lang.utils.Urls;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
@@ -63,11 +68,19 @@ public class TerminalTransferInterceptor implements HandshakeInterceptor {
log.error("TerminalTransferInterceptor-beforeHandshake absent transferToken: {}", transferToken);
return false;
}
- // 设置参数
- attributes.put(ExtraFieldConst.USER_ID, transfer.getUserId());
- attributes.put(ExtraFieldConst.USERNAME, transfer.getUsername());
- attributes.put(ExtraFieldConst.TRACE_ID, TraceIdHolder.get());
- attributes.put(ExtraFieldConst.IDENTITY, Requests.getIdentity());
+ // 设置属性
+ TerminalChannelProps props = TerminalChannelProps.builder()
+ .type(SessionTypeEnum.TRANSFER.name())
+ .channel(SessionChannelEnum.WEB.name())
+ .userId(transfer.getUserId())
+ .username(transfer.getUsername())
+ .nickname(transfer.getNickname())
+ .traceId(TraceIdHolder.get())
+ .identity(Requests.getIdentity())
+ .extra(new TerminalChannelExtra())
+ .attr(new MutableHashMap<>())
+ .build();
+ attributes.put(FieldConst.PROPS, props);
return true;
}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/CommandSnippetGroupService.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/CommandSnippetGroupService.java
similarity index 80%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/CommandSnippetGroupService.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/CommandSnippetGroupService.java
index 567d76be..a3be5b40 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/CommandSnippetGroupService.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/CommandSnippetGroupService.java
@@ -20,12 +20,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service;
+package org.dromara.visor.module.terminal.service;
-import org.dromara.visor.module.asset.entity.request.command.CommandSnippetGroupCreateRequest;
-import org.dromara.visor.module.asset.entity.request.command.CommandSnippetGroupDeleteRequest;
-import org.dromara.visor.module.asset.entity.request.command.CommandSnippetGroupUpdateRequest;
-import org.dromara.visor.module.asset.entity.vo.CommandSnippetGroupVO;
+import org.dromara.visor.module.terminal.entity.request.snippet.CommandSnippetGroupCreateRequest;
+import org.dromara.visor.module.terminal.entity.request.snippet.CommandSnippetGroupDeleteRequest;
+import org.dromara.visor.module.terminal.entity.request.snippet.CommandSnippetGroupUpdateRequest;
+import org.dromara.visor.module.terminal.entity.vo.CommandSnippetGroupVO;
import java.util.List;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/CommandSnippetService.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/CommandSnippetService.java
similarity index 85%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/CommandSnippetService.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/CommandSnippetService.java
index 4cd1d137..ef70fed6 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/CommandSnippetService.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/CommandSnippetService.java
@@ -20,12 +20,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service;
+package org.dromara.visor.module.terminal.service;
-import org.dromara.visor.module.asset.entity.request.command.CommandSnippetCreateRequest;
-import org.dromara.visor.module.asset.entity.request.command.CommandSnippetUpdateRequest;
-import org.dromara.visor.module.asset.entity.vo.CommandSnippetVO;
-import org.dromara.visor.module.asset.entity.vo.CommandSnippetWrapperVO;
+import org.dromara.visor.module.terminal.entity.request.snippet.CommandSnippetCreateRequest;
+import org.dromara.visor.module.terminal.entity.request.snippet.CommandSnippetUpdateRequest;
+import org.dromara.visor.module.terminal.entity.vo.CommandSnippetVO;
+import org.dromara.visor.module.terminal.entity.vo.CommandSnippetWrapperVO;
import java.util.List;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/PathBookmarkGroupService.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/PathBookmarkGroupService.java
similarity index 81%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/PathBookmarkGroupService.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/PathBookmarkGroupService.java
index 875c831e..e0ad7f39 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/PathBookmarkGroupService.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/PathBookmarkGroupService.java
@@ -20,12 +20,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service;
+package org.dromara.visor.module.terminal.service;
-import org.dromara.visor.module.asset.entity.request.path.PathBookmarkGroupCreateRequest;
-import org.dromara.visor.module.asset.entity.request.path.PathBookmarkGroupDeleteRequest;
-import org.dromara.visor.module.asset.entity.request.path.PathBookmarkGroupUpdateRequest;
-import org.dromara.visor.module.asset.entity.vo.PathBookmarkGroupVO;
+import org.dromara.visor.module.terminal.entity.request.path.PathBookmarkGroupCreateRequest;
+import org.dromara.visor.module.terminal.entity.request.path.PathBookmarkGroupDeleteRequest;
+import org.dromara.visor.module.terminal.entity.request.path.PathBookmarkGroupUpdateRequest;
+import org.dromara.visor.module.terminal.entity.vo.PathBookmarkGroupVO;
import java.util.List;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/PathBookmarkService.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/PathBookmarkService.java
similarity index 85%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/PathBookmarkService.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/PathBookmarkService.java
index f733a4b2..d287ad21 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/PathBookmarkService.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/PathBookmarkService.java
@@ -20,12 +20,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service;
+package org.dromara.visor.module.terminal.service;
-import org.dromara.visor.module.asset.entity.request.path.PathBookmarkCreateRequest;
-import org.dromara.visor.module.asset.entity.request.path.PathBookmarkUpdateRequest;
-import org.dromara.visor.module.asset.entity.vo.PathBookmarkVO;
-import org.dromara.visor.module.asset.entity.vo.PathBookmarkWrapperVO;
+import org.dromara.visor.module.terminal.entity.request.path.PathBookmarkCreateRequest;
+import org.dromara.visor.module.terminal.entity.request.path.PathBookmarkUpdateRequest;
+import org.dromara.visor.module.terminal.entity.vo.PathBookmarkVO;
+import org.dromara.visor.module.terminal.entity.vo.PathBookmarkWrapperVO;
import java.util.List;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/TerminalConnectLogService.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/TerminalConnectLogService.java
similarity index 80%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/TerminalConnectLogService.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/TerminalConnectLogService.java
index 4dd238cf..3621f31b 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/TerminalConnectLogService.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/TerminalConnectLogService.java
@@ -20,17 +20,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service;
+package org.dromara.visor.module.terminal.service;
import cn.orionsec.kit.lang.define.wrapper.DataGrid;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import org.dromara.visor.module.asset.entity.domain.TerminalConnectLogDO;
-import org.dromara.visor.module.asset.entity.request.host.TerminalConnectLogClearRequest;
-import org.dromara.visor.module.asset.entity.request.host.TerminalConnectLogCreateRequest;
-import org.dromara.visor.module.asset.entity.request.host.TerminalConnectLogQueryRequest;
-import org.dromara.visor.module.asset.entity.vo.TerminalConnectLogVO;
-import org.dromara.visor.module.asset.enums.TerminalConnectStatusEnum;
-import org.dromara.visor.module.asset.enums.TerminalConnectTypeEnum;
+import org.dromara.visor.module.terminal.entity.domain.TerminalConnectLogDO;
+import org.dromara.visor.module.terminal.entity.request.terminal.TerminalConnectLogClearRequest;
+import org.dromara.visor.module.terminal.entity.request.terminal.TerminalConnectLogCreateRequest;
+import org.dromara.visor.module.terminal.entity.request.terminal.TerminalConnectLogQueryRequest;
+import org.dromara.visor.module.terminal.entity.vo.TerminalConnectLogVO;
+import org.dromara.visor.module.terminal.enums.TerminalConnectStatusEnum;
import java.util.List;
import java.util.Map;
@@ -52,7 +51,7 @@ public interface TerminalConnectLogService {
* @param request request
* @return record
*/
- TerminalConnectLogDO create(TerminalConnectTypeEnum type, TerminalConnectLogCreateRequest request);
+ TerminalConnectLogDO create(String type, TerminalConnectLogCreateRequest request);
/**
* 分页查询终端连接日志
@@ -81,7 +80,7 @@ public interface TerminalConnectLogService {
Integer updateStatusById(Long id, TerminalConnectStatusEnum status, Map extra);
/**
- * 查询用户最近连接的主机
+ * 查询用户最近连接的终端
*
* @param request request
* @return hostId
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/TerminalService.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/TerminalService.java
similarity index 73%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/TerminalService.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/TerminalService.java
index 5507842b..5273b9fb 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/TerminalService.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/TerminalService.java
@@ -20,11 +20,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service;
+package org.dromara.visor.module.terminal.service;
-import org.dromara.visor.module.asset.entity.dto.TerminalAccessDTO;
-import org.dromara.visor.module.asset.entity.dto.TerminalTransferDTO;
-import org.dromara.visor.module.asset.entity.vo.TerminalThemeVO;
+import org.dromara.visor.module.terminal.entity.dto.TerminalAccessDTO;
+import org.dromara.visor.module.terminal.entity.dto.TerminalTransferDTO;
+import org.dromara.visor.module.terminal.entity.request.terminal.TerminalSessionAccessRequest;
+import org.dromara.visor.module.terminal.entity.vo.TerminalThemeVO;
import java.util.List;
@@ -38,21 +39,22 @@ import java.util.List;
public interface TerminalService {
/**
- * 获取主机终端主题
+ * 获取终端主题
*
* @return themes
*/
List getTerminalThemes();
/**
- * 获取主机终端访问 accessToken
+ * 获取终端访问 accessToken
*
+ * @param request request
* @return accessToken
*/
- String getTerminalAccessToken();
+ String getTerminalAccessToken(TerminalSessionAccessRequest request);
/**
- * 获取主机终端传输 transferToken
+ * 获取终端传输 transferToken
*
* @return transferToken
*/
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/TerminalSftpService.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/TerminalSftpService.java
similarity index 86%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/TerminalSftpService.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/TerminalSftpService.java
index 3aa8c174..7d1fe1fb 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/TerminalSftpService.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/TerminalSftpService.java
@@ -20,11 +20,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service;
+package org.dromara.visor.module.terminal.service;
import cn.orionsec.kit.lang.define.wrapper.DataGrid;
-import org.dromara.visor.module.asset.entity.request.host.TerminalSftpLogQueryRequest;
-import org.dromara.visor.module.asset.entity.vo.TerminalSftpLogVO;
+import org.dromara.visor.module.terminal.entity.request.terminal.TerminalSftpLogQueryRequest;
+import org.dromara.visor.module.terminal.entity.vo.TerminalSftpLogVO;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
@@ -49,6 +49,14 @@ public interface TerminalSftpService {
*/
DataGrid getTerminalSftpLogPage(TerminalSftpLogQueryRequest request);
+ /**
+ * 获取 SFTP 操作日志数量
+ *
+ * @param request request
+ * @return count
+ */
+ Long getTerminalSftpLogCount(TerminalSftpLogQueryRequest request);
+
/**
* 删除 SFTP 操作日志
*
diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/TerminalStatisticsService.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/TerminalStatisticsService.java
new file mode 100644
index 00000000..169b4dcb
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/TerminalStatisticsService.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.service;
+
+import org.dromara.visor.common.entity.chart.LineSingleChartData;
+import org.dromara.visor.module.terminal.entity.vo.TerminalWorkplaceStatisticsVO;
+
+/**
+ * 终端模块统计服务
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/12/23 22:24
+ */
+public interface TerminalStatisticsService {
+
+ /**
+ * 查询工作台统计信息
+ *
+ * @return data
+ */
+ TerminalWorkplaceStatisticsVO getWorkplaceStatisticsData();
+
+ /**
+ * 获取用户终端连接日志数量图表
+ *
+ * @param userId userId
+ * @return data
+ */
+ LineSingleChartData getTerminalConnectCountChart(Long userId);
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/CommandSnippetGroupServiceImpl.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/CommandSnippetGroupServiceImpl.java
similarity index 88%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/CommandSnippetGroupServiceImpl.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/CommandSnippetGroupServiceImpl.java
index cdddc08b..44f2c5c2 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/CommandSnippetGroupServiceImpl.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/CommandSnippetGroupServiceImpl.java
@@ -20,30 +20,30 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service.impl;
+package org.dromara.visor.module.terminal.service.impl;
-import cn.orionsec.kit.lang.utils.Booleans;
-import com.alibaba.fastjson.JSON;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.visor.common.constant.Const;
import org.dromara.visor.common.constant.ErrorMessage;
import org.dromara.visor.common.utils.Valid;
import org.dromara.visor.framework.security.core.utils.SecurityUtils;
-import org.dromara.visor.module.asset.convert.CommandSnippetGroupConvert;
-import org.dromara.visor.module.asset.dao.CommandSnippetDAO;
-import org.dromara.visor.module.asset.entity.domain.CommandSnippetDO;
-import org.dromara.visor.module.asset.entity.request.command.CommandSnippetGroupCreateRequest;
-import org.dromara.visor.module.asset.entity.request.command.CommandSnippetGroupDeleteRequest;
-import org.dromara.visor.module.asset.entity.request.command.CommandSnippetGroupUpdateRequest;
-import org.dromara.visor.module.asset.entity.vo.CommandSnippetGroupVO;
-import org.dromara.visor.module.asset.service.CommandSnippetGroupService;
-import org.dromara.visor.module.asset.service.CommandSnippetService;
import org.dromara.visor.module.infra.api.DataGroupApi;
import org.dromara.visor.module.infra.api.DataGroupUserApi;
import org.dromara.visor.module.infra.entity.dto.data.DataGroupCreateDTO;
import org.dromara.visor.module.infra.entity.dto.data.DataGroupDTO;
import org.dromara.visor.module.infra.entity.dto.data.DataGroupRenameDTO;
import org.dromara.visor.module.infra.enums.DataGroupTypeEnum;
+import org.dromara.visor.module.terminal.convert.CommandSnippetGroupConvert;
+import org.dromara.visor.module.terminal.dao.CommandSnippetDAO;
+import org.dromara.visor.module.terminal.entity.domain.CommandSnippetDO;
+import org.dromara.visor.module.terminal.entity.request.snippet.CommandSnippetGroupCreateRequest;
+import org.dromara.visor.module.terminal.entity.request.snippet.CommandSnippetGroupDeleteRequest;
+import org.dromara.visor.module.terminal.entity.request.snippet.CommandSnippetGroupUpdateRequest;
+import org.dromara.visor.module.terminal.entity.vo.CommandSnippetGroupVO;
+import org.dromara.visor.module.terminal.service.CommandSnippetGroupService;
+import org.dromara.visor.module.terminal.service.CommandSnippetService;
+import cn.orionsec.kit.lang.utils.Booleans;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/CommandSnippetServiceImpl.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/CommandSnippetServiceImpl.java
similarity index 89%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/CommandSnippetServiceImpl.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/CommandSnippetServiceImpl.java
index 448f5935..f44dee2d 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/CommandSnippetServiceImpl.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/CommandSnippetServiceImpl.java
@@ -20,30 +20,30 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service.impl;
+package org.dromara.visor.module.terminal.service.impl;
-import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.visor.common.constant.ErrorMessage;
import org.dromara.visor.common.utils.Valid;
import org.dromara.visor.framework.redis.core.utils.RedisMaps;
import org.dromara.visor.framework.redis.core.utils.barrier.CacheBarriers;
import org.dromara.visor.framework.security.core.utils.SecurityUtils;
-import org.dromara.visor.module.asset.convert.CommandSnippetConvert;
-import org.dromara.visor.module.asset.dao.CommandSnippetDAO;
-import org.dromara.visor.module.asset.define.cache.CommandSnippetCacheKeyDefine;
-import org.dromara.visor.module.asset.entity.domain.CommandSnippetDO;
-import org.dromara.visor.module.asset.entity.dto.CommandSnippetCacheDTO;
-import org.dromara.visor.module.asset.entity.request.command.CommandSnippetCreateRequest;
-import org.dromara.visor.module.asset.entity.request.command.CommandSnippetUpdateRequest;
-import org.dromara.visor.module.asset.entity.vo.CommandSnippetGroupVO;
-import org.dromara.visor.module.asset.entity.vo.CommandSnippetVO;
-import org.dromara.visor.module.asset.entity.vo.CommandSnippetWrapperVO;
-import org.dromara.visor.module.asset.service.CommandSnippetGroupService;
-import org.dromara.visor.module.asset.service.CommandSnippetService;
+import org.dromara.visor.module.terminal.convert.CommandSnippetConvert;
+import org.dromara.visor.module.terminal.dao.CommandSnippetDAO;
+import org.dromara.visor.module.terminal.define.cache.CommandSnippetCacheKeyDefine;
+import org.dromara.visor.module.terminal.entity.domain.CommandSnippetDO;
+import org.dromara.visor.module.terminal.entity.dto.CommandSnippetCacheDTO;
+import org.dromara.visor.module.terminal.entity.request.snippet.CommandSnippetCreateRequest;
+import org.dromara.visor.module.terminal.entity.request.snippet.CommandSnippetUpdateRequest;
+import org.dromara.visor.module.terminal.entity.vo.CommandSnippetGroupVO;
+import org.dromara.visor.module.terminal.entity.vo.CommandSnippetVO;
+import org.dromara.visor.module.terminal.entity.vo.CommandSnippetWrapperVO;
+import org.dromara.visor.module.terminal.service.CommandSnippetGroupService;
+import org.dromara.visor.module.terminal.service.CommandSnippetService;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/PathBookmarkGroupServiceImpl.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/PathBookmarkGroupServiceImpl.java
similarity index 88%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/PathBookmarkGroupServiceImpl.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/PathBookmarkGroupServiceImpl.java
index b4af1389..478af069 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/PathBookmarkGroupServiceImpl.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/PathBookmarkGroupServiceImpl.java
@@ -20,30 +20,30 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service.impl;
+package org.dromara.visor.module.terminal.service.impl;
-import cn.orionsec.kit.lang.utils.Booleans;
-import com.alibaba.fastjson.JSON;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.visor.common.constant.Const;
import org.dromara.visor.common.constant.ErrorMessage;
import org.dromara.visor.common.utils.Valid;
import org.dromara.visor.framework.security.core.utils.SecurityUtils;
-import org.dromara.visor.module.asset.convert.PathBookmarkGroupConvert;
-import org.dromara.visor.module.asset.dao.PathBookmarkDAO;
-import org.dromara.visor.module.asset.entity.domain.PathBookmarkDO;
-import org.dromara.visor.module.asset.entity.request.path.PathBookmarkGroupCreateRequest;
-import org.dromara.visor.module.asset.entity.request.path.PathBookmarkGroupDeleteRequest;
-import org.dromara.visor.module.asset.entity.request.path.PathBookmarkGroupUpdateRequest;
-import org.dromara.visor.module.asset.entity.vo.PathBookmarkGroupVO;
-import org.dromara.visor.module.asset.service.PathBookmarkGroupService;
-import org.dromara.visor.module.asset.service.PathBookmarkService;
import org.dromara.visor.module.infra.api.DataGroupApi;
import org.dromara.visor.module.infra.api.DataGroupUserApi;
import org.dromara.visor.module.infra.entity.dto.data.DataGroupCreateDTO;
import org.dromara.visor.module.infra.entity.dto.data.DataGroupDTO;
import org.dromara.visor.module.infra.entity.dto.data.DataGroupRenameDTO;
import org.dromara.visor.module.infra.enums.DataGroupTypeEnum;
+import org.dromara.visor.module.terminal.convert.PathBookmarkGroupConvert;
+import org.dromara.visor.module.terminal.dao.PathBookmarkDAO;
+import org.dromara.visor.module.terminal.entity.domain.PathBookmarkDO;
+import org.dromara.visor.module.terminal.entity.request.path.PathBookmarkGroupCreateRequest;
+import org.dromara.visor.module.terminal.entity.request.path.PathBookmarkGroupDeleteRequest;
+import org.dromara.visor.module.terminal.entity.request.path.PathBookmarkGroupUpdateRequest;
+import org.dromara.visor.module.terminal.entity.vo.PathBookmarkGroupVO;
+import org.dromara.visor.module.terminal.service.PathBookmarkGroupService;
+import org.dromara.visor.module.terminal.service.PathBookmarkService;
+import cn.orionsec.kit.lang.utils.Booleans;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/PathBookmarkServiceImpl.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/PathBookmarkServiceImpl.java
similarity index 89%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/PathBookmarkServiceImpl.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/PathBookmarkServiceImpl.java
index d6756de4..a6c3fd8d 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/PathBookmarkServiceImpl.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/PathBookmarkServiceImpl.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service.impl;
+package org.dromara.visor.module.terminal.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -32,18 +32,18 @@ import org.dromara.visor.common.utils.Valid;
import org.dromara.visor.framework.redis.core.utils.RedisMaps;
import org.dromara.visor.framework.redis.core.utils.barrier.CacheBarriers;
import org.dromara.visor.framework.security.core.utils.SecurityUtils;
-import org.dromara.visor.module.asset.convert.PathBookmarkConvert;
-import org.dromara.visor.module.asset.dao.PathBookmarkDAO;
-import org.dromara.visor.module.asset.define.cache.PathBookmarkCacheKeyDefine;
-import org.dromara.visor.module.asset.entity.domain.PathBookmarkDO;
-import org.dromara.visor.module.asset.entity.dto.PathBookmarkCacheDTO;
-import org.dromara.visor.module.asset.entity.request.path.PathBookmarkCreateRequest;
-import org.dromara.visor.module.asset.entity.request.path.PathBookmarkUpdateRequest;
-import org.dromara.visor.module.asset.entity.vo.PathBookmarkGroupVO;
-import org.dromara.visor.module.asset.entity.vo.PathBookmarkVO;
-import org.dromara.visor.module.asset.entity.vo.PathBookmarkWrapperVO;
-import org.dromara.visor.module.asset.service.PathBookmarkGroupService;
-import org.dromara.visor.module.asset.service.PathBookmarkService;
+import org.dromara.visor.module.terminal.convert.PathBookmarkConvert;
+import org.dromara.visor.module.terminal.dao.PathBookmarkDAO;
+import org.dromara.visor.module.terminal.define.cache.PathBookmarkCacheKeyDefine;
+import org.dromara.visor.module.terminal.entity.domain.PathBookmarkDO;
+import org.dromara.visor.module.terminal.entity.dto.PathBookmarkCacheDTO;
+import org.dromara.visor.module.terminal.entity.request.path.PathBookmarkCreateRequest;
+import org.dromara.visor.module.terminal.entity.request.path.PathBookmarkUpdateRequest;
+import org.dromara.visor.module.terminal.entity.vo.PathBookmarkGroupVO;
+import org.dromara.visor.module.terminal.entity.vo.PathBookmarkVO;
+import org.dromara.visor.module.terminal.entity.vo.PathBookmarkWrapperVO;
+import org.dromara.visor.module.terminal.service.PathBookmarkGroupService;
+import org.dromara.visor.module.terminal.service.PathBookmarkService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/TerminalConnectLogServiceImpl.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/TerminalConnectLogServiceImpl.java
similarity index 82%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/TerminalConnectLogServiceImpl.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/TerminalConnectLogServiceImpl.java
index 38a946ca..7c594ce6 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/TerminalConnectLogServiceImpl.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/TerminalConnectLogServiceImpl.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service.impl;
+package org.dromara.visor.module.terminal.service.impl;
import cn.orionsec.kit.lang.define.wrapper.DataGrid;
import cn.orionsec.kit.lang.utils.Arrays1;
@@ -34,26 +34,23 @@ import org.dromara.visor.common.utils.SqlUtils;
import org.dromara.visor.common.utils.Valid;
import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs;
import org.dromara.visor.framework.security.core.utils.SecurityUtils;
-import org.dromara.visor.module.asset.convert.TerminalConnectLogConvert;
-import org.dromara.visor.module.asset.dao.TerminalConnectLogDAO;
-import org.dromara.visor.module.asset.entity.domain.TerminalConnectLogDO;
-import org.dromara.visor.module.asset.entity.dto.TerminalConnectLogExtraDTO;
-import org.dromara.visor.module.asset.entity.request.host.TerminalConnectLogClearRequest;
-import org.dromara.visor.module.asset.entity.request.host.TerminalConnectLogCreateRequest;
-import org.dromara.visor.module.asset.entity.request.host.TerminalConnectLogQueryRequest;
-import org.dromara.visor.module.asset.entity.vo.TerminalConnectLogVO;
-import org.dromara.visor.module.asset.enums.TerminalConnectStatusEnum;
-import org.dromara.visor.module.asset.enums.TerminalConnectTypeEnum;
-import org.dromara.visor.module.asset.handler.host.terminal.manager.TerminalManager;
-import org.dromara.visor.module.asset.handler.host.terminal.model.TerminalConfig;
-import org.dromara.visor.module.asset.handler.host.terminal.session.ITerminalSession;
-import org.dromara.visor.module.asset.service.TerminalConnectLogService;
+import org.dromara.visor.module.terminal.convert.TerminalConnectLogConvert;
+import org.dromara.visor.module.terminal.dao.TerminalConnectLogDAO;
+import org.dromara.visor.module.terminal.entity.domain.TerminalConnectLogDO;
+import org.dromara.visor.module.terminal.entity.dto.TerminalConnectLogExtraDTO;
+import org.dromara.visor.module.terminal.entity.request.terminal.TerminalConnectLogClearRequest;
+import org.dromara.visor.module.terminal.entity.request.terminal.TerminalConnectLogCreateRequest;
+import org.dromara.visor.module.terminal.entity.request.terminal.TerminalConnectLogQueryRequest;
+import org.dromara.visor.module.terminal.entity.vo.TerminalConnectLogVO;
+import org.dromara.visor.module.terminal.enums.TerminalConnectStatusEnum;
+import org.dromara.visor.module.terminal.handler.terminal.manager.TerminalManager;
+import org.dromara.visor.module.terminal.handler.terminal.session.ITerminalSession;
+import org.dromara.visor.module.terminal.service.TerminalConnectLogService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
@@ -74,9 +71,9 @@ public class TerminalConnectLogServiceImpl implements TerminalConnectLogService
private TerminalManager terminalManager;
@Override
- public TerminalConnectLogDO create(TerminalConnectTypeEnum type, TerminalConnectLogCreateRequest request) {
+ public TerminalConnectLogDO create(String type, TerminalConnectLogCreateRequest request) {
TerminalConnectLogDO record = TerminalConnectLogConvert.MAPPER.to(request);
- record.setType(type.name());
+ record.setType(type);
String status = request.getStatus();
record.setStatus(status);
record.setStartTime(new Date());
@@ -107,25 +104,9 @@ public class TerminalConnectLogServiceImpl implements TerminalConnectLogService
@Override
public List getTerminalConnectSessions(TerminalConnectLogQueryRequest request) {
- // 查询全部
- List idList = terminalManager.getChannelSessions()
- .values()
- .stream()
- .map(ConcurrentHashMap::values)
- .flatMap(Collection::stream)
- .filter(s -> !s.isClosed())
- .map(ITerminalSession::getConfig)
- .filter(Objects::nonNull)
- .map(TerminalConfig::getLogId)
- .filter(Objects::nonNull)
- .collect(Collectors.toList());
- if (idList.isEmpty()) {
- return Lists.empty();
- }
// 条件
- request.setIdList(idList);
- request.setStatus(TerminalConnectStatusEnum.CONNECTING.name());
LambdaQueryWrapper wrapper = this.buildQueryWrapper(request)
+ .eq(TerminalConnectLogDO::getStatus, TerminalConnectStatusEnum.CONNECTING.name())
.orderByDesc(TerminalConnectLogDO::getId);
// 查询
return terminalConnectLogDAO.of(wrapper)
@@ -246,7 +227,7 @@ public class TerminalConnectLogServiceImpl implements TerminalConnectLogService
OperatorLogs.add(OperatorLogs.HOST_NAME, record.getHostName());
// 获取会话
TerminalConnectLogExtraDTO extra = JSON.parseObject(record.getExtraInfo(), TerminalConnectLogExtraDTO.class);
- ITerminalSession session = terminalManager.getSession(extra.getChannelId(), extra.getSessionId());
+ ITerminalSession session = terminalManager.getSession(extra.getSessionId());
if (session != null) {
// 关闭会话
session.forceOffline();
@@ -268,7 +249,7 @@ public class TerminalConnectLogServiceImpl implements TerminalConnectLogService
.eq(TerminalConnectLogDO::getHostId, request.getHostId())
.like(TerminalConnectLogDO::getHostAddress, request.getHostAddress())
.eq(TerminalConnectLogDO::getType, request.getType())
- .like(TerminalConnectLogDO::getSessionId, request.getSessionId())
+ .eq(TerminalConnectLogDO::getSessionId, request.getSessionId())
.eq(TerminalConnectLogDO::getStatus, request.getStatus())
.in(TerminalConnectLogDO::getStatus, request.getStatusList())
.ge(TerminalConnectLogDO::getStartTime, Arrays1.getIfPresent(request.getStartTimeRange(), 0))
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/TerminalServiceImpl.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/TerminalServiceImpl.java
similarity index 80%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/TerminalServiceImpl.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/TerminalServiceImpl.java
index e3a2bc59..ce762b76 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/TerminalServiceImpl.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/TerminalServiceImpl.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service.impl;
+package org.dromara.visor.module.terminal.service.impl;
import cn.orionsec.kit.lang.id.UUIds;
import com.alibaba.fastjson.JSONObject;
@@ -30,12 +30,13 @@ import org.dromara.visor.common.security.LoginUser;
import org.dromara.visor.common.utils.Valid;
import org.dromara.visor.framework.redis.core.utils.RedisStrings;
import org.dromara.visor.framework.security.core.utils.SecurityUtils;
-import org.dromara.visor.module.asset.define.cache.TerminalCacheKeyDefine;
-import org.dromara.visor.module.asset.entity.dto.TerminalAccessDTO;
-import org.dromara.visor.module.asset.entity.dto.TerminalTransferDTO;
-import org.dromara.visor.module.asset.entity.vo.TerminalThemeVO;
-import org.dromara.visor.module.asset.service.TerminalService;
import org.dromara.visor.module.infra.api.DictValueApi;
+import org.dromara.visor.module.terminal.define.cache.TerminalCacheKeyDefine;
+import org.dromara.visor.module.terminal.entity.dto.TerminalAccessDTO;
+import org.dromara.visor.module.terminal.entity.dto.TerminalTransferDTO;
+import org.dromara.visor.module.terminal.entity.request.terminal.TerminalSessionAccessRequest;
+import org.dromara.visor.module.terminal.entity.vo.TerminalThemeVO;
+import org.dromara.visor.module.terminal.service.TerminalService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -62,7 +63,7 @@ public class TerminalServiceImpl implements TerminalService {
public List getTerminalThemes() {
// if (true) {
// String arr = "";
- // return JSON.parseArray(arr, HostTerminalThemeVO.class);
+ // return JSON.parseArray(arr, TerminalThemeVO.class);
// }
List themes = dictValueApi.getDictValue(THEME_DICT_KEY);
return themes.stream()
@@ -75,13 +76,17 @@ public class TerminalServiceImpl implements TerminalService {
}
@Override
- public String getTerminalAccessToken() {
+ public String getTerminalAccessToken(TerminalSessionAccessRequest request) {
LoginUser user = Valid.notNull(SecurityUtils.getLoginUser());
- log.info("HostTerminalService.getTerminalAccessToken userId: {}", user.getId());
+ log.info("TerminalService.getHostAccessToken userId: {}", user.getId());
String accessToken = UUIds.random19();
TerminalAccessDTO access = TerminalAccessDTO.builder()
.userId(user.getId())
.username(user.getUsername())
+ .nickname(user.getNickname())
+ .hostId(request.getHostId())
+ .connectType(request.getConnectType())
+ .extra(request.getExtra())
.build();
// 设置 access 缓存
String key = TerminalCacheKeyDefine.TERMINAL_ACCESS.format(accessToken);
@@ -92,11 +97,12 @@ public class TerminalServiceImpl implements TerminalService {
@Override
public String getTerminalTransferToken() {
LoginUser user = Valid.notNull(SecurityUtils.getLoginUser());
- log.info("HostTerminalService.getTerminalTransferToken userId: {}", user.getId());
+ log.info("TerminalService.getTerminalTransferToken userId: {}", user.getId());
String transferToken = UUIds.random19();
TerminalTransferDTO transfer = TerminalTransferDTO.builder()
.userId(user.getId())
.username(user.getUsername())
+ .nickname(user.getNickname())
.build();
// 设置 transfer 缓存
String key = TerminalCacheKeyDefine.TERMINAL_TRANSFER.format(transferToken);
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/TerminalSftpServiceImpl.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/TerminalSftpServiceImpl.java
similarity index 83%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/TerminalSftpServiceImpl.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/TerminalSftpServiceImpl.java
index c39aa1ca..566d32c3 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/TerminalSftpServiceImpl.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/TerminalSftpServiceImpl.java
@@ -20,7 +20,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.service.impl;
+package org.dromara.visor.module.terminal.service.impl;
import cn.orionsec.kit.lang.constant.StandardContentType;
import cn.orionsec.kit.lang.define.wrapper.DataGrid;
@@ -40,24 +40,24 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.visor.common.constant.Const;
import org.dromara.visor.common.constant.ErrorMessage;
import org.dromara.visor.common.constant.ExtraFieldConst;
+import org.dromara.visor.common.session.config.SshConnectConfig;
+import org.dromara.visor.common.session.ssh.SessionStores;
import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs;
import org.dromara.visor.framework.redis.core.utils.RedisStrings;
import org.dromara.visor.framework.security.core.utils.SecurityUtils;
-import org.dromara.visor.module.asset.convert.TerminalSftpLogConvert;
-import org.dromara.visor.module.asset.define.cache.TerminalCacheKeyDefine;
-import org.dromara.visor.module.asset.define.operator.TerminalOperatorType;
-import org.dromara.visor.module.asset.entity.dto.SftpGetContentCacheDTO;
-import org.dromara.visor.module.asset.entity.dto.SftpSetContentCacheDTO;
-import org.dromara.visor.module.asset.entity.dto.TerminalConnectDTO;
-import org.dromara.visor.module.asset.entity.request.host.TerminalSftpLogQueryRequest;
-import org.dromara.visor.module.asset.entity.vo.TerminalSftpLogVO;
-import org.dromara.visor.module.asset.handler.host.jsch.SessionStores;
-import org.dromara.visor.module.asset.handler.host.transfer.manager.TerminalTransferManager;
-import org.dromara.visor.module.asset.handler.host.transfer.session.DownloadSession;
-import org.dromara.visor.module.asset.service.HostConnectService;
-import org.dromara.visor.module.asset.service.TerminalSftpService;
+import org.dromara.visor.module.asset.api.HostConnectApi;
import org.dromara.visor.module.infra.api.OperatorLogApi;
import org.dromara.visor.module.infra.entity.dto.operator.OperatorLogQueryDTO;
+import org.dromara.visor.module.terminal.convert.TerminalSftpLogConvert;
+import org.dromara.visor.module.terminal.define.cache.TerminalCacheKeyDefine;
+import org.dromara.visor.module.terminal.define.operator.TerminalOperatorType;
+import org.dromara.visor.module.terminal.entity.dto.SftpGetContentCacheDTO;
+import org.dromara.visor.module.terminal.entity.dto.SftpSetContentCacheDTO;
+import org.dromara.visor.module.terminal.entity.request.terminal.TerminalSftpLogQueryRequest;
+import org.dromara.visor.module.terminal.entity.vo.TerminalSftpLogVO;
+import org.dromara.visor.module.terminal.handler.transfer.manager.TerminalTransferManager;
+import org.dromara.visor.module.terminal.handler.transfer.session.DownloadSession;
+import org.dromara.visor.module.terminal.service.TerminalSftpService;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
@@ -85,7 +85,7 @@ public class TerminalSftpServiceImpl implements TerminalSftpService {
private OperatorLogApi operatorLogApi;
@Resource
- private HostConnectService hostConnectService;
+ private HostConnectApi hostConnectApi;
@Resource
private TerminalTransferManager terminalTransferManager;
@@ -111,6 +111,14 @@ public class TerminalSftpServiceImpl implements TerminalSftpService {
});
}
+ @Override
+ public Long getTerminalSftpLogCount(TerminalSftpLogQueryRequest request) {
+ // 查询
+ OperatorLogQueryDTO query = this.buildQueryInfo(request);
+ // 转换
+ return operatorLogApi.getOperatorLogCount(query);
+ }
+
@Override
public Integer deleteTerminalSftpLog(List idList) {
log.info("TerminalSftpService.deleteSftpLog start {}", JSON.toJSONString(idList));
@@ -138,9 +146,9 @@ public class TerminalSftpServiceImpl implements TerminalSftpService {
InputStream in = null;
try {
// 获取终端连接信息
- TerminalConnectDTO connectInfo = hostConnectService.getSshConnectInfo(cache.getHostId(), SecurityUtils.getLoginUserId());
- sessionStore = SessionStores.openSessionStore(connectInfo);
- executor = sessionStore.getSftpExecutor(connectInfo.getFileNameCharset());
+ SshConnectConfig connectConfig = hostConnectApi.getSshConnectConfig(cache.getHostId(), SecurityUtils.getLoginUserId());
+ sessionStore = SessionStores.openSessionStore(connectConfig);
+ executor = sessionStore.getSftpExecutor(connectConfig.getFileNameCharset());
executor.connect();
// 读取文件
in = executor.openInputStream(cache.getPath());
@@ -171,9 +179,9 @@ public class TerminalSftpServiceImpl implements TerminalSftpService {
InputStream in = null;
try {
// 获取终端连接信息
- TerminalConnectDTO connectInfo = hostConnectService.getSshConnectInfo(cache.getHostId(), SecurityUtils.getLoginUserId());
- sessionStore = SessionStores.openSessionStore(connectInfo);
- executor = sessionStore.getSftpExecutor(connectInfo.getFileNameCharset());
+ SshConnectConfig connectConfig = hostConnectApi.getSshConnectConfig(cache.getHostId(), SecurityUtils.getLoginUserId());
+ sessionStore = SessionStores.openSessionStore(connectConfig);
+ executor = sessionStore.getSftpExecutor(connectConfig.getFileNameCharset());
executor.connect();
// 写入文件
out = executor.openOutputStream(cache.getPath());
diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/TerminalStatisticsServiceImpl.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/TerminalStatisticsServiceImpl.java
new file mode 100644
index 00000000..1416ce47
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/service/impl/TerminalStatisticsServiceImpl.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.service.impl;
+
+import cn.orionsec.kit.lang.utils.collect.Lists;
+import cn.orionsec.kit.lang.utils.time.Dates;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.visor.common.entity.chart.LineSingleChartData;
+import org.dromara.visor.common.enums.StatisticsRange;
+import org.dromara.visor.framework.redis.core.utils.RedisStrings;
+import org.dromara.visor.framework.security.core.utils.SecurityUtils;
+import org.dromara.visor.module.terminal.convert.TerminalConnectLogConvert;
+import org.dromara.visor.module.terminal.dao.TerminalConnectLogDAO;
+import org.dromara.visor.module.terminal.define.cache.TerminalStatisticsCacheKeyDefine;
+import org.dromara.visor.module.terminal.entity.domain.TerminalConnectLogDO;
+import org.dromara.visor.module.terminal.entity.po.TerminalConnectLogCountPO;
+import org.dromara.visor.module.terminal.entity.vo.TerminalConnectLogVO;
+import org.dromara.visor.module.terminal.entity.vo.TerminalWorkplaceStatisticsVO;
+import org.dromara.visor.module.terminal.service.TerminalStatisticsService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 终端模块统计服务
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/12/23 22:24
+ */
+@Slf4j
+@Service
+public class TerminalStatisticsServiceImpl implements TerminalStatisticsService {
+
+ @Resource
+ private TerminalConnectLogDAO terminalConnectLogDAO;
+
+ @Override
+ public TerminalWorkplaceStatisticsVO getWorkplaceStatisticsData() {
+ Long userId = SecurityUtils.getLoginUserId();
+ // 读取缓存
+ String cacheKey = TerminalStatisticsCacheKeyDefine.WORKPLACE_DATA.format(userId, Dates.current(Dates.YMD2));
+ TerminalWorkplaceStatisticsVO data = RedisStrings.getJson(cacheKey, TerminalStatisticsCacheKeyDefine.WORKPLACE_DATA);
+ if (data == null) {
+ // 查询终端连接次数图表
+ LineSingleChartData terminalConnectCountChart = this.getTerminalConnectCountChart(userId);
+ List terminalConnectCountData = terminalConnectCountChart.getData();
+ int terminalConnectCount = terminalConnectCountData.stream()
+ .mapToInt(Integer::intValue)
+ .sum();
+ data = TerminalWorkplaceStatisticsVO.builder()
+ .todayTerminalConnectCount(Lists.last(terminalConnectCountData))
+ .weekTerminalConnectCount(terminalConnectCount)
+ .terminalConnectChart(terminalConnectCountChart)
+ .build();
+ // 设置缓存
+ RedisStrings.setJson(cacheKey, TerminalStatisticsCacheKeyDefine.WORKPLACE_DATA, data);
+ }
+ // 查询终端连接记录
+ List connectList = terminalConnectLogDAO.of()
+ .createWrapper()
+ .eq(TerminalConnectLogDO::getUserId, userId)
+ .orderByDesc(TerminalConnectLogDO::getId)
+ .then()
+ .limit(10)
+ .list(TerminalConnectLogConvert.MAPPER::to);
+ data.setTerminalConnectList(connectList);
+ return data;
+ }
+
+ @Override
+ public LineSingleChartData getTerminalConnectCountChart(Long userId) {
+ Date endTime = new Date();
+ Date startTime = Dates.stream()
+ .clearHms()
+ .addDay(-6)
+ .get();
+ List rangeDays = StatisticsRange.WEEK.getDateRanges(startTime);
+ // 查询连接数量
+ Map countMap = terminalConnectLogDAO.selectConnectLogUserCount(userId, startTime, endTime)
+ .stream()
+ .collect(Collectors.toMap(TerminalConnectLogCountPO::getConnectDate, TerminalConnectLogCountPO::getCount));
+ // 构建每天的数据
+ List data = rangeDays.stream()
+ .map(s -> countMap.getOrDefault(s, 0))
+ .collect(Collectors.toList());
+ return LineSingleChartData.builder()
+ .x(rangeDays)
+ .data(data)
+ .build();
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/task/CommandSnippetGroupAutoClearTask.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/task/CommandSnippetGroupAutoClearTask.java
similarity index 93%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/task/CommandSnippetGroupAutoClearTask.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/task/CommandSnippetGroupAutoClearTask.java
index 7d9c12cd..abd1d686 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/task/CommandSnippetGroupAutoClearTask.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/task/CommandSnippetGroupAutoClearTask.java
@@ -20,11 +20,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.task;
+package org.dromara.visor.module.terminal.task;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.visor.common.utils.LockerUtils;
-import org.dromara.visor.module.asset.service.CommandSnippetGroupService;
+import org.dromara.visor.module.terminal.service.CommandSnippetGroupService;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/task/PathBookmarkGroupAutoClearTask.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/task/PathBookmarkGroupAutoClearTask.java
similarity index 93%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/task/PathBookmarkGroupAutoClearTask.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/task/PathBookmarkGroupAutoClearTask.java
index 2d8bd666..dd2f0f0e 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/task/PathBookmarkGroupAutoClearTask.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/task/PathBookmarkGroupAutoClearTask.java
@@ -20,11 +20,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.task;
+package org.dromara.visor.module.terminal.task;
-import lombok.extern.slf4j.Slf4j;
import org.dromara.visor.common.utils.LockerUtils;
-import org.dromara.visor.module.asset.service.PathBookmarkGroupService;
+import org.dromara.visor.module.terminal.service.PathBookmarkGroupService;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/task/TerminalConnectLogAutoClearTask.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/task/TerminalConnectLogAutoClearTask.java
similarity index 89%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/task/TerminalConnectLogAutoClearTask.java
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/task/TerminalConnectLogAutoClearTask.java
index f4d0d986..6810a7f3 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/task/TerminalConnectLogAutoClearTask.java
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/task/TerminalConnectLogAutoClearTask.java
@@ -20,17 +20,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.dromara.visor.module.asset.task;
+package org.dromara.visor.module.terminal.task;
+import org.dromara.visor.common.constant.Const;
+import org.dromara.visor.common.utils.LockerUtils;
+import org.dromara.visor.module.common.config.AppAutoClearConfig;
+import org.dromara.visor.module.terminal.entity.request.terminal.TerminalConnectLogClearRequest;
+import org.dromara.visor.module.terminal.enums.TerminalConnectStatusEnum;
+import org.dromara.visor.module.terminal.service.TerminalConnectLogService;
import cn.orionsec.kit.lang.utils.Booleans;
import cn.orionsec.kit.lang.utils.time.Dates;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.visor.common.constant.Const;
-import org.dromara.visor.common.utils.LockerUtils;
-import org.dromara.visor.module.asset.define.config.AppAutoClearConfig;
-import org.dromara.visor.module.asset.entity.request.host.TerminalConnectLogClearRequest;
-import org.dromara.visor.module.asset.enums.TerminalConnectStatusEnum;
-import org.dromara.visor.module.asset.service.TerminalConnectLogService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
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
new file mode 100644
index 00000000..1ce4b547
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/utils/SftpFileUtils.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.utils;
+
+import org.dromara.visor.module.terminal.handler.terminal.model.response.SftpFileVO;
+import cn.orionsec.kit.lang.utils.io.FileType;
+import cn.orionsec.kit.lang.utils.io.Files1;
+import cn.orionsec.kit.net.host.sftp.SftpFile;
+
+import java.util.Optional;
+
+/**
+ * sftp 文件工具类
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2024/10/12 20:49
+ */
+public class SftpFileUtils {
+
+ private SftpFileUtils() {
+ }
+
+ /**
+ * 转为文件
+ *
+ * @param file file
+ * @return file
+ */
+ public static SftpFileVO toFile(SftpFile file) {
+ SftpFileVO vo = new SftpFileVO();
+ vo.setName(file.getName());
+ vo.setPath(file.getPath());
+ vo.setSuffix(Files1.getSuffix(file.getName()));
+ vo.setSize(file.getSize());
+ vo.setPermission(file.getPermission());
+ vo.setUid(file.getUid());
+ vo.setGid(file.getGid());
+ vo.setAttr(file.getPermissionString());
+ vo.setModifyTime(file.getModifyTime());
+ Boolean isDir = Optional.ofNullable(FileType.of(vo.getAttr()))
+ .map(FileType.DIRECTORY::equals)
+ .orElse(false);
+ vo.setIsDir(isDir);
+ return vo;
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/resources/mapper/CommandSnippetMapper.xml b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/resources/mapper/CommandSnippetMapper.xml
similarity index 89%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/resources/mapper/CommandSnippetMapper.xml
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/resources/mapper/CommandSnippetMapper.xml
index b41d6800..8caafbbe 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/resources/mapper/CommandSnippetMapper.xml
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/resources/mapper/CommandSnippetMapper.xml
@@ -1,9 +1,9 @@
-
+
-
+
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/resources/mapper/PathBookmarkMapper.xml b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/resources/mapper/PathBookmarkMapper.xml
similarity index 89%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/resources/mapper/PathBookmarkMapper.xml
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/resources/mapper/PathBookmarkMapper.xml
index 0ad6ada9..3a938cba 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/resources/mapper/PathBookmarkMapper.xml
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/resources/mapper/PathBookmarkMapper.xml
@@ -1,9 +1,9 @@
-
+
-
+
diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/resources/mapper/TerminalConnectLogMapper.xml b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/resources/mapper/TerminalConnectLogMapper.xml
similarity index 91%
rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/resources/mapper/TerminalConnectLogMapper.xml
rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/resources/mapper/TerminalConnectLogMapper.xml
index ff13af98..1067d2c8 100644
--- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/resources/mapper/TerminalConnectLogMapper.xml
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/resources/mapper/TerminalConnectLogMapper.xml
@@ -1,9 +1,9 @@
-
+
-
+
@@ -22,7 +22,7 @@
-
+
diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/test/java/org/dromara/visor/module/terminal/api/impl/.gitkeep b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/test/java/org/dromara/visor/module/terminal/api/impl/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/test/java/org/dromara/visor/module/terminal/meta/TerminalThemeGenerator.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/test/java/org/dromara/visor/module/terminal/meta/TerminalThemeGenerator.java
new file mode 100644
index 00000000..ad711173
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/test/java/org/dromara/visor/module/terminal/meta/TerminalThemeGenerator.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 2023 - present Dromara, All rights reserved.
+ *
+ * https://visor.dromara.org
+ * https://visor.dromara.org.cn
+ * https://visor.orionsec.cn
+ *
+ * Members:
+ * Jiahang Li - ljh1553488six@139.com - author
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.visor.module.terminal.meta;
+
+import cn.orionsec.kit.lang.utils.Colors;
+import cn.orionsec.kit.lang.utils.collect.Lists;
+import cn.orionsec.kit.lang.utils.io.FileReaders;
+import cn.orionsec.kit.lang.utils.io.Files1;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.ValueFilter;
+import lombok.Data;
+
+import java.io.File;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 终端主题生成 __META__
+ *
+ * @author Jiahang Li
+ * @version 1.0.0
+ * @since 2023/12/7 10:52
+ */
+public class TerminalThemeGenerator {
+
+ public static void main(String[] args) {
+ List files = Files1.listFiles("D:\\idea-project\\iTerm2-Color-Schemes\\vhs");
+ // 过滤的 theme
+ List schemaFilter = Lists.of(
+ "Dracula", "Builtin Tango Light",
+ "Atom", "AtomOneLight",
+ "OneHalfDark", "OneHalfLight",
+ "Apple System Colors", "Tomorrow",
+ "catppuccin-mocha", "catppuccin-latte",
+ "catppuccin-macchiato", "BlulocoLight",
+ "catppuccin-frappe", "MaterialDesignColors",
+ "GitHub Dark", "Github",
+ "DimmedMonokai", "Duotone Dark"
+ );
+ // 颜色大写
+ ValueFilter colorFilter = (Object object, String name, Object value) -> {
+ if (value instanceof String && value.toString().contains("#")) {
+ return ((String) value).toUpperCase();
+ } else {
+ return value;
+ }
+ };
+ // 转换
+ List arr = files.stream()
+ .filter(f -> Lists.isEmpty(schemaFilter) || schemaFilter.stream()
+ .map(s -> s + ".json")
+ .anyMatch(s -> f.getName().equalsIgnoreCase(s)))
+ .map(f -> {
+ JSONObject schema = JSONObject.parseObject(new String(FileReaders.readAllBytes(f)));
+ // 设置选中背景色
+ schema.put("selectionBackground", schema.getString("selection"));
+ // 设置主题色
+ String background = schema.getString("background");
+ TerminalTheme theme = new TerminalTheme();
+ theme.setName(schema.getString("name"));
+ theme.setDark(Colors.isDarkColor(background));
+ theme.setSchema(JSON.parseObject(JSON.toJSONString(schema), TerminalThemeSchema.class));
+ return theme;
+ }).skip(0).limit(50).collect(Collectors.toList());
+ // 排序
+ if (!Lists.isEmpty(schemaFilter)) {
+ arr.sort(Comparator.comparing(s -> schemaFilter.indexOf(s.getName())));
+ }
+ // 打印 json
+ System.out.println();
+ for (TerminalTheme theme : arr) {
+ System.out.println("name: " + theme.name);
+ System.out.println("dark: " + theme.dark);
+ System.out.println("value: " + JSON.toJSONString(theme.schema, colorFilter));
+ System.out.println("json: " + JSON.toJSONString(theme, colorFilter));
+ System.out.println();
+ }
+ String json = JSON.toJSONString(arr, colorFilter);
+ System.out.println("\n" + json);
+ }
+
+ /*
+ var term = new Terminal();
+ var doc = document.getElementById('themes');
+ for (let t of themes) {
+ var span = document.createElement('span');
+ span.innerHTML = t.name;
+ span.style.display = 'inline-block';
+ span.style.padding = '4px 8px';
+ span.style.margin = '4px';
+ span.style.border = '1px solid green';
+ if(t.dark) {
+ span.style.background = '#000';
+ span.style.color = '#FFF';
+ }
+ span.addEventListener('click', function() {
+ term.setOption('theme', t);
+ term.reset();
+ for (let i = 0; i < 9; i++) {
+ term.write('[' + (30 + i) + 'm');
+ term.write(' ' + i + 'OrionVisor');
+ term.write('[0m\r\n');
+ }
+ for (let i = 0; i < 9; i++) {
+ term.write('[' + (90 + i) + 'm');
+ term.write(' ' + i + 'OrionVisor');
+ term.write('[0m\r\n');
+ }
+ });
+ doc.append(span);
+ }
+ term.open(document.getElementById('terminal'));
+ */
+
+ @Data
+ public static class TerminalTheme {
+ @JSONField(ordinal = 0)
+ private String name;
+ @JSONField(ordinal = 1)
+ private Boolean dark;
+ @JSONField(ordinal = 2)
+ private TerminalThemeSchema schema;
+ }
+
+ @Data
+ public static class TerminalThemeSchema {
+ @JSONField(ordinal = 0)
+ private String background;
+ @JSONField(ordinal = 1)
+ private String foreground;
+ @JSONField(ordinal = 2)
+ private String cursor;
+ @JSONField(ordinal = 3)
+ private String selectionBackground;
+ @JSONField(ordinal = 4)
+ private String black;
+ @JSONField(ordinal = 5)
+ private String red;
+ @JSONField(ordinal = 6)
+ private String green;
+ @JSONField(ordinal = 7)
+ private String yellow;
+ @JSONField(ordinal = 8)
+ private String blue;
+ @JSONField(ordinal = 9)
+ private String magenta;
+ @JSONField(ordinal = 10)
+ private String cyan;
+ @JSONField(ordinal = 11)
+ private String white;
+ @JSONField(ordinal = 12)
+ private String brightBlack;
+ @JSONField(ordinal = 13)
+ private String brightRed;
+ @JSONField(ordinal = 14)
+ private String brightGreen;
+ @JSONField(ordinal = 15)
+ private String brightYellow;
+ @JSONField(ordinal = 16)
+ private String brightBlue;
+ @JSONField(ordinal = 17)
+ private String brightMagenta;
+ @JSONField(ordinal = 18)
+ private String brightCyan;
+ @JSONField(ordinal = 19)
+ private String brightWhite;
+ }
+
+}
diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/test/java/org/dromara/visor/module/terminal/service/impl/.gitkeep b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/test/java/org/dromara/visor/module/terminal/service/impl/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/test/resources/application-unit-test.yaml b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/test/resources/application-unit-test.yaml
new file mode 100644
index 00000000..f349f31e
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/test/resources/application-unit-test.yaml
@@ -0,0 +1,30 @@
+spring:
+ main:
+ lazy-initialization: true
+ banner-mode: OFF
+ datasource:
+ druid:
+ name: orion_visor
+ url: jdbc:h2:mem:memdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value;
+ driver-class-name: org.h2.Driver
+ username: sa
+ password:
+ max-active: 1
+ async-init: true
+ initial-size: 1
+ test-while-idle: false
+ sql:
+ init:
+ schema-locations:
+ - classpath:/sql/create-table-h2-*.sql
+ redis:
+ host: 127.0.0.1
+ port: 16379
+ database: 0
+ redisson:
+ threads: 2
+ netty-threads: 2
+ minimum-idle-size: 2
+
+mybatis-plus:
+ lazy-initialization: true
diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/test/resources/sql/.gitkeep b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/test/resources/sql/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/orion-visor-modules/orion-visor-module-terminal/pom.xml b/orion-visor-modules/orion-visor-module-terminal/pom.xml
new file mode 100644
index 00000000..c8399615
--- /dev/null
+++ b/orion-visor-modules/orion-visor-module-terminal/pom.xml
@@ -0,0 +1,23 @@
+
+
+
+ org.dromara.visor
+ orion-visor-modules
+ ${revision}
+
+
+ 4.0.0
+ orion-visor-module-terminal
+ pom
+
+ 项目终端模块
+ https://github.com/dromara/orion-visor
+
+
+ orion-visor-module-terminal-provider
+ orion-visor-module-terminal-service
+
+
+
\ No newline at end of file