diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-provider/pom.xml b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-provider/pom.xml new file mode 100644 index 00000000..ee4c5864 --- /dev/null +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-provider/pom.xml @@ -0,0 +1,26 @@ + + + + org.dromara.visor + orion-visor-module-terminal + ${revision} + + + 4.0.0 + orion-visor-module-terminal-provider + jar + + 项目终端模块 + https://github.com/dromara/orion-visor + + + + + org.dromara.visor + orion-visor-common + + + + \ No newline at end of file diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/api/CommandSnippetApi.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-provider/src/main/java/org/dromara/visor/module/terminal/api/CommandSnippetApi.java similarity index 95% rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/api/CommandSnippetApi.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-provider/src/main/java/org/dromara/visor/module/terminal/api/CommandSnippetApi.java index 5ebee48a..ba570eaa 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/api/CommandSnippetApi.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-provider/src/main/java/org/dromara/visor/module/terminal/api/CommandSnippetApi.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.api; +package org.dromara.visor.module.terminal.api; import java.util.List; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/api/PathBookmarkApi.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-provider/src/main/java/org/dromara/visor/module/terminal/api/PathBookmarkApi.java similarity index 95% rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/api/PathBookmarkApi.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-provider/src/main/java/org/dromara/visor/module/terminal/api/PathBookmarkApi.java index 5562cd02..364e5738 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/api/PathBookmarkApi.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-provider/src/main/java/org/dromara/visor/module/terminal/api/PathBookmarkApi.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.api; +package org.dromara.visor.module.terminal.api; import java.util.List; diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/pom.xml b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/pom.xml new file mode 100644 index 00000000..a4c70f1a --- /dev/null +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/pom.xml @@ -0,0 +1,150 @@ + + + + org.dromara.visor + orion-visor-module-terminal + ${revision} + + + 4.0.0 + orion-visor-module-terminal-service + jar + + 项目终端模块 + https://github.com/dromara/orion-visor + + + + + org.dromara.visor + orion-visor-common + + + + + org.dromara.visor + orion-visor-module-common + ${revision} + + + + + org.dromara.visor + orion-visor-module-infra-provider + ${revision} + + + org.dromara.visor + orion-visor-module-asset-provider + ${revision} + + + org.dromara.visor + orion-visor-module-terminal-provider + ${revision} + + + + + org.dromara.visor + orion-visor-spring-boot-starter-web + + + org.dromara.visor + orion-visor-spring-boot-starter-websocket + + + org.dromara.visor + orion-visor-spring-boot-starter-log + + + org.dromara.visor + orion-visor-spring-boot-starter-biz-operator-log + + + org.dromara.visor + orion-visor-spring-boot-starter-desensitize + + + org.dromara.visor + orion-visor-spring-boot-starter-security + + + org.dromara.visor + orion-visor-spring-boot-starter-redis + + + org.dromara.visor + orion-visor-spring-boot-starter-mybatis + + + org.dromara.visor + orion-visor-spring-boot-starter-storage + + + org.dromara.visor + orion-visor-spring-boot-starter-test + + + + + org.dromara.visor + orion-visor-spring-boot-starter-web + + + org.dromara.visor + orion-visor-spring-boot-starter-websocket + + + org.dromara.visor + orion-visor-spring-boot-starter-log + + + org.dromara.visor + orion-visor-spring-boot-starter-biz-operator-log + + + org.dromara.visor + orion-visor-spring-boot-starter-desensitize + + + org.dromara.visor + orion-visor-spring-boot-starter-security + + + org.dromara.visor + orion-visor-spring-boot-starter-redis + + + org.dromara.visor + orion-visor-spring-boot-starter-mybatis + + + org.dromara.visor + orion-visor-spring-boot-starter-storage + + + org.dromara.visor + orion-visor-spring-boot-starter-job + + + + + org.apache.guacamole + guacamole-common + + + + + + + + com.github.wvengen + proguard-maven-plugin + + + + + diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/api/impl/CommandSnippetApiImpl.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/api/impl/CommandSnippetApiImpl.java similarity index 87% rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/api/impl/CommandSnippetApiImpl.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/api/impl/CommandSnippetApiImpl.java index c0afe99a..bcd270e2 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/api/impl/CommandSnippetApiImpl.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/api/impl/CommandSnippetApiImpl.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.api.impl; +package org.dromara.visor.module.terminal.api.impl; +import org.dromara.visor.module.terminal.api.CommandSnippetApi; +import org.dromara.visor.module.terminal.service.CommandSnippetService; import lombok.extern.slf4j.Slf4j; -import org.dromara.visor.module.asset.api.CommandSnippetApi; -import org.dromara.visor.module.asset.service.CommandSnippetService; 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/api/impl/PathBookmarkApiImpl.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/api/impl/PathBookmarkApiImpl.java similarity index 87% rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/api/impl/PathBookmarkApiImpl.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/api/impl/PathBookmarkApiImpl.java index e84a2003..5698212c 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/api/impl/PathBookmarkApiImpl.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/api/impl/PathBookmarkApiImpl.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.api.impl; +package org.dromara.visor.module.terminal.api.impl; +import org.dromara.visor.module.terminal.api.PathBookmarkApi; +import org.dromara.visor.module.terminal.service.PathBookmarkService; import lombok.extern.slf4j.Slf4j; -import org.dromara.visor.module.asset.api.PathBookmarkApi; -import org.dromara.visor.module.asset.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/configuration/AssetWebSocketConfiguration.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 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/configuration/AssetWebSocketConfiguration.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/configuration/TerminalWebSocketConfiguration.java index 2b49c6e2..95120ff5 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/configuration/AssetWebSocketConfiguration.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 @@ -20,14 +20,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.asset.configuration; +package org.dromara.visor.module.terminal.configuration; -import org.dromara.visor.module.asset.handler.host.exec.log.ExecLogTailHandler; -import org.dromara.visor.module.asset.handler.host.terminal.TerminalMessageDispatcher; -import org.dromara.visor.module.asset.handler.host.transfer.TransferMessageDispatcher; -import org.dromara.visor.module.asset.interceptor.ExecLogTailInterceptor; -import org.dromara.visor.module.asset.interceptor.TerminalAccessInterceptor; -import org.dromara.visor.module.asset.interceptor.TerminalTransferInterceptor; +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.transfer.TransferMessageDispatcher; +import org.dromara.visor.module.terminal.interceptor.TerminalAccessInterceptor; +import org.dromara.visor.module.terminal.interceptor.TerminalTransferInterceptor; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; @@ -36,14 +36,14 @@ import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry import javax.annotation.Resource; /** - * 资产模块 websocket 配置 + * 终端模块 websocket 配置 * * @author Jiahang Li * @version 1.0.0 * @since 2023/12/28 11:39 */ @Configuration -public class AssetWebSocketConfiguration implements WebSocketConfigurer { +public class TerminalWebSocketConfiguration implements WebSocketConfigurer { @Value("${orion.websocket.prefix}") private String prefix; @@ -55,31 +55,35 @@ public class AssetWebSocketConfiguration implements WebSocketConfigurer { private TerminalTransferInterceptor terminalTransferInterceptor; @Resource - private ExecLogTailInterceptor execLogTailInterceptor; + private TerminalAccessSshHandler terminalAccessSshHandler; @Resource - private TerminalMessageDispatcher terminalMessageDispatcher; + private TerminalAccessSftpHandler terminalAccessSftpHandler; + + @Resource + private TerminalAccessRdpHandler terminalAccessRdpHandler; @Resource private TransferMessageDispatcher transferMessageDispatcher; - @Resource - private ExecLogTailHandler execLogTailHandler; - @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { - // 终端会话 - registry.addHandler(terminalMessageDispatcher, prefix + "/terminal/access/{accessToken}") + // SSH 终端会话 + registry.addHandler(terminalAccessSshHandler, prefix + "/terminal/access/ssh/{accessToken}") + .addInterceptors(terminalAccessInterceptor) + .setAllowedOrigins("*"); + // SFTP 终端会话 + registry.addHandler(terminalAccessSftpHandler, prefix + "/terminal/access/sftp/{accessToken}") + .addInterceptors(terminalAccessInterceptor) + .setAllowedOrigins("*"); + // RDP 终端会话 + registry.addHandler(terminalAccessRdpHandler, prefix + "/terminal/access/rdp/{accessToken}") .addInterceptors(terminalAccessInterceptor) .setAllowedOrigins("*"); // 文件传输 registry.addHandler(transferMessageDispatcher, prefix + "/terminal/transfer/{transferToken}") .addInterceptors(terminalTransferInterceptor) .setAllowedOrigins("*"); - // 执行日志 - registry.addHandler(execLogTailHandler, prefix + "/exec/log/{token}") - .addInterceptors(execLogTailInterceptor) - .setAllowedOrigins("*"); } } diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/CommandSnippetController.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/CommandSnippetController.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/controller/CommandSnippetController.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/CommandSnippetController.java index 40379546..5c413350 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/CommandSnippetController.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/CommandSnippetController.java @@ -20,19 +20,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.asset.controller; +package org.dromara.visor.module.terminal.controller; +import org.dromara.visor.framework.log.core.annotation.IgnoreLog; +import org.dromara.visor.framework.log.core.enums.IgnoreLogMode; +import org.dromara.visor.framework.web.core.annotation.RestWrapper; +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.CommandSnippetWrapperVO; +import org.dromara.visor.module.terminal.service.CommandSnippetService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; -import org.dromara.visor.framework.log.core.annotation.IgnoreLog; -import org.dromara.visor.framework.log.core.enums.IgnoreLogMode; -import org.dromara.visor.framework.web.core.annotation.RestWrapper; -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.CommandSnippetWrapperVO; -import org.dromara.visor.module.asset.service.CommandSnippetService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -45,12 +45,12 @@ import javax.annotation.Resource; * @version 1.0.0 * @since 2024-1-22 15:28 */ -@Tag(name = "asset - 命令片段服务") +@Tag(name = "terminal - 命令片段服务") @Slf4j @Validated @RestWrapper @RestController -@RequestMapping("/asset/command-snippet") +@RequestMapping("/terminal/command-snippet") public class CommandSnippetController { @Resource diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/CommandSnippetGroupController.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/CommandSnippetGroupController.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/controller/CommandSnippetGroupController.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/CommandSnippetGroupController.java index 439071b8..f41a6d11 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/CommandSnippetGroupController.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/CommandSnippetGroupController.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.controller; +package org.dromara.visor.module.terminal.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -29,11 +29,11 @@ import org.dromara.visor.common.validator.group.Id; import org.dromara.visor.framework.log.core.annotation.IgnoreLog; import org.dromara.visor.framework.log.core.enums.IgnoreLogMode; import org.dromara.visor.framework.web.core.annotation.RestWrapper; -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.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.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -47,12 +47,12 @@ import java.util.List; * @version 1.0.0 * @since 2024-1-24 12:28 */ -@Tag(name = "asset - 命令片段分组服务") +@Tag(name = "terminal - 命令片段分组服务") @Slf4j @Validated @RestWrapper @RestController -@RequestMapping("/asset/command-snippet-group") +@RequestMapping("/terminal/command-snippet-group") public class CommandSnippetGroupController { @Resource diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/PathBookmarkController.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/PathBookmarkController.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/controller/PathBookmarkController.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/PathBookmarkController.java index d66f4343..63711656 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/PathBookmarkController.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/PathBookmarkController.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.controller; +package org.dromara.visor.module.terminal.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.dromara.visor.framework.web.core.annotation.RestWrapper; -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.PathBookmarkWrapperVO; -import org.dromara.visor.module.asset.service.PathBookmarkService; +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.PathBookmarkWrapperVO; +import org.dromara.visor.module.terminal.service.PathBookmarkService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -43,12 +43,12 @@ import javax.annotation.Resource; * @version 1.0.6 * @since 2024-4-23 23:15 */ -@Tag(name = "asset - 路径标签服务") +@Tag(name = "terminal - 路径标签服务") @Slf4j @Validated @RestWrapper @RestController -@RequestMapping("/asset/path-bookmark") +@RequestMapping("/terminal/path-bookmark") public class PathBookmarkController { @Resource diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/PathBookmarkGroupController.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/PathBookmarkGroupController.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/controller/PathBookmarkGroupController.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/PathBookmarkGroupController.java index 59f0b2e0..4d39492d 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/PathBookmarkGroupController.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/PathBookmarkGroupController.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.controller; +package org.dromara.visor.module.terminal.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -29,11 +29,11 @@ import org.dromara.visor.common.validator.group.Id; import org.dromara.visor.framework.log.core.annotation.IgnoreLog; import org.dromara.visor.framework.log.core.enums.IgnoreLogMode; import org.dromara.visor.framework.web.core.annotation.RestWrapper; -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.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.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -47,12 +47,12 @@ import java.util.List; * @version 1.0.0 * @since 2024-1-24 12:28 */ -@Tag(name = "asset - 路径标签分组服务") +@Tag(name = "terminal - 路径标签分组服务") @Slf4j @Validated @RestWrapper @RestController -@RequestMapping("/asset/path-bookmark-group") +@RequestMapping("/terminal/path-bookmark-group") public class PathBookmarkGroupController { @Resource diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/TerminalConnectLogController.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/TerminalConnectLogController.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/controller/TerminalConnectLogController.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/TerminalConnectLogController.java index 1d552e8a..b105e705 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/TerminalConnectLogController.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/TerminalConnectLogController.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.controller; +package org.dromara.visor.module.terminal.controller; import cn.orionsec.kit.lang.define.wrapper.DataGrid; import io.swagger.v3.oas.annotations.Operation; @@ -34,11 +34,11 @@ import org.dromara.visor.framework.log.core.annotation.IgnoreLog; import org.dromara.visor.framework.log.core.enums.IgnoreLogMode; import org.dromara.visor.framework.web.core.annotation.DemoDisableApi; import org.dromara.visor.framework.web.core.annotation.RestWrapper; -import org.dromara.visor.module.asset.define.operator.TerminalConnectLogOperatorType; -import org.dromara.visor.module.asset.entity.request.host.TerminalConnectLogClearRequest; -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.service.TerminalConnectLogService; +import org.dromara.visor.module.terminal.define.operator.TerminalConnectLogOperatorType; +import org.dromara.visor.module.terminal.entity.request.terminal.TerminalConnectLogClearRequest; +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.service.TerminalConnectLogService; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -54,12 +54,12 @@ import java.util.Set; * @version 1.0.0 * @since 2023-12-26 22:09 */ -@Tag(name = "asset - 终端连接日志服务") +@Tag(name = "terminal - 终端连接日志服务") @Slf4j @Validated @RestWrapper @RestController -@RequestMapping("/asset/terminal-connect-log") +@RequestMapping("/terminal/terminal-connect-log") public class TerminalConnectLogController { @Resource @@ -68,22 +68,22 @@ public class TerminalConnectLogController { @IgnoreLog(IgnoreLogMode.RET) @PostMapping("/query") @Operation(summary = "分页查询终端连接日志") - @PreAuthorize("@ss.hasPermission('asset:terminal-connect-log:management:query')") + @PreAuthorize("@ss.hasPermission('terminal:terminal-connect-log:management:query')") public DataGrid getTerminalConnectLogPage(@Validated(Page.class) @RequestBody TerminalConnectLogQueryRequest request) { return terminalConnectLogService.getTerminalConnectLogPage(request); } @PostMapping("/count") @Operation(summary = "查询终端连接日志数量") - @PreAuthorize("@ss.hasPermission('asset:terminal-connect-log:management:query')") + @PreAuthorize("@ss.hasPermission('terminal:terminal-connect-log:management:query')") public Long getTerminalConnectLogCount(@Validated @RequestBody TerminalConnectLogQueryRequest request) { return terminalConnectLogService.getTerminalConnectLogCount(request); } @IgnoreLog(IgnoreLogMode.RET) @PostMapping("/sessions") - @Operation(summary = "查询全部终端连接会话") - @PreAuthorize("@ss.hasPermission('asset:terminal-connect-session:management:query')") + @Operation(summary = "查询全部终端会话") + @PreAuthorize("@ss.hasPermission('terminal:terminal-connect-session:management:query')") public List getTerminalConnectSessions(@Validated @RequestBody TerminalConnectLogQueryRequest request) { return terminalConnectLogService.getTerminalConnectSessions(request); } @@ -99,7 +99,7 @@ public class TerminalConnectLogController { @DeleteMapping("/delete") @Operation(summary = "删除终端连接日志") @Parameter(name = "idList", description = "idList", required = true) - @PreAuthorize("@ss.hasPermission('asset:terminal-connect-log:management:delete')") + @PreAuthorize("@ss.hasPermission('terminal:terminal-connect-log:management:delete')") public Integer deleteTerminalConnectLog(@RequestParam("idList") List idList) { return terminalConnectLogService.deleteTerminalConnectLog(idList); } @@ -107,7 +107,7 @@ public class TerminalConnectLogController { @OperatorLog(TerminalConnectLogOperatorType.CLEAR) @PostMapping("/clear") @Operation(summary = "清空终端连接日志") - @PreAuthorize("@ss.hasPermission('asset:terminal-connect-log:management:clear')") + @PreAuthorize("@ss.hasPermission('terminal:terminal-connect-log:management:clear')") public Integer clearTerminalConnectLog(@Validated @RequestBody TerminalConnectLogClearRequest request) { return terminalConnectLogService.clearTerminalConnectLog(request); } @@ -115,8 +115,8 @@ public class TerminalConnectLogController { @DemoDisableApi @OperatorLog(TerminalConnectLogOperatorType.FORCE_OFFLINE) @PutMapping("/force-offline") - @Operation(summary = "强制断开终端连接") - @PreAuthorize("@ss.hasAnyPermission('asset:terminal-connect-log:management:force-offline', 'asset:terminal-connect-session:management:force-offline')") + @Operation(summary = "强制断开终端") + @PreAuthorize("@ss.hasAnyPermission('terminal:terminal-connect-log:management:force-offline', 'terminal:terminal-connect-session:management:force-offline')") public Boolean forceOffline(@Validated(Id.class) @RequestBody TerminalConnectLogQueryRequest request) { terminalConnectLogService.forceOffline(request); 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/controller/TerminalController.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/TerminalController.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/controller/TerminalController.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/TerminalController.java index cd574fe3..0d92f2b6 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/TerminalController.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/TerminalController.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.controller; +package org.dromara.visor.module.terminal.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -28,13 +28,12 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.visor.framework.log.core.annotation.IgnoreLog; import org.dromara.visor.framework.log.core.enums.IgnoreLogMode; import org.dromara.visor.framework.web.core.annotation.RestWrapper; -import org.dromara.visor.module.asset.entity.vo.TerminalThemeVO; -import org.dromara.visor.module.asset.service.TerminalService; +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.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; @@ -46,12 +45,12 @@ import java.util.List; * @version 1.0.0 * @since 2023-9-20 11:55 */ -@Tag(name = "asset - 终端服务") +@Tag(name = "terminal - 终端服务") @Slf4j @Validated @RestWrapper @RestController -@RequestMapping("/asset/terminal") +@RequestMapping("/terminal/terminal") public class TerminalController { @Resource @@ -64,16 +63,16 @@ public class TerminalController { return terminalService.getTerminalThemes(); } - @GetMapping("/access") + @PostMapping("/access") @Operation(summary = "获取终端 accessToken") - @PreAuthorize("@ss.hasPermission('asset:terminal:access')") - public String getTerminalAccessToken() { - return terminalService.getTerminalAccessToken(); + @PreAuthorize("@ss.hasPermission('terminal:terminal:access')") + public String getTerminalAccessToken(@Validated @RequestBody TerminalSessionAccessRequest request) { + return terminalService.getTerminalAccessToken(request); } @GetMapping("/transfer") @Operation(summary = "获取终端 transferToken") - @PreAuthorize("@ss.hasPermission('asset:terminal:access')") + @PreAuthorize("@ss.hasPermission('terminal:terminal:access')") public String getTerminalTransferToken() { return terminalService.getTerminalTransferToken(); } diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/TerminalSftpController.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/TerminalSftpController.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/controller/TerminalSftpController.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/TerminalSftpController.java index b0abfa07..62386b2e 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/TerminalSftpController.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/TerminalSftpController.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.controller; +package org.dromara.visor.module.terminal.controller; import cn.orionsec.kit.lang.define.wrapper.DataGrid; import io.swagger.v3.oas.annotations.Operation; @@ -33,10 +33,10 @@ import org.dromara.visor.framework.log.core.annotation.IgnoreLog; import org.dromara.visor.framework.log.core.enums.IgnoreLogMode; import org.dromara.visor.framework.web.core.annotation.IgnoreWrapper; import org.dromara.visor.framework.web.core.annotation.RestWrapper; -import org.dromara.visor.module.asset.define.operator.TerminalOperatorType; -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.service.TerminalSftpService; +import org.dromara.visor.module.terminal.define.operator.TerminalOperatorType; +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.service.TerminalSftpService; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -55,12 +55,12 @@ import java.util.List; * @version 1.0.0 * @since 2023-12-26 22:09 */ -@Tag(name = "asset - SFTP 操作服务") +@Tag(name = "terminal - SFTP 操作服务") @Slf4j @Validated @RestWrapper @RestController -@RequestMapping("/asset/terminal-sftp") +@RequestMapping("/terminal/terminal-sftp") public class TerminalSftpController { @Resource @@ -69,16 +69,24 @@ public class TerminalSftpController { @IgnoreLog(IgnoreLogMode.RET) @PostMapping("/query-log") @Operation(summary = "分页查询 SFTP 操作日志") - @PreAuthorize("@ss.hasAnyPermission('infra:operator-log:query', 'asset:terminal-sftp-log:management:query')") + @PreAuthorize("@ss.hasAnyPermission('infra:operator-log:query', 'terminal:terminal-sftp-log:management:query')") public DataGrid getTerminalSftpLogPage(@Validated(Page.class) @RequestBody TerminalSftpLogQueryRequest request) { return terminalSftpService.getTerminalSftpLogPage(request); } + @IgnoreLog(IgnoreLogMode.RET) + @PostMapping("/log-count") + @Operation(summary = "查询 SFTP 操作日志数量") + @PreAuthorize("@ss.hasAnyPermission('infra:operator-log:query', 'terminal:terminal-sftp-log:management:query')") + public Long getTerminalSftpLogCount(@Validated @RequestBody TerminalSftpLogQueryRequest request) { + return terminalSftpService.getTerminalSftpLogCount(request); + } + @OperatorLog(TerminalOperatorType.DELETE_SFTP_LOG) @DeleteMapping("/delete-log") @Operation(summary = "删除 SFTP 操作日志") @Parameter(name = "idList", description = "idList", required = true) - @PreAuthorize("@ss.hasAnyPermission('infra:operator-log:delete', 'asset:terminal-sftp-log:management:delete')") + @PreAuthorize("@ss.hasAnyPermission('infra:operator-log:delete', 'terminal:terminal-sftp-log:management:delete')") public Integer deleteTerminalSftpLog(@RequestParam("idList") List idList) { return terminalSftpService.deleteTerminalSftpLog(idList); } diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/AssetStatisticsController.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/TerminalStatisticsController.java similarity index 68% rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/AssetStatisticsController.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/TerminalStatisticsController.java index 7c2ec0d7..29bec92f 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/controller/AssetStatisticsController.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/controller/TerminalStatisticsController.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.controller; +package org.dromara.visor.module.terminal.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; -import org.dromara.visor.common.entity.chart.PieChartData; import org.dromara.visor.framework.log.core.annotation.IgnoreLog; import org.dromara.visor.framework.log.core.enums.IgnoreLogMode; import org.dromara.visor.framework.web.core.annotation.RestWrapper; -import org.dromara.visor.module.asset.service.AssetStatisticsService; -import org.springframework.security.access.prepost.PreAuthorize; +import org.dromara.visor.module.terminal.entity.vo.TerminalWorkplaceStatisticsVO; +import org.dromara.visor.module.terminal.service.TerminalStatisticsService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -39,29 +38,28 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** - * asset - 统计服务 + * terminal - 统计服务 * * @author Jiahang Li * @version 1.0.0 - * @since 2024/12/23 15:56 + * @since 2024/12/23 16:07 */ -@Tag(name = "asset - 统计服务") +@Tag(name = "terminal - 统计服务") @Slf4j @Validated @RestWrapper @RestController -@RequestMapping("/asset/statistics") -public class AssetStatisticsController { +@RequestMapping("/terminal/statistics") +public class TerminalStatisticsController { @Resource - private AssetStatisticsService assetStatisticsService; + private TerminalStatisticsService terminalStatisticsService; @IgnoreLog(IgnoreLogMode.RET) - @GetMapping("/host-type-chart") - @Operation(summary = "查询主机类型图表") - @PreAuthorize("@ss.hasPermission('asset:statistics:query')") - public PieChartData getHostTypeChart() { - return assetStatisticsService.getHostTypeChart(); + @GetMapping("/get-workplace") + @Operation(summary = "查询工作台统计信息") + public TerminalWorkplaceStatisticsVO getWorkplaceStatisticsData() { + return terminalStatisticsService.getWorkplaceStatisticsData(); } } diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/convert/CommandSnippetConvert.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/CommandSnippetConvert.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/convert/CommandSnippetConvert.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/CommandSnippetConvert.java index d12d044a..8a7469b2 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/convert/CommandSnippetConvert.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/CommandSnippetConvert.java @@ -20,13 +20,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.asset.convert; +package org.dromara.visor.module.terminal.convert; -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.CommandSnippetVO; +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.CommandSnippetVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/convert/CommandSnippetGroupConvert.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/CommandSnippetGroupConvert.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/convert/CommandSnippetGroupConvert.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/CommandSnippetGroupConvert.java index b7815f51..5af69e3b 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/convert/CommandSnippetGroupConvert.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/CommandSnippetGroupConvert.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.convert; +package org.dromara.visor.module.terminal.convert; -import org.dromara.visor.module.asset.entity.request.command.CommandSnippetGroupCreateRequest; -import org.dromara.visor.module.asset.entity.request.command.CommandSnippetGroupUpdateRequest; -import org.dromara.visor.module.asset.entity.vo.CommandSnippetGroupVO; 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.terminal.entity.request.snippet.CommandSnippetGroupCreateRequest; +import org.dromara.visor.module.terminal.entity.request.snippet.CommandSnippetGroupUpdateRequest; +import org.dromara.visor.module.terminal.entity.vo.CommandSnippetGroupVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/convert/PathBookmarkConvert.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/PathBookmarkConvert.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/convert/PathBookmarkConvert.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/PathBookmarkConvert.java index 536780f7..5af2b499 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/convert/PathBookmarkConvert.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/PathBookmarkConvert.java @@ -20,13 +20,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.asset.convert; +package org.dromara.visor.module.terminal.convert; -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.PathBookmarkVO; +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.PathBookmarkVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/convert/PathBookmarkGroupConvert.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/PathBookmarkGroupConvert.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/convert/PathBookmarkGroupConvert.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/PathBookmarkGroupConvert.java index 2c2b4dca..ff90e077 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/convert/PathBookmarkGroupConvert.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/PathBookmarkGroupConvert.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.convert; +package org.dromara.visor.module.terminal.convert; -import org.dromara.visor.module.asset.entity.request.path.PathBookmarkGroupCreateRequest; -import org.dromara.visor.module.asset.entity.request.path.PathBookmarkGroupUpdateRequest; -import org.dromara.visor.module.asset.entity.vo.PathBookmarkGroupVO; 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.terminal.entity.request.path.PathBookmarkGroupCreateRequest; +import org.dromara.visor.module.terminal.entity.request.path.PathBookmarkGroupUpdateRequest; +import org.dromara.visor.module.terminal.entity.vo.PathBookmarkGroupVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/convert/TerminalConnectLogConvert.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/TerminalConnectLogConvert.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/convert/TerminalConnectLogConvert.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/TerminalConnectLogConvert.java index bf1abc6f..07b24c8d 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/convert/TerminalConnectLogConvert.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/TerminalConnectLogConvert.java @@ -20,13 +20,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.asset.convert; +package org.dromara.visor.module.terminal.convert; -import org.dromara.visor.module.asset.entity.domain.TerminalConnectLogDO; -import org.dromara.visor.module.asset.entity.dto.TerminalConnectDTO; -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.terminal.entity.domain.TerminalConnectLogDO; +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.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -50,8 +49,6 @@ public interface TerminalConnectLogConvert { TerminalConnectLogVO to(TerminalConnectLogDO domain); - TerminalConnectLogCreateRequest to(TerminalConnectDTO dto); - List to(List list); } diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/TerminalSessionConvert.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/TerminalSessionConvert.java new file mode 100644 index 00000000..e9738a42 --- /dev/null +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/TerminalSessionConvert.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.convert; + +import org.dromara.visor.common.session.config.RdpConnectConfig; +import org.dromara.visor.common.session.config.SshConnectConfig; +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.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 终端会话 内部对象转换器 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023-12-26 22:09 + */ +@Mapper +public interface TerminalSessionConvert { + + TerminalSessionConvert MAPPER = Mappers.getMapper(TerminalSessionConvert.class); + + TerminalSessionSshConfig toSsh(SshConnectConfig request); + + TerminalSessionSftpConfig toSftp(SshConnectConfig request); + + TerminalSessionRdpConfig toRdp(RdpConnectConfig domain); + +} diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/convert/TerminalSftpLogConvert.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/TerminalSftpLogConvert.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/convert/TerminalSftpLogConvert.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/TerminalSftpLogConvert.java index e8967fb5..604fb740 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/convert/TerminalSftpLogConvert.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/convert/TerminalSftpLogConvert.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.convert; +package org.dromara.visor.module.terminal.convert; -import org.dromara.visor.module.asset.entity.vo.TerminalSftpLogVO; import org.dromara.visor.module.infra.entity.dto.operator.OperatorLogDTO; +import org.dromara.visor.module.terminal.entity.vo.TerminalSftpLogVO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/dao/CommandSnippetDAO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/dao/CommandSnippetDAO.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/dao/CommandSnippetDAO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/dao/CommandSnippetDAO.java index d23770a7..07ed71ba 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/dao/CommandSnippetDAO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/dao/CommandSnippetDAO.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.dao; +package org.dromara.visor.module.terminal.dao; +import org.dromara.visor.framework.mybatis.core.mapper.IMapper; +import org.dromara.visor.module.terminal.entity.domain.CommandSnippetDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.apache.ibatis.annotations.Mapper; -import org.dromara.visor.framework.mybatis.core.mapper.IMapper; -import org.dromara.visor.module.asset.entity.domain.CommandSnippetDO; 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/dao/PathBookmarkDAO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/dao/PathBookmarkDAO.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/dao/PathBookmarkDAO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/dao/PathBookmarkDAO.java index b9d42e91..1acacd0d 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/dao/PathBookmarkDAO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/dao/PathBookmarkDAO.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.dao; +package org.dromara.visor.module.terminal.dao; +import org.dromara.visor.framework.mybatis.core.mapper.IMapper; +import org.dromara.visor.module.terminal.entity.domain.PathBookmarkDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.apache.ibatis.annotations.Mapper; -import org.dromara.visor.framework.mybatis.core.mapper.IMapper; -import org.dromara.visor.module.asset.entity.domain.PathBookmarkDO; 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/dao/TerminalConnectLogDAO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/dao/TerminalConnectLogDAO.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/dao/TerminalConnectLogDAO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/dao/TerminalConnectLogDAO.java index da025b20..d128f18a 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/dao/TerminalConnectLogDAO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/dao/TerminalConnectLogDAO.java @@ -20,13 +20,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.asset.dao; +package org.dromara.visor.module.terminal.dao; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.dromara.visor.framework.mybatis.core.mapper.IMapper; -import org.dromara.visor.module.asset.entity.domain.TerminalConnectLogDO; -import org.dromara.visor.module.asset.entity.po.TerminalConnectLogCountPO; +import org.dromara.visor.module.terminal.entity.domain.TerminalConnectLogDO; +import org.dromara.visor.module.terminal.entity.po.TerminalConnectLogCountPO; import java.util.Date; import java.util.List; @@ -73,4 +73,19 @@ public interface TerminalConnectLogDAO extends IMapper { @Param("startTime") Date startTime, @Param("endTime") Date endTime); + /** + * 通过 sessionId 查询 + * + * @param sessionId sessionId + * @return row + */ + default TerminalConnectLogDO selectBySessionId(String sessionId) { + return this.of() + .createWrapper() + .eq(TerminalConnectLogDO::getSessionId, sessionId) + .orderByDesc(TerminalConnectLogDO::getId) + .then() + .getOne(); + } + } diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/TerminalThreadPools.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/TerminalThreadPools.java new file mode 100644 index 00000000..637c4f60 --- /dev/null +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/TerminalThreadPools.java @@ -0,0 +1,75 @@ +/* + * 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.define; + +import cn.orionsec.kit.lang.define.thread.ExecutorBuilder; +import org.dromara.visor.common.constant.Const; + +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 终端线程池 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/1/3 11:21 + */ +public interface TerminalThreadPools { + + /** + * terminal 标准输出线程池 + */ + ThreadPoolExecutor TERMINAL_STDOUT = ExecutorBuilder.create() + .namedThreadFactory("terminal-stdout-") + .corePoolSize(1) + .maxPoolSize(Integer.MAX_VALUE) + .keepAliveTime(Const.MS_S_60) + .workQueue(new SynchronousQueue<>()) + .allowCoreThreadTimeout(true) + .build(); + + /** + * terminal 操作线程池 + */ + ThreadPoolExecutor TERMINAL_OPERATOR = ExecutorBuilder.create() + .namedThreadFactory("terminal-operator-") + .corePoolSize(1) + .maxPoolSize(Integer.MAX_VALUE) + .keepAliveTime(Const.MS_S_60) + .workQueue(new SynchronousQueue<>()) + .allowCoreThreadTimeout(true) + .build(); + + /** + * 终端异步保存线程池 + */ + ThreadPoolExecutor TERMINAL_ASYNC_SAVER = ExecutorBuilder.create() + .namedThreadFactory("terminal-async-saver-") + .corePoolSize(1) + .maxPoolSize(1) + .workQueue(new LinkedBlockingQueue<>()) + .build(); + +} diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/cache/CommandSnippetCacheKeyDefine.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/cache/CommandSnippetCacheKeyDefine.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/define/cache/CommandSnippetCacheKeyDefine.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/cache/CommandSnippetCacheKeyDefine.java index 6d84d240..b680e72f 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/cache/CommandSnippetCacheKeyDefine.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/cache/CommandSnippetCacheKeyDefine.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.define.cache; +package org.dromara.visor.module.terminal.define.cache; +import org.dromara.visor.module.terminal.entity.dto.CommandSnippetCacheDTO; import cn.orionsec.kit.lang.define.cache.key.CacheKeyBuilder; import cn.orionsec.kit.lang.define.cache.key.CacheKeyDefine; import cn.orionsec.kit.lang.define.cache.key.struct.RedisCacheStruct; -import org.dromara.visor.module.asset.entity.dto.CommandSnippetCacheDTO; import java.util.concurrent.TimeUnit; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/cache/PathBookmarkCacheKeyDefine.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/cache/PathBookmarkCacheKeyDefine.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/define/cache/PathBookmarkCacheKeyDefine.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/cache/PathBookmarkCacheKeyDefine.java index b35cb512..adb645ac 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/cache/PathBookmarkCacheKeyDefine.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/cache/PathBookmarkCacheKeyDefine.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.define.cache; +package org.dromara.visor.module.terminal.define.cache; +import org.dromara.visor.module.terminal.entity.dto.PathBookmarkCacheDTO; import cn.orionsec.kit.lang.define.cache.key.CacheKeyBuilder; import cn.orionsec.kit.lang.define.cache.key.CacheKeyDefine; import cn.orionsec.kit.lang.define.cache.key.struct.RedisCacheStruct; -import org.dromara.visor.module.asset.entity.dto.PathBookmarkCacheDTO; import java.util.concurrent.TimeUnit; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/cache/TerminalCacheKeyDefine.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/cache/TerminalCacheKeyDefine.java similarity index 87% rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/cache/TerminalCacheKeyDefine.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/cache/TerminalCacheKeyDefine.java index c16b15ad..be07ea2a 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/cache/TerminalCacheKeyDefine.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/cache/TerminalCacheKeyDefine.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.define.cache; +package org.dromara.visor.module.terminal.define.cache; import cn.orionsec.kit.lang.define.cache.key.CacheKeyBuilder; import cn.orionsec.kit.lang.define.cache.key.CacheKeyDefine; import cn.orionsec.kit.lang.define.cache.key.struct.RedisCacheStruct; -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.TerminalAccessDTO; -import org.dromara.visor.module.asset.entity.dto.TerminalTransferDTO; +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.dto.TerminalAccessDTO; +import org.dromara.visor.module.terminal.entity.dto.TerminalTransferDTO; import java.util.concurrent.TimeUnit; diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/cache/TerminalStatisticsCacheKeyDefine.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/cache/TerminalStatisticsCacheKeyDefine.java new file mode 100644 index 00000000..94d0cbf8 --- /dev/null +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/cache/TerminalStatisticsCacheKeyDefine.java @@ -0,0 +1,49 @@ +/* + * 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.define.cache; + +import cn.orionsec.kit.lang.define.cache.key.CacheKeyBuilder; +import cn.orionsec.kit.lang.define.cache.key.CacheKeyDefine; +import cn.orionsec.kit.lang.define.cache.key.struct.RedisCacheStruct; +import org.dromara.visor.module.terminal.entity.vo.TerminalWorkplaceStatisticsVO; + +import java.util.concurrent.TimeUnit; + +/** + * terminal 模块统计缓存 key + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/12/23 16:10 + */ +public interface TerminalStatisticsCacheKeyDefine { + + CacheKeyDefine WORKPLACE_DATA = new CacheKeyBuilder() + .key("data:statistics:terminal-workplace:{}:{}") + .desc("终端模块工作台统计 ${userId} ${time}") + .type(TerminalWorkplaceStatisticsVO.class) + .struct(RedisCacheStruct.STRING) + .timeout(10, TimeUnit.MINUTES) + .build(); + +} diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/message/UploadMessageDefine.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/message/UploadMessageDefine.java new file mode 100644 index 00000000..bbfb5742 --- /dev/null +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/message/UploadMessageDefine.java @@ -0,0 +1,75 @@ +/* + * 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.define.message; + +import org.dromara.visor.module.infra.define.SystemMessageDefine; +import org.dromara.visor.module.infra.enums.MessageClassifyEnum; +import lombok.Getter; + +/** + * 上传任务 系统消息定义 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/5/14 17:23 + */ +@Getter +public enum UploadMessageDefine implements SystemMessageDefine { + + /** + * 上传任务部分失败 + */ + UPLOAD_FAILED(MessageClassifyEnum.NOTICE, + "批量上传失败", + "您在 ${time} 提交的上传任务中, 有部分主机文件上传失败。点击查看详情 #${id} >>>"), + + ; + + UploadMessageDefine(MessageClassifyEnum classify, String title, String content) { + this.classify = classify; + this.type = this.name(); + this.title = title; + this.content = content; + } + + /** + * 消息分类 + */ + private final MessageClassifyEnum classify; + + /** + * 消息类型 + */ + private final String type; + + /** + * 标题 + */ + private final String title; + + /** + * 内容 + */ + private final String content; + +} diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/operator/TerminalConnectLogOperatorType.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/operator/TerminalConnectLogOperatorType.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/define/operator/TerminalConnectLogOperatorType.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/operator/TerminalConnectLogOperatorType.java index c906fdf3..cdba24f0 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/operator/TerminalConnectLogOperatorType.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/operator/TerminalConnectLogOperatorType.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.define.operator; +package org.dromara.visor.module.terminal.define.operator; import org.dromara.visor.framework.biz.operator.log.core.annotation.Module; import org.dromara.visor.framework.biz.operator.log.core.factory.InitializingOperatorTypes; @@ -36,7 +36,7 @@ import static org.dromara.visor.framework.biz.operator.log.core.enums.OperatorRi * @version 1.0.0 * @since 2024/3/2 14:37 */ -@Module("asset:terminal-connect-log") +@Module("terminal:terminal-connect-log") public class TerminalConnectLogOperatorType extends InitializingOperatorTypes { public static final String DELETE = "terminal-connect-log:delete"; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/operator/TerminalOperatorType.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/operator/TerminalOperatorType.java 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/define/operator/TerminalOperatorType.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/operator/TerminalOperatorType.java index 45d3dae5..4535b49f 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/operator/TerminalOperatorType.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/operator/TerminalOperatorType.java @@ -20,17 +20,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.asset.define.operator; +package org.dromara.visor.module.terminal.define.operator; import cn.orionsec.kit.lang.utils.collect.Lists; import org.dromara.visor.framework.biz.operator.log.core.annotation.Module; +import org.dromara.visor.framework.biz.operator.log.core.enums.OperatorRiskLevel; import org.dromara.visor.framework.biz.operator.log.core.factory.InitializingOperatorTypes; import org.dromara.visor.framework.biz.operator.log.core.model.OperatorType; import java.util.List; -import static org.dromara.visor.framework.biz.operator.log.core.enums.OperatorRiskLevel.*; - /** * 终端 操作日志类型 * @@ -38,7 +37,7 @@ import static org.dromara.visor.framework.biz.operator.log.core.enums.OperatorRi * @version 1.0.0 * @since 2023/10/10 17:30 */ -@Module("asset:terminal") +@Module("terminal:terminal") public class TerminalOperatorType extends InitializingOperatorTypes { public static final String CONNECT = "terminal:connect"; @@ -57,6 +56,12 @@ public class TerminalOperatorType extends InitializingOperatorTypes { public static final String SFTP_CHMOD = "terminal:sftp-chmod"; + public static final String SFTP_CHOWN = "terminal:sftp-chown"; + + public static final String SFTP_CHGRP = "terminal:sftp-chgrp"; + + public static final String SFTP_GET_CONTENT = "terminal:sftp-get-content"; + public static final String SFTP_SET_CONTENT = "terminal:sftp-set-content"; public static final String SFTP_UPLOAD = "terminal:sftp-upload"; @@ -70,6 +75,9 @@ public class TerminalOperatorType extends InitializingOperatorTypes { SFTP_REMOVE, SFTP_TRUNCATE, SFTP_CHMOD, + SFTP_CHOWN, + SFTP_CHGRP, + SFTP_GET_CONTENT, SFTP_SET_CONTENT, SFTP_UPLOAD, SFTP_DOWNLOAD @@ -78,17 +86,20 @@ public class TerminalOperatorType extends InitializingOperatorTypes { @Override public OperatorType[] types() { return new OperatorType[]{ - new OperatorType(L, CONNECT, "连接主机 ${connectType} ${hostName}"), - new OperatorType(H, DELETE_SFTP_LOG, "删除 SFTP 操作日志 ${count} 条"), - new OperatorType(L, SFTP_MKDIR, "创建文件夹 ${hostName} ${path}"), - new OperatorType(L, SFTP_TOUCH, "创建文件 ${hostName} ${path}"), - new OperatorType(M, SFTP_MOVE, "移动文件 ${hostName} ${path}${target}"), - new OperatorType(H, SFTP_REMOVE, "删除文件 ${hostName} ${path}"), - new OperatorType(H, SFTP_TRUNCATE, "截断文件 ${hostName} ${path}"), - new OperatorType(M, SFTP_CHMOD, "文件提权 ${hostName} ${path} ${mod}"), - new OperatorType(M, SFTP_SET_CONTENT, "修改文件内容 ${hostName} ${path}"), - new OperatorType(M, SFTP_UPLOAD, "上传文件 ${hostName} ${path}"), - new OperatorType(M, SFTP_DOWNLOAD, "下载文件 ${hostName} ${path}"), + new OperatorType(OperatorRiskLevel.L, CONNECT, "连接主机 ${connectType} ${hostName}"), + new OperatorType(OperatorRiskLevel.H, DELETE_SFTP_LOG, "删除 SFTP 操作日志 ${count} 条"), + new OperatorType(OperatorRiskLevel.L, SFTP_MKDIR, "创建文件夹 ${hostName} ${path}"), + new OperatorType(OperatorRiskLevel.L, SFTP_TOUCH, "创建文件 ${hostName} ${path}"), + new OperatorType(OperatorRiskLevel.M, SFTP_MOVE, "移动文件 ${hostName} ${path}${target}"), + new OperatorType(OperatorRiskLevel.H, SFTP_REMOVE, "删除文件 ${hostName} ${path}"), + new OperatorType(OperatorRiskLevel.H, SFTP_TRUNCATE, "截断文件 ${hostName} ${path}"), + new OperatorType(OperatorRiskLevel.M, SFTP_CHMOD, "文件提权 ${hostName} ${path} ${mod}"), + new OperatorType(OperatorRiskLevel.M, SFTP_CHOWN, "修改文件归属 ${hostName} ${path} ${id}"), + new OperatorType(OperatorRiskLevel.M, SFTP_CHGRP, "修改文件分组 ${hostName} ${path} ${id}"), + new OperatorType(OperatorRiskLevel.L, SFTP_GET_CONTENT, "获取文件内容 ${hostName} ${path}"), + new OperatorType(OperatorRiskLevel.M, SFTP_SET_CONTENT, "修改文件内容 ${hostName} ${path}"), + new OperatorType(OperatorRiskLevel.M, SFTP_UPLOAD, "上传文件 ${hostName} ${path}"), + new OperatorType(OperatorRiskLevel.M, SFTP_DOWNLOAD, "下载文件 ${hostName} ${path}"), }; } diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/domain/CommandSnippetDO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/domain/CommandSnippetDO.java similarity index 97% rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/domain/CommandSnippetDO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/domain/CommandSnippetDO.java index 7cb2070b..ce36ee68 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/domain/CommandSnippetDO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/domain/CommandSnippetDO.java @@ -20,8 +20,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.asset.entity.domain; +package org.dromara.visor.module.terminal.entity.domain; +import org.dromara.visor.framework.mybatis.core.domain.BaseDO; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; @@ -30,7 +31,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import org.dromara.visor.framework.mybatis.core.domain.BaseDO; /** * 命令片段 实体对象 diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/domain/PathBookmarkDO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/domain/PathBookmarkDO.java similarity index 97% rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/domain/PathBookmarkDO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/domain/PathBookmarkDO.java index 91348aba..4a7a0f1f 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/domain/PathBookmarkDO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/domain/PathBookmarkDO.java @@ -20,8 +20,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.asset.entity.domain; +package org.dromara.visor.module.terminal.entity.domain; +import org.dromara.visor.framework.mybatis.core.domain.BaseDO; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; @@ -30,7 +31,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import org.dromara.visor.framework.mybatis.core.domain.BaseDO; /** * 路径标签 实体对象 diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/domain/TerminalConnectLogDO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/domain/TerminalConnectLogDO.java similarity index 98% rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/domain/TerminalConnectLogDO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/domain/TerminalConnectLogDO.java index cdf161fb..10c9a2f5 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/domain/TerminalConnectLogDO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/domain/TerminalConnectLogDO.java @@ -20,8 +20,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.asset.entity.domain; +package org.dromara.visor.module.terminal.entity.domain; +import org.dromara.visor.framework.mybatis.core.domain.BaseDO; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; @@ -30,7 +31,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import org.dromara.visor.framework.mybatis.core.domain.BaseDO; import java.util.Date; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/CommandSnippetCacheDTO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/CommandSnippetCacheDTO.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/entity/dto/CommandSnippetCacheDTO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/CommandSnippetCacheDTO.java index 20b7bfb1..6ada93a0 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/CommandSnippetCacheDTO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/CommandSnippetCacheDTO.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.entity.dto; +package org.dromara.visor.module.terminal.entity.dto; import cn.orionsec.kit.lang.define.cache.key.model.LongCacheIdModel; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/PathBookmarkCacheDTO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/PathBookmarkCacheDTO.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/entity/dto/PathBookmarkCacheDTO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/PathBookmarkCacheDTO.java index daa4a226..8e4be1c5 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/PathBookmarkCacheDTO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/PathBookmarkCacheDTO.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.entity.dto; +package org.dromara.visor.module.terminal.entity.dto; import cn.orionsec.kit.lang.define.cache.key.model.LongCacheIdModel; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/SftpGetContentCacheDTO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/SftpGetContentCacheDTO.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/entity/dto/SftpGetContentCacheDTO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/SftpGetContentCacheDTO.java index e531aa77..cbf75a09 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/SftpGetContentCacheDTO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/SftpGetContentCacheDTO.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.entity.dto; +package org.dromara.visor.module.terminal.entity.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/SftpSetContentCacheDTO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/SftpSetContentCacheDTO.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/entity/dto/SftpSetContentCacheDTO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/SftpSetContentCacheDTO.java index d0b22429..3e24d0f1 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/SftpSetContentCacheDTO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/SftpSetContentCacheDTO.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.entity.dto; +package org.dromara.visor.module.terminal.entity.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/TerminalAccessDTO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/TerminalAccessDTO.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/entity/dto/TerminalAccessDTO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/TerminalAccessDTO.java index 6169e4e7..97e69196 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/TerminalAccessDTO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/TerminalAccessDTO.java @@ -20,14 +20,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.asset.entity.dto; +package org.dromara.visor.module.terminal.entity.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.dromara.visor.framework.desensitize.core.annotation.DesensitizeObject; + +import java.util.Map; /** * 终端访问参数 @@ -40,7 +41,6 @@ import org.dromara.visor.framework.desensitize.core.annotation.DesensitizeObject @Builder @NoArgsConstructor @AllArgsConstructor -@DesensitizeObject @Schema(name = "TerminalAccessDTO", description = "终端访问参数") public class TerminalAccessDTO { @@ -50,4 +50,16 @@ public class TerminalAccessDTO { @Schema(description = "username") private String username; + @Schema(description = "nickname") + private String nickname; + + @Schema(description = "hostId") + private Long hostId; + + @Schema(description = "连接类型") + private String connectType; + + @Schema(description = "额外信息") + private Map extra; + } diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/TerminalConnectLogExtraDTO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/TerminalConnectLogExtraDTO.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/entity/dto/TerminalConnectLogExtraDTO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/TerminalConnectLogExtraDTO.java index 2805e48c..1d688dcf 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/TerminalConnectLogExtraDTO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/TerminalConnectLogExtraDTO.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.entity.dto; +package org.dromara.visor.module.terminal.entity.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; @@ -54,8 +54,8 @@ public class TerminalConnectLogExtraDTO { @Schema(description = "traceId") private String traceId; - @Schema(description = "channelId") - private String channelId; + @Schema(description = "channel") + private String channel; @Schema(description = "sessionId") private String sessionId; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/TerminalTransferDTO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/TerminalTransferDTO.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/entity/dto/TerminalTransferDTO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/TerminalTransferDTO.java index 7985f878..3b5e79d7 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/dto/TerminalTransferDTO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/dto/TerminalTransferDTO.java @@ -20,14 +20,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.asset.entity.dto; +package org.dromara.visor.module.terminal.entity.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.dromara.visor.framework.desensitize.core.annotation.DesensitizeObject; /** * 终端传输参数 @@ -40,7 +39,6 @@ import org.dromara.visor.framework.desensitize.core.annotation.DesensitizeObject @Builder @NoArgsConstructor @AllArgsConstructor -@DesensitizeObject @Schema(name = "TerminalTransferDTO", description = "终端传输参数") public class TerminalTransferDTO { @@ -50,4 +48,7 @@ public class TerminalTransferDTO { @Schema(description = "username") private String username; + @Schema(description = "nickname") + private String nickname; + } diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/po/TerminalConnectLogCountPO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/po/TerminalConnectLogCountPO.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/entity/po/TerminalConnectLogCountPO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/po/TerminalConnectLogCountPO.java index 490ec0b7..4f7ac7e2 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/po/TerminalConnectLogCountPO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/po/TerminalConnectLogCountPO.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.entity.po; +package org.dromara.visor.module.terminal.entity.po; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/path/PathBookmarkCreateRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkCreateRequest.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/entity/request/path/PathBookmarkCreateRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkCreateRequest.java index 00a40910..9f3b1a81 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/path/PathBookmarkCreateRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkCreateRequest.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.entity.request.path; +package org.dromara.visor.module.terminal.entity.request.path; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/path/PathBookmarkGroupCreateRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkGroupCreateRequest.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/entity/request/path/PathBookmarkGroupCreateRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkGroupCreateRequest.java index 1dae76d8..556b60ac 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/path/PathBookmarkGroupCreateRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkGroupCreateRequest.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.entity.request.path; +package org.dromara.visor.module.terminal.entity.request.path; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/path/PathBookmarkGroupDeleteRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkGroupDeleteRequest.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/entity/request/path/PathBookmarkGroupDeleteRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkGroupDeleteRequest.java index b7ada2b7..048ca6ca 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/path/PathBookmarkGroupDeleteRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkGroupDeleteRequest.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.entity.request.path; +package org.dromara.visor.module.terminal.entity.request.path; +import org.dromara.visor.common.validator.group.Id; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.dromara.visor.common.validator.group.Id; import javax.validation.constraints.NotNull; import java.io.Serializable; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/path/PathBookmarkGroupUpdateRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkGroupUpdateRequest.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/entity/request/path/PathBookmarkGroupUpdateRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkGroupUpdateRequest.java index e3b7c565..25c3605c 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/path/PathBookmarkGroupUpdateRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkGroupUpdateRequest.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.entity.request.path; +package org.dromara.visor.module.terminal.entity.request.path; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/path/PathBookmarkUpdateRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkUpdateRequest.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/entity/request/path/PathBookmarkUpdateRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkUpdateRequest.java index 272a5f94..b1952870 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/path/PathBookmarkUpdateRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/path/PathBookmarkUpdateRequest.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.entity.request.path; +package org.dromara.visor.module.terminal.entity.request.path; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/command/CommandSnippetCreateRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetCreateRequest.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/entity/request/command/CommandSnippetCreateRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetCreateRequest.java index 91b955c5..048adee8 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/command/CommandSnippetCreateRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetCreateRequest.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.entity.request.command; +package org.dromara.visor.module.terminal.entity.request.snippet; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/command/CommandSnippetGroupCreateRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetGroupCreateRequest.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/entity/request/command/CommandSnippetGroupCreateRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetGroupCreateRequest.java index 7caa213c..b4c2bdf1 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/command/CommandSnippetGroupCreateRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetGroupCreateRequest.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.entity.request.command; +package org.dromara.visor.module.terminal.entity.request.snippet; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/command/CommandSnippetGroupDeleteRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetGroupDeleteRequest.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/entity/request/command/CommandSnippetGroupDeleteRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetGroupDeleteRequest.java index 9cd07111..a5c3b194 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/command/CommandSnippetGroupDeleteRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetGroupDeleteRequest.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.entity.request.command; +package org.dromara.visor.module.terminal.entity.request.snippet; +import org.dromara.visor.common.validator.group.Id; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.dromara.visor.common.validator.group.Id; import javax.validation.constraints.NotNull; import java.io.Serializable; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/command/CommandSnippetGroupUpdateRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetGroupUpdateRequest.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/entity/request/command/CommandSnippetGroupUpdateRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetGroupUpdateRequest.java index 4fe7ad00..9a99b1a6 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/command/CommandSnippetGroupUpdateRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetGroupUpdateRequest.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.entity.request.command; +package org.dromara.visor.module.terminal.entity.request.snippet; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/command/CommandSnippetUpdateRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetUpdateRequest.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/entity/request/command/CommandSnippetUpdateRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetUpdateRequest.java index 4e432d23..5134e6a1 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/command/CommandSnippetUpdateRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/snippet/CommandSnippetUpdateRequest.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.entity.request.command; +package org.dromara.visor.module.terminal.entity.request.snippet; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/host/TerminalConnectLogClearRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalConnectLogClearRequest.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/entity/request/host/TerminalConnectLogClearRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalConnectLogClearRequest.java index 4247744c..5e0fe1b4 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/host/TerminalConnectLogClearRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalConnectLogClearRequest.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.entity.request.host; +package org.dromara.visor.module.terminal.entity.request.terminal; +import org.dromara.visor.common.entity.DataClearRequest; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -import org.dromara.visor.common.entity.DataClearRequest; import javax.validation.constraints.Max; import javax.validation.constraints.Min; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/host/TerminalConnectLogCreateRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalConnectLogCreateRequest.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/entity/request/host/TerminalConnectLogCreateRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalConnectLogCreateRequest.java index 26e86050..b5727a80 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/host/TerminalConnectLogCreateRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalConnectLogCreateRequest.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.entity.request.host; +package org.dromara.visor.module.terminal.entity.request.terminal; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/host/TerminalConnectLogQueryRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalConnectLogQueryRequest.java similarity index 97% rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/host/TerminalConnectLogQueryRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalConnectLogQueryRequest.java index ea6c152b..675d4034 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/host/TerminalConnectLogQueryRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalConnectLogQueryRequest.java @@ -20,13 +20,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.asset.entity.request.host; +package org.dromara.visor.module.terminal.entity.request.terminal; +import org.dromara.visor.common.entity.BaseQueryRequest; +import org.dromara.visor.common.validator.group.Id; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; -import org.dromara.visor.common.entity.BaseQueryRequest; -import org.dromara.visor.common.validator.group.Id; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/host/HostUpdateConfigRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalSessionAccessRequest.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/entity/request/host/HostUpdateConfigRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalSessionAccessRequest.java index 326ee72d..96a0cbc7 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/host/HostUpdateConfigRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalSessionAccessRequest.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.entity.request.host; +package org.dromara.visor.module.terminal.entity.request.terminal; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; @@ -30,28 +30,31 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; -import java.io.Serializable; +import java.util.Map; /** - * 主机 更新配置请求对象 + * 终端会话访问请求对象 * * @author Jiahang Li * @version 1.0.0 - * @since 2023-9-13 14:31 + * @since 2023-12-26 22:09 */ @Data @Builder @NoArgsConstructor @AllArgsConstructor -@Schema(name = "HostUpdateConfigRequest", description = "主机 更新配置请求对象") -public class HostUpdateConfigRequest implements Serializable { +@Schema(name = "TerminalSessionAccessRequest", description = "终端会话访问请求对象") +public class TerminalSessionAccessRequest { @NotNull - @Schema(description = "id") - private Long id; + @Schema(description = "主机id") + private Long hostId; @NotBlank - @Schema(description = "配置详情") - private String config; + @Schema(description = "连接类型") + private String connectType; + + @Schema(description = "额外信息") + private Map extra; } diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/host/TerminalSftpLogQueryRequest.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalSftpLogQueryRequest.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/entity/request/host/TerminalSftpLogQueryRequest.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalSftpLogQueryRequest.java index 0d89b8b5..999f2272 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/request/host/TerminalSftpLogQueryRequest.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/request/terminal/TerminalSftpLogQueryRequest.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.entity.request.host; +package org.dromara.visor.module.terminal.entity.request.terminal; +import org.dromara.visor.common.entity.BaseQueryRequest; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; -import org.dromara.visor.common.entity.BaseQueryRequest; import javax.validation.constraints.Size; import java.util.Date; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/CommandSnippetGroupVO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/CommandSnippetGroupVO.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/entity/vo/CommandSnippetGroupVO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/CommandSnippetGroupVO.java index 0a76d449..14eb2cc1 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/CommandSnippetGroupVO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/CommandSnippetGroupVO.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.entity.vo; +package org.dromara.visor.module.terminal.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/CommandSnippetVO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/CommandSnippetVO.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/entity/vo/CommandSnippetVO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/CommandSnippetVO.java index 6ce85579..056de18a 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/CommandSnippetVO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/CommandSnippetVO.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.entity.vo; +package org.dromara.visor.module.terminal.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/CommandSnippetWrapperVO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/CommandSnippetWrapperVO.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/entity/vo/CommandSnippetWrapperVO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/CommandSnippetWrapperVO.java index 598eba2c..62e191f9 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/CommandSnippetWrapperVO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/CommandSnippetWrapperVO.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.entity.vo; +package org.dromara.visor.module.terminal.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/PathBookmarkGroupVO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/PathBookmarkGroupVO.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/entity/vo/PathBookmarkGroupVO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/PathBookmarkGroupVO.java index a27f85b0..44e058dc 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/PathBookmarkGroupVO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/PathBookmarkGroupVO.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.entity.vo; +package org.dromara.visor.module.terminal.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/PathBookmarkVO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/PathBookmarkVO.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/entity/vo/PathBookmarkVO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/PathBookmarkVO.java index b325bc4c..63ff2cce 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/PathBookmarkVO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/PathBookmarkVO.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.entity.vo; +package org.dromara.visor.module.terminal.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/PathBookmarkWrapperVO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/PathBookmarkWrapperVO.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/entity/vo/PathBookmarkWrapperVO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/PathBookmarkWrapperVO.java index a76443f9..f8d60b93 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/PathBookmarkWrapperVO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/PathBookmarkWrapperVO.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.entity.vo; +package org.dromara.visor.module.terminal.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/TerminalConnectLogVO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/TerminalConnectLogVO.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/entity/vo/TerminalConnectLogVO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/TerminalConnectLogVO.java index 25868ed6..53bbc489 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/TerminalConnectLogVO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/TerminalConnectLogVO.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.entity.vo; +package org.dromara.visor.module.terminal.entity.vo; +import org.dromara.visor.module.terminal.entity.dto.TerminalConnectLogExtraDTO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.dromara.visor.module.asset.entity.dto.TerminalConnectLogExtraDTO; import java.io.Serializable; import java.util.Date; @@ -69,12 +69,12 @@ public class TerminalConnectLogVO implements Serializable { @Schema(description = "类型") private String type; - @Schema(description = "状态") - private String status; - @Schema(description = "sessionId") private String sessionId; + @Schema(description = "状态") + private String status; + @Schema(description = "开始时间") private Date startTime; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/TerminalSftpLogVO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/TerminalSftpLogVO.java similarity index 97% rename from orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/TerminalSftpLogVO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/TerminalSftpLogVO.java index aa61fa3e..97859976 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/TerminalSftpLogVO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/TerminalSftpLogVO.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.entity.vo; +package org.dromara.visor.module.terminal.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/TerminalThemeVO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/TerminalThemeVO.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/entity/vo/TerminalThemeVO.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/TerminalThemeVO.java index cafe5f3d..52184f6d 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/entity/vo/TerminalThemeVO.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/TerminalThemeVO.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.entity.vo; +package org.dromara.visor.module.terminal.entity.vo; import com.alibaba.fastjson.JSONObject; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/TerminalWorkplaceStatisticsVO.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/TerminalWorkplaceStatisticsVO.java new file mode 100644 index 00000000..07b61cfb --- /dev/null +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/entity/vo/TerminalWorkplaceStatisticsVO.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.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.visor.common.entity.chart.LineSingleChartData; + +import java.util.List; + +/** + * 终端模块工作台统计响应 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/12/26 15:32 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "TerminalWorkplaceStatisticsVO", description = "终端模块工作台统计响应") +public class TerminalWorkplaceStatisticsVO { + + @Schema(description = "今日连接终端次数") + private Integer todayTerminalConnectCount; + + @Schema(description = "7日连接终端次数") + private Integer weekTerminalConnectCount; + + @Schema(description = "连接终端次数图表") + private LineSingleChartData terminalConnectChart; + + @Schema(description = "连接终端记录") + private List terminalConnectList; + +} diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/enums/TerminalConnectStatusEnum.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/enums/TerminalConnectStatusEnum.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/enums/TerminalConnectStatusEnum.java rename to orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/enums/TerminalConnectStatusEnum.java index c76ecdf6..58fffddd 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/enums/TerminalConnectStatusEnum.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/enums/TerminalConnectStatusEnum.java @@ -20,9 +20,11 @@ * 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; import cn.orionsec.kit.lang.utils.collect.Lists; +import lombok.AllArgsConstructor; +import lombok.Getter; import java.util.List; @@ -33,30 +35,34 @@ import java.util.List; * @version 1.0.0 * @since 2023/12/26 22:27 */ +@Getter +@AllArgsConstructor public enum TerminalConnectStatusEnum { /** * 连接中 */ - CONNECTING, + CONNECTING("连接中"), /** * 完成 */ - COMPLETE, + COMPLETE("完成"), /** * 失败 */ - FAILED, + FAILED("失败"), /** * 强制下线 */ - FORCE_OFFLINE, + FORCE_OFFLINE("强制下线"), ; + private final String label; + public static final List 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> handlerBean; + private final Class> handlerBean; private final String[] payloadDefine; private final Class payloadClass; - @Getter - private final boolean asyncExec; + private ITerminalHandler handler; - @Getter - private ITerminalHandler handler; - - InputTypeEnum(String type, - Class> handlerBean, - String[] payloadDefine, - Class payloadClass, - boolean asyncExec) { + InputProtocolEnum(String type, + Class> 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('\r\n'); + } + for (let i = 0; i < 9; i++) { + term.write('[' + (90 + i) + 'm'); + term.write(' ' + i + 'OrionVisor'); + term.write('\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