summaryrefslogtreecommitdiff
path: root/app/src/main/java/se/leap/bitmaskclient/tethering
diff options
context:
space:
mode:
authorcyberta <cyberta@riseup.net>2020-01-30 16:14:22 -0600
committercyberta <cyberta@riseup.net>2020-01-30 16:14:22 -0600
commit97a117cb3bbc022ee16008dea9896a8dfea7c681 (patch)
tree8e3684e0012d3148ed1598ab6f839a562660cd13 /app/src/main/java/se/leap/bitmaskclient/tethering
parentb9e4195573da146d48e5921c65dc57273d94ccd2 (diff)
implement usb tethering
Diffstat (limited to 'app/src/main/java/se/leap/bitmaskclient/tethering')
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java37
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/tethering/TetheringState.java12
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java127
3 files changed, 101 insertions, 75 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java
index b84f3494..75d29417 100644
--- a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java
+++ b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java
@@ -16,6 +16,8 @@
*/
package se.leap.bitmaskclient.tethering;
+import android.support.annotation.NonNull;
+
import java.util.Observable;
public class TetheringObservable extends Observable {
@@ -43,40 +45,47 @@ public class TetheringObservable extends Observable {
}
public static void allowVpnUsbTethering(boolean enabled) {
- if (getInstance().tetheringState.isUsbTetheringEnabled != enabled) {
- getInstance().tetheringState.isUsbTetheringEnabled = enabled;
+ if (getInstance().tetheringState.isVpnUsbTetheringAllowed != enabled) {
+ getInstance().tetheringState.isVpnUsbTetheringAllowed = enabled;
getInstance().setChanged();
getInstance().notifyObservers();
}
}
public static void allowVpnBluetoothTethering(boolean enabled) {
- if (getInstance().tetheringState.isBluetoothTetheringEnabled != enabled) {
- getInstance().tetheringState.isBluetoothTetheringEnabled = enabled;
+ if (getInstance().tetheringState.isVpnBluetoothTetheringAllowed != enabled) {
+ getInstance().tetheringState.isVpnBluetoothTetheringAllowed = enabled;
getInstance().setChanged();
getInstance().notifyObservers();
}
}
- static void setWifiTethering(boolean enabled, String address, String interfaceName) {
+ static void setWifiTethering(boolean enabled, @NonNull String address, @NonNull String interfaceName) {
if (getInstance().tetheringState.isWifiTetheringEnabled != enabled ||
!getInstance().tetheringState.wifiInterface.equals(interfaceName) ||
!getInstance().tetheringState.wifiAddress.equals(address)) {
- getInstance().tetheringState.isWifiTetheringEnabled = enabled;
- getInstance().tetheringState.wifiInterface = interfaceName;
- getInstance().tetheringState.wifiAddress = address;
- if ("".equals(address)) {
- getInstance().tetheringState.lastWifiAddress = address;
- }
+ TetheringState state = getInstance().tetheringState;
+ state.isWifiTetheringEnabled = enabled;
+ state.wifiInterface = interfaceName;
+ state.wifiAddress = address;
+ state.lastSeenWifiAddress = address.isEmpty() ? state.lastSeenWifiAddress : address;
+ state.lastSeenWifiInterface = interfaceName.isEmpty() ? state.lastSeenWifiInterface : interfaceName;
getInstance().setChanged();
getInstance().notifyObservers();
}
}
- static void setUsbTethering(boolean enabled) {
- if (getInstance().tetheringState.isUsbTetheringEnabled != enabled) {
- getInstance().tetheringState.isUsbTetheringEnabled = enabled;
+ static void setUsbTethering(boolean enabled, @NonNull String address, @NonNull String interfaceName) {
+ if (getInstance().tetheringState.isUsbTetheringEnabled != enabled ||
+ !getInstance().tetheringState.usbAddress.equals(address) ||
+ !getInstance().tetheringState.usbInterface.equals(interfaceName)) {
+ TetheringState state = getInstance().tetheringState;
+ state.isUsbTetheringEnabled = enabled;
+ state.usbAddress = address;
+ state.usbInterface = interfaceName;
+ state.lastSeenUsbAddress = address.isEmpty() ? state.lastSeenUsbAddress : address;
+ state.lastSeenUsbInterface = interfaceName.isEmpty() ? state.lastSeenUsbInterface : interfaceName;
getInstance().setChanged();
getInstance().notifyObservers();
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringState.java b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringState.java
index 9708639a..8ef237c6 100644
--- a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringState.java
+++ b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringState.java
@@ -8,12 +8,18 @@ public class TetheringState implements Cloneable {
public boolean isVpnUsbTetheringAllowed;
public boolean isVpnBluetoothTetheringAllowed;
public String wifiInterface = "";
- public String usbInterface = "";
- public String bluetoothInterface = "";
+ public String lastSeenWifiInterface = "";
public String wifiAddress = "";
- public String lastWifiAddress = "";
+ public String lastSeenWifiAddress = "";
+ public String usbInterface = "";
+ public String lastSeenUsbInterface = "";
public String usbAddress = "";
+ public String lastSeenUsbAddress = "";
+ public String bluetoothInterface = "";
+ public String lastSeenBluetoothInterface = "";
public String bluetoothAddress = "";
+ public String lastSeenBluetoothAddress = "";
+
public boolean tetherWifiVpn() {
return isWifiTetheringEnabled && isVpnWifiTetheringAllowed;
diff --git a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java
index 11e1a83d..4a266d87 100644
--- a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java
+++ b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringStateManager.java
@@ -19,7 +19,6 @@ package se.leap.bitmaskclient.tethering;
import android.content.Context;
import android.content.IntentFilter;
import android.support.annotation.VisibleForTesting;
-import android.util.Log;
import java.net.Inet4Address;
import java.net.InterfaceAddress;
@@ -72,26 +71,68 @@ public class TetheringStateManager {
updateBluetoothTetheringState();
}
+ static void updateWifiTetheringState() {
+ WifiManagerWrapper manager = getInstance().wifiManager;
+ try {
+ TetheringObservable.setWifiTethering(manager.isWifiAPEnabled(), getWifiAddressRange(), getWlanInterfaceName());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ static void updateUsbTetheringState() {
+ TetheringObservable.setUsbTethering(isUsbTetheringEnabled(), getUsbAddressRange(), getUsbInterfaceName());
+ }
+
+ static void updateBluetoothTetheringState() {
+ TetheringObservable.setBluetoothTethering(isBluetoothTetheringEnabled());
+ }
+
+ private static String getWifiAddressRange() {
+ String interfaceAddress = getInterfaceAddress(getWlanInterface());
+ return getAddressRange(interfaceAddress);
+ }
+
+ private static String getUsbAddressRange() {
+ String interfaceAddress = getInterfaceAddress(getUsbInterface());
+ return getAddressRange(interfaceAddress);
+ }
+
+ private static String getWlanInterfaceName() {
+ return getInterfaceName(getWlanInterface());
+ }
- private static boolean getUsbTetheringState() {
+ private static String getUsbInterfaceName() {
+ return getInterfaceName(getUsbInterface());
+ }
+
+ private static NetworkInterface getWlanInterface() {
+ return getNetworkInterface(new String[]{"wlan", "eth"});
+ }
+
+ private static NetworkInterface getUsbInterface() {
+ return getNetworkInterface(new String[]{"rndis", "usb"});
+ }
+
+ private static boolean isBluetoothTetheringEnabled() {
+ StringBuilder log = new StringBuilder();
+ boolean hasBtPan = false;
try {
- for(Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
- NetworkInterface networkInterface = en.nextElement();
- if(!networkInterface.isLoopback()){
- if(networkInterface.getName().contains("rndis") || networkInterface.getName().contains("usb")){
- return true;
- }
- }
- }
- } catch(Exception e){
+ hasBtPan = Cmd.runBlockingCmd(new String[] {"ifconfig bt-pan"}, log) == 0;
+ //Log.d(TAG, "ifconfig result: " + log.toString());
+ } catch (Exception e) {
e.printStackTrace();
}
+ return hasBtPan;
- return false;
}
- public static String getWifiAddressRange() {
- String interfaceAddress = getWifiInterfaceAddress();
+ private static boolean isUsbTetheringEnabled() {
+ return getUsbInterface() != null;
+ }
+
+ @VisibleForTesting
+ static String getAddressRange(String interfaceAddress) {
if (interfaceAddress.split("\\.").length == 4) {
String result = interfaceAddress.substring(0, interfaceAddress.lastIndexOf("."));
result = result + ".0/24";
@@ -100,72 +141,42 @@ public class TetheringStateManager {
return "";
}
- @VisibleForTesting
- static String getWifiInterfaceAddress() {
- NetworkInterface networkInterface = getWlanInterface();
+ private static String getInterfaceAddress(NetworkInterface networkInterface) {
if (networkInterface != null) {
- List<InterfaceAddress> ifaceAddresses = networkInterface.getInterfaceAddresses();
- for (InterfaceAddress ifaceAddres : ifaceAddresses) {
- if (ifaceAddres.getAddress() instanceof Inet4Address) {
- return ifaceAddres.getAddress().getHostAddress();
- }
- }
+ List<InterfaceAddress> ifaceAddresses = networkInterface.getInterfaceAddresses();
+ for (InterfaceAddress ifaceAddres : ifaceAddresses) {
+ if (ifaceAddres.getAddress() instanceof Inet4Address) {
+ return ifaceAddres.getAddress().getHostAddress();
+ }
+ }
}
return "";
}
- private static String getWifiInterfaceName() {
- NetworkInterface networkInterface = getWlanInterface();
+ private static String getInterfaceName(NetworkInterface networkInterface) {
if (networkInterface != null) {
return networkInterface.getName();
}
return "";
}
- private static NetworkInterface getWlanInterface() {
+ private static NetworkInterface getNetworkInterface(String[] interfaceNames) {
try {
for(Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface networkInterface = en.nextElement();
if(!networkInterface.isLoopback()){
- if(networkInterface.getName().contains("wlan") || networkInterface.getName().contains("eth")){
- return networkInterface;
+ for (String interfaceName : interfaceNames) {
+ if (networkInterface.getName().contains(interfaceName)) {
+ return networkInterface;
+ }
}
}
}
} catch(Exception e){
e.printStackTrace();
}
- return null;
- }
-
- private static boolean isBluetoothTetheringEnabled() {
- StringBuilder log = new StringBuilder();
- boolean hasBtPan = false;
- try {
- hasBtPan = Cmd.runBlockingCmd(new String[] {"ifconfig bt-pan"}, log) == 0;
- //Log.d(TAG, "ifconfig result: " + log.toString());
- } catch (Exception e) {
- e.printStackTrace();
- }
- return hasBtPan;
-
- }
- static void updateUsbTetheringState() {
- TetheringObservable.setUsbTethering(getUsbTetheringState());
- }
-
- static void updateBluetoothTetheringState() {
- TetheringObservable.setBluetoothTethering(isBluetoothTetheringEnabled());
- }
-
- static void updateWifiTetheringState() {
- WifiManagerWrapper manager = getInstance().wifiManager;
- try {
- TetheringObservable.setWifiTethering(manager.isWifiAPEnabled(), getWifiAddressRange(), getWifiInterfaceName());
- } catch (Exception e) {
- e.printStackTrace();
- }
+ return null;
}
}