From ca7c8127d974cc83589ce4f5b27458fc025d05e4 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Tue, 29 Jun 2021 19:28:18 +0200 Subject: [PATCH] Hide connections matching whitelist after delay Some info of the connections, such as the host and the protocol, can become available after the connection has been shown. Such info could determine a match with the whitelist, in which case the connection must be hidden. --- .../remote_capture/ConnectionsRegister.java | 18 ++-- .../adapters/ConnectionsAdapter.java | 83 +++++++++++++++---- .../fragments/ConnectionsFragment.java | 2 +- .../model/ConnectionDescriptor.java | 8 ++ app/src/main/jni/vpnproxy-jni/vpnproxy.c | 7 +- 5 files changed, 88 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/emanuelef/remote_capture/ConnectionsRegister.java b/app/src/main/java/com/emanuelef/remote_capture/ConnectionsRegister.java index 6d9fa185..4943efec 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/ConnectionsRegister.java +++ b/app/src/main/java/com/emanuelef/remote_capture/ConnectionsRegister.java @@ -72,13 +72,15 @@ public class ConnectionsRegister { conns = Arrays.copyOfRange(conns, conns.length - mSize, conns.length); } - int in_items = Math.min((mSize - mNumItems), conns.length); - int out_items = conns.length - in_items; + int out_items = conns.length - Math.min((mSize - mNumItems), conns.length); int insert_pos = mNumItems; ConnectionDescriptor []removedItems = null; + //Log.d(TAG, "newConnections[" + mNumItems + "/" + mSize +"]: insert " + conns.length + + // " items at " + mTail + " (removed: " + out_items + " at " + firstPos() + ")"); + if(out_items > 0) { - int pos = mTail; + int pos = firstPos(); removedItems = new ConnectionDescriptor[out_items]; // update the apps stats @@ -128,16 +130,16 @@ public class ConnectionsRegister { } } - public synchronized void connectionsUpdates(ConnectionUpdate[] conns) { + public synchronized void connectionsUpdates(ConnectionUpdate[] updates) { int first_pos = firstPos(); int first_id = mItemsRing[first_pos].incr_id; int last_id = mItemsRing[lastPos()].incr_id; - int []changed_pos = new int[conns.length]; + int []changed_pos = new int[updates.length]; int k = 0; Log.d(TAG, "connectionsUpdates: items=" + mNumItems + ", first_id=" + first_id + ", last_id=" + last_id); - for(ConnectionUpdate update: conns) { + for(ConnectionUpdate update: updates) { int id = update.incr_id; // ignore updates for untracked items @@ -159,10 +161,10 @@ public class ConnectionsRegister { } for(ConnectionsListener listener: mListeners) { - if(k != conns.length) { + if(k != updates.length) { // some untracked items where skipped, shrink the array changed_pos = Arrays.copyOf(changed_pos, k); - k = conns.length; + k = updates.length; } listener.connectionsUpdated(changed_pos); diff --git a/app/src/main/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapter.java b/app/src/main/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapter.java index d21b3b2a..8fd15eea 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapter.java +++ b/app/src/main/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapter.java @@ -43,6 +43,7 @@ import com.emanuelef.remote_capture.Utils; import com.emanuelef.remote_capture.model.Whitelist; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Objects; @@ -58,7 +59,12 @@ public class ConnectionsAdapter extends RecyclerView.Adapter mIdToFilteredPos; + private ArrayList mFilteredConn; private String mFilter; public final Whitelist mWhitelist; @@ -175,8 +181,10 @@ public class ConnectionsAdapter extends RecyclerView.Adapter(); for(int i=0; i= mUnfilteredItemsCount) || (reg == null)) + if((pos < 0) || (pos >= mUnfilteredItemsCount) || (reg == null)) { + Log.w(TAG, "getItem: bad position: " + pos); return null; + } return reg.getConn(pos); } diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java index 4da58b42..f7ad8e4b 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java @@ -455,7 +455,7 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener @Override public void connectionsAdded(int start, ConnectionDescriptor []conns) { mHandler.post(() -> { - Log.d(TAG, "Added " + conns.length + " connections at " + start); + Log.d(TAG, "Add " + conns.length + " connections at " + start); mAdapter.connectionsAdded(start, conns); 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 55157c54..e49c7883 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 @@ -21,6 +21,8 @@ package com.emanuelef.remote_capture.model; import android.content.Context; +import androidx.annotation.NonNull; + import com.emanuelef.remote_capture.AppsResolver; import com.emanuelef.remote_capture.R; @@ -128,4 +130,10 @@ public class ConnectionDescriptor implements Serializable { app.getPackageName().equals(filter))) ); } + + @Override + public @NonNull String toString() { + return "[proto=" + ipproto + "/" + l7proto + "]: " + src_ip + ":" + src_port + " -> " + + dst_ip + ":" + dst_port + " [" + uid + "] " + info; + } } diff --git a/app/src/main/jni/vpnproxy-jni/vpnproxy.c b/app/src/main/jni/vpnproxy-jni/vpnproxy.c index 07d97b81..8733a258 100644 --- a/app/src/main/jni/vpnproxy-jni/vpnproxy.c +++ b/app/src/main/jni/vpnproxy-jni/vpnproxy.c @@ -17,6 +17,7 @@ * Copyright 2020-21 - Emanuele Faranda */ +#include #include "vpnproxy.h" #include "pcap_utils.h" #include "common/utils.h" @@ -38,8 +39,8 @@ static ndpi_protocol_bitmask_struct_t masterProtos; static int dumper_socket; static bool send_header; static int netd_resolve_waiting; -static time_t last_connections_dump; -static time_t next_connections_dump; +static u_int64_t last_connections_dump; +static u_int64_t next_connections_dump; static vpnproxy_data_t *global_proxy = NULL; /* ******************************************************* */ @@ -728,7 +729,7 @@ static void sendConnectionsDump(vpnproxy_data_t *proxy) { if((proxy->new_conns.cur_items == 0) && (proxy->conns_updates.cur_items == 0)) return; - log_d("sendConnectionsDump [after %d ms]: new=%d, updates=%d", + log_d("sendConnectionsDump [after %" PRIu64 " ms]: new=%d, updates=%d", proxy->now_ms - last_connections_dump, proxy->new_conns.cur_items, proxy->conns_updates.cur_items);