summaryrefslogtreecommitdiff
path: root/app/src/main/java/se/leap/bitmaskclient/base
diff options
context:
space:
mode:
authorcyberta <cyberta@riseup.net>2026-03-09 20:46:13 +0100
committercyberta <cyberta@riseup.net>2026-03-16 11:08:57 +0000
commit31f29fcf0de6f7c254c1ca608aef1accce4238b1 (patch)
treea5c139b893a58f8e4a72389af6247ef77cace4fe /app/src/main/java/se/leap/bitmaskclient/base
parentb6c66d85dedfb82c6bf337b3eb2aa75166d0be42 (diff)
Reimpement IPtProxy management code: IPtProxys 'new' controller can only be initiated once, se we need to switch to a singleton-like architecture to keep a global reference of it and pass it around. The update includes new support for sqs queues as signaling channel, which will be only provided to users in some regions. IPtProxy now has proper state callbacks, so the preliminary code that scraped logs to retrieve the snowflake state could be removed.
Diffstat (limited to 'app/src/main/java/se/leap/bitmaskclient/base')
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java5
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/models/Constants.java2
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/utils/ClientTransportPluginProvider.java39
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java10
4 files changed, 54 insertions, 2 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java b/app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java
index 6b3ba348..cbe954db 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java
@@ -28,6 +28,7 @@ import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getSavedProvider
import android.content.IntentFilter;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
@@ -44,6 +45,7 @@ import java.security.Security;
import se.leap.bitmaskclient.BuildConfig;
import se.leap.bitmaskclient.appUpdate.DownloadBroadcastReceiver;
import se.leap.bitmaskclient.base.models.ProviderObservable;
+import se.leap.bitmaskclient.base.utils.ClientTransportPluginProvider;
import se.leap.bitmaskclient.base.utils.PRNGFixes;
import se.leap.bitmaskclient.base.utils.PreferenceHelper;
import se.leap.bitmaskclient.eip.EipSetupObserver;
@@ -61,12 +63,12 @@ public class BitmaskApp extends MultiDexApplication implements DefaultLifecycleO
private ProviderObservable providerObservable;
private DownloadBroadcastReceiver downloadBroadcastReceiver;
private TorStatusObservable torStatusObservable;
-
private ProviderSetupObservable providerSetupObservable;
private PreferenceHelper preferenceHelper;
+
@Override
public void onCreate() {
super.onCreate();
@@ -85,6 +87,7 @@ public class BitmaskApp extends MultiDexApplication implements DefaultLifecycleO
providerObservable.updateProvider(getSavedProviderFromSharedPreferences());
torStatusObservable = TorStatusObservable.getInstance();
providerSetupObservable = ProviderSetupObservable.getInstance();
+ ClientTransportPluginProvider.init(this);
EipSetupObserver.init(this);
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/models/Constants.java b/app/src/main/java/se/leap/bitmaskclient/base/models/Constants.java
index b8849c4d..e01542f5 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/models/Constants.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/models/Constants.java
@@ -44,6 +44,8 @@ public interface Constants {
String PREFERRED_CITY = "preferred_city";
// ATTENTION: this key is also used in bitmask-core for persistence
String COUNTRYCODE = "COUNTRYCODE";
+ // ATTENTION: this key is also used in bitmask-core
+ String GEOIP_LOOKUP_URL = "";
String USE_SNOWFLAKE = "use_snowflake";
String PREFER_UDP = "prefer_UDP";
String GATEWAY_PINNING = "gateway_pinning";
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/utils/ClientTransportPluginProvider.java b/app/src/main/java/se/leap/bitmaskclient/base/utils/ClientTransportPluginProvider.java
new file mode 100644
index 00000000..8e6387d4
--- /dev/null
+++ b/app/src/main/java/se/leap/bitmaskclient/base/utils/ClientTransportPluginProvider.java
@@ -0,0 +1,39 @@
+package se.leap.bitmaskclient.base.utils;
+
+import android.content.Context;
+
+import org.torproject.jni.ClientTransportPluginInterface;
+
+import se.leap.bitmaskclient.tor.SnowflakePlugin;
+
+/**
+ * ClientTransportPluginProvider keeps a global reference of an implementation of ClientTransportPluginInterface.
+ * Currently the underlying plugin is utilizing IPtPtroxy and that library cannot be instantiated twice.
+ * Therefore we need keep a global reference to it and pass that around.
+ */
+public class ClientTransportPluginProvider {
+ private final SnowflakePlugin plugin;
+ private static ClientTransportPluginProvider instance = null;
+
+ private ClientTransportPluginProvider(Context context) throws IllegalStateException {
+ plugin = new SnowflakePlugin(context);
+ }
+
+ public static void init(Context context) {
+ if (instance == null) {
+ try {
+ instance = new ClientTransportPluginProvider(context);
+ } catch (IllegalStateException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+
+ public static ClientTransportPluginInterface get() {
+ if (instance != null) {
+ return instance.plugin;
+ }
+ return null;
+ }
+}
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java b/app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java
index 200617cf..38e32861 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/utils/PreferenceHelper.java
@@ -20,6 +20,7 @@ import static se.leap.bitmaskclient.base.models.Constants.EIP_RESTART_ON_BOOT;
import static se.leap.bitmaskclient.base.models.Constants.EXCLUDED_APPS;
import static se.leap.bitmaskclient.base.models.Constants.FIRST_TIME_USER_DATE;
import static se.leap.bitmaskclient.base.models.Constants.GATEWAY_PINNING;
+import static se.leap.bitmaskclient.base.models.Constants.GEOIP_LOOKUP_URL;
import static se.leap.bitmaskclient.base.models.Constants.LAST_DONATION_REMINDER_DATE;
import static se.leap.bitmaskclient.base.models.Constants.LAST_UPDATE_CHECK;
import static se.leap.bitmaskclient.base.models.Constants.LAST_USED_PROFILE;
@@ -218,7 +219,7 @@ public class PreferenceHelper {
try {
introducer = Introducer.fromUrl(BitmaskCoreProvider.getBitmaskMobile().getIntroducerURLByDomain(domain));
} catch (Exception e) {
- e.printStackTrace();
+ Log.w(TAG, "introducer lookup: " + e.getMessage());
}
Provider customProvider = new Provider(mainURL);
customProvider.setIntroducer(introducer);
@@ -670,6 +671,13 @@ public class PreferenceHelper {
putString(COUNTRYCODE, countryCode);
}
+ public static void setGeoIPLookupURL(String url) {
+ putString(GEOIP_LOOKUP_URL, url);
+ }
+ public static String getGeoIPLookupURL() {
+ return getString(GEOIP_LOOKUP_URL, null);
+ }
+
public static String getPreferredCity() {
return useObfuscationPinning() ? null : getString(PREFERRED_CITY, null);
}