Simplify the payload mode preference

Turn it into a toggle which enables/disables the full payload
This commit is contained in:
emanuele-f
2022-04-12 22:54:07 +02:00
parent d3a1ef2b05
commit f8ccd99980
11 changed files with 29 additions and 57 deletions
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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) {
@@ -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)); }
}
-8
View File
@@ -73,14 +73,6 @@
tools:listitem="@layout/quick_settings_item"
android:prompt="@string/traffic_dump"/>
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/payload_mode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:spinnerMode="dialog"
tools:listitem="@layout/quick_settings_item"
android:prompt="@string/payload_visualization"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
-16
View File
@@ -38,20 +38,4 @@
<item>@string/theme_light</item>
<item>@string/theme_dark</item>
</string-array>
<string-array name="payload_modes">
<item>none</item>
<item>minimal</item>
<item>full</item>
</string-array>
<string-array name="payload_modes_labels">
<item>@string/no_payload</item>
<item>@string/minimal_payload</item>
<item>@string/full_payload</item>
</string-array>
<string-array name="payload_modes_descriptions">
<item>@string/payload_mode_none</item>
<item>@string/payload_mode_minimal</item>
<item>@string/payload_mode_full</item>
</string-array>
</resources>
+3 -10
View File
@@ -291,14 +291,6 @@
<string name="upgrade_action">Upgrade</string>
<string name="export_sslkeylog">Export SSL keylog</string>
<string name="export_failed">Export failed</string>
<string name="connections_payload">Payload</string>
<string name="no_payload">No payload</string>
<string name="minimal_payload">Short payload</string>
<string name="full_payload">Full payload</string>
<string name="full">Full</string>
<string name="payload_mode_none">The connections payload will not be shown</string>
<string name="payload_mode_minimal">Only the initial bytes of the payload will be shown</string>
<string name="payload_mode_full">The full payload will be shown (e.g. the full HTTP request and response). This requires a lot of memory</string>
<string name="connection">Connection</string>
<string name="encrypted">Encrypted</string>
<string name="cleartext">Cleartext</string>
@@ -307,11 +299,12 @@
<string name="overview">Overview</string>
<string name="string_http_request">HTTP request</string>
<string name="string_http_response">HTTP response</string>
<string name="payload_visualization">Payload visualization</string>
<string name="payload_truncated">Only a portion of the actual payload is shown, see \"%1$s\"</string>
<string name="payload_truncated">Payload is truncated. Enable \"%1$s\" to show it in full</string>
<string name="websocket">WebSocket</string>
<string name="http">HTTP</string>
<string name="raw_payload">Raw</string>
<string name="tx_direction">TX</string>
<string name="rx_direction">RX</string>
<string name="full_payload">Full payload</string>
<string name="full_payload_summary">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</string>
</resources>
@@ -52,6 +52,13 @@
app:summary="@string/tls_decryption_summary"
app:defaultValue="false" />
<SwitchPreference
app:key="full_payload"
app:title="@string/full_payload"
app:iconSpaceReserved="false"
app:summary="@string/full_payload_summary"
app:defaultValue="false" />
<SwitchPreference
app:key="socks5_enabled"
app:title="@string/socks5_proxy"
-1
View File
@@ -88,7 +88,6 @@ As shown above, the capture settings can be specified by using intent extras. Th
| max_pkts_per_flow | int | 43 | only dump the first max_pkts_per_flow packets per flow |
| max_dump_size | int | 43 | max size in bytes for the PCAP dump |
| tls_decryption | bool | 48 | true to enable the built-in TLS decryption |
| payload_mode | string | 48 | none \| minimal \| full, specify how much payload to display |
The `Ver` column indicates the minimum PCAPdroid version required to use the given parameter. The PCAPdroid version can be queried via the `get_status` action as explained below.