Browse Source

Integrate GetNetworkID on iOS and Android

Rod Hynes 8 years ago
parent
commit
6522944c4f

+ 31 - 0
MobileLibrary/Android/PsiphonTunnel/PsiphonTunnel.java

@@ -22,6 +22,8 @@ package ca.psiphon;
 import android.annotation.TargetApi;
 import android.content.Context;
 import android.net.ConnectivityManager;
+import android.net.wifi.WifiManager;
+import android.net.wifi.WifiInfo;
 import android.net.LinkProperties;
 import android.net.NetworkInfo;
 import android.net.VpnService;
@@ -366,6 +368,35 @@ public class PsiphonTunnel extends Psi.PsiphonProvider.Stub {
     @Override
     public String IPv6Synthesize(String IPv4Addr) { return IPv4Addr; }
 
+    @Override
+    public String GetNetworkID() {
+
+        // The network ID contains potential PII. In tunnel-core, the network ID
+        // is used only locally in the client and not sent to the server.
+
+        Context context = mHostService.getContext();
+        String networkIdentifier = "UNKNOWN";
+        ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
+        WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
+        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
+        TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
+        if (activeNetworkInfo == null) {
+            networkIdentifier = "NONE";
+        } else if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
+            networkIdentifier = "WIFI";
+            if (wifiInfo != null) {
+                networkIdentifier += "-" + wifiInfo.getBSSID();
+            }
+        } else if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
+            networkIdentifier = "MOBILE";
+            if (telephonyManager != null) {
+                networkIdentifier += "-" + telephonyManager.getNetworkOperator();
+            }
+        }
+        return networkIdentifier;
+    }
+
     //----------------------------------------------------------------------------------------------
     // Psiphon Tunnel Core
     //----------------------------------------------------------------------------------------------

+ 32 - 0
MobileLibrary/iOS/PsiphonTunnel/PsiphonTunnel/PsiphonTunnel.m

@@ -22,6 +22,7 @@
 #import <stdatomic.h>
 #import <CoreTelephony/CTTelephonyNetworkInfo.h>
 #import <CoreTelephony/CTCarrier.h>
+#import <SystemConfiguration/CaptiveNetwork.h>
 #import "LookupIPv6.h"
 #import "Psi-meta.h"
 #import "PsiphonTunnel.h"
@@ -1089,6 +1090,37 @@
     return @"";
 }
 
+- (NSString *)getNetworkID {
+
+    // The network ID contains potential PII. In tunnel-core, the network ID
+    // is used only locally in the client and not sent to the server.
+
+    NSMutableString *networkIdentifier = [NSMutableString stringWithString:@"UNKNOWN"];
+    NetworkStatus status = [[Reachability reachabilityForInternetConnection] currentReachabilityStatus];
+    if (status == NotReachable) {
+        [networkIdentifier setString:@"NONE"];
+    } else if (status == ReachableViaWiFi) {
+        [networkIdentifier setString:@"WIFI"];
+        NSArray *networkInterfaceNames = (__bridge_transfer id)CNCopySupportedInterfaces();
+        for (NSString *networkInterfaceName in networkInterfaceNames) {
+            NSDictionary *networkInterfaceInfo = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)networkInterfaceName);
+            if (networkInterfaceInfo[@"BSSID"]) {
+                [networkIdentifier appendFormat:@"-%@", networkInterfaceInfo[@"BSSID"]];
+            }
+        }
+    } else if (status == ReachableViaWWAN) {
+        [networkIdentifier setString:@"MOBILE"];
+        CTTelephonyNetworkInfo *telephonyNetworkinfo = [[CTTelephonyNetworkInfo alloc] init];
+        CTCarrier *cellularProvider = [telephonyNetworkinfo subscriberCellularProvider];
+        if (cellularProvider != nil) {
+            NSString *mcc = [cellularProvider mobileCountryCode];
+            NSString *mnc = [cellularProvider mobileNetworkCode];
+            [networkIdentifier appendFormat:@"-%@-%@", mcc, mnc];
+        }
+    }
+    return networkIdentifier;
+}
+
 - (void)notice:(NSString *)noticeJSON {
     // To prevent out-of-control memory usage, we want to limit the number of notices
     // we asynchronously queue. Note that this means we'll start blocking Go threads

+ 10 - 0
MobileLibrary/psi/psi.go

@@ -44,6 +44,7 @@ type PsiphonProvider interface {
 	IPv6Synthesize(IPv4Addr string) string
 	GetPrimaryDnsServer() string
 	GetSecondaryDnsServer() string
+	GetNetworkID() string
 }
 
 func SetNoticeFiles(
@@ -96,8 +97,11 @@ func Start(
 	if err != nil {
 		return fmt.Errorf("error loading configuration file: %s", err)
 	}
+
 	config.NetworkConnectivityChecker = provider
 
+	config.NetworkIDGetter = provider
+
 	if useDeviceBinder {
 		config.DeviceBinder = newLoggingDeviceBinder(provider)
 		config.DnsServerGetter = provider
@@ -293,6 +297,12 @@ func (p *mutexPsiphonProvider) GetSecondaryDnsServer() string {
 	return p.p.GetSecondaryDnsServer()
 }
 
+func (p *mutexPsiphonProvider) GetNetworkID() string {
+	p.Lock()
+	defer p.Unlock()
+	return p.p.GetNetworkID()
+}
+
 type loggingDeviceBinder struct {
 	p PsiphonProvider
 }