diff --git a/app/src/main/java/com/emanuelef/remote_capture/ActionReceiver.java b/app/src/main/java/com/emanuelef/remote_capture/ActionReceiver.java
index eed4bc55..3c1cb3a0 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/ActionReceiver.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/ActionReceiver.java
@@ -22,7 +22,6 @@ package com.emanuelef.remote_capture;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.util.Log;
import androidx.core.app.NotificationManagerCompat;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/AppsLoader.java b/app/src/main/java/com/emanuelef/remote_capture/AppsLoader.java
index 5291cf21..e81cb9d3 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/AppsLoader.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/AppsLoader.java
@@ -23,7 +23,6 @@ import android.annotation.SuppressLint;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
-import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -147,4 +146,4 @@ public class AppsLoader implements LoaderManager.LoaderCallbacks.
+ *
+ * Copyright 2020-22 - Emanuele Faranda
+ */
+
+package com.emanuelef.remote_capture;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+public class Log {
+ public static final int LOG_LEVEL_INFO = 4;
+ public static int DEFAULT_LOGGER;
+ public static int MITMADDON_LOGGER;
+
+ public static void init(String basedir) {
+ DEFAULT_LOGGER = CaptureService.initLogger(basedir + "/pcapdroid.log", LOG_LEVEL_INFO);
+ MITMADDON_LOGGER = CaptureService.initLogger(basedir + "/mitmaddon.log", LOG_LEVEL_INFO);
+ android.util.Log.e("tag", basedir);
+ }
+
+ public static void writeLog(int logger, int level, @Nullable String tag, @NonNull String message) {
+ CaptureService.writeLog(logger, level, "[" + tag + "] " + message);
+ }
+
+ public static void d(@Nullable String tag, @NonNull String message) {
+ android.util.Log.d(tag, message);
+ }
+
+ public static void i(@Nullable String tag, @NonNull String message) {
+ android.util.Log.i(tag, message);
+ writeLog(DEFAULT_LOGGER, android.util.Log.INFO, tag, message);
+ }
+
+ public static void w(@Nullable String tag, @NonNull String message) {
+ android.util.Log.w(tag, message);
+ writeLog(DEFAULT_LOGGER, android.util.Log.WARN, tag, message);
+ }
+
+ public static void e(@Nullable String tag, @NonNull String message) {
+ android.util.Log.e(tag, message);
+ writeLog(DEFAULT_LOGGER, android.util.Log.ERROR, tag, message);
+ }
+
+ public static void wtf(@Nullable String tag, @NonNull String message) {
+ android.util.Log.wtf(tag, message);
+ writeLog(DEFAULT_LOGGER, android.util.Log.ASSERT, tag, message); // ANDROID_LOG_FATAL
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/emanuelef/remote_capture/MitmAddon.java b/app/src/main/java/com/emanuelef/remote_capture/MitmAddon.java
index 7e1ebdcc..e05f6490 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/MitmAddon.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/MitmAddon.java
@@ -35,7 +35,6 @@ import android.os.Message;
import android.os.Messenger;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
-import android.util.Log;
import androidx.annotation.NonNull;
import androidx.core.content.pm.PackageInfoCompat;
@@ -69,7 +68,7 @@ public class MitmAddon {
private final ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
- Log.d(TAG, "Service connected");
+ Log.i(TAG, "Service connected");
mService = new Messenger(service);
if(mStopRequested)
@@ -80,7 +79,7 @@ public class MitmAddon {
@Override
public void onServiceDisconnected(ComponentName className) {
- Log.d(TAG, "Service disconnected");
+ Log.i(TAG, "Service disconnected");
disconnect(); // call unbind to prevent new connections
mReceiver.onMitmServiceDisconnect();
}
@@ -211,7 +210,7 @@ public class MitmAddon {
// This must be always called after connect, e.g. in the OnDestroy
public void disconnect() {
if(mService != null) {
- Log.d(TAG, "Unbinding service...");
+ Log.i(TAG, "Unbinding service...");
mContext.unbindService(mConnection);
mService = null;
}
@@ -278,12 +277,12 @@ public class MitmAddon {
public boolean stopProxy() {
if(mService == null) {
- Log.d(TAG, "Not connected, postponing stop message");
+ Log.i(TAG, "Not connected, postponing stop message");
mStopRequested = true;
return true;
}
- Log.d(TAG, "Send stop message");
+ Log.i(TAG, "Send stop message");
Message msg = Message.obtain(null, MitmAPI.MSG_STOP_MITM);
try {
mService.send(msg);
diff --git a/app/src/main/java/com/emanuelef/remote_capture/MitmReceiver.java b/app/src/main/java/com/emanuelef/remote_capture/MitmReceiver.java
index a434c394..7be64528 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/MitmReceiver.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/MitmReceiver.java
@@ -23,7 +23,6 @@ import android.content.Context;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.os.SystemClock;
-import android.util.Log;
import android.util.LruCache;
import android.util.SparseArray;
@@ -179,12 +178,12 @@ public class MitmReceiver implements Runnable, ConnectionsListener, MitmListener
@Override
public void run() {
if(mSocketFd == null) {
- Log.d(TAG, "Null socket, abort");
+ Log.e(TAG, "Null socket, abort");
proxyRunning.postValue(false);
return;
}
- Log.d(TAG, "Receiving data...");
+ Log.i(TAG, "Receiving data...");
try(DataInputStream istream = new DataInputStream(new ParcelFileDescriptor.AutoCloseInputStream(mSocketFd))) {
while(mAddon.isConnected()) {
String msg_type;
@@ -236,7 +235,7 @@ public class MitmReceiver implements Runnable, ConnectionsListener, MitmListener
if(type == MsgType.MASTER_SECRET)
logMasterSecret(msg);
else if(type == MsgType.RUNNING) {
- Log.d(TAG, "MITM proxy is running");
+ Log.i(TAG, "MITM proxy is running");
proxyRunning.postValue(true);
} else {
ConnectionDescriptor conn = getConnByLocalPort(port);
@@ -258,7 +257,7 @@ public class MitmReceiver implements Runnable, ConnectionsListener, MitmListener
}
proxyRunning.postValue(false);
- Log.d(TAG, "End receiving data");
+ Log.i(TAG, "End receiving data");
}
private boolean isSent(MsgType type) {
diff --git a/app/src/main/java/com/emanuelef/remote_capture/PCAPdroid.java b/app/src/main/java/com/emanuelef/remote_capture/PCAPdroid.java
index 9e3cf19d..7c635a76 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/PCAPdroid.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/PCAPdroid.java
@@ -22,7 +22,6 @@ package com.emanuelef.remote_capture;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
-import android.util.Log;
import androidx.annotation.NonNull;
import androidx.preference.PreferenceManager;
@@ -59,8 +58,9 @@ public class PCAPdroid extends Application {
public void onCreate() {
super.onCreate();
+ Log.init(getCacheDir().getAbsolutePath());
Utils.BuildType buildtp = Utils.getVerifiedBuild(this);
- Log.d(TAG, "Build type: " + buildtp);
+ Log.i(TAG, "Build type: " + buildtp);
CaocConfig.Builder builder = CaocConfig.Builder.create();
if((buildtp == Utils.BuildType.PLAYSTORE) || (buildtp == Utils.BuildType.UNKNOWN)) {
@@ -123,4 +123,4 @@ public class PCAPdroid extends Application {
mCtrlPermissions = new CtrlPermissions(this);
return mCtrlPermissions;
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/emanuelef/remote_capture/Utils.java b/app/src/main/java/com/emanuelef/remote_capture/Utils.java
index 3e35d7c1..c5f5a21d 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/Utils.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/Utils.java
@@ -65,7 +65,6 @@ import android.text.SpannedString;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.StyleSpan;
-import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/CaptureCtrl.java b/app/src/main/java/com/emanuelef/remote_capture/activities/CaptureCtrl.java
index c8763aea..cc05774c 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/CaptureCtrl.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/CaptureCtrl.java
@@ -27,7 +27,6 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowInsets;
@@ -48,6 +47,7 @@ import com.emanuelef.remote_capture.Billing;
import com.emanuelef.remote_capture.BuildConfig;
import com.emanuelef.remote_capture.CaptureHelper;
import com.emanuelef.remote_capture.CaptureService;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.PCAPdroid;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java
index 45bdd810..f3c02ffb 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java
@@ -29,10 +29,10 @@ import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import android.util.Log;
import com.emanuelef.remote_capture.CaptureService;
import com.emanuelef.remote_capture.ConnectionsRegister;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.fragments.ConnectionOverview;
import com.emanuelef.remote_capture.fragments.ConnectionPayload;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/FirewallActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/FirewallActivity.java
index 79437191..5da556cb 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/FirewallActivity.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/FirewallActivity.java
@@ -20,7 +20,6 @@
package com.emanuelef.remote_capture.activities;
import android.os.Bundle;
-import android.util.Log;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
@@ -28,6 +27,7 @@ import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.fragments.EditListFragment;
import com.emanuelef.remote_capture.fragments.FirewallStatus;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/MainActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/MainActivity.java
index d35ba8e9..646e2c3f 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/MainActivity.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/MainActivity.java
@@ -52,7 +52,6 @@ import android.os.Build;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.provider.OpenableColumns;
-import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
@@ -63,6 +62,7 @@ import com.emanuelef.remote_capture.AppsResolver;
import com.emanuelef.remote_capture.Billing;
import com.emanuelef.remote_capture.BuildConfig;
import com.emanuelef.remote_capture.CaptureHelper;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.MitmReceiver;
import com.emanuelef.remote_capture.fragments.ConnectionsFragment;
import com.emanuelef.remote_capture.fragments.StatusFragment;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/MalwareDetection.java b/app/src/main/java/com/emanuelef/remote_capture/activities/MalwareDetection.java
index 25dabc5a..e8120bee 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/MalwareDetection.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/MalwareDetection.java
@@ -20,7 +20,6 @@
package com.emanuelef.remote_capture.activities;
import android.os.Bundle;
-import android.util.Log;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
@@ -28,6 +27,7 @@ import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.fragments.EditListFragment;
import com.emanuelef.remote_capture.fragments.BlacklistsFragment;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/OnBoardingActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/OnBoardingActivity.java
index 63050c5e..c21e3fce 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/OnBoardingActivity.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/OnBoardingActivity.java
@@ -24,7 +24,6 @@ import android.os.Build;
import android.os.Bundle;
import android.text.method.LinkMovementMethod;
import android.util.DisplayMetrics;
-import android.util.Log;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
@@ -41,6 +40,7 @@ import androidx.fragment.app.Fragment;
import androidx.preference.PreferenceManager;
import com.emanuelef.remote_capture.Billing;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
import com.emanuelef.remote_capture.model.Prefs;
@@ -210,4 +210,4 @@ public class OnBoardingActivity extends AppIntro {
startActivity(intent);
finish();
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/SettingsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/SettingsActivity.java
index 27442ac9..a91a8a9e 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/SettingsActivity.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/SettingsActivity.java
@@ -26,7 +26,6 @@ import android.net.InetAddresses;
import android.os.Build;
import android.os.Bundle;
import android.text.InputType;
-import android.util.Log;
import android.util.Patterns;
import androidx.activity.result.ActivityResultLauncher;
@@ -44,6 +43,7 @@ import androidx.preference.PreferenceManager;
import androidx.preference.SwitchPreference;
import com.emanuelef.remote_capture.Billing;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.PCAPdroid;
import com.emanuelef.remote_capture.Utils;
import com.emanuelef.remote_capture.MitmAddon;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/VpnExemptionsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/VpnExemptionsActivity.java
index fc674f1f..b28f63c6 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/VpnExemptionsActivity.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/VpnExemptionsActivity.java
@@ -22,13 +22,13 @@ package com.emanuelef.remote_capture.activities;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
-import android.util.Log;
import android.view.MenuItem;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.fragments.AppsToggles;
import com.emanuelef.remote_capture.model.AppDescriptor;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/adapters/AppsTogglesAdapter.java b/app/src/main/java/com/emanuelef/remote_capture/adapters/AppsTogglesAdapter.java
index f88e1be5..e63afed7 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/adapters/AppsTogglesAdapter.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/adapters/AppsTogglesAdapter.java
@@ -21,7 +21,6 @@ package com.emanuelef.remote_capture.adapters;
import android.annotation.SuppressLint;
import android.content.Context;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -33,6 +32,7 @@ import androidx.annotation.Nullable;
import androidx.appcompat.widget.SwitchCompat;
import androidx.recyclerview.widget.RecyclerView;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.model.AppDescriptor;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapter.java b/app/src/main/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapter.java
index a8921d78..a74f4482 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapter.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapter.java
@@ -22,7 +22,6 @@ package com.emanuelef.remote_capture.adapters;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
-import android.util.Log;
import android.util.SparseIntArray;
import android.view.LayoutInflater;
import android.view.View;
@@ -35,6 +34,7 @@ import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.RecyclerView;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.PCAPdroid;
import com.emanuelef.remote_capture.interfaces.ConnectionsListener;
import com.emanuelef.remote_capture.model.AppDescriptor;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/adapters/PayloadAdapter.java b/app/src/main/java/com/emanuelef/remote_capture/adapters/PayloadAdapter.java
index e5da542c..6fd0a7ae 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/adapters/PayloadAdapter.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/adapters/PayloadAdapter.java
@@ -21,7 +21,6 @@ package com.emanuelef.remote_capture.adapters;
import android.annotation.SuppressLint;
import android.content.Context;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -34,6 +33,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.emanuelef.remote_capture.CaptureService;
import com.emanuelef.remote_capture.HTTPReassembly;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
import com.emanuelef.remote_capture.model.ConnectionDescriptor;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsFragment.java
index 6702e064..1390cdba 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsFragment.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsFragment.java
@@ -23,7 +23,6 @@ import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuInflater;
@@ -38,6 +37,7 @@ import androidx.fragment.app.Fragment;
import com.emanuelef.remote_capture.CaptureService;
import com.emanuelef.remote_capture.ConnectionsRegister;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.PCAPdroid;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.activities.AppDetailsActivity;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsToggles.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsToggles.java
index 31cbf574..52c11fe3 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsToggles.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsToggles.java
@@ -20,7 +20,6 @@
package com.emanuelef.remote_capture.fragments;
import android.os.Bundle;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -38,6 +37,7 @@ import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import com.emanuelef.remote_capture.AppsLoader;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
import com.emanuelef.remote_capture.adapters.AppsTogglesAdapter;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/BlacklistsFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/BlacklistsFragment.java
index c79c1087..e8641406 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/fragments/BlacklistsFragment.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/BlacklistsFragment.java
@@ -22,7 +22,6 @@ package com.emanuelef.remote_capture.fragments;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -38,6 +37,7 @@ import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import com.emanuelef.remote_capture.CaptureService;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.PCAPdroid;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.adapters.BlacklistsAdapter;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionPayload.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionPayload.java
index 4f8c6674..4169d624 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionPayload.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionPayload.java
@@ -22,7 +22,6 @@ package com.emanuelef.remote_capture.fragments;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -41,6 +40,7 @@ import androidx.preference.PreferenceManager;
import com.emanuelef.remote_capture.CaptureService;
import com.emanuelef.remote_capture.ConnectionsRegister;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
import com.emanuelef.remote_capture.activities.ConnectionDetailsActivity;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java
index 46674458..17398bb1 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java
@@ -28,7 +28,6 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -55,6 +54,7 @@ import com.emanuelef.remote_capture.AppsResolver;
import com.emanuelef.remote_capture.Billing;
import com.emanuelef.remote_capture.CaptureService;
import com.emanuelef.remote_capture.ConnectionsRegister;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.PCAPdroid;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/EditListFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/EditListFragment.java
index 2de7dee7..517b4c60 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/fragments/EditListFragment.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/EditListFragment.java
@@ -23,7 +23,6 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.util.Log;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -47,6 +46,7 @@ import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import com.emanuelef.remote_capture.CaptureService;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
import com.emanuelef.remote_capture.adapters.ListEditAdapter;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/FirewallStatus.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/FirewallStatus.java
index 55f347a5..ebbc977c 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/fragments/FirewallStatus.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/FirewallStatus.java
@@ -26,7 +26,6 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -47,6 +46,7 @@ import androidx.preference.PreferenceManager;
import com.emanuelef.remote_capture.CaptureService;
import com.emanuelef.remote_capture.ConnectionsRegister;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.PCAPdroid;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/GeoipSettings.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/GeoipSettings.java
index f64a7ec6..4b2d869a 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/fragments/GeoipSettings.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/GeoipSettings.java
@@ -22,7 +22,6 @@ import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
-import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -31,6 +30,7 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import com.emanuelef.remote_capture.Geolocation;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/StatusFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/StatusFragment.java
index 0ff7f9d0..55ceb633 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/fragments/StatusFragment.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/StatusFragment.java
@@ -28,7 +28,6 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.method.LinkMovementMethod;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -49,6 +48,7 @@ import androidx.preference.PreferenceManager;
import com.emanuelef.remote_capture.AppsLoader;
import com.emanuelef.remote_capture.AppsResolver;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.MitmReceiver;
import com.emanuelef.remote_capture.interfaces.AppsLoadListener;
import com.emanuelef.remote_capture.model.AppDescriptor;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/mitmwizard/InstallCertificate.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/mitmwizard/InstallCertificate.java
index 958fd267..b032034a 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/fragments/mitmwizard/InstallCertificate.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/mitmwizard/InstallCertificate.java
@@ -27,7 +27,6 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.security.KeyChain;
-import android.util.Log;
import android.view.View;
import android.widget.Toast;
@@ -38,6 +37,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
import com.emanuelef.remote_capture.interfaces.MitmListener;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/Blocklist.java b/app/src/main/java/com/emanuelef/remote_capture/model/Blocklist.java
index 6217edf5..2f0a7b55 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/model/Blocklist.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/model/Blocklist.java
@@ -3,9 +3,9 @@ package com.emanuelef.remote_capture.model;
import android.content.Context;
import android.os.SystemClock;
import android.util.ArrayMap;
-import android.util.Log;
import com.emanuelef.remote_capture.CaptureService;
+import com.emanuelef.remote_capture.Log;
import java.util.Iterator;
import java.util.Map;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionUpdate.java b/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionUpdate.java
index f769d270..c435fd7f 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionUpdate.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionUpdate.java
@@ -19,8 +19,6 @@
package com.emanuelef.remote_capture.model;
-import android.util.Log;
-
import java.util.ArrayList;
public class ConnectionUpdate {
diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/MatchList.java b/app/src/main/java/com/emanuelef/remote_capture/model/MatchList.java
index 8480bd95..38d50578 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/model/MatchList.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/model/MatchList.java
@@ -24,13 +24,13 @@ import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.text.style.StyleSpan;
import android.util.ArrayMap;
-import android.util.Log;
import androidx.annotation.Nullable;
import androidx.collection.ArraySet;
import androidx.preference.PreferenceManager;
import com.emanuelef.remote_capture.AppsResolver;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
import com.google.gson.Gson;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/pcap_dump/FileDumper.java b/app/src/main/java/com/emanuelef/remote_capture/pcap_dump/FileDumper.java
index 7316780b..75efb99e 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/pcap_dump/FileDumper.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/pcap_dump/FileDumper.java
@@ -2,9 +2,9 @@ package com.emanuelef.remote_capture.pcap_dump;
import android.content.Context;
import android.net.Uri;
-import android.util.Log;
import com.emanuelef.remote_capture.CaptureService;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.Utils;
import com.emanuelef.remote_capture.interfaces.PcapDumper;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/pcap_dump/HTTPServer.java b/app/src/main/java/com/emanuelef/remote_capture/pcap_dump/HTTPServer.java
index da9d0755..c83a6cb0 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/pcap_dump/HTTPServer.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/pcap_dump/HTTPServer.java
@@ -20,9 +20,9 @@
package com.emanuelef.remote_capture.pcap_dump;
import android.content.Context;
-import android.util.Log;
import com.emanuelef.remote_capture.CaptureService;
+import com.emanuelef.remote_capture.Log;
import com.emanuelef.remote_capture.Utils;
import com.emanuelef.remote_capture.interfaces.PcapDumper;
diff --git a/app/src/main/jni/core/CMakeLists.txt b/app/src/main/jni/core/CMakeLists.txt
index 54cdcb2b..456412b3 100644
--- a/app/src/main/jni/core/CMakeLists.txt
+++ b/app/src/main/jni/core/CMakeLists.txt
@@ -9,6 +9,7 @@ add_library(capture SHARED
crc32.c
blacklist.c
pcap_utils.c
+ log_writer.c
jni_impl.c)
# nDPI
diff --git a/app/src/main/jni/core/capture_root.c b/app/src/main/jni/core/capture_root.c
index 6e48a4a6..411b3d09 100644
--- a/app/src/main/jni/core/capture_root.c
+++ b/app/src/main/jni/core/capture_root.c
@@ -57,7 +57,7 @@ static void kill_pcapd(pcapdroid_t *nc) {
pid = atoi(pid_s);
if(pid != 0) {
- log_d("Killing old pcapd with pid %d", pid);
+ log_i("Killing old pcapd with pid %d", pid);
run_shell_cmd("kill", pid_s, true, false);
}
@@ -185,7 +185,7 @@ static int connectPcapd(pcapdroid_t *pd) {
goto cleanup;
}
- log_d("Connected to pcapd");
+ log_i("Connected to pcapd");
cleanup:
unlink(PCAPD_SOCKET_PATH);
@@ -518,7 +518,7 @@ int run_root(pcapdroid_t *pd) {
pd_refresh_time(pd);
next_purge_ms = pd->now_ms + PERIODIC_PURGE_TIMEOUT_MS;
- log_d("Starting packet loop");
+ log_i("Starting packet loop");
while(running) {
pcapd_hdr_t hdr;
diff --git a/app/src/main/jni/core/capture_vpn.c b/app/src/main/jni/core/capture_vpn.c
index 68122468..632b8230 100644
--- a/app/src/main/jni/core/capture_vpn.c
+++ b/app/src/main/jni/core/capture_vpn.c
@@ -33,7 +33,7 @@ static int resolve_uid(pcapdroid_t *pd, const zdtun_5tuple_t *conn_info) {
char appbuf[64];
get_appname_by_uid(pd, uid, appbuf, sizeof(appbuf));
- log_i( "%s [%d/%s]", buf, uid, appbuf);
+ log_d( "%s [%d/%s]", buf, uid, appbuf);
} else {
uid = UID_UNKNOWN;
log_w("%s => UID not found!", buf);
@@ -154,7 +154,7 @@ static bool check_dns_req_allowed(pcapdroid_t *pd, zdtun_conn_t *conn, pkt_conte
ip.ip4 = pd->vpn.ipv4.dns_server;
zdtun_set_dnat_info(pd->zdt, &ip, htons(53), 4);
- log_d("Using new DNS server");
+ log_i("Using new DNS server");
}
if(pctx->tuple->ipproto == IPPROTO_ICMP)
@@ -209,7 +209,7 @@ static bool check_dns_req_allowed(pcapdroid_t *pd, zdtun_conn_t *conn, pkt_conte
}
if(block_private_dns) {
- log_i("blocking packet directed to the DNS server");
+ log_d("blocking packet directed to the DNS server");
return(false);
}
@@ -370,7 +370,7 @@ void vpn_process_ndpi(pcapdroid_t *pd, const zdtun_5tuple_t *tuple, pd_conn_t *d
if(block_private_dns && !data->to_block &&
(data->l7proto == NDPI_PROTOCOL_TLS) &&
data->info && blacklist_match_domain(pd->vpn.known_dns_servers, data->info)) {
- log_i("blocking connection to private DNS server");
+ log_d("blocking connection to private DNS server");
data->blacklisted_internal = true;
data->to_block = true;
}
@@ -474,7 +474,7 @@ int run_vpn(pcapdroid_t *pd) {
pd_refresh_time(pd);
next_purge_ms = pd->now_ms + PERIODIC_PURGE_TIMEOUT_MS;
- log_d("Starting packet loop [tunfd=%d]", pd->vpn.tunfd);
+ log_i("Starting packet loop");
while(running) {
int max_fd;
diff --git a/app/src/main/jni/core/jni_impl.c b/app/src/main/jni/core/jni_impl.c
index 78981488..8adb24e9 100644
--- a/app/src/main/jni/core/jni_impl.c
+++ b/app/src/main/jni/core/jni_impl.c
@@ -19,15 +19,18 @@
#if ANDROID
+#include
#include "pcapdroid.h"
#include "pcap_utils.h"
#include "common/utils.h"
+#include "log_writer.h"
// This files contains functions to make the capture core communicate
// with the Android system.
// Exported functions are defined in pcapdroid.h
static pcapdroid_t *global_pd = NULL;
+static pthread_t jni_thread;
jni_classes_t cls;
jni_methods_t mids;
@@ -37,9 +40,19 @@ jni_enum_t enums;
/* ******************************************************* */
static void log_callback(int lvl, const char *line) {
- if(lvl >= ANDROID_LOG_FATAL) {
- pcapdroid_t *pd = global_pd;
+ pcapdroid_t *pd = global_pd;
+ // quick path for debug logs
+ if(lvl < PD_DEFAULT_LOGGER_LEVEL)
+ return;
+
+ pd_log_write(PD_DEFAULT_LOGGER, lvl, line);
+
+ // ensure that we are invoking jni from the attached thread
+ if(!pd || !(pthread_equal(jni_thread, pthread_self())))
+ return;
+
+ if(lvl >= ANDROID_LOG_FATAL) {
// This is a fatal error, report it to the gui
jobject info_string = (*pd->env)->NewStringUTF(pd->env, line);
@@ -607,6 +620,7 @@ Java_com_emanuelef_remote_1capture_CaptureService_runPacketLoop(JNIEnv *env, jcl
pd.filesdir_len = strlen(pd.filesdir);
global_pd = &pd;
+ jni_thread = pthread_self();
logcallback = log_callback;
signal(SIGPIPE, SIG_IGN);
@@ -641,7 +655,7 @@ Java_com_emanuelef_remote_1capture_CaptureService_runPacketLoop(JNIEnv *env, jcl
JNIEXPORT void JNICALL
Java_com_emanuelef_remote_1capture_CaptureService_stopPacketLoop(JNIEnv *env, jclass type) {
/* NOTE: the select on the packets loop uses a timeout to wake up periodically */
- log_i( "stopPacketLoop called");
+ log_i("stopPacketLoop called");
running = false;
}
@@ -846,6 +860,28 @@ Java_com_emanuelef_remote_1capture_CaptureService_setPayloadMode(JNIEnv *env, jc
/* ******************************************************* */
+JNIEXPORT jint JNICALL
+Java_com_emanuelef_remote_1capture_CaptureService_initLogger(JNIEnv *env, jclass clazz,
+ jstring path, jint level) {
+ const char *path_s = (*env)->GetStringUTFChars(env, path, 0);
+ int rv = pd_init_logger(path_s, level);
+ (*env)->ReleaseStringUTFChars(env, path, path_s);
+ return rv;
+}
+
+/* ******************************************************* */
+
+JNIEXPORT jint JNICALL
+Java_com_emanuelef_remote_1capture_CaptureService_writeLog(JNIEnv *env, jclass clazz,
+ jint logger, jint lvl, jstring message) {
+ const char *message_s = (*env)->GetStringUTFChars(env, message, 0);
+ int rv = pd_log_write(logger, lvl, message_s);
+ (*env)->ReleaseStringUTFChars(env, message, message_s);
+ return rv;
+}
+
+/* ******************************************************* */
+
char* getStringPref(pcapdroid_t *pd, const char *key, char *buf, int bufsize) {
JNIEnv *env = pd->env;
diff --git a/app/src/main/jni/core/log_writer.c b/app/src/main/jni/core/log_writer.c
new file mode 100644
index 00000000..cba27e85
--- /dev/null
+++ b/app/src/main/jni/core/log_writer.c
@@ -0,0 +1,111 @@
+#include
+#include
+#include
+#include "log_writer.h"
+
+struct log_writer;
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static struct log_writer **loggers = NULL;
+static int num_loggers = 0;
+
+struct log_writer {
+ FILE *f;
+ int id;
+ int level;
+};
+
+static void pd_destroy_logger(struct log_writer *logger) {
+ fclose(logger->f);
+ pd_free(logger);
+}
+
+void pd_close_loggers() {
+ pthread_mutex_lock(&mutex);
+
+ for(int i=0; ilevel = min_lvl;
+ logger->f = f;
+
+ pthread_mutex_lock(&mutex);
+ loggers = pd_realloc(loggers, sizeof(void*) * (num_loggers + 1));
+ if(!loggers) {
+ pd_destroy_logger(logger);
+ rv = -1;
+ } else {
+ loggers[num_loggers++] = logger;
+ logger->id = rv = num_loggers;
+ }
+ pthread_mutex_unlock(&mutex);
+
+ return rv;
+}
+
+int pd_log_write(int logger_id, int lvl, const char *msg) {
+ int rv = 0;
+ char dtbuf[64];
+ struct tm tm;
+ time_t tnow = time(NULL);
+
+ strftime(dtbuf, sizeof(dtbuf), "%d/%b/%Y %H:%M:%S", localtime_r(&tnow, &tm));
+
+ pthread_mutex_lock(&mutex);
+
+ if((logger_id < 0) || (logger_id >= num_loggers)) {
+ rv = -ENOENT;
+ goto unlock;
+ }
+
+ struct log_writer *logger = loggers[logger_id];
+
+ if(logger->level > lvl)
+ goto unlock;
+
+ if(ferror(logger->f)) {
+ rv = -EINVAL;
+ goto unlock;
+ }
+
+ fprintf(logger->f, "[%c] %s - %s\n", loglvl2char(lvl), dtbuf, msg);
+ if(ferror(logger->f)) {
+#ifdef ANDROID
+ __android_log_print(ANDROID_LOG_ERROR, logtag,
+ "pd_log %d failed[%d]: %s", logger_id, errno, strerror(errno));
+#endif
+ rv = -errno;
+ goto unlock;
+ }
+
+ fflush(logger->f);
+
+unlock:
+ pthread_mutex_unlock(&mutex);
+ return rv;
+}
\ No newline at end of file
diff --git a/app/src/main/jni/core/log_writer.h b/app/src/main/jni/core/log_writer.h
new file mode 100644
index 00000000..d47f64a5
--- /dev/null
+++ b/app/src/main/jni/core/log_writer.h
@@ -0,0 +1,13 @@
+#ifndef PCAPDROID_LOG_WRITER_H
+#define PCAPDROID_LOG_WRITER_H
+
+#include "common/utils.h"
+
+#define PD_DEFAULT_LOGGER 0
+#define PD_DEFAULT_LOGGER_LEVEL ANDROID_LOG_INFO
+
+int pd_init_logger(const char *path, int min_lvl);
+int pd_log_write(int logger, int lvl, const char *msg);
+void pd_close_loggers();
+
+#endif //PCAPDROID_LOG_WRITER_H
diff --git a/app/src/main/jni/core/pcapdroid.c b/app/src/main/jni/core/pcapdroid.c
index 7a0f66a0..228da8df 100644
--- a/app/src/main/jni/core/pcapdroid.c
+++ b/app/src/main/jni/core/pcapdroid.c
@@ -1100,7 +1100,7 @@ void pd_dump_packet(pcapdroid_t *pd, const char *pktbuf, int pktlen, const struc
JAVA_PCAP_BUFFER_SIZE, pd->pcap_dump.buffer_idx, rec_size);
else if((pd->pcap_dump.max_dump_size > 0) &&
((pd->pcap_dump.tot_size + rec_size) >= pd->pcap_dump.max_dump_size)) {
- log_d("Max dump size reached, stop the dump");
+ log_i("Max dump size reached, stop the dump");
stop_pcap_dump(pd);
} else {
pcap_dump_rec(pd, (u_char *) pd->pcap_dump.buffer + pd->pcap_dump.buffer_idx,
@@ -1198,7 +1198,7 @@ int pd_run(pcapdroid_t *pd) {
// Run the capture
int rv = pd->root_capture ? run_root(pd) : run_vpn(pd);
- log_d("Stopped packet loop");
+ log_i("Stopped packet loop");
// send last dump
if(pd->cb.send_stats_dump)
@@ -1216,7 +1216,7 @@ int pd_run(pcapdroid_t *pd) {
if(pd->malware_detection.enabled) {
if(pd->malware_detection.reload_in_progress) {
- log_d("Joining blacklists reload_worker");
+ log_i("Joining blacklists reload_worker");
pthread_join(pd->malware_detection.reload_worker, NULL);
}
if(pd->malware_detection.bl)
@@ -1245,8 +1245,8 @@ int pd_run(pcapdroid_t *pd) {
pd_free(e);
}
- log_d("Host LRU cache size: %d", ip_lru_size(pd->ip_to_host));
- log_d("Discarded fragments: %ld", pd->num_discarded_fragments);
+ log_i("Host LRU cache size: %d", ip_lru_size(pd->ip_to_host));
+ log_i("Discarded fragments: %ld", pd->num_discarded_fragments);
ip_lru_destroy(pd->ip_to_host);
return(rv);