diff --git a/app/src/main/java/com/emanuelef/remote_capture/Utils.java b/app/src/main/java/com/emanuelef/remote_capture/Utils.java index 3366eb19..3b438f55 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/Utils.java +++ b/app/src/main/java/com/emanuelef/remote_capture/Utils.java @@ -59,6 +59,7 @@ import android.text.SpannableString; import android.text.style.StyleSpan; import android.util.Log; import android.view.View; +import android.widget.ImageView; import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; @@ -67,6 +68,7 @@ import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.widget.SearchView; +import androidx.core.content.ContextCompat; import androidx.preference.PreferenceManager; import com.emanuelef.remote_capture.interfaces.TextAdapter; @@ -1083,4 +1085,28 @@ public class Utils { return sb.toString(); } + + public static void setDecryptionIcon(ImageView icon, ConnectionDescriptor conn) { + int color; + + switch(conn.getDecryptionStatus()) { + case DECRYPTED: + color = R.color.ok; + break; + case NOT_DECRYPTABLE: + color = R.color.warning; + break; + case TLS_ERROR: + color = R.color.danger; + break; + default: + color = R.color.lightGray; + } + + Context context = icon.getContext(); + int resid = (conn.isCleartext() || conn.isDecrypted()) ? R.drawable.ic_lock_open : R.drawable.ic_lock; + + icon.setColorFilter(ContextCompat.getColor(context, color)); + icon.setImageDrawable(ContextCompat.getDrawable(context, resid)); + } } diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java index 667802f8..0c2e0681 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java @@ -158,7 +158,7 @@ public class ConnectionDetailsActivity extends BaseActivity implements Connectio case POS_HTTP: return R.string.http; case POS_RAW_PAYLOAD: - return R.string.raw_payload; + return R.string.payload; case POS_OVERVIEW: default: return R.string.overview; 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 23951f3c..08a52953 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 @@ -84,8 +84,6 @@ public class ConnectionsAdapter extends RecyclerView.Adapter " + diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionUpdate.java b/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionUpdate.java index b94b2b76..f769d270 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionUpdate.java +++ b/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionUpdate.java @@ -33,6 +33,7 @@ public class ConnectionUpdate { /* set if update_type & UPDATE_STATS */ public long last_seen; + public long payload_length; public long sent_bytes; public long rcvd_bytes; public int sent_pkts; @@ -55,12 +56,13 @@ public class ConnectionUpdate { incr_id = _incr_id; } - public void setStats(long _last_seen, long _sent_bytes, long _rcvd_bytes, + public void setStats(long _last_seen, long _payload_length, long _sent_bytes, long _rcvd_bytes, int _sent_pkts, int _rcvd_pkts, int _blocked_pkts, int _tcp_flags, int _status) { update_type |= UPDATE_STATS; last_seen = _last_seen; + payload_length = _payload_length; sent_bytes = _sent_bytes; rcvd_bytes = _rcvd_bytes; sent_pkts = _sent_pkts; diff --git a/app/src/main/jni/core/jni_impl.c b/app/src/main/jni/core/jni_impl.c index 494b7ce9..f7ec3d8d 100644 --- a/app/src/main/jni/core/jni_impl.c +++ b/app/src/main/jni/core/jni_impl.c @@ -151,7 +151,7 @@ static jobject getConnUpdate(pcapdroid_t *pd, const conn_and_tuple_t *conn) { bool blocked = data->to_block && !pd->root_capture; // currently can only block connections in non-root mode (*env)->CallVoidMethod(env, update, mids.connUpdateSetStats, data->last_seen, - data->sent_bytes, data->rcvd_bytes, data->sent_pkts, data->rcvd_pkts, data->blocked_pkts, + data->payload_length, data->sent_bytes, data->rcvd_bytes, data->sent_pkts, data->rcvd_pkts, data->blocked_pkts, (data->tcp_flags[0] << 8) | data->tcp_flags[1], (blocked << 10) | (data->blacklisted_domain << 9) | (data->blacklisted_ip << 8) | (data->status & 0xFF)); @@ -510,7 +510,7 @@ Java_com_emanuelef_remote_1capture_CaptureService_runPacketLoop(JNIEnv *env, jcl mids.connInit = jniGetMethodID(env, cls.conn, "", "(IIILjava/lang/String;Ljava/lang/String;IIIIIZJ)V"); mids.connProcessUpdate = jniGetMethodID(env, cls.conn, "processUpdate", "(Lcom/emanuelef/remote_capture/model/ConnectionUpdate;)V"); mids.connUpdateInit = jniGetMethodID(env, cls.conn_update, "", "(I)V"); - mids.connUpdateSetStats = jniGetMethodID(env, cls.conn_update, "setStats", "(JJJIIIII)V"); + mids.connUpdateSetStats = jniGetMethodID(env, cls.conn_update, "setStats", "(JJJJIIIII)V"); mids.connUpdateSetInfo = jniGetMethodID(env, cls.conn_update, "setInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V"); mids.connUpdateSetPayload = jniGetMethodID(env, cls.conn_update, "setPayload", "(Ljava/util/ArrayList;Z)V"); mids.statsInit = jniGetMethodID(env, cls.stats, "", "()V"); diff --git a/app/src/main/jni/core/pcapdroid.c b/app/src/main/jni/core/pcapdroid.c index 13d5de85..1dfe91aa 100644 --- a/app/src/main/jni/core/pcapdroid.c +++ b/app/src/main/jni/core/pcapdroid.c @@ -1071,6 +1071,8 @@ void pd_account_stats(pcapdroid_t *pd, pkt_context_t *pctx) { zdtun_pkt_t *pkt = pctx->pkt; pd_conn_t *data = pctx->data; + data->payload_length += pkt->l7_len; + if(pctx->is_tx) { data->sent_pkts++; data->sent_bytes += pkt->len; diff --git a/app/src/main/jni/core/pcapdroid.h b/app/src/main/jni/core/pcapdroid.h index edb3ca4d..5c40a1b2 100644 --- a/app/src/main/jni/core/pcapdroid.h +++ b/app/src/main/jni/core/pcapdroid.h @@ -90,6 +90,7 @@ typedef struct { jlong first_seen; jlong last_seen; + jlong payload_length; jlong sent_bytes; jlong rcvd_bytes; jint sent_pkts; diff --git a/app/src/main/res/layout/connection_item.xml b/app/src/main/res/layout/connection_item.xml index ac636009..1ed6224a 100644 --- a/app/src/main/res/layout/connection_item.xml +++ b/app/src/main/res/layout/connection_item.xml @@ -123,7 +123,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="@id/l7proto" tools:tint="@color/ok" - android:contentDescription="@string/encrypted" tools:src="@drawable/ic_lock_open" /> - + android:text="@string/decryption" /> + + + + + + + + + + tools:text="1.5 MB received - 0.1 sent" /> + tools:text="1.1 K received - 98 sent" /> + + + + + Export failed Connection Encrypted - Cleartext + Not encrypted Request Response Overview @@ -301,7 +301,7 @@ Payload is truncated. Enable \"%1$s\" to show it in full WebSocket HTTP - Raw + Payload TX RX Full payload @@ -311,4 +311,6 @@ Decryption Decryption: %1$s In progress + PCAPdroid has not seen the start of this connection. Some information may be missing + Traffic diff --git a/app/src/test/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapterTest.java b/app/src/test/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapterTest.java index b25a5a25..17807288 100644 --- a/app/src/test/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapterTest.java +++ b/app/src/test/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapterTest.java @@ -446,7 +446,7 @@ public class ConnectionsAdapterTest { ConnectionUpdate update = new ConnectionUpdate(incr_id); if(tp.equals(UpdateType.UPDATE_STATS)) - update.setStats(0, 10, 10, 1, 1, + update.setStats(0, 0, 10, 10, 1, 1, 0, 0, ConnectionDescriptor.CONN_STATUS_CONNECTED); else update.setInfo("example.org", null, "TLS", ConnectionUpdate.UPDATE_INFO_FLAG_ENCRYPTED_L7); @@ -525,4 +525,4 @@ public class ConnectionsAdapterTest { return notified; } -} \ No newline at end of file +}