diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/EditFilterActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/EditFilterActivity.java index da3065c2..a58723dc 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/activities/EditFilterActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/activities/EditFilterActivity.java @@ -39,6 +39,7 @@ import com.emanuelef.remote_capture.PCAPdroid; import com.emanuelef.remote_capture.R; import com.emanuelef.remote_capture.model.ConnectionDescriptor.Status; import com.emanuelef.remote_capture.model.ConnectionDescriptor.DecryptionStatus; +import com.emanuelef.remote_capture.model.ConnectionDescriptor.FilteringStatus; import com.emanuelef.remote_capture.model.FilterDescriptor; import com.emanuelef.remote_capture.model.ListInfo; import com.emanuelef.remote_capture.model.MatchList; @@ -54,8 +55,8 @@ public class EditFilterActivity extends BaseActivity { private static final String TAG = "FilterEditActivity"; private FilterDescriptor mFilter; private CheckBox mHideMasked; - private CheckBox mOnlyBlocked; private CheckBox mOnlyBlacklisted; + private ArrayList> mFirewallChips; private ArrayList> mStatusChips; private ArrayList> mDecChips; private ChipGroup mInterfaceGroup; @@ -82,7 +83,6 @@ public class EditFilterActivity extends BaseActivity { mFilter = new FilterDescriptor(); mHideMasked = findViewById(R.id.not_hidden); - mOnlyBlocked = findViewById(R.id.only_blocked); mOnlyBlacklisted = findViewById(R.id.only_blacklisted); mInterfaceGroup = findViewById(R.id.interfaces); @@ -92,6 +92,11 @@ public class EditFilterActivity extends BaseActivity { startActivity(editIntent); }); + mFirewallChips = new ArrayList<>(Arrays.asList( + new Pair<>(FilteringStatus.BLOCKED, findViewById(R.id.status_blocked)), + new Pair<>(FilteringStatus.ALLOWED, findViewById(R.id.status_allowed)) + )); + mStatusChips = new ArrayList<>(Arrays.asList( new Pair<>(Status.STATUS_ACTIVE, findViewById(R.id.status_active)), new Pair<>(Status.STATUS_CLOSED, findViewById(R.id.status_closed)), @@ -116,8 +121,10 @@ public class EditFilterActivity extends BaseActivity { if(!Prefs.isMalwareDetectionEnabled(this, prefs)) mOnlyBlacklisted.setVisibility(View.GONE); - if(!billing.isFirewallVisible()) - mOnlyBlocked.setVisibility(View.GONE); + if(billing.isFirewallVisible()) { + findViewById(R.id.firewall_label).setVisibility(View.VISIBLE); + findViewById(R.id.firewall_group).setVisibility(View.VISIBLE); + } ConnectionsRegister reg = CaptureService.getConnsRegister(); if((reg != null) && (reg.hasSeenMultipleInterfaces())) { @@ -165,11 +172,11 @@ public class EditFilterActivity extends BaseActivity { private void model2view() { mHideMasked.setChecked(!mFilter.showMasked); - mOnlyBlocked.setChecked(mFilter.onlyBLocked); mOnlyBlacklisted.setChecked(mFilter.onlyBlacklisted); setCheckedChip(mStatusChips, mFilter.status); setCheckedChip(mDecChips, mFilter.decStatus); + setCheckedChip(mFirewallChips, mFilter.filteringStatus); if(mFilter.iface != null) { int num_chips = mInterfaceGroup.getChildCount(); @@ -185,11 +192,11 @@ public class EditFilterActivity extends BaseActivity { private void view2model() { mFilter.showMasked = !mHideMasked.isChecked(); - mFilter.onlyBLocked = mOnlyBlocked.isChecked(); mFilter.onlyBlacklisted = mOnlyBlacklisted.isChecked(); mFilter.status = getCheckedChip(mStatusChips, Status.STATUS_INVALID); mFilter.decStatus = getCheckedChip(mDecChips, DecryptionStatus.INVALID); + mFilter.filteringStatus = getCheckedChip(mFirewallChips, FilteringStatus.INVALID); int num_chips = mInterfaceGroup.getChildCount(); for(int i=0; i { FilterDescriptor filter = new FilterDescriptor(); - filter.onlyBLocked = true; + filter.filteringStatus = ConnectionDescriptor.FilteringStatus.BLOCKED; Intent intent = new Intent(requireContext(), ConnectionsActivity.class) .putExtra(ConnectionsFragment.FILTER_EXTRA, filter); diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionDescriptor.java b/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionDescriptor.java index 7c3e480f..d6c5eb8e 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionDescriptor.java +++ b/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionDescriptor.java @@ -72,6 +72,12 @@ public class ConnectionDescriptor { ERROR, } + public enum FilteringStatus { + INVALID, + ALLOWED, + BLOCKED + } + /* Metadata */ public final int ipver; public final int ipproto; diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/FilterDescriptor.java b/app/src/main/java/com/emanuelef/remote_capture/model/FilterDescriptor.java index 89df701c..589f45ce 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/model/FilterDescriptor.java +++ b/app/src/main/java/com/emanuelef/remote_capture/model/FilterDescriptor.java @@ -27,6 +27,7 @@ import com.emanuelef.remote_capture.PCAPdroid; import com.emanuelef.remote_capture.R; import com.emanuelef.remote_capture.model.ConnectionDescriptor.Status; import com.emanuelef.remote_capture.model.ConnectionDescriptor.DecryptionStatus; +import com.emanuelef.remote_capture.model.ConnectionDescriptor.FilteringStatus; import com.google.android.material.chip.Chip; import com.google.android.material.chip.ChipGroup; @@ -35,8 +36,8 @@ import java.io.Serializable; public class FilterDescriptor implements Serializable { public Status status; public boolean showMasked; - public boolean onlyBLocked; public boolean onlyBlacklisted; + public FilteringStatus filteringStatus; public DecryptionStatus decStatus; public String iface; public int uid = -2; // this is persistent and used internally (AppDetailsActivity) @@ -48,8 +49,8 @@ public class FilterDescriptor implements Serializable { public boolean isSet() { return (status != Status.STATUS_INVALID) || (decStatus != DecryptionStatus.INVALID) + || (filteringStatus != FilteringStatus.INVALID) || (iface != null) - || onlyBLocked || onlyBlacklisted || (uid != 2) || (!showMasked && !PCAPdroid.getInstance().getVisualizationMask().isEmpty()); @@ -57,10 +58,10 @@ public class FilterDescriptor implements Serializable { public boolean matches(ConnectionDescriptor conn) { return (showMasked || !PCAPdroid.getInstance().getVisualizationMask().matches(conn)) - && (!onlyBLocked || conn.is_blocked) && (!onlyBlacklisted || conn.isBlacklisted()) && ((status == Status.STATUS_INVALID) || (conn.getStatus().equals(status))) && ((decStatus == DecryptionStatus.INVALID) || (conn.getDecryptionStatus() == decStatus)) + && ((filteringStatus == FilteringStatus.INVALID) || ((filteringStatus == FilteringStatus.BLOCKED) == conn.is_blocked)) && ((iface == null) || (CaptureService.getInterfaceName(conn.ifidx).equals(iface))) && ((uid == -2) || (uid == conn.uid)); } @@ -77,8 +78,6 @@ public class FilterDescriptor implements Serializable { if(!showMasked) addChip(inflater, group, R.id.not_hidden, ctx.getString(R.string.not_hidden_filter)); - if(onlyBLocked) - addChip(inflater, group, R.id.blocked, ctx.getString(R.string.blocked_connection_filter)); if(onlyBlacklisted) addChip(inflater, group, R.id.blacklisted, ctx.getString(R.string.malicious_connection_filter)); if(status != Status.STATUS_INVALID) { @@ -89,6 +88,11 @@ public class FilterDescriptor implements Serializable { String label = String.format(ctx.getString(R.string.decryption_filter), ConnectionDescriptor.getDecryptionStatusLabel(decStatus, ctx)); addChip(inflater, group, R.id.decryption_status, label); } + if(filteringStatus != FilteringStatus.INVALID) { + String label = ctx.getString(R.string.firewall_filter, ctx.getString((filteringStatus == FilteringStatus.BLOCKED) ? + R.string.blocked_connection_filter : R.string.allowed_connection_filter)); + addChip(inflater, group, R.id.firewall, label); + } if(iface != null) addChip(inflater, group, R.id.capture_interface, String.format(ctx.getString(R.string.interface_filter), iface)); } @@ -96,24 +100,24 @@ public class FilterDescriptor implements Serializable { public void clear(int filter_id) { if(filter_id == R.id.not_hidden) showMasked = true; - else if(filter_id == R.id.blocked) - onlyBLocked = false; else if(filter_id == R.id.blacklisted) onlyBlacklisted = false; else if(filter_id == R.id.status_ind) status = Status.STATUS_INVALID; else if(filter_id == R.id.decryption_status) decStatus = DecryptionStatus.INVALID; + else if(filter_id == R.id.firewall) + filteringStatus = FilteringStatus.INVALID; else if(filter_id == R.id.capture_interface) iface = null; } public void clear() { showMasked = true; - onlyBLocked = false; onlyBlacklisted = false; status = Status.STATUS_INVALID; decStatus = DecryptionStatus.INVALID; + filteringStatus = FilteringStatus.INVALID; iface = null; } } diff --git a/app/src/main/res/layout/edit_filter_activity.xml b/app/src/main/res/layout/edit_filter_activity.xml index d2144998..8d73f6f5 100644 --- a/app/src/main/res/layout/edit_filter_activity.xml +++ b/app/src/main/res/layout/edit_filter_activity.xml @@ -36,13 +36,6 @@ android:textColor="@color/colorTabText" /> - - + + + + + + + + Blocked %1$s pkts Blocked connections - blocked + Blocked + Allowed + Firewall: %1$s Paid features Unlock code Validate