Merge "Pass DoH information to DnsResolver" into main
This commit is contained in:
commit
af569157d5
2 changed files with 48 additions and 11 deletions
|
|
@ -41,6 +41,7 @@ import android.net.Network;
|
|||
import android.net.NetworkCapabilities;
|
||||
import android.net.ResolverParamsParcel;
|
||||
import android.net.Uri;
|
||||
import android.net.resolv.aidl.DohParamsParcel;
|
||||
import android.net.shared.PrivateDnsConfig;
|
||||
import android.os.Binder;
|
||||
import android.os.RemoteException;
|
||||
|
|
@ -52,16 +53,17 @@ import android.util.Log;
|
|||
import android.util.Pair;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Encapsulate the management of DNS settings for networks.
|
||||
|
|
@ -382,15 +384,14 @@ public class DnsManager {
|
|||
paramsParcel.domains = getDomainStrings(lp.getDomains());
|
||||
paramsParcel.tlsName = strictMode ? privateDnsCfg.hostname : "";
|
||||
paramsParcel.tlsServers =
|
||||
strictMode ? makeStrings(
|
||||
Arrays.stream(privateDnsCfg.ips)
|
||||
.filter((ip) -> lp.isReachable(ip))
|
||||
.collect(Collectors.toList()))
|
||||
strictMode ? makeStrings(getReachableAddressList(privateDnsCfg.ips, lp))
|
||||
: useTls ? paramsParcel.servers // Opportunistic
|
||||
: new String[0]; // Off
|
||||
paramsParcel.transportTypes = nc.getTransportTypes();
|
||||
paramsParcel.meteredNetwork = nc.isMetered();
|
||||
paramsParcel.interfaceNames = lp.getAllInterfaceNames().toArray(new String[0]);
|
||||
paramsParcel.dohParams = makeDohParamsParcel(privateDnsCfg, lp);
|
||||
|
||||
// Prepare to track the validation status of the DNS servers in the
|
||||
// resolver config when private DNS is in opportunistic or strict mode.
|
||||
if (useTls) {
|
||||
|
|
@ -404,15 +405,16 @@ public class DnsManager {
|
|||
}
|
||||
|
||||
Log.d(TAG, String.format("sendDnsConfigurationForNetwork(%d, %s, %s, %d, %d, %d, %d, "
|
||||
+ "%d, %d, %s, %s, %s, %b, %s)", paramsParcel.netId,
|
||||
+ "%d, %d, %s, %s, %s, %b, %s, %s, %s, %s, %d)", paramsParcel.netId,
|
||||
Arrays.toString(paramsParcel.servers), Arrays.toString(paramsParcel.domains),
|
||||
paramsParcel.sampleValiditySeconds, paramsParcel.successThreshold,
|
||||
paramsParcel.minSamples, paramsParcel.maxSamples, paramsParcel.baseTimeoutMsec,
|
||||
paramsParcel.retryCount, paramsParcel.tlsName,
|
||||
Arrays.toString(paramsParcel.tlsServers),
|
||||
Arrays.toString(paramsParcel.transportTypes), paramsParcel.meteredNetwork,
|
||||
Arrays.toString(paramsParcel.interfaceNames)));
|
||||
|
||||
Arrays.toString(paramsParcel.interfaceNames),
|
||||
paramsParcel.dohParams.name, Arrays.toString(paramsParcel.dohParams.ips),
|
||||
paramsParcel.dohParams.dohpath, paramsParcel.dohParams.port));
|
||||
try {
|
||||
mDnsResolver.setResolverConfiguration(paramsParcel);
|
||||
} catch (RemoteException | ServiceSpecificException e) {
|
||||
|
|
@ -498,4 +500,26 @@ public class DnsManager {
|
|||
private static String[] getDomainStrings(String domains) {
|
||||
return (TextUtils.isEmpty(domains)) ? new String[0] : domains.split(" ");
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private List<InetAddress> getReachableAddressList(@NonNull InetAddress[] ips,
|
||||
@NonNull LinkProperties lp) {
|
||||
final ArrayList<InetAddress> out = new ArrayList<InetAddress>(Arrays.asList(ips));
|
||||
out.removeIf(ip -> !lp.isReachable(ip));
|
||||
return out;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private DohParamsParcel makeDohParamsParcel(@NonNull PrivateDnsConfig cfg,
|
||||
@NonNull LinkProperties lp) {
|
||||
if (cfg.mode == PRIVATE_DNS_MODE_OFF) {
|
||||
return new DohParamsParcel.Builder().build();
|
||||
}
|
||||
return new DohParamsParcel.Builder()
|
||||
.setName(cfg.dohName)
|
||||
.setIps(makeStrings(getReachableAddressList(cfg.dohIps, lp)))
|
||||
.setDohpath(cfg.dohPath)
|
||||
.setPort(cfg.dohPort)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ import android.net.NetworkCapabilities;
|
|||
import android.net.ResolverOptionsParcel;
|
||||
import android.net.ResolverParamsParcel;
|
||||
import android.net.RouteInfo;
|
||||
import android.net.resolv.aidl.DohParamsParcel;
|
||||
import android.net.shared.PrivateDnsConfig;
|
||||
import android.os.Build;
|
||||
import android.provider.Settings;
|
||||
|
|
@ -327,8 +328,16 @@ public class DnsManagerTest {
|
|||
@Test
|
||||
public void testSendDnsConfiguration() throws Exception {
|
||||
reset(mMockDnsResolver);
|
||||
mDnsManager.updatePrivateDns(new Network(TEST_NETID),
|
||||
mDnsManager.getPrivateDnsConfig());
|
||||
final PrivateDnsConfig cfg = new PrivateDnsConfig(
|
||||
PRIVATE_DNS_MODE_OPPORTUNISTIC /* mode */,
|
||||
null /* hostname */,
|
||||
null /* ips */,
|
||||
"doh.com" /* dohName */,
|
||||
null /* dohIps */,
|
||||
"/some-path{?dns}" /* dohPath */,
|
||||
5353 /* dohPort */);
|
||||
|
||||
mDnsManager.updatePrivateDns(new Network(TEST_NETID), cfg);
|
||||
final LinkProperties lp = new LinkProperties();
|
||||
lp.setInterfaceName(TEST_IFACENAME);
|
||||
lp.addDnsServer(InetAddress.getByName("3.3.3.3"));
|
||||
|
|
@ -352,7 +361,11 @@ public class DnsManagerTest {
|
|||
expectedParams.transportTypes = TEST_TRANSPORT_TYPES;
|
||||
expectedParams.resolverOptions = null;
|
||||
expectedParams.meteredNetwork = true;
|
||||
expectedParams.dohParams = null;
|
||||
expectedParams.dohParams = new DohParamsParcel.Builder()
|
||||
.setName("doh.com")
|
||||
.setDohpath("/some-path{?dns}")
|
||||
.setPort(5353)
|
||||
.build();
|
||||
expectedParams.interfaceNames = new String[]{TEST_IFACENAME};
|
||||
verify(mMockDnsResolver, times(1)).setResolverConfiguration(eq(expectedParams));
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue