summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/tor/ClientTransportPlugin.java24
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/tor/TorStatusObservable.java42
2 files changed, 52 insertions, 14 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/tor/ClientTransportPlugin.java b/app/src/main/java/se/leap/bitmaskclient/tor/ClientTransportPlugin.java
index 0fd51d15..1d2b7cea 100644
--- a/app/src/main/java/se/leap/bitmaskclient/tor/ClientTransportPlugin.java
+++ b/app/src/main/java/se/leap/bitmaskclient/tor/ClientTransportPlugin.java
@@ -18,6 +18,8 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import IPtProxy.IPtProxy;
@@ -28,6 +30,7 @@ public class ClientTransportPlugin implements ClientTransportPluginInterface {
private final WeakReference<Context> contextRef;
private long snowflakePort = -1;
private FileObserver logFileObserver;
+ private static final Pattern SNOWFLAKE_LOG_TIMESTAMP_PATTERN = Pattern.compile("((19|2[0-9])[0-9]{2}\\/\\d{1,2}\\/\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}) ([\\S|\\s]+)");
public ClientTransportPlugin(Context context) {
this.contextRef = new WeakReference<>(context);
@@ -77,7 +80,7 @@ public class ClientTransportPlugin implements ClientTransportPluginInterface {
int endIndex = currentBuffer.size() - 1;
Collection<String> newMessages = currentBuffer.subList(startIndex, endIndex);
for (String message : newMessages) {
- Log.d("[SNOWFLAKE]", message);
+ logSnowflakeMessage(message);
}
lastBuffer.addAll(newMessages);
}
@@ -130,4 +133,23 @@ public class ClientTransportPlugin implements ClientTransportPluginInterface {
}
return null;
}
+
+ private void logSnowflakeMessage(String message) {
+ Matcher matcher = SNOWFLAKE_LOG_TIMESTAMP_PATTERN.matcher(message);
+ if (matcher.matches()) {
+ try {
+
+ String strippedString = matcher.group(3).trim();
+ Log.d(TAG, "log: " + message);
+ Log.d(TAG, "log stripped: " + strippedString);
+ if (strippedString.length() > 0) {
+ TorStatusObservable.logSnowflakeMessage(contextRef.get(), strippedString);
+ }
+ } catch (IndexOutOfBoundsException | IllegalStateException e) {
+ e.printStackTrace();
+ }
+ } else {
+ TorStatusObservable.logSnowflakeMessage(contextRef.get(), message);
+ }
+ }
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/tor/TorStatusObservable.java b/app/src/main/java/se/leap/bitmaskclient/tor/TorStatusObservable.java
index 11baecbf..64e68727 100644
--- a/app/src/main/java/se/leap/bitmaskclient/tor/TorStatusObservable.java
+++ b/app/src/main/java/se/leap/bitmaskclient/tor/TorStatusObservable.java
@@ -1,10 +1,8 @@
package se.leap.bitmaskclient.tor;
import android.content.Context;
-import android.os.Handler;
import android.util.Log;
-import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.Observable;
@@ -24,10 +22,15 @@ public class TorStatusObservable extends Observable {
UNKOWN
}
+ public static final String LOG_TAG_TOR = "[TOR]";
+ public static final String LOG_TAG_SNOWFLAKE = "[SNOWFLAKE]";
+
private static TorStatusObservable instance;
private TorStatus status = TorStatus.UNKOWN;
private final TorNotificationManager torNotificationManager;
private String lastError;
+ private String lastTorLog;
+ private String lastSnowflakeLog;
private int port = -1;
private int bootstrapPercent = -1;
private Vector<String> lastLogs = new Vector<>(100);
@@ -47,16 +50,32 @@ public class TorStatusObservable extends Observable {
return getInstance().status;
}
- public static void logMessage(Context context, String tag, String message) {
- Log.d(tag, message);
+ public static void logSnowflakeMessage(Context context, String message) {
+ Log.d(LOG_TAG_SNOWFLAKE, message);
addLog(message);
+ getInstance().lastSnowflakeLog = message;
if (getInstance().status != TorStatus.OFF) {
- getInstance().torNotificationManager.buildTorNotification(context, getStringForCurrentStatus(context), message, getInstance().bootstrapPercent);
+ getInstance().torNotificationManager.buildTorNotification(context, getStringForCurrentStatus(context), getNotificationLog(), getNotificationProgress());
}
instance.setChanged();
instance.notifyObservers();
}
+ private static String getNotificationLog() {
+ String snowflakeIcon = new String(Character.toChars(0x2744));
+ String snowflakeLog = getInstance().lastSnowflakeLog;
+ // we don't want to show the response json in the notification
+ if (snowflakeLog != null && snowflakeLog.contains("Received answer: {")) {
+ snowflakeLog = "Received answer.";
+ }
+ return "Tor: " + getInstance().lastTorLog + "\n" +
+ snowflakeIcon + ": " + snowflakeLog;
+ }
+
+ private static int getNotificationProgress() {
+ return getInstance().status == TorStatus.STARTING ? getInstance().bootstrapPercent : -1;
+ }
+
private static void addLog(String message) {
if (instance.lastLogs.size() > 100) {
instance.lastLogs.remove(0);
@@ -75,18 +94,15 @@ public class TorStatusObservable extends Observable {
if (bootstrapPercent != -1) {
getInstance().bootstrapPercent = bootstrapPercent;
}
- int progress = getInstance().status == TorStatus.STARTING ? getInstance().bootstrapPercent : -1;
-
if (getInstance().status == TorStatus.OFF) {
getInstance().torNotificationManager.cancelNotifications(context);
- } else if (logKey != null) {
- String log = getStringFor(context, logKey);
- addLog(log);
- getInstance().torNotificationManager.buildTorNotification(context, getStringForCurrentStatus(context), log, progress);
} else {
- String log = instance.lastLogs.size() > 0 ? instance.lastLogs.lastElement() : "";
- getInstance().torNotificationManager.buildTorNotification(context, getStringForCurrentStatus(context), log, progress);
+ if (logKey != null) {
+ getInstance().lastTorLog = getStringFor(context, logKey);
+ addLog(getInstance().lastTorLog);
+ }
+ getInstance().torNotificationManager.buildTorNotification(context, getStringForCurrentStatus(context), getNotificationLog(), getNotificationProgress());
}
instance.setChanged();