diff --git a/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java b/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java index 46614021..b3e3e915 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java +++ b/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java @@ -791,13 +791,13 @@ public class CaptureService extends VpnService implements Runnable { public static Prefs.PayloadMode getCurPayloadMode() { if(INSTANCE == null) - return Prefs.PayloadMode.NONE; + return Prefs.PayloadMode.MINIMAL; // With TLS decryption, payload mode is always "full" if(INSTANCE.mSettings.tls_decryption) return Prefs.PayloadMode.FULL; - return INSTANCE.mSettings.payload_mode; + return INSTANCE.mSettings.full_payload ? Prefs.PayloadMode.FULL : Prefs.PayloadMode.MINIMAL; } public static void requestBlacklistsUpdate() { @@ -964,7 +964,7 @@ public class CaptureService extends VpnService implements Runnable { public int getMaxDumpSize() { return mSettings.max_dump_size; } - public int getPayloadMode() { return mSettings.payload_mode.ordinal(); } + public int getPayloadMode() { return getCurPayloadMode().ordinal(); } public int getOwnAppUid() { AppDescriptor app = AppsResolver.resolve(getPackageManager(), BuildConfig.APPLICATION_ID, 0); 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 7a5a8803..f9dc0830 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 @@ -84,6 +84,7 @@ public class SettingsActivity extends BaseActivity { public static class SettingsFragment extends PreferenceFragmentCompat { private SwitchPreference mSocks5Enabled; private SwitchPreference mTlsDecryption; + private SwitchPreference mFullPayloadEnabled; private SwitchPreference mRootCaptureEnabled; private EditTextPreference mSocks5ProxyIp; private EditTextPreference mSocks5ProxyPort; @@ -110,6 +111,7 @@ public class SettingsActivity extends BaseActivity { setupSecurityPrefs(); setupOtherPrefs(); + fullPayloadHideShow(mTlsDecryption.isChecked()); socks5ProxyHideShow(mTlsDecryption.isChecked(), mSocks5Enabled.isChecked()); rootCaptureHideShow(Utils.isRootAvailable() && mRootCaptureEnabled.isChecked()); @@ -223,9 +225,13 @@ public class SettingsActivity extends BaseActivity { return false; } + fullPayloadHideShow((boolean) newValue); socks5ProxyHideShow((boolean) newValue, mSocks5Enabled.isChecked()); return true; }); + + mFullPayloadEnabled = requirePreference(Prefs.PREF_FULL_PAYLOAD); + mSocks5Enabled = requirePreference(Prefs.PREF_SOCKS5_ENABLED_KEY); mSocks5Enabled.setOnPreferenceChangeListener((preference, newValue) -> { socks5ProxyHideShow(mTlsDecryption.isChecked(), (boolean)newValue); @@ -249,6 +255,10 @@ public class SettingsActivity extends BaseActivity { mSocks5ProxyPort.setOnPreferenceChangeListener((preference, newValue) -> validatePort(newValue.toString())); } + private void fullPayloadHideShow(boolean tlsDecryption) { + mFullPayloadEnabled.setVisible(!tlsDecryption); + } + private void socks5ProxyHideShow(boolean tlsDecryption, boolean socks5Enabled) { mSocks5Enabled.setVisible(!tlsDecryption); mSocks5ProxyIp.setVisible(socks5Enabled && !tlsDecryption); 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 f9412871..df62384e 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 @@ -87,7 +87,7 @@ public class ConnectionPayload extends Fragment implements ConnectionDetailsActi recyclerView.setLayoutManager(layoutMan); mTruncatedWarning = view.findViewById(R.id.truncated_warning); - mTruncatedWarning.setText(String.format(getString(R.string.payload_truncated), getString(R.string.minimal_payload))); + mTruncatedWarning.setText(String.format(getString(R.string.payload_truncated), getString(R.string.full_payload))); if(mConn.isPayloadTruncated()) mTruncatedWarning.setVisibility(View.VISIBLE); 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 4f4b331f..5095b15e 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 @@ -37,8 +37,6 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; -import android.widget.AdapterView; -import android.widget.Spinner; import android.widget.TextView; import androidx.annotation.NonNull; @@ -51,7 +49,6 @@ import androidx.preference.PreferenceManager; import com.emanuelef.remote_capture.AppsLoader; import com.emanuelef.remote_capture.AppsResolver; -import com.emanuelef.remote_capture.adapters.PrefSpinnerAdapter; import com.emanuelef.remote_capture.interfaces.AppsLoadListener; import com.emanuelef.remote_capture.model.AppDescriptor; import com.emanuelef.remote_capture.model.AppState; @@ -59,7 +56,6 @@ import com.emanuelef.remote_capture.CaptureService; import com.emanuelef.remote_capture.R; import com.emanuelef.remote_capture.Utils; import com.emanuelef.remote_capture.activities.MainActivity; -import com.emanuelef.remote_capture.activities.StatsActivity; import com.emanuelef.remote_capture.interfaces.AppStateListener; import com.emanuelef.remote_capture.model.Prefs; import com.emanuelef.remote_capture.model.VPNStats; @@ -87,7 +83,6 @@ public class StatusFragment extends Fragment implements AppStateListener, AppsLo private String mAppFilter; private TextView mEmptyAppsView; private TextView mFilterWarning; - private Spinner mPayloadMode; AppsListView mOpenAppsList; @Override @@ -117,9 +112,6 @@ public class StatusFragment extends Fragment implements AppStateListener, AppsLo } }; - // With TLS decryption, payload mode is always "full" - mPayloadMode.setVisibility(Prefs.getTlsDecryptionEnabled(mPrefs) ? View.GONE : View.VISIBLE); - LocalBroadcastManager.getInstance(requireContext()) .registerReceiver(mReceiver, new IntentFilter(CaptureService.ACTION_STATS_DUMP)); } @@ -152,16 +144,11 @@ public class StatusFragment extends Fragment implements AppStateListener, AppsLo mFilterWarning = view.findViewById(R.id.app_filter_warning); mPrefs = PreferenceManager.getDefaultSharedPreferences(mActivity); mAppFilter = Prefs.getAppFilter(mPrefs); - mPayloadMode = view.findViewById(R.id.payload_mode); PrefSpinner.init(view.findViewById(R.id.dump_mode_spinner), R.array.pcap_dump_modes, R.array.pcap_dump_modes_labels, R.array.pcap_dump_modes_descriptions, Prefs.PREF_PCAP_DUMP_MODE, Prefs.DEFAULT_DUMP_MODE); - PrefSpinner.init(mPayloadMode, - R.array.payload_modes, R.array.payload_modes_labels, R.array.payload_modes_descriptions, - Prefs.PREF_PAYLOAD_MODE, Prefs.DEFAULT_PAYLOAD_MODE); - mAppFilterSwitch = view.findViewById(R.id.app_filter_switch); View filterRow = view.findViewById(R.id.app_filter_text); TextView filterTitle = filterRow.findViewById(R.id.title); diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/CaptureSettings.java b/app/src/main/java/com/emanuelef/remote_capture/model/CaptureSettings.java index fef34ab6..453bf546 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/model/CaptureSettings.java +++ b/app/src/main/java/com/emanuelef/remote_capture/model/CaptureSettings.java @@ -8,7 +8,6 @@ import java.io.Serializable; public class CaptureSettings implements Serializable { public Prefs.DumpMode dump_mode; - public Prefs.PayloadMode payload_mode; public String app_filter; public String collector_address; public int collector_port; @@ -20,6 +19,7 @@ public class CaptureSettings implements Serializable { public boolean ipv6_enabled; public boolean root_capture; public boolean pcapdroid_trailer; + public boolean full_payload; public String capture_interface; public String pcap_uri; public int snaplen = 0; @@ -41,7 +41,7 @@ public class CaptureSettings implements Serializable { capture_interface = Prefs.getCaptureInterface(prefs); pcap_uri = Prefs.getPCAPUri(prefs); tls_decryption = Prefs.getTlsDecryptionEnabled(prefs); - payload_mode = Prefs.getPayloadMode(prefs); + full_payload = Prefs.getFullPayloadMode(prefs); } public CaptureSettings(Intent intent) { @@ -62,7 +62,7 @@ public class CaptureSettings implements Serializable { max_pkts_per_flow = getInt(intent, Prefs.PREF_MAX_PKTS_PER_FLOW, 0); max_dump_size = getInt(intent, Prefs.PREF_MAX_DUMP_SIZE, 0); tls_decryption = getBool(intent, Prefs.PREF_TLS_DECRYPTION_KEY, false); - payload_mode = Prefs.getPayloadMode(getString(intent, Prefs.PREF_PAYLOAD_MODE, "minimal")); + full_payload = false; } private static String getString(Intent intent, String key, String def_value) { diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/Prefs.java b/app/src/main/java/com/emanuelef/remote_capture/model/Prefs.java index b8fd904b..45c2f905 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/model/Prefs.java +++ b/app/src/main/java/com/emanuelef/remote_capture/model/Prefs.java @@ -62,7 +62,7 @@ public class Prefs { public static final String PREF_MAX_DUMP_SIZE = "max_dump_size"; public static final String PREF_SOCKS5_ENABLED_KEY = "socks5_enabled"; public static final String PREF_TLS_DECRYPTION_SETUP_DONE = "tls_decryption_setup_ok"; - public static final String PREF_PAYLOAD_MODE = "payload_mode"; + public static final String PREF_FULL_PAYLOAD = "full_payload"; public enum DumpMode { NONE, @@ -116,5 +116,5 @@ public class Prefs { public static boolean startAtBoot(SharedPreferences p) { return(p.getBoolean(PREF_START_AT_BOOT, false)); } public static String getPCAPUri(SharedPreferences p) { return(p.getString(PREF_PCAP_URI, "")); } public static boolean isTLSDecryptionSetupDone(SharedPreferences p) { return(p.getBoolean(PREF_TLS_DECRYPTION_SETUP_DONE, false)); } - public static PayloadMode getPayloadMode(SharedPreferences p) { return(getPayloadMode(p.getString(PREF_PAYLOAD_MODE, "minimal")));} + public static boolean getFullPayloadMode(SharedPreferences p) { return(p.getBoolean(PREF_FULL_PAYLOAD, false)); } } diff --git a/app/src/main/res/layout/status.xml b/app/src/main/res/layout/status.xml index 8e499b1a..8aeaa070 100644 --- a/app/src/main/res/layout/status.xml +++ b/app/src/main/res/layout/status.xml @@ -73,14 +73,6 @@ tools:listitem="@layout/quick_settings_item" android:prompt="@string/traffic_dump"/> - - diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 1de80343..e05091ff 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -38,20 +38,4 @@ @string/theme_light @string/theme_dark - - - none - minimal - full - - - @string/no_payload - @string/minimal_payload - @string/full_payload - - - @string/payload_mode_none - @string/payload_mode_minimal - @string/payload_mode_full - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 95ebf577..22f5571f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -291,14 +291,6 @@ Upgrade Export SSL keylog Export failed - Payload - No payload - Short payload - Full payload - Full - The connections payload will not be shown - Only the initial bytes of the payload will be shown - The full payload will be shown (e.g. the full HTTP request and response). This requires a lot of memory Connection Encrypted Cleartext @@ -307,11 +299,12 @@ Overview HTTP request HTTP response - Payload visualization - Only a portion of the actual payload is shown, see \"%1$s\" + Payload is truncated. Enable \"%1$s\" to show it in full WebSocket HTTP Raw TX RX + Full payload + Show the full connections payload (e.g. the full HTTP request and response). This requires a lot of memory, don\'t use in the long run diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 65b9b1b9..7702114c 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -52,6 +52,13 @@ app:summary="@string/tls_decryption_summary" app:defaultValue="false" /> + +