Implement PCAP dump mode selector

This commit is contained in:
emanuele-f 2020-01-05 21:05:11 +01:00
parent a4b6924acb
commit 930bfaa218
6 changed files with 152 additions and 26 deletions

1
.gitignore vendored
View File

@ -11,3 +11,4 @@
/build
/captures
.externalNativeBuild
.cxx

View File

@ -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);
}
}

View File

@ -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);
}
}
}

View 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>

View File

@ -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>

View File

@ -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>