diff --git a/router/direct-plain.txt b/router/direct-plain.txt index a1a0a2e..55e6383 100644 --- a/router/direct-plain.txt +++ b/router/direct-plain.txt @@ -33,3 +33,18 @@ DOMAIN-SUFFIX,syncthing.net IP-CIDR,110.42.0.0/16,no-resolve IP-CIDR,43.248.128.0/17,no-resolve IP-CIDR,111.170.0.0/16,no-resolve +DOMAIN-SUFFIX,steampowered.com +DOMAIN-SUFFIX,steamcommunity.com +DOMAIN-SUFFIX,steamgames.com +DOMAIN-SUFFIX,steamusercontent.com +DOMAIN-SUFFIX,steam-chat.com +DOMAIN-SUFFIX,steamstatic.com +DOMAIN-SUFFIX,steamcontent.com +DOMAIN-KEYWORD,csgo. +PROCESS-NAME,steam +PROCESS-NAME,steamwebhelper +IP-CIDR,162.254.192.0/18,no-resolve +IP-CIDR,103.10.124.0/23,no-resolve +IP-CIDR,103.28.54.0/23,no-resolve +IP-CIDR,146.66.152.0/21,no-resolve +IP-CIDR,155.133.224.0/19,no-resolve diff --git a/router/direct-rules.yaml b/router/direct-rules.yaml index 8b6c273..ee8b9ec 100644 --- a/router/direct-rules.yaml +++ b/router/direct-rules.yaml @@ -46,3 +46,18 @@ rules: - IP-CIDR,110.42.0.0/16,DIRECT,no-resolve - IP-CIDR,43.248.128.0/17,DIRECT,no-resolve - IP-CIDR,111.170.0.0/16,DIRECT,no-resolve + - DOMAIN-SUFFIX,steampowered.com,DIRECT + - DOMAIN-SUFFIX,steamcommunity.com,DIRECT + - DOMAIN-SUFFIX,steamgames.com,DIRECT + - DOMAIN-SUFFIX,steamusercontent.com,DIRECT + - DOMAIN-SUFFIX,steam-chat.com,DIRECT + - DOMAIN-SUFFIX,steamstatic.com,DIRECT + - DOMAIN-SUFFIX,steamcontent.com,DIRECT + - DOMAIN-KEYWORD,csgo.,DIRECT + - PROCESS-NAME,steam,DIRECT + - PROCESS-NAME,steamwebhelper,DIRECT + - IP-CIDR,162.254.192.0/18,DIRECT,no-resolve + - IP-CIDR,103.10.124.0/23,DIRECT,no-resolve + - IP-CIDR,103.28.54.0/23,DIRECT,no-resolve + - IP-CIDR,146.66.152.0/21,DIRECT,no-resolve + - IP-CIDR,155.133.224.0/19,DIRECT,no-resolve diff --git a/tests/test_module_spec.py b/tests/test_module_spec.py index 270278d..e907766 100644 --- a/tests/test_module_spec.py +++ b/tests/test_module_spec.py @@ -203,6 +203,42 @@ class ModuleSpecTests(unittest.TestCase): "PROCESS-NAME,OneDrive.exe,DIRECT", ) + def test_to_rule_strips_inline_hash_comment_before_classifying_no_resolve(self) -> None: + # 回归测试 (b4a4769):to_rule() 在判断 entry.endswith(',no-resolve') 之前 + # 没有剥掉行尾 # 注释,导致带 inline 注释的 Akamai Steam CDN 规则 + # 走错分支,把注释当成 entry 的一部分拼进去,生成 mihomo 解析失败的规则。 + self.assertEqual( + to_rule("IP-CIDR,162.254.192.0/18,no-resolve # Akamai Steam CDN 主段"), + "IP-CIDR,162.254.192.0/18,DIRECT,no-resolve", + ) + # 注释里出现 "no-resolve" 不能误判为 suffix + self.assertEqual( + to_rule("DOMAIN-SUFFIX,example.com # 走 no-resolve 路径"), + "DOMAIN-SUFFIX,example.com,DIRECT", + ) + # 注释里出现 ",DIRECT" 不能误拼到 proxy 字段 + self.assertEqual( + to_rule("IP-CIDR,10.0.0.0/8 # 不是 DIRECT, 是 REJECT"), + "IP-CIDR,10.0.0.0/8,DIRECT", + ) + + def test_to_rule_preserves_canonical_forms(self) -> None: + # 不带注释、不带 no-resolve + self.assertEqual( + to_rule("DOMAIN-SUFFIX,bilibili.com"), + "DOMAIN-SUFFIX,bilibili.com,DIRECT", + ) + # 带 no-resolve、无注释 + self.assertEqual( + to_rule("IP-CIDR,127.0.0.0/8,no-resolve"), + "IP-CIDR,127.0.0.0/8,DIRECT,no-resolve", + ) + # 带 no-resolve + 行尾空白 + self.assertEqual( + to_rule("IP-CIDR,127.0.0.0/8,no-resolve "), + "IP-CIDR,127.0.0.0/8,DIRECT,no-resolve", + ) + def test_clash_verge_script_adds_reachable_direct_dns_fallbacks(self) -> None: script = render_script(["PROCESS-NAME,OneDrive.exe"])