mirror of
https://github.com/emanuele-f/PCAPdroid.git
synced 2026-05-08 21:12:26 +00:00
Simplify the payload mode preference
Turn it into a toggle which enables/disables the full payload
This commit is contained in:
@@ -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)); }
|
||||
}
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user