Fixed issue with parsing duplicate search domains

This commit is contained in:
Robinson 2021-04-07 14:55:32 +02:00
parent c66fb357a8
commit 3ad50e79cf
1 changed files with 57 additions and 30 deletions

View File

@ -40,9 +40,9 @@ object Dns {
val dnsServers = dnsServersString.split(",") val dnsServers = dnsServersString.split(",")
val dnsFile = File("/etc/resolvconf/resolv.conf.d/head") val dnsFile = File("/etc/resolvconf/resolv.conf.d/head")
if (!dnsFile.canRead()) { if (!dnsFile.canRead()) {
throw IOException("Unable to initialize dns server file. Something is SERIOUSLY wrong") throw IOException("Unable to initialize dns server file. Something is SERIOUSLY wrong")
} }
BufferedWriter(FileWriter(dnsFile)).use { BufferedWriter(FileWriter(dnsFile)).use {
it.write("# File location: /etc/resolvconf/resolv.conf.d/head\n") it.write("# File location: /etc/resolvconf/resolv.conf.d/head\n")
@ -88,15 +88,15 @@ object Dns {
} else if (IPv4.isPreferred) { } else if (IPv4.isPreferred) {
// skip IPv6 addresses // skip IPv6 addresses
defaultServers.filter { it.address is Inet4Address } defaultServers.filter { it.address is Inet4Address }
} else {
// neither is specified, return in the order added
defaultServers
} }
// neither is specified, return in the order added
defaultServers
} }
// largely from: // largely from:
// https://github.com/dnsjava/dnsjava/blob/fb4889ee7a73f391f43bf6dc78b019d87ae15f15/src/main/java/org/xbill/DNS/config/BaseResolverConfigProvider.java#L22 // https://github.com/dnsjava/dnsjava/blob/fb4889ee7a73f391f43bf6dc78b019d87ae15f15/src/main/java/org/xbill/DNS/config/BaseResolverConfigProvider.java#L22
private fun getUnsortedNameServers() : Map<String, List<InetSocketAddress>> { private fun getUnsortedNameServers(): Map<String, List<InetSocketAddress>> {
val nameServerDomains = mutableMapOf<String, List<InetSocketAddress>>() val nameServerDomains = mutableMapOf<String, List<InetSocketAddress>>()
// Using jndi-dns to obtain the default name servers. // Using jndi-dns to obtain the default name servers.
@ -121,11 +121,7 @@ object Dns {
for (server in servers) { for (server in servers) {
try { try {
if (nameServerDomains[DEFAULT_SEARCH_DOMAIN] == null) { putIfAbsent(nameServerDomains, DEFAULT_SEARCH_DOMAIN, Common.socketAddress(URI(server).host, 53))
nameServerDomains[DEFAULT_SEARCH_DOMAIN] = mutableListOf()
}
(nameServerDomains[DEFAULT_SEARCH_DOMAIN] as MutableList).add(Common.socketAddress(server, 53))
} catch (e: URISyntaxException) { } catch (e: URISyntaxException) {
Common.logger.debug("Skipping a malformed nameserver URI: {}", server, e) Common.logger.debug("Skipping a malformed nameserver URI: {}", server, e)
} }
@ -180,13 +176,14 @@ object Dns {
try { try {
address = dns.Address.toAddress() address = dns.Address.toAddress()
if (address is Inet4Address || !address.isSiteLocalAddress) { if (address is Inet4Address || !address.isSiteLocalAddress) {
if (nameServerDomains[DEFAULT_SEARCH_DOMAIN] == null) {
nameServerDomains[DEFAULT_SEARCH_DOMAIN] = mutableListOf()
}
(nameServerDomains[DEFAULT_SEARCH_DOMAIN] as MutableList).add(Common.socketAddress(address, 53)) putIfAbsent(nameServerDomains, DEFAULT_SEARCH_DOMAIN, Common.socketAddress(address, 53))
} else { } else {
Common.logger.debug("Skipped site-local IPv6 server address {} on adapter index {}", address, result.IfIndex) Common.logger.debug(
"Skipped site-local IPv6 server address {} on adapter index {}",
address,
result.IfIndex
)
} }
} catch (e: UnknownHostException) { } catch (e: UnknownHostException) {
Common.logger.warn("Invalid nameserver address on adapter index {}", result.IfIndex, e) Common.logger.warn("Invalid nameserver address on adapter index {}", result.IfIndex, e)
@ -216,9 +213,8 @@ object Dns {
// if we STILL don't have anything, add global nameservers to the default search domain // if we STILL don't have anything, add global nameservers to the default search domain
if (nameServerDomains[DEFAULT_SEARCH_DOMAIN] == null) { if (nameServerDomains[DEFAULT_SEARCH_DOMAIN] == null) {
nameServerDomains[DEFAULT_SEARCH_DOMAIN] = mutableListOf() putIfAbsent(nameServerDomains, DEFAULT_SEARCH_DOMAIN, Common.socketAddress("1.1.1.1", 53)) // cloudflare
(nameServerDomains[DEFAULT_SEARCH_DOMAIN] as MutableList).add(InetSocketAddress("1.1.1.1", 53)) // cloudflare putIfAbsent(nameServerDomains, DEFAULT_SEARCH_DOMAIN, Common.socketAddress("1.1.1.1", 53)) // google
(nameServerDomains[DEFAULT_SEARCH_DOMAIN] as MutableList).add(InetSocketAddress("8.8.8.8", 53)) // google
} }
return nameServerDomains return nameServerDomains
@ -236,7 +232,7 @@ object Dns {
var domainName = DEFAULT_SEARCH_DOMAIN var domainName = DEFAULT_SEARCH_DOMAIN
var port = 53 var port = 53
var line0: String? var line0: String?
loop@while (br.readLine().also { line0 = it?.trim() } != null) { loop@ while (br.readLine().also { line0 = it?.trim() } != null) {
val line = line0!! val line = line0!!
if (line.isEmpty()) { if (line.isEmpty()) {
@ -277,10 +273,7 @@ object Dns {
} }
// we have a NEW domain! add the PREVIOUS nameServers and start again. // we have a NEW domain! add the PREVIOUS nameServers and start again.
if (nameServerDomains[domainName] == null) { putIfAbsent(nameServerDomains, domainName, nameServers)
nameServerDomains[domainName] = mutableListOf()
}
(nameServerDomains[domainName] as MutableList).addAll(nameServers)
nameServers = mutableListOf() nameServers = mutableListOf()
domainName = line.substring(i) domainName = line.substring(i)
@ -295,11 +288,7 @@ object Dns {
} }
// when done parsing the file, ALWAYS add the nameServer domains (since they have not been added yet) // when done parsing the file, ALWAYS add the nameServer domains (since they have not been added yet)
if (nameServerDomains[domainName] == null) { putIfAbsent(nameServerDomains, domainName, nameServers)
nameServerDomains[domainName] = mutableListOf()
}
(nameServerDomains[domainName] as MutableList).addAll(nameServers)
return Pair(true, nameServerDomains) return Pair(true, nameServerDomains)
} }
} }
@ -489,4 +478,42 @@ object Dns {
} }
return -1 return -1
} }
private fun putIfAbsent(
nameServerDomains: MutableMap<String, List<InetSocketAddress>>,
domainName: String,
nameServer: InetSocketAddress
) {
var list = nameServerDomains[domainName]
if (list == null) {
list = mutableListOf()
nameServerDomains[domainName] = list
}
(list as MutableList)
if (!list.contains(nameServer)) {
list.add(nameServer)
}
}
private fun putIfAbsent(
nameServerDomains: MutableMap<String, List<InetSocketAddress>>,
domainName: String,
nameServers: List<InetSocketAddress>
) {
var list = nameServerDomains[domainName]
if (list == null) {
list = mutableListOf()
nameServerDomains[domainName] = list
}
(list as MutableList)
nameServers.forEach {
if (!list.contains(it)) {
list.add(it)
}
}
nameServers
}
} }