mirror of
https://github.com/emanuele-f/PCAPdroid.git
synced 2026-06-16 21:10:57 +08:00
Implement PCAP dump mode selector
This commit is contained in:
parent
a4b6924acb
commit
930bfaa218
1
.gitignore
vendored
1
.gitignore
vendored
@ -11,3 +11,4 @@
|
||||
/build
|
||||
/captures
|
||||
.externalNativeBuild
|
||||
.cxx
|
||||
|
||||
@ -1,8 +1,26 @@
|
||||
package com.emanuelef.remote_capture;
|
||||
|
||||
public class Prefs {
|
||||
static final String DUMP_HTTP_SERVER = "http_server";
|
||||
static final String DUMP_UDP_EXPORTER = "udp_exporter";
|
||||
static final String PREF_COLLECTOR_IP_KEY = "collector_ip_address";
|
||||
static final String PREF_COLLECTOR_PORT_KEY = "collector_port";
|
||||
static final String PREF_UID_FILTER = "uid_filter";
|
||||
static final String PREF_CAPTURE_UNKNOWN_APP_TRAFFIC = "capture_unknown_app";
|
||||
static final String PREF_HTTP_SERVER_PORT = "http_server_port";
|
||||
|
||||
enum DumpMode {
|
||||
NONE,
|
||||
HTTP_SERVER,
|
||||
UDP_EXPORTER
|
||||
}
|
||||
|
||||
static DumpMode getDumpMode(String pref) {
|
||||
if(pref.equals(DUMP_HTTP_SERVER))
|
||||
return(DumpMode.HTTP_SERVER);
|
||||
else if(pref.equals(DUMP_UDP_EXPORTER))
|
||||
return(DumpMode.UDP_EXPORTER);
|
||||
else
|
||||
return(DumpMode.NONE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,6 +2,7 @@ package com.emanuelef.remote_capture;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.text.InputType;
|
||||
import android.util.Log;
|
||||
import android.util.Patterns;
|
||||
import android.widget.EditText;
|
||||
|
||||
@ -9,13 +10,14 @@ import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.preference.EditTextPreference;
|
||||
import androidx.preference.ListPreference;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
import androidx.preference.PreferenceFragmentCompat;
|
||||
|
||||
import java.util.regex.Matcher;
|
||||
|
||||
public class SettingsActivity extends AppCompatActivity {
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
@ -31,13 +33,43 @@ public class SettingsActivity extends AppCompatActivity {
|
||||
}
|
||||
|
||||
public static class SettingsFragment extends PreferenceFragmentCompat {
|
||||
private EditTextPreference mRemoteCollectorIp;
|
||||
private EditTextPreference mRemoteCollectorPort;
|
||||
private EditTextPreference mHttpServerPort;
|
||||
private ListPreference mDumpModePref;
|
||||
|
||||
@Override
|
||||
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
|
||||
setPreferencesFromResource(R.xml.root_preferences, rootKey);
|
||||
|
||||
mDumpModePref = findPreference("pcap_dump_mode");
|
||||
mDumpModePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
dumpPrefsHideShow((String) newValue);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
setupUdpExporterPrefs();
|
||||
setupHttpServerPrefs();
|
||||
|
||||
dumpPrefsHideShow(mDumpModePref.getValue());
|
||||
}
|
||||
|
||||
private boolean validatePort(String value) {
|
||||
try {
|
||||
int val = Integer.parseInt(value);
|
||||
return((val > 0) && (val < 65535));
|
||||
} catch(NumberFormatException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void setupUdpExporterPrefs() {
|
||||
/* Collector IP validation */
|
||||
EditTextPreference ip_address = getPreferenceManager().findPreference(Prefs.PREF_COLLECTOR_IP_KEY);
|
||||
ip_address.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
mRemoteCollectorIp = findPreference(Prefs.PREF_COLLECTOR_IP_KEY);
|
||||
mRemoteCollectorIp.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
Matcher matcher = Patterns.IP_ADDRESS.matcher(newValue.toString());
|
||||
@ -46,24 +78,62 @@ public class SettingsActivity extends AppCompatActivity {
|
||||
});
|
||||
|
||||
/* Collector port validation */
|
||||
EditTextPreference port = getPreferenceManager().findPreference(Prefs.PREF_COLLECTOR_PORT_KEY);
|
||||
port.setOnBindEditTextListener(new EditTextPreference.OnBindEditTextListener() {
|
||||
mRemoteCollectorPort = findPreference(Prefs.PREF_COLLECTOR_PORT_KEY);
|
||||
mRemoteCollectorPort.setOnBindEditTextListener(new EditTextPreference.OnBindEditTextListener() {
|
||||
@Override
|
||||
public void onBindEditText(@NonNull EditText editText) {
|
||||
editText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
|
||||
}
|
||||
});
|
||||
port.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
mRemoteCollectorPort.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
try {
|
||||
int val = Integer.parseInt(newValue.toString());
|
||||
return((val > 0) && (val < 65535));
|
||||
} catch(NumberFormatException e) {
|
||||
return false;
|
||||
}
|
||||
return validatePort(newValue.toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void setupHttpServerPrefs() {
|
||||
/* HTTP Server port validation */
|
||||
mHttpServerPort = findPreference(Prefs.PREF_HTTP_SERVER_PORT);
|
||||
mHttpServerPort.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
return validatePort(newValue.toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* This implements a radio-button like behaviour */
|
||||
private void dumpPrefsHideShow(String dumpMode) {
|
||||
Prefs.DumpMode mode = Prefs.getDumpMode(dumpMode);
|
||||
boolean show_http_prefs = (mode == Prefs.DumpMode.HTTP_SERVER);
|
||||
boolean show_udp_prefs = (mode == Prefs.DumpMode.UDP_EXPORTER);
|
||||
|
||||
/* HTTP Server */
|
||||
mHttpServerPort.setVisible(show_http_prefs);
|
||||
|
||||
/* UDP Receiver */
|
||||
mRemoteCollectorIp.setVisible(show_udp_prefs);
|
||||
mRemoteCollectorPort.setVisible(show_udp_prefs);
|
||||
|
||||
/* Adjust label */
|
||||
int summary_id;
|
||||
|
||||
switch(mode) {
|
||||
case HTTP_SERVER:
|
||||
summary_id = R.string.http_server_info;
|
||||
break;
|
||||
case UDP_EXPORTER:
|
||||
summary_id = R.string.udp_exporter_info;
|
||||
break;
|
||||
case NONE:
|
||||
default:
|
||||
summary_id = R.string.no_dump_info;
|
||||
break;
|
||||
}
|
||||
|
||||
mDumpModePref.setSummary(summary_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
14
app/src/main/res/values/arrays.xml
Normal file
14
app/src/main/res/values/arrays.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string-array name="pcap_dump_modes">
|
||||
<item>none</item>
|
||||
<item>http_server</item>
|
||||
<item>udp_exporter</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="pcap_dump_modes_labels">
|
||||
<item>@string/no_dump</item>
|
||||
<item>@string/http_server</item>
|
||||
<item>@string/udp_exporter</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
@ -26,7 +26,7 @@
|
||||
<string name="about">Instructions</string>
|
||||
<string name="capture_unknown_app">Capture Unknown Traffic</string>
|
||||
<string name="capture_unknown_app_summary">When an app filter is set, also capture general purpose traffic which cannot be associated to a specific app. This is usually needed to properly capture DNS traffic.</string>
|
||||
<string name="capture_prefs">Capture</string>
|
||||
<string name="misc_prefs">Misc</string>
|
||||
<string name="status_view">Status</string>
|
||||
<string name="connections_view">Connections</string>
|
||||
<string name="no_connections">No connections</string>
|
||||
@ -40,5 +40,14 @@
|
||||
<string name="bytes">Bytes</string>
|
||||
<string name="packets">Packets</string>
|
||||
<string name="duration">Duration</string>
|
||||
<string name="http_server">HTTP Server</string>
|
||||
<string name="udp_exporter">UDP Exporter</string>
|
||||
<string name="no_dump">None</string>
|
||||
<string name="no_dump_info">PCAP will not be dumped</string>
|
||||
<string name="http_server_info">Start an HTTP server for the PCAP download</string>
|
||||
<string name="udp_exporter_info">Sends the PCAP to an UDP receiver</string>
|
||||
<string name="http_server_port">HTTP Server Port</string>
|
||||
<string name="receiver_ip_address">Receiver IP Address</string>
|
||||
<string name="receiver_port">Receiver Port</string>
|
||||
</resources>
|
||||
|
||||
|
||||
@ -14,35 +14,49 @@
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<PreferenceCategory app:title="@string/collector_prefs_header" app:iconSpaceReserved="false">
|
||||
<PreferenceCategory app:title="PCAP Dump" app:iconSpaceReserved="false">
|
||||
<ListPreference
|
||||
app:key="pcap_dump_mode"
|
||||
app:title="Dump Mode"
|
||||
app:iconSpaceReserved="false"
|
||||
app:summary="@string/no_dump_info"
|
||||
app:defaultValue="http_server"
|
||||
app:entries="@array/pcap_dump_modes_labels"
|
||||
app:entryValues="@array/pcap_dump_modes"/>
|
||||
|
||||
<EditTextPreference
|
||||
app:key="http_server_port"
|
||||
app:title="@string/http_server_port"
|
||||
app:defaultValue="8080"
|
||||
app:iconSpaceReserved="false"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
|
||||
<EditTextPreference
|
||||
app:key="collector_ip_address"
|
||||
app:title="@string/ip_address"
|
||||
app:title="@string/receiver_ip_address"
|
||||
app:iconSpaceReserved="false"
|
||||
app:defaultValue="@string/default_collector_ip"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
|
||||
<EditTextPreference
|
||||
app:key="collector_port"
|
||||
app:title="@string/port"
|
||||
app:title="@string/receiver_port"
|
||||
app:iconSpaceReserved="false"
|
||||
app:defaultValue="@string/default_collector_port"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory app:title="@string/capture_prefs" app:iconSpaceReserved="false">
|
||||
<PreferenceCategory app:title="@string/misc_prefs" app:iconSpaceReserved="false">
|
||||
|
||||
<SwitchPreference
|
||||
app:key="capture_unknown_app"
|
||||
app:title="@string/capture_unknown_app"
|
||||
app:iconSpaceReserved="false"
|
||||
app:summary="@string/capture_unknown_app_summary"
|
||||
app:defaultValue="true" />
|
||||
<SwitchPreference
|
||||
app:key="capture_unknown_app"
|
||||
app:title="@string/capture_unknown_app"
|
||||
app:iconSpaceReserved="false"
|
||||
app:summary="@string/capture_unknown_app_summary"
|
||||
app:defaultValue="true" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user