diff --git a/api/current.txt b/api/current.txt index a1977bf373a480f26137cedf8905fc634e932856..7c7c11b0b9fa72e4198e454d9d939901d50c15d7 100644 --- a/api/current.txt +++ b/api/current.txt @@ -26167,6 +26167,7 @@ package android.net { method public deprecated android.net.NetworkInfo getNetworkInfo(int); method public android.net.NetworkInfo getNetworkInfo(android.net.Network); method public deprecated int getNetworkPreference(); + method public byte[] getNetworkWatchlistConfigHash(); method public static deprecated android.net.Network getProcessDefaultNetwork(); method public int getRestrictBackgroundStatus(); method public boolean isActiveNetworkMetered(); diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 11d338d05c6864d816adddebde0f6280faac084b..166342dd4e6dc87b7d20da297ac1bb68693d750b 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -3763,4 +3763,20 @@ public class ConnectivityManager { throw e.rethrowFromSystemServer(); } } + + /** + * The network watchlist is a list of domains and IP addresses that are associated with + * potentially harmful apps. This method returns the hash of the watchlist currently + * used by the system. + * + * @return Hash of network watchlist config file. Null if config does not exist. + */ + public byte[] getNetworkWatchlistConfigHash() { + try { + return mService.getNetworkWatchlistConfigHash(); + } catch (RemoteException e) { + Log.e(TAG, "Unable to get watchlist config hash"); + throw e.rethrowFromSystemServer(); + } + } } diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index a6fe7389bc723ea1d4c581a601b168e94bff1da2..ce95b60dd2db6cf3e55a0400394187a8bf4ec2b6 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -180,4 +180,6 @@ interface IConnectivityManager void stopKeepalive(in Network network, int slot); String getCaptivePortalServerUrl(); + + byte[] getNetworkWatchlistConfigHash(); } diff --git a/core/java/android/net/NetworkWatchlistManager.java b/core/java/android/net/NetworkWatchlistManager.java index 5425bf534ebdeafbba190d9c4f0cf3025dd5016a..49047d3a0c8739d6244c6da30cb4541d015da97d 100644 --- a/core/java/android/net/NetworkWatchlistManager.java +++ b/core/java/android/net/NetworkWatchlistManager.java @@ -86,4 +86,16 @@ public class NetworkWatchlistManager { e.rethrowFromSystemServer(); } } + + /** + * Get Network Watchlist config file hash. + */ + public byte[] getWatchlistConfigHash() { + try { + return mNetworkWatchlistManager.getWatchlistConfigHash(); + } catch (RemoteException e) { + Log.e(TAG, "Unable to get watchlist config hash"); + throw e.rethrowFromSystemServer(); + } + } } diff --git a/core/java/com/android/internal/net/INetworkWatchlistManager.aidl b/core/java/com/android/internal/net/INetworkWatchlistManager.aidl index ee01a23af686fb4aa41db78571495db7ee32bde4..d69c7deab375ba4f40a921ad4c6823dca4c7cdcf 100644 --- a/core/java/com/android/internal/net/INetworkWatchlistManager.aidl +++ b/core/java/com/android/internal/net/INetworkWatchlistManager.aidl @@ -24,4 +24,5 @@ interface INetworkWatchlistManager { boolean stopWatchlistLogging(); void reloadWatchlist(); void reportWatchlistIfNecessary(); + byte[] getWatchlistConfigHash(); } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index c1f4b789e002d56706fa267102805ce67900272e..5030dce7cbf97247dadf5c6fded3e19dbc521bca 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -69,6 +69,7 @@ import android.net.NetworkRequest; import android.net.NetworkSpecifier; import android.net.NetworkState; import android.net.NetworkUtils; +import android.net.NetworkWatchlistManager; import android.net.Proxy; import android.net.ProxyInfo; import android.net.RouteInfo; @@ -5708,6 +5709,17 @@ public class ConnectivityService extends IConnectivityManager.Stub Settings.Global.NETWORK_AVOID_BAD_WIFI, null); } + @Override + public byte[] getNetworkWatchlistConfigHash() { + NetworkWatchlistManager nwm = mContext.getSystemService(NetworkWatchlistManager.class); + if (nwm == null) { + loge("Unable to get NetworkWatchlistManager"); + return null; + } + // Redirect it to network watchlist service to access watchlist file and calculate hash. + return nwm.getWatchlistConfigHash(); + } + @VisibleForTesting public NetworkMonitor createNetworkMonitor(Context context, Handler handler, NetworkAgentInfo nai, NetworkRequest defaultRequest) { diff --git a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java index 239ddbeb5f862771349d13d1c2dd0e0fc075599e..7165e600ca2f382ca7f8642b78011cc5b94fd988 100644 --- a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java +++ b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java @@ -16,6 +16,7 @@ package com.android.server.net.watchlist; +import android.annotation.Nullable; import android.content.Context; import android.net.IIpConnectivityMetrics; import android.net.INetdEventCallback; @@ -210,6 +211,12 @@ public class NetworkWatchlistService extends INetworkWatchlistManager.Stub { return stopWatchlistLoggingImpl(); } + @Nullable + @Override + public byte[] getWatchlistConfigHash() { + return mConfig.getWatchlistConfigHash(); + } + private void enforceWatchlistLoggingPermission() { final int uid = Binder.getCallingUid(); if (uid != Process.SYSTEM_UID) {