




















@@ -167,6 +167,31 @@ describe("resolveIrcAccount", () => {
167167fs.rmSync(dir, { recursive: true, force: true });
168168});
169169170+it.runIf(process.platform !== "win32")("rejects symlinked NickServ password files", () => {
171+const dir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-irc-nickserv-"));
172+const passwordFile = path.join(dir, "nickserv-password.txt");
173+const passwordLink = path.join(dir, "nickserv-password-link.txt");
174+fs.writeFileSync(passwordFile, "nickserv-pass\n", "utf8");
175+fs.symlinkSync(passwordFile, passwordLink);
176+177+const cfg = asConfig({
178+channels: {
179+irc: {
180+host: "irc.example.com",
181+nick: "claw",
182+nickserv: {
183+passwordFile: passwordLink,
184+},
185+},
186+},
187+});
188+189+expect(() => resolveIrcAccount({ cfg })).toThrow(
190+/IRC NickServ password file.*must not be a symlink/,
191+);
192+fs.rmSync(dir, { recursive: true, force: true });
193+});
194+170195it("preserves shared NickServ config when an account overrides one NickServ field", () => {
171196const account = resolveIrcAccount({
172197cfg: asConfig({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。