From c0840dc3325fd5fef783a78083165a3e4c99b5b8 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Thu, 22 Mar 2018 17:41:07 +0000 Subject: [PATCH] Log a lot of information about the network state. --- .../plugin/tcp/AndroidLanTcpPlugin.java | 17 ++- .../bramble/plugin/tor/TorPlugin.java | 3 +- .../bramble/util/AndroidUtils.java | 141 +++++++++++++++++- .../bramble/util/StringUtils.java | 8 + .../android/reporting/BriarReportPrimer.java | 7 +- 5 files changed, 166 insertions(+), 10 deletions(-) diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPlugin.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPlugin.java index 4d507d0d1..24c456f6b 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPlugin.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPlugin.java @@ -6,6 +6,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.os.Bundle; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.Backoff; @@ -19,6 +20,8 @@ import javax.annotation.Nullable; import static android.content.Context.CONNECTIVITY_SERVICE; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; import static android.net.ConnectivityManager.TYPE_WIFI; +import static java.util.logging.Level.INFO; +import static org.briarproject.bramble.util.AndroidUtils.logNetworkState; @NotNullByDefault class AndroidLanTcpPlugin extends LanTcpPlugin { @@ -46,6 +49,7 @@ class AndroidLanTcpPlugin extends LanTcpPlugin { networkStateReceiver = new NetworkStateReceiver(); IntentFilter filter = new IntentFilter(CONNECTIVITY_ACTION); appContext.registerReceiver(networkStateReceiver, filter); + if (LOG.isLoggable(INFO)) logNetworkState(appContext, LOG); } @Override @@ -61,10 +65,21 @@ class AndroidLanTcpPlugin extends LanTcpPlugin { @Override public void onReceive(Context ctx, Intent i) { if (!running) return; + if (LOG.isLoggable(INFO)) { + LOG.info("Connectivity change"); + Bundle extras = i.getExtras(); + if (extras != null) { + LOG.info("Extras:"); + for (String key : extras.keySet()) + LOG.info("\t" + key + ": " + extras.get(key)); + } + logNetworkState(appContext, LOG); + } Object o = ctx.getSystemService(CONNECTIVITY_SERVICE); ConnectivityManager cm = (ConnectivityManager) o; NetworkInfo net = cm.getActiveNetworkInfo(); - if (net != null && net.getType() == TYPE_WIFI && net.isConnected()) { + if (net != null && net.getType() == TYPE_WIFI + && net.isConnected()) { LOG.info("Connected to Wi-Fi"); if (socket == null || socket.isClosed()) bind(); } else { diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java index 7ccaa9a27..da5665354 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java @@ -716,8 +716,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { boolean online = net != null && net.isConnected(); boolean wifi = online && net.getType() == TYPE_WIFI; String country = locationUtils.getCurrentCountry(); - boolean blocked = TorNetworkMetadata.isTorProbablyBlocked( - country); + boolean blocked = TorNetworkMetadata.isTorProbablyBlocked(country); Settings s = callback.getSettings(); int network = s.getInt(PREF_TOR_NETWORK, PREF_TOR_NETWORK_ALWAYS); diff --git a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java index 15edba9c4..c58e2762a 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java @@ -1,18 +1,41 @@ package org.briarproject.bramble.util; +import android.annotation.SuppressLint; import android.bluetooth.BluetoothAdapter; import android.content.Context; +import android.net.ConnectivityManager; +import android.net.Network; +import android.net.NetworkInfo; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; import android.os.Build; import android.provider.Settings; import java.io.File; +import java.net.InetAddress; +import java.net.InterfaceAddress; +import java.net.NetworkInterface; +import java.net.SocketException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.logging.Logger; +import javax.annotation.Nullable; + +import static android.content.Context.CONNECTIVITY_SERVICE; import static android.content.Context.MODE_PRIVATE; +import static android.content.Context.WIFI_SERVICE; +import static android.os.Build.VERSION.SDK_INT; +import static java.net.NetworkInterface.getNetworkInterfaces; +import static java.util.Collections.list; +import static java.util.logging.Level.INFO; +import static java.util.logging.Level.WARNING; +import static org.briarproject.bramble.util.StringUtils.ipToString; +import static org.briarproject.bramble.util.StringUtils.toHexString; +@SuppressLint("HardwareIds") public class AndroidUtils { // Fake Bluetooth address returned by BluetoothAdapter on API 23 and later @@ -23,7 +46,7 @@ public class AndroidUtils { @SuppressWarnings("deprecation") public static Collection getSupportedArchitectures() { List abis = new ArrayList<>(); - if (Build.VERSION.SDK_INT >= 21) { + if (SDK_INT >= 21) { abis.addAll(Arrays.asList(Build.SUPPORTED_ABIS)); } else { abis.add(Build.CPU_ABI); @@ -67,4 +90,120 @@ public class AndroidUtils { public static File getReportDir(Context ctx) { return ctx.getDir(STORED_REPORTS, MODE_PRIVATE); } + + public static void logNetworkState(Context ctx, Logger logger) { + if (!logger.isLoggable(INFO)) return; + + Object o = ctx.getSystemService(CONNECTIVITY_SERVICE); + if (o == null) throw new AssertionError(); + ConnectivityManager cm = (ConnectivityManager) o; + o = ctx.getApplicationContext().getSystemService(WIFI_SERVICE); + if (o == null) throw new AssertionError(); + WifiManager wm = (WifiManager) o; + + StringBuilder s = new StringBuilder(); + logWifiInfo(s, wm.getConnectionInfo()); + if (SDK_INT >= 21) { + for (Network network : cm.getAllNetworks()) + logNetworkInfo(s, cm.getNetworkInfo(network)); + } else { + for (NetworkInfo info : cm.getAllNetworkInfo()) + logNetworkInfo(s, info); + } + try { + for (NetworkInterface iface : list(getNetworkInterfaces())) + logNetworkInterface(s, iface); + } catch (SocketException e) { + logger.log(WARNING, e.toString(), e); + } + logger.log(INFO, s.toString()); + } + + private static void logWifiInfo(StringBuilder s, @Nullable WifiInfo info) { + if (info == null) { + s.append("Wifi info: null\n"); + return; + } + s.append("Wifi info:\n"); + s.append("\tSSID: ").append(info.getSSID()).append("\n"); + s.append("\tBSSID: ").append(info.getBSSID()).append("\n"); + s.append("\tMAC address: ").append(info.getMacAddress()).append("\n"); + s.append("\tIP address: ") + .append(ipToString(info.getIpAddress())).append("\n"); + s.append("\tSupplicant state: ") + .append(info.getSupplicantState()).append("\n"); + s.append("\tNetwork ID: ").append(info.getNetworkId()).append("\n"); + s.append("\tLink speed: ").append(info.getLinkSpeed()).append("\n"); + s.append("\tRSSI: ").append(info.getRssi()).append("\n"); + if (info.getHiddenSSID()) s.append("\tHidden SSID\n"); + if (SDK_INT >= 21) + s.append("\tFrequency: ").append(info.getFrequency()).append("\n"); + } + + private static void logNetworkInfo(StringBuilder s, + @Nullable NetworkInfo info) { + if (info == null) { + s.append("Network info: null\n"); + return; + } + s.append("Network info:\n"); + s.append("\tType: ").append(info.getTypeName()) + .append(" (").append(info.getType()).append(")\n"); + s.append("\tSubtype: ").append(info.getSubtypeName()) + .append(" (").append(info.getSubtype()).append(")\n"); + s.append("\tState: ").append(info.getState()).append("\n"); + s.append("\tDetailed state: ") + .append(info.getDetailedState()).append("\n"); + s.append("\tReason: ").append(info.getReason()).append("\n"); + s.append("\tExtra info: ").append(info.getExtraInfo()).append("\n"); + if (info.isAvailable()) s.append("\tAvailable\n"); + if (info.isConnected()) s.append("\tConnected\n"); + if (info.isConnectedOrConnecting()) + s.append("\tConnected or connecting\n"); + if (info.isFailover()) s.append("\tFailover\n"); + if (info.isRoaming()) s.append("\tRoaming\n"); + } + + private static void logNetworkInterface(StringBuilder s, + NetworkInterface iface) throws SocketException { + s.append("Network interface:\n"); + s.append("\tName: ").append(iface.getName()).append("\n"); + s.append("\tDisplay name: ") + .append(iface.getDisplayName()).append("\n"); + s.append("\tHardware address: ") + .append(hexOrNull(iface.getHardwareAddress())).append("\n"); + if (iface.isLoopback()) s.append("\tLoopback\n"); + if (iface.isPointToPoint()) s.append("\tPoint-to-point\n"); + if (iface.isVirtual()) s.append("\tVirtual\n"); + if (iface.isUp()) s.append("\tUp\n"); + if (SDK_INT >= 19) + s.append("\tIndex: ").append(iface.getIndex()).append("\n"); + for (InterfaceAddress addr : iface.getInterfaceAddresses()) { + s.append("\tInterface address:\n"); + logInetAddress(s, addr.getAddress()); + s.append("\t\tPrefix length: ") + .append(addr.getNetworkPrefixLength()).append("\n"); + } + } + + private static void logInetAddress(StringBuilder s, InetAddress addr) { + s.append("\t\tAddress: ") + .append(hexOrNull(addr.getAddress())).append("\n"); + s.append("\t\tHost address: ") + .append(addr.getHostAddress()).append("\n"); + if (addr.isLoopbackAddress()) s.append("\t\tLoopback\n"); + if (addr.isLinkLocalAddress()) s.append("\t\tLink-local\n"); + if (addr.isSiteLocalAddress()) s.append("\t\tSite-local\n"); + if (addr.isAnyLocalAddress()) s.append("\t\tAny local (wildcard)\n"); + if (addr.isMCNodeLocal()) s.append("\t\tMulticast node-local\n"); + if (addr.isMCLinkLocal()) s.append("\t\tMulticast link-local\n"); + if (addr.isMCSiteLocal()) s.append("\t\tMulticast site-local\n"); + if (addr.isMCOrgLocal()) s.append("\t\tMulticast org-local\n"); + if (addr.isMCGlobal()) s.append("\t\tMulticast global\n"); + } + + @Nullable + private static String hexOrNull(@Nullable byte[] b) { + return b == null ? null : toHexString(b); + } } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/util/StringUtils.java b/bramble-api/src/main/java/org/briarproject/bramble/util/StringUtils.java index b6d082098..816e890b1 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/util/StringUtils.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/util/StringUtils.java @@ -146,6 +146,14 @@ public class StringUtils { return s.toString(); } + public static String ipToString(int ip) { + int ip1 = ip & 0xFF; + int ip2 = (ip >> 8) & 0xFF; + int ip3 = (ip >> 16) & 0xFF; + int ip4 = (ip >> 24) & 0xFF; + return ip1 + "." + ip2 + "." + ip3 + "." + ip4; + } + public static String getRandomString(int length) { char[] c = new char[length]; for (int i = 0; i < length; i++) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportPrimer.java b/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportPrimer.java index f74647eba..b48ae05ed 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportPrimer.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportPrimer.java @@ -173,12 +173,7 @@ public class BriarReportPrimer implements ReportPrimer { WifiInfo wifiInfo = wm.getConnectionInfo(); if (wifiInfo != null) { int ip = wifiInfo.getIpAddress(); // Nice API, Google - int ip1 = ip & 0xFF; - int ip2 = (ip >> 8) & 0xFF; - int ip3 = (ip >> 16) & 0xFF; - int ip4 = (ip >> 24) & 0xFF; - String address = ip1 + "." + ip2 + "." + ip3 + "." + ip4; - customData.put("Wi-Fi address", address); + customData.put("Wi-Fi address", StringUtils.ipToString(ip)); } }