fix(config): auto complete and patch secret field when loading config

- Ensure the 'secret' field is present and non-empty during config loading
- Auto-fill with default value if missing to improve compatibility and security
- Update config guard logic for robustness
This commit is contained in:
Tunglies
2025-05-28 17:26:26 +08:00
Unverified
parent c507c483fb
commit 9416de6442
3 changed files with 26 additions and 12 deletions

View File

@@ -1,9 +1,12 @@
## v2.2.4-alpha
尽管外部控制密钥已自动补全默认值且不允许为空。仍然推荐自行修改外部控制密钥。
#### 已知问题
- 仅在Ubuntu 22.04/24.04Fedora 41 **Gnome桌面环境** 做过简单测试不保证其他其他Linux发行版可用将在未来做进一步适配和调优
- MacOS 下 墙贴主要为浅色Tray 图标深色时图标闪烁;彩色 Tray 速率颜色淡
- 窗口状态管理器已确定上游存在缺陷,暂时移除。当前不再内置窗口大小和位置记忆。
- MacOS 下卸载服务后需手动重启软件才能与内核通信。
### 2.2.4 相对于 2.2.3
#### 修复了:
@@ -50,6 +53,7 @@
- 切换、升级、重启内核的状态管理
- 更精细化控制自动日志清理新增1天选项
- Winodws 快捷键名称改为 `Clash Verge`
- 配置加载阶段自动补全 external-controller secret 字段。
#### 优化了:
- 系统代理 Bypass 设置
@@ -79,6 +83,7 @@
- 优化端口设置退出和保存机制
- 强制为 Mihomo 配置补全并覆盖 external-controller-cors 字段,默认不允许跨域和仅本地请求,提升 cors 安全性,升级配置时自动覆盖
- 修改 端口检测范围 1111-65536
- 配置文件缺失 secret 字段时自动填充默认值 set-your-secret
#### 移除了:
- 窗口状态管理器

View File

@@ -20,6 +20,12 @@ impl IClashTemp {
map.insert(key.clone(), template.0.get(key).unwrap().clone());
}
});
// 确保 secret 字段存在且不为空
if let Some(Value::String(s)) = map.get_mut("secret") {
if s.is_empty() {
*s = "set-your-secret".to_string();
}
}
Self(Self::guard(map))
}
Err(err) => {
@@ -64,7 +70,7 @@ impl IClashTemp {
]
.into(),
);
map.insert("secret".into(), "".into());
map.insert("secret".into(), "set-your-secret".into());
map.insert("tun".into(), tun.into());
map.insert("external-controller-cors".into(), cors_map.into());
map.insert("unified-delay".into(), true.into());

View File

@@ -42,7 +42,12 @@ export const ControllerViewer = forwardRef<DialogRef>((props, ref) => {
// 保存配置
const onSave = useLockFn(async () => {
if (!controller.trim()) {
showNotice('info', t("Controller address cannot be empty"), 3000);
showNotice('error', t("Controller address cannot be empty"), 3000);
return;
}
if (!secret.trim()) {
showNotice('error', t("Secret cannot be empty"), 3000);
return;
}
@@ -95,14 +100,13 @@ export const ControllerViewer = forwardRef<DialogRef>((props, ref) => {
size="small"
sx={{
width: 175,
opacity: 0.7,
pointerEvents: 'none'
opacity: 1,
pointerEvents: 'auto'
}}
value={controller}
placeholder="Required"
onChange={() => {}}
disabled={true}
inputProps={{ readOnly: true }}
onChange={e => setController(e.target.value)}
disabled={isSaving}
/>
<Tooltip title={t("Copy to clipboard")}>
<IconButton
@@ -124,14 +128,13 @@ export const ControllerViewer = forwardRef<DialogRef>((props, ref) => {
size="small"
sx={{
width: 175,
opacity: 0.7,
pointerEvents: 'none'
opacity: 1,
pointerEvents: 'auto'
}}
value={secret}
placeholder={t("Recommended")}
onChange={() => {}}
disabled={true}
inputProps={{ readOnly: true }}
onChange={e => setSecret(e.target.value)}
disabled={isSaving}
/>
<Tooltip title={t("Copy to clipboard")}>
<IconButton