70 lines
2.9 KiB
JavaScript
70 lines
2.9 KiB
JavaScript
/* global module */
|
||
|
||
/**
|
||
* 服务器连接前校验。
|
||
* 约束:
|
||
* 1. 这里只做“用户可立即修正”的前置校验,避免明显配置错误落到网关层才报模糊错误;
|
||
* 2. 端口允许留空并回退默认 22,保持当前表单行为不变;
|
||
* 3. 返回值统一为中文错误文案,空字符串表示校验通过。
|
||
*/
|
||
|
||
function normalizeAuthType(value) {
|
||
const authType = String(value || "").trim();
|
||
if (authType === "privateKey" || authType === "certificate") return authType;
|
||
return "password";
|
||
}
|
||
|
||
function validatePortField(value, label) {
|
||
const raw = String(value == null ? "" : value).trim();
|
||
if (!raw) return "";
|
||
if (!/^\d+$/.test(raw)) return `${label}需为 1-65535 的整数`;
|
||
const port = Number(raw);
|
||
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
||
return `${label}需为 1-65535 的整数`;
|
||
}
|
||
return "";
|
||
}
|
||
|
||
function validateServerForConnect(server) {
|
||
const source = server && typeof server === "object" ? server : {};
|
||
const host = String(source.host || "").trim();
|
||
const username = String(source.username || "").trim();
|
||
const portError = validatePortField(source.port, "SSH 端口");
|
||
if (!host) return "主机不能为空";
|
||
if (portError) return portError;
|
||
if (!username) return "用户名不能为空";
|
||
|
||
const authType = normalizeAuthType(source.authType);
|
||
if (authType === "password" && !String(source.password || "").trim()) return "密码不能为空";
|
||
if (authType === "privateKey" && !String(source.privateKey || "").trim()) return "私钥内容不能为空";
|
||
if (authType === "certificate") {
|
||
if (!String(source.privateKey || "").trim()) return "证书模式下私钥不能为空";
|
||
if (!String(source.certificate || "").trim()) return "证书模式下证书不能为空";
|
||
}
|
||
|
||
const jumpHost = source.jumpHost && typeof source.jumpHost === "object" ? source.jumpHost : null;
|
||
if (!jumpHost || !jumpHost.enabled) return "";
|
||
|
||
const jumpHostName = String(jumpHost.host || "").trim();
|
||
const jumpUsername = String(jumpHost.username || "").trim();
|
||
const jumpPortError = validatePortField(jumpHost.port, "跳板机端口");
|
||
if (!jumpHostName) return "跳板机主机不能为空";
|
||
if (jumpPortError) return jumpPortError;
|
||
if (!jumpUsername) return "跳板机用户名不能为空";
|
||
|
||
const jumpAuthType = normalizeAuthType(jumpHost.authType);
|
||
if (jumpAuthType === "password" && !String(source.jumpPassword || "").trim()) return "跳板机密码不能为空";
|
||
if (jumpAuthType === "privateKey" && !String(source.jumpPrivateKey || "").trim()) {
|
||
return "跳板机私钥不能为空";
|
||
}
|
||
if (jumpAuthType === "certificate") {
|
||
if (!String(source.jumpPrivateKey || "").trim()) return "跳板机证书模式下私钥不能为空";
|
||
if (!String(source.jumpCertificate || "").trim()) return "跳板机证书模式下证书不能为空";
|
||
}
|
||
return "";
|
||
}
|
||
|
||
module.exports = {
|
||
validateServerForConnect
|
||
};
|