diff --git a/orion-visor-common/src/main/java/org/dromara/visor/common/session/config/VncConnectConfig.java b/orion-visor-common/src/main/java/org/dromara/visor/common/session/config/VncConnectConfig.java new file mode 100644 index 00000000..39317be0 --- /dev/null +++ b/orion-visor-common/src/main/java/org/dromara/visor/common/session/config/VncConnectConfig.java @@ -0,0 +1,56 @@ +/* + * 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.common.session.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; + +/** + * VNC 连接参数 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2025/4/1 16:57 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Schema(name = "VncConnectConfig", description = "VNC 连接参数") +public class VncConnectConfig extends BaseConnectConfig { + + @Schema(description = "低带宽模式") + private Boolean lowBandwidthMode; + + @Schema(description = "时区") + private String timezone; + + @Schema(description = "剪切板编码") + private String clipboardEncoding; + +} diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/api/HostConnectApi.java b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/api/HostConnectApi.java index 02764b9a..c94db8b4 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/api/HostConnectApi.java +++ b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/api/HostConnectApi.java @@ -24,6 +24,7 @@ package org.dromara.visor.module.asset.api; import org.dromara.visor.common.session.config.RdpConnectConfig; import org.dromara.visor.common.session.config.SshConnectConfig; +import org.dromara.visor.common.session.config.VncConnectConfig; import org.dromara.visor.module.asset.entity.dto.host.HostDTO; /** @@ -87,4 +88,30 @@ public interface HostConnectApi { */ RdpConnectConfig getRdpConnectConfig(HostDTO host, Long userId); + /** + * 获取 VNC 连接配置 + * + * @param hostId hostId + * @return session + */ + VncConnectConfig getVncConnectConfig(Long hostId); + + /** + * 使用用户配置获取 VNC 连接配置 + * + * @param hostId hostId + * @param userId userId + * @return session + */ + VncConnectConfig getVncConnectConfig(Long hostId, Long userId); + + /** + * 使用用户配置获取 VNC 连接配置 + * + * @param host host + * @param userId userId + * @return session + */ + VncConnectConfig getVncConnectConfig(HostDTO host, Long userId); + } diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/entity/dto/host/HostVncConfigDTO.java b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/entity/dto/host/HostVncConfigDTO.java new file mode 100644 index 00000000..3f3c4be5 --- /dev/null +++ b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/entity/dto/host/HostVncConfigDTO.java @@ -0,0 +1,88 @@ +/* + * 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.asset.entity.dto.host; + +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.handler.data.model.GenericsDataModel; +import org.dromara.visor.common.security.UpdatePasswordAction; + +import javax.validation.constraints.*; + +/** + * 主机 VNC 配置 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/9/13 16:18 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "HostVncConfigDTO", description = "主机 VNC 配置业务对象") +public class HostVncConfigDTO implements GenericsDataModel, UpdatePasswordAction { + + @NotNull + @Min(value = 1) + @Max(value = 65535) + @Schema(description = "主机端口") + private Integer port; + + @Size(max = 128) + @Schema(description = "用户名") + private String username; + + @NotBlank + @Size(max = 12) + @Schema(description = "认证方式") + private String authType; + + @Schema(description = "密码") + private String password; + + @Schema(description = "身份id") + private Long identityId; + + @Schema(description = "无用户名") + private Boolean noUsername; + + @Schema(description = "无密码") + private Boolean noPassword; + + @Schema(description = "时区") + private String timezone; + + @Schema(description = "剪切板编码") + private String clipboardEncoding; + + @Schema(description = "是否使用新密码 仅参数") + private Boolean useNewPassword; + + @Schema(description = "是否已设置密码 仅返回") + private Boolean hasPassword; + +} diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/enums/HostTypeEnum.java b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/enums/HostTypeEnum.java index 206ba242..e4bf6760 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/enums/HostTypeEnum.java +++ b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-provider/src/main/java/org/dromara/visor/module/asset/enums/HostTypeEnum.java @@ -27,6 +27,7 @@ import lombok.AllArgsConstructor; import org.dromara.visor.common.constant.Const; import org.dromara.visor.module.asset.entity.dto.host.HostRdpConfigDTO; import org.dromara.visor.module.asset.entity.dto.host.HostSshConfigDTO; +import org.dromara.visor.module.asset.entity.dto.host.HostVncConfigDTO; import java.util.ArrayList; import java.util.Arrays; @@ -54,6 +55,11 @@ public enum HostTypeEnum { */ RDP(HostRdpConfigDTO.class), + /** + * VNC + */ + VNC(HostVncConfigDTO.class), + ; private final Class clazz; 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/HostConnectApiImpl.java b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/api/impl/HostConnectApiImpl.java index 6ffcc687..4f13662f 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/api/impl/HostConnectApiImpl.java +++ b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/api/impl/HostConnectApiImpl.java @@ -25,6 +25,7 @@ package org.dromara.visor.module.asset.api.impl; import lombok.extern.slf4j.Slf4j; import org.dromara.visor.common.session.config.RdpConnectConfig; import org.dromara.visor.common.session.config.SshConnectConfig; +import org.dromara.visor.common.session.config.VncConnectConfig; import org.dromara.visor.module.asset.api.HostConnectApi; import org.dromara.visor.module.asset.convert.HostProviderConvert; import org.dromara.visor.module.asset.entity.dto.host.HostDTO; @@ -77,4 +78,19 @@ public class HostConnectApiImpl implements HostConnectApi { return hostConnectService.getRdpConnectConfig(HostProviderConvert.MAPPER.to(host), userId); } + @Override + public VncConnectConfig getVncConnectConfig(Long hostId) { + return hostConnectService.getVncConnectConfig(hostId); + } + + @Override + public VncConnectConfig getVncConnectConfig(Long hostId, Long userId) { + return hostConnectService.getVncConnectConfig(hostId, userId); + } + + @Override + public VncConnectConfig getVncConnectConfig(HostDTO host, Long userId) { + return hostConnectService.getVncConnectConfig(HostProviderConvert.MAPPER.to(host), userId); + } + } 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/config/HostConfigStrategyEnum.java b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/config/HostConfigStrategyEnum.java index 17018a08..e479fe2b 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/config/HostConfigStrategyEnum.java +++ b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/config/HostConfigStrategyEnum.java @@ -49,6 +49,11 @@ public enum HostConfigStrategyEnum implements GenericsStrategyDefinition { */ RDP(HostRdpConfigStrategy.class), + /** + * VNC + */ + VNC(HostVncConfigStrategy.class), + ; private final Class> strategyClass; 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/config/HostVncConfigStrategy.java b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/config/HostVncConfigStrategy.java new file mode 100644 index 00000000..290e64f0 --- /dev/null +++ b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/config/HostVncConfigStrategy.java @@ -0,0 +1,116 @@ +/* + * 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.asset.handler.host.config; + +import cn.orionsec.kit.lang.utils.Booleans; +import cn.orionsec.kit.lang.utils.Strings; +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.dao.HostIdentityDAO; +import org.dromara.visor.module.asset.entity.domain.HostIdentityDO; +import org.dromara.visor.module.asset.entity.dto.host.HostVncConfigDTO; +import org.dromara.visor.module.asset.enums.HostAuthTypeEnum; +import org.dromara.visor.module.asset.enums.HostIdentityTypeEnum; +import org.dromara.visor.module.asset.enums.HostTypeEnum; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 主机 VNC 配置策略 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/9/19 14:26 + */ +@Component +public class HostVncConfigStrategy extends AbstractHostConfigStrategy { + + @Resource + private HostIdentityDAO hostIdentityDAO; + + public HostVncConfigStrategy() { + super(HostVncConfigDTO.class); + } + + @Override + public HostVncConfigDTO getDefault() { + return HostVncConfigDTO.builder() + .port(5900) + .username(Const.ROOT) + .authType(HostAuthTypeEnum.PASSWORD.name()) + .noUsername(false) + .noPassword(false) + .clipboardEncoding(Const.UTF_8) + .build(); + } + + @Override + protected void preValid(HostVncConfigDTO model) { + // 验证剪切板编码格式 + String clipboardEncoding = model.getClipboardEncoding(); + if (!Strings.isBlank(clipboardEncoding)) { + this.validCharset(clipboardEncoding); + } + // 检查主机身份是否存在 + Long identityId = model.getIdentityId(); + if (identityId != null) { + HostIdentityDO identity = Valid.notNull(hostIdentityDAO.selectById(identityId), ErrorMessage.IDENTITY_ABSENT); + Valid.eq(HostIdentityTypeEnum.PASSWORD.name(), identity.getType(), ErrorMessage.CHECK_IDENTITY_PASSWORD); + } + } + + @Override + protected void valid(HostVncConfigDTO model) { + // 验证填充后的参数 + Valid.valid(model); + } + + @Override + protected void updateFill(HostVncConfigDTO beforeModel, HostVncConfigDTO afterModel) { + // 无密码设置认证方式为密码验证 + if (Booleans.isTrue(afterModel.getNoPassword())) { + afterModel.setAuthType(HostAuthTypeEnum.PASSWORD.name()); + } + // 加密密码 + this.checkEncryptPassword(afterModel.getAuthType(), beforeModel, afterModel); + afterModel.setHasPassword(null); + afterModel.setUseNewPassword(null); + } + + @Override + public HostVncConfigDTO parse(String serialModel) { + return HostTypeEnum.VNC.parse(serialModel); + } + + @Override + public void toView(HostVncConfigDTO model) { + if (model == null) { + return; + } + model.setHasPassword(Strings.isNotBlank(model.getPassword())); + model.setPassword(null); + } + +} 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/extra/HostExtraItemEnum.java b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/extra/HostExtraItemEnum.java index 2f8b6db9..dd855591 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/extra/HostExtraItemEnum.java +++ b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/extra/HostExtraItemEnum.java @@ -27,10 +27,7 @@ import lombok.Getter; import org.dromara.visor.common.handler.data.GenericsStrategyDefinition; import org.dromara.visor.common.handler.data.model.GenericsDataModel; import org.dromara.visor.common.handler.data.strategy.GenericsDataStrategy; -import org.dromara.visor.module.asset.handler.host.extra.strategy.HostLabelExtraStrategy; -import org.dromara.visor.module.asset.handler.host.extra.strategy.HostRdpExtraStrategy; -import org.dromara.visor.module.asset.handler.host.extra.strategy.HostSpecExtraStrategy; -import org.dromara.visor.module.asset.handler.host.extra.strategy.HostSshExtraStrategy; +import org.dromara.visor.module.asset.handler.host.extra.strategy.*; /** * 主机额外配置项策略枚举 @@ -58,6 +55,11 @@ public enum HostExtraItemEnum implements GenericsStrategyDefinition { */ RDP(HostRdpExtraStrategy.class, true), + /** + * VNC 额外配置 + */ + VNC(HostVncExtraStrategy.class, true), + /** * 规格信息配置 */ 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/extra/model/HostVncExtraModel.java b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/extra/model/HostVncExtraModel.java new file mode 100644 index 00000000..183f51bd --- /dev/null +++ b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/extra/model/HostVncExtraModel.java @@ -0,0 +1,54 @@ +/* + * 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.asset.handler.host.extra.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.dromara.visor.common.handler.data.model.GenericsDataModel; + +/** + * 主机拓展信息 - vnc 模型 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/20 21:36 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HostVncExtraModel implements GenericsDataModel { + + /** + * 端口号 + */ + private Integer port; + + /** + * 低带宽模式 + */ + private Boolean lowBandwidthMode; + +} 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/extra/strategy/HostRdpExtraStrategy.java b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/extra/strategy/HostRdpExtraStrategy.java index fbda5570..709270a2 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/extra/strategy/HostRdpExtraStrategy.java +++ b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/handler/host/extra/strategy/HostRdpExtraStrategy.java @@ -59,6 +59,7 @@ public class HostRdpExtraStrategy extends AbstractGenericsDataStrategy { + + public HostVncExtraStrategy() { + super(HostVncExtraModel.class); + } + + @Override + public HostVncExtraModel getDefault() { + return HostVncExtraModel.builder() + .lowBandwidthMode(false) + .build(); + } + +} diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/HostConnectService.java b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/HostConnectService.java index fee71a48..d9e93c85 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/HostConnectService.java +++ b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/HostConnectService.java @@ -24,6 +24,7 @@ package org.dromara.visor.module.asset.service; import org.dromara.visor.common.session.config.RdpConnectConfig; import org.dromara.visor.common.session.config.SshConnectConfig; +import org.dromara.visor.common.session.config.VncConnectConfig; import org.dromara.visor.module.asset.entity.domain.HostDO; import org.dromara.visor.module.asset.entity.request.host.HostTestConnectRequest; @@ -95,4 +96,30 @@ public interface HostConnectService { */ RdpConnectConfig getRdpConnectConfig(HostDO host, Long userId); + /** + * 获取 VNC 连接配置 + * + * @param hostId hostId + * @return session + */ + VncConnectConfig getVncConnectConfig(Long hostId); + + /** + * 使用用户配置获取 VNC 连接配置 + * + * @param hostId hostId + * @param userId userId + * @return session + */ + VncConnectConfig getVncConnectConfig(Long hostId, Long userId); + + /** + * 使用用户配置获取 VNC 连接配置 + * + * @param host host + * @param userId userId + * @return session + */ + VncConnectConfig getVncConnectConfig(HostDO host, 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/HostConnectServiceImpl.java b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/HostConnectServiceImpl.java index 93240932..117cf04b 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/HostConnectServiceImpl.java +++ b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/service/impl/HostConnectServiceImpl.java @@ -22,6 +22,7 @@ */ package org.dromara.visor.module.asset.service.impl; +import cn.orionsec.kit.lang.utils.Booleans; import cn.orionsec.kit.lang.utils.Exceptions; import cn.orionsec.kit.lang.utils.io.Streams; import cn.orionsec.kit.net.host.SessionStore; @@ -30,6 +31,7 @@ import org.dromara.visor.common.constant.ErrorMessage; 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.config.VncConnectConfig; import org.dromara.visor.common.session.ssh.SessionStores; import org.dromara.visor.common.utils.Valid; import org.dromara.visor.module.asset.dao.HostDAO; @@ -40,6 +42,7 @@ import org.dromara.visor.module.asset.entity.domain.HostIdentityDO; import org.dromara.visor.module.asset.entity.domain.HostKeyDO; import org.dromara.visor.module.asset.entity.dto.host.HostRdpConfigDTO; import org.dromara.visor.module.asset.entity.dto.host.HostSshConfigDTO; +import org.dromara.visor.module.asset.entity.dto.host.HostVncConfigDTO; import org.dromara.visor.module.asset.entity.request.host.HostTestConnectRequest; import org.dromara.visor.module.asset.enums.HostAuthTypeEnum; import org.dromara.visor.module.asset.enums.HostExtraAuthTypeEnum; @@ -48,6 +51,7 @@ import org.dromara.visor.module.asset.enums.HostTypeEnum; import org.dromara.visor.module.asset.handler.host.extra.HostExtraItemEnum; import org.dromara.visor.module.asset.handler.host.extra.model.HostRdpExtraModel; import org.dromara.visor.module.asset.handler.host.extra.model.HostSshExtraModel; +import org.dromara.visor.module.asset.handler.host.extra.model.HostVncExtraModel; import org.dromara.visor.module.asset.service.AssetAuthorizedDataService; import org.dromara.visor.module.asset.service.HostConfigService; import org.dromara.visor.module.asset.service.HostConnectService; @@ -189,6 +193,41 @@ public class HostConnectServiceImpl implements HostConnectService { return this.getRdpConnectConfig(host, config, extra); } + @Override + public VncConnectConfig getVncConnectConfig(Long hostId) { + log.info("HostConnectService.getVncConnectConfig-withHost hostId: {}", hostId); + // 查询主机 + HostDO host = hostDAO.selectById(hostId); + // 查询主机配置 + HostVncConfigDTO config = hostConfigService.getHostConfig(hostId, HostTypeEnum.VNC.name()); + // 获取配置 + return this.getVncConnectConfig(host, config, null); + } + + @Override + public VncConnectConfig getVncConnectConfig(Long hostId, Long userId) { + // 查询主机 + HostDO host = hostDAO.selectById(hostId); + Valid.notNull(host, ErrorMessage.HOST_ABSENT); + // 获取配置 + return this.getVncConnectConfig(host, userId); + } + + @Override + public VncConnectConfig getVncConnectConfig(HostDO host, Long userId) { + Long hostId = host.getId(); + log.info("HostConnectService.getVncConnectConfig hostId: {}, userId: {}", hostId, userId); + // 验证权限 + this.validHostAuthorized(userId, hostId); + // 获取主机配置 + HostVncConfigDTO config = hostConfigService.getHostConfig(hostId, HostTypeEnum.VNC.name()); + Valid.notNull(config, ErrorMessage.CONFIG_ABSENT); + // 查询主机额外配置 + HostVncExtraModel extra = hostExtraService.getHostExtra(userId, hostId, HostExtraItemEnum.VNC); + // 获取连接配置 + return this.getVncConnectConfig(host, config, extra); + } + /** * 获取主机 SSH 连接配置 * @@ -254,14 +293,7 @@ public class HostConnectServiceImpl implements HostConnectService { connectConfig.setPassword(config.getPassword()); } else if (HostAuthTypeEnum.KEY.equals(authType)) { // 密钥认证 - Long keyId = config.getKeyId(); - Valid.notNull(keyId, ErrorMessage.KEY_ABSENT); - HostKeyDO key = hostKeyDAO.selectById(keyId); - Valid.notNull(key, ErrorMessage.KEY_ABSENT); - connectConfig.setKeyId(keyId); - connectConfig.setPublicKey(key.getPublicKey()); - connectConfig.setPrivateKey(key.getPrivateKey()); - connectConfig.setPrivateKeyPassword(key.getPassword()); + this.setSshKey(config.getKeyId(), connectConfig); } return connectConfig; } @@ -279,6 +311,8 @@ public class HostConnectServiceImpl implements HostConnectService { // 填充认证信息 RdpConnectConfig connectConfig = RdpConnectConfig.builder() .hostPort(config.getPort()) + .username(config.getUsername()) + .password(config.getPassword()) .versionGt81(config.getVersionGt81()) .timezone(config.getTimezone()) .keyboardLayout(config.getKeyboardLayout()) @@ -304,25 +338,53 @@ public class HostConnectServiceImpl implements HostConnectService { config.setIdentityId(extra.getIdentityId()); } } - - // 身份认证 - HostAuthTypeEnum authType = HostAuthTypeEnum.of(config.getAuthType()); - if (HostAuthTypeEnum.IDENTITY.equals(authType)) { - // 身份认证 - 仅密码 - authType = HostAuthTypeEnum.PASSWORD; - Valid.notNull(config.getIdentityId(), ErrorMessage.IDENTITY_ABSENT); - HostIdentityDO identity = hostIdentityDAO.selectById(config.getIdentityId()); - Valid.notNull(identity, ErrorMessage.IDENTITY_ABSENT); - // 设置身份信息 - config.setUsername(identity.getUsername()); - config.setPassword(identity.getPassword()); + // 填充身份认证信息 + if (HostAuthTypeEnum.IDENTITY.name().equals(config.getAuthType())) { + this.setIdentityPasswordAuthorization(config.getIdentityId(), connectConfig); } + return connectConfig; + } + /** + * 获取 VNC 连接信息 + * + * @param host host + * @param config config + * @return info + */ + private VncConnectConfig getVncConnectConfig(HostDO host, + HostVncConfigDTO config, + HostVncExtraModel extra) { // 填充认证信息 - connectConfig.setUsername(config.getUsername()); - if (HostAuthTypeEnum.PASSWORD.equals(authType)) { - // 密码认证 - connectConfig.setPassword(config.getPassword()); + VncConnectConfig connectConfig = VncConnectConfig.builder() + .hostPort(config.getPort()) + .username(config.getUsername()) + .password(config.getPassword()) + .timezone(config.getTimezone()) + .clipboardEncoding(config.getClipboardEncoding()) + .build(); + // 填充基础主机信息 + this.setBaseConnectConfig(connectConfig, host); + if (extra != null) { + // 设置额外配置信息 + connectConfig.setLowBandwidthMode(extra.getLowBandwidthMode()); + // 设置自定义端口 + Integer extraPort = extra.getPort(); + if (extraPort != null) { + connectConfig.setHostPort(extraPort); + } + } + // 填充身份认证信息 + if (HostAuthTypeEnum.IDENTITY.name().equals(config.getAuthType())) { + this.setIdentityPasswordAuthorization(config.getIdentityId(), connectConfig); + } + // 无用户名 + if (Booleans.isTrue(config.getNoUsername())) { + connectConfig.setUsername(null); + } + // 无密码 + if (Booleans.isTrue(config.getNoPassword())) { + connectConfig.setPassword(null); } return connectConfig; } @@ -366,6 +428,41 @@ public class HostConnectServiceImpl implements HostConnectService { } } + /** + * 设置密码认证 + * + * @param identityId identityId + * @param connectConfig connectConfig + */ + private void setIdentityPasswordAuthorization(Long identityId, BaseConnectConfig connectConfig) { + if (identityId == null) { + return; + } + // 查询身份信息 + HostIdentityDO identity = hostIdentityDAO.selectById(identityId); + Valid.notNull(identity, ErrorMessage.IDENTITY_ABSENT); + // 设置身份信息 + connectConfig.setUsername(identity.getUsername()); + connectConfig.setPassword(identity.getPassword()); + } + + /** + * 设置 SSH 密钥信息 + * + * @param keyId keyId + * @param connectConfig connectConfig + */ + private void setSshKey(Long keyId, SshConnectConfig connectConfig) { + Valid.notNull(keyId, ErrorMessage.KEY_ABSENT); + // 查询密钥信息 + HostKeyDO key = hostKeyDAO.selectById(keyId); + Valid.notNull(key, ErrorMessage.KEY_ABSENT); + connectConfig.setKeyId(keyId); + connectConfig.setPublicKey(key.getPublicKey()); + connectConfig.setPrivateKey(key.getPrivateKey()); + connectConfig.setPrivateKeyPassword(key.getPassword()); + } + /** * 设置基础主机信息 *