From aed5d10eedf8dfb755a07698f8baf2f2263643e1 Mon Sep 17 00:00:00 2001 From: lijiahangmax Date: Mon, 7 Jul 2025 00:04:29 +0800 Subject: [PATCH] =?UTF-8?q?:hammer:=20=E6=B7=BB=E5=8A=A0=20vnc=20=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TerminalWebSocketConfiguration.java | 8 ++ .../terminal/handler/guacd/GuacdTunnel.java | 8 +- .../terminal/handler/guacd/IGuacdTunnel.java | 10 ++- .../handler/guacd/constant/GuacdConst.java | 10 +++ .../terminal/TerminalAccessVncHandler.java | 44 ++++++++++ .../handler/GuacdInstructionHandler.java | 18 +--- .../handler/TerminalConnectHandler.java | 17 ++-- .../handler/TerminalResizeHandler.java | 13 +-- .../session/AbstractGuacdSession.java | 52 +++++++++++- .../terminal/session/IGuacdSession.java | 2 +- .../handler/terminal/session/IRdpSession.java | 9 -- .../terminal/session/IResizeableSession.java | 42 +++++++++ .../handler/terminal/session/ISshSession.java | 10 +-- .../handler/terminal/session/IVncSession.java | 33 +++++++ .../handler/terminal/session/RdpSession.java | 43 ++-------- .../handler/terminal/session/VncSession.java | 85 +++++++++++++++++++ 16 files changed, 311 insertions(+), 93 deletions(-) create mode 100644 orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/TerminalAccessVncHandler.java create mode 100644 orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/IResizeableSession.java create mode 100644 orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/IVncSession.java create mode 100644 orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/VncSession.java diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/configuration/TerminalWebSocketConfiguration.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/configuration/TerminalWebSocketConfiguration.java index 95120ff5..ebc01ec6 100644 --- a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/configuration/TerminalWebSocketConfiguration.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/configuration/TerminalWebSocketConfiguration.java @@ -25,6 +25,7 @@ package org.dromara.visor.module.terminal.configuration; import org.dromara.visor.module.terminal.handler.terminal.TerminalAccessRdpHandler; import org.dromara.visor.module.terminal.handler.terminal.TerminalAccessSftpHandler; import org.dromara.visor.module.terminal.handler.terminal.TerminalAccessSshHandler; +import org.dromara.visor.module.terminal.handler.terminal.TerminalAccessVncHandler; import org.dromara.visor.module.terminal.handler.transfer.TransferMessageDispatcher; import org.dromara.visor.module.terminal.interceptor.TerminalAccessInterceptor; import org.dromara.visor.module.terminal.interceptor.TerminalTransferInterceptor; @@ -63,6 +64,9 @@ public class TerminalWebSocketConfiguration implements WebSocketConfigurer { @Resource private TerminalAccessRdpHandler terminalAccessRdpHandler; + @Resource + private TerminalAccessVncHandler terminalAccessVncHandler; + @Resource private TransferMessageDispatcher transferMessageDispatcher; @@ -80,6 +84,10 @@ public class TerminalWebSocketConfiguration implements WebSocketConfigurer { registry.addHandler(terminalAccessRdpHandler, prefix + "/terminal/access/rdp/{accessToken}") .addInterceptors(terminalAccessInterceptor) .setAllowedOrigins("*"); + // VNC 终端会话 + registry.addHandler(terminalAccessVncHandler, prefix + "/terminal/access/vnc/{accessToken}") + .addInterceptors(terminalAccessInterceptor) + .setAllowedOrigins("*"); // 文件传输 registry.addHandler(transferMessageDispatcher, prefix + "/terminal/transfer/{transferToken}") .addInterceptors(terminalTransferInterceptor) 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 index 2c08d300..53034461 100644 --- 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 @@ -192,12 +192,16 @@ public class GuacdTunnel implements IGuacdTunnel { } @Override - public void size(int width, int height, int dpi) { + public void size(int width, int height) { clientConfig.setOptimalScreenWidth(width); clientConfig.setOptimalScreenHeight(height); - clientConfig.setOptimalResolution(dpi); this.setParameter(GuacdConst.WIDTH, width); this.setParameter(GuacdConst.HEIGHT, height); + } + + @Override + public void dpi(int dpi) { + clientConfig.setOptimalResolution(dpi); this.setParameter(GuacdConst.DPI, 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/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 index be72804e..8eff3c20 100644 --- 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 @@ -64,9 +64,15 @@ public interface IGuacdTunnel extends Runnable, Executable, SafeCloseable { * * @param width width * @param height height - * @param dpi dpi */ - void size(int width, int height, int dpi); + void size(int width, int height); + + /** + * dpi + * + * @param dpi dpi + */ + void dpi(int 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/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 index c0edfb9e..99d5cdb5 100644 --- 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 @@ -392,6 +392,16 @@ public interface GuacdConst { */ String CLIPBOARD_ENCODING = "clipboard-encoding"; + /** + * 压缩等级 + */ + String COMPRESS_LEVEL = "compress-level"; + + /** + * 质量等级 + */ + String QUALITY_LEVEL = "quality-level"; + // -------------------- const -------------------- String RESIZE_METHOD_DISPLAY_UPDATE = "display-update"; 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/TerminalAccessVncHandler.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/TerminalAccessVncHandler.java new file mode 100644 index 00000000..fe772f4d --- /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/TerminalAccessVncHandler.java @@ -0,0 +1,44 @@ +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; + +/** + * VNC 终端处理器 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/28 14:33 + */ +@Slf4j +@Component +public class TerminalAccessVncHandler 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("TerminalAccessVncHandler-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/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 index 854bc582..0787e012 100644 --- a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/handler/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 @@ -26,7 +26,7 @@ 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.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.IGuacdSession; import org.dromara.visor.module.terminal.handler.terminal.session.ITerminalSession; import org.springframework.stereotype.Component; @@ -45,20 +45,10 @@ public class GuacdInstructionHandler extends AbstractTerminalHandler */ protected abstract IGuacdTunnel createTunnel(); + /** + * 是否为低带宽模式 + * + * @return is + */ + protected abstract boolean isLowBandwidthMode(); + /** * 设置 tunnel 参数 */ - protected abstract void setTunnelParams(); + protected void setTunnelParams() { + // 设置低带宽模式 + if (this.isLowBandwidthMode()) { + this.setLowBandwidthMode(); + } + // 主机信息 + tunnel.remote(config.getHostAddress(), config.getHostPort()); + // 身份信息 + tunnel.auth(config.getUsername(), AesEncryptUtils.decryptAsString(config.getPassword())); + // 大小 + tunnel.size(config.getWidth(), config.getHeight()); + } + + /** + * 设置低带宽模式 + */ + protected void setLowBandwidthMode() { + TerminalChannelExtra extra = props.getExtra(); + 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.setDisableOffscreenCaching(false); + extra.setDisableGlyphCaching(false); + extra.setDisableGfx(false); + extra.setEnableAudioInput(false); + extra.setEnableAudioOutput(false); + extra.setCompressLevel(9); + extra.setQualityLevel(1); + } /** * 执行连接 @@ -92,6 +135,13 @@ public abstract class AbstractGuacdSession tunnel.write(data); } + @Override + public void resize(int width, int height) { + config.setWidth(width); + config.setHeight(height); + tunnel.writeInstruction("size", String.valueOf(width), String.valueOf(height)); + } + @Override public void keepAlive() { // guacd 有内部实现 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/IGuacdSession.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 index a9f79372..56c8249c 100644 --- a/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 +++ 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 @@ -29,7 +29,7 @@ package org.dromara.visor.module.terminal.handler.terminal.session; * @version 1.0.0 * @since 2025/3/30 17:42 */ -public interface IGuacdSession extends ITerminalSession { +public interface IGuacdSession extends ITerminalSession, IResizeableSession { /** * 写入数据 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 index de2d5860..225316b9 100644 --- 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 @@ -30,13 +30,4 @@ package org.dromara.visor.module.terminal.handler.terminal.session; * @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-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/handler/terminal/session/IResizeableSession.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/IResizeableSession.java new file mode 100644 index 00000000..cdc41edb --- /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/IResizeableSession.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; + +/** + * 可修改大小的会话 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2025/7/3 2:16 + */ +public interface IResizeableSession { + + /** + * 修改大小 + * + * @param width width + * @param height height + */ + void resize(int width, int 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/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 index 1f621fcc..d978900a 100644 --- a/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 +++ 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 @@ -32,15 +32,7 @@ import org.dromara.visor.module.terminal.handler.terminal.sender.ISshTerminalSen * @version 1.0.0 * @since 2024/2/4 16:47 */ -public interface ISshSession extends ITerminalSession { - - /** - * 重置大小 - * - * @param width width - * @param height height - */ - void resize(int width, int height); +public interface ISshSession extends ITerminalSession, IResizeableSession { /** * 写入内容 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/IVncSession.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/IVncSession.java new file mode 100644 index 00000000..e17bb388 --- /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/IVncSession.java @@ -0,0 +1,33 @@ +/* + * 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; + +/** + * vnc 会话 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2025/7/3 2:04 + */ +public interface IVncSession extends IGuacdSession { +} 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 index 165e8af8..c0e463bd 100644 --- 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 @@ -27,7 +27,6 @@ import cn.orionsec.kit.lang.utils.Strings; import cn.orionsec.kit.lang.utils.io.Files1; 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.enums.DriveMountModeEnum; import org.dromara.visor.module.terminal.handler.guacd.GuacdTunnel; @@ -66,19 +65,13 @@ public class RdpSession extends AbstractGuacdSession i @Override protected void setTunnelParams() { + super.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()); + // dpi + tunnel.dpi(config.getDpi()); // 时区 tunnel.timezone(config.getTimezone()); // 忽略证书 @@ -140,32 +133,8 @@ public class RdpSession extends AbstractGuacdSession i } @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.setDisableOffscreenCaching(false); - extra.setDisableGlyphCaching(false); - extra.setDisableGfx(false); - extra.setEnableAudioInput(false); - extra.setEnableAudioOutput(false); + protected boolean isLowBandwidthMode() { + return Booleans.isTrue(config.getLowBandwidthMode()); } } 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/VncSession.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/VncSession.java new file mode 100644 index 00000000..f4a76b5e --- /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/VncSession.java @@ -0,0 +1,85 @@ +/* + * 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 lombok.extern.slf4j.Slf4j; +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.TerminalSessionVncConfig; +import org.dromara.visor.module.terminal.handler.terminal.sender.IGuacdTerminalSender; + +/** + * vnc 会话 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2025/3/30 17:44 + */ +@Slf4j +public class VncSession extends AbstractGuacdSession implements IVncSession { + + private final GuacdConfig guacdConfig; + + public VncSession(TerminalChannelProps props, + IGuacdTerminalSender sender, + TerminalSessionVncConfig config, + GuacdConfig guacdConfig) { + super(props, sender, config); + this.guacdConfig = guacdConfig; + } + + @Override + protected IGuacdTunnel createTunnel() { + return new GuacdTunnel(GuacdProtocol.VNC, sessionId, guacdConfig.getHost(), guacdConfig.getPort()); + } + + @Override + protected void setTunnelParams() { + super.setTunnelParams(); + // 设置额外参数 + TerminalChannelExtra extra = props.getExtra(); + // 时区 + tunnel.timezone(config.getTimezone()); + // 显示设置 + tunnel.setParameter(GuacdConst.COLOR_DEPTH, extra.getColorDepth()); + tunnel.setParameter(GuacdConst.FORCE_LOSSLESS, extra.getForceLossless()); + tunnel.setParameter(GuacdConst.COMPRESS_LEVEL, extra.getCompressLevel()); + tunnel.setParameter(GuacdConst.QUALITY_LEVEL, extra.getQualityLevel()); + // 光标设置 + tunnel.setParameter(GuacdConst.CURSOR, extra.getCursor()); + // 编码设置 + tunnel.setParameter(GuacdConst.CLIPBOARD_ENCODING, config.getClipboardEncoding()); + } + + @Override + protected boolean isLowBandwidthMode() { + return Booleans.isTrue(config.getLowBandwidthMode()); + } + +}