Skip to content

Commit aaef218

Browse files
stariflydsfkjlweuyr
authored andcommitted
fix: don't emit user_id-only DNS rules for non-domain routes
1 parent d3a17b2 commit aaef218

1 file changed

Lines changed: 74 additions & 13 deletions

File tree

app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt

Lines changed: 74 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -731,8 +731,31 @@ fun buildConfig(
731731
return DNSRule_DefaultOptions().apply {
732732
if (uidList.isNotEmpty()) user_id = uidList
733733
domainList?.let { makeSingBoxRule(it) }
734-
735-
val nonIpRulesets = mutableListOf<String>()
734+
}
735+
}
736+
737+
val hasDomainCriteria = !domainList.isNullOrEmpty()
738+
val hasIpCriteria =
739+
rule.ip.isNotBlank() || rulesetTags.any { it.second }
740+
val hasDomainRuleset = rulesetTags.any { !it.second }
741+
val isAppOnlyDns =
742+
uidList.isNotEmpty() &&
743+
!hasDomainCriteria &&
744+
!hasIpCriteria &&
745+
!hasDomainRuleset &&
746+
rule.port.isBlank() &&
747+
rule.sourcePort.isBlank() &&
748+
rule.network.isBlank() &&
749+
rule.source.isBlank() &&
750+
rule.protocol.isBlank()
751+
val shouldAddDnsRule = hasDomainCriteria || isAppOnlyDns
752+
753+
when (rule.outbound) {
754+
-1L -> {
755+
if (shouldAddDnsRule) {
756+
userDNSRuleList += makeDnsRuleObj().apply { server = "dns-direct" }
757+
}
758+
736759
if (rule_set != null && rulesetTags.isNotEmpty()) {
737760
for (tag in rule_set) {
738761
val tagInfo = rulesetTags.find { it.first == tag }
@@ -752,21 +775,59 @@ fun buildConfig(
752775
userDNSRuleList += makeDnsRuleObj().apply { server = "dns-direct" }
753776
}
754777

755-
-2L -> {
756-
userDNSRuleList += makeDnsRuleObj().apply {
757-
server = "dns-block"
758-
disable_cache = true
778+
0L -> {
779+
if (shouldAddDnsRule) {
780+
if (useFakeDns) userDNSRuleList += makeDnsRuleObj().apply {
781+
server = "dns-fake"
782+
inbound = listOf("tun-in")
783+
query_type = listOf("A", "AAAA")
784+
} else {
785+
userDNSRuleList += makeDnsRuleObj().apply {
786+
server = "dns-remote"
787+
}
788+
}
789+
}
790+
791+
if (rule_set != null && rulesetTags.isNotEmpty()) {
792+
for (tag in rule_set) {
793+
val tagInfo = rulesetTags.find { it.first == tag }
794+
if (tag.startsWith("ruleset-") && tagInfo != null && !tagInfo.second) {
795+
if (useFakeDns) {
796+
userDNSRuleList += DNSRule_DefaultOptions().apply {
797+
rule_set = mutableListOf(tag)
798+
server = "dns-fake"
799+
inbound = listOf("tun-in")
800+
query_type = listOf("A", "AAAA")
801+
}
802+
} else {
803+
userDNSRuleList += DNSRule_DefaultOptions().apply {
804+
rule_set = mutableListOf(tag)
805+
server = "dns-remote"
806+
}
807+
}
808+
}
809+
}
759810
}
760811
}
761812

762-
else -> {
763-
if (useFakeDns) userDNSRuleList += makeDnsRuleObj().apply {
764-
server = "dns-fake"
765-
inbound = listOf("tun-in")
766-
query_type = listOf("A", "AAAA")
767-
} else {
813+
-2L -> {
814+
if (shouldAddDnsRule) {
768815
userDNSRuleList += makeDnsRuleObj().apply {
769-
server = "dns-remote"
816+
server = "dns-block"
817+
disable_cache = true
818+
}
819+
}
820+
821+
if (rule_set != null && rulesetTags.isNotEmpty()) {
822+
for (tag in rule_set) {
823+
val tagInfo = rulesetTags.find { it.first == tag }
824+
if (tag.startsWith("ruleset-") && tagInfo != null && !tagInfo.second) {
825+
userDNSRuleList += DNSRule_DefaultOptions().apply {
826+
rule_set = mutableListOf(tag)
827+
server = "dns-block"
828+
disable_cache = true
829+
}
830+
}
770831
}
771832
}
772833
}

0 commit comments

Comments
 (0)