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 c9cac611..3637a4dd 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 @@ -77,8 +77,8 @@ public class ConnectionDetailsActivity extends BaseActivity implements Connectio View url_row = findViewById(R.id.detail_url_row); View info_row = findViewById(R.id.detail_info_row); TextView source = findViewById(R.id.detail_source); - TextView http_request = findViewById(R.id.http_request); - TextView http_request_lbl = findViewById(R.id.http_request_label); + TextView request_data = findViewById(R.id.request_data); + TextView request_data_lbl = findViewById(R.id.request_data_label); TextView destination = findViewById(R.id.detail_destination); mTable = findViewById(R.id.table); mBytesView = findViewById(R.id.detail_bytes); @@ -118,11 +118,11 @@ public class ConnectionDetailsActivity extends BaseActivity implements Connectio else url_row.setVisibility(View.GONE); - if(!mConn.http_request.isEmpty()) - http_request.setText(mConn.http_request); + if(!mConn.request_plaintext.isEmpty()) + request_data.setText(mConn.request_plaintext); else { - http_request.setVisibility(View.GONE); - http_request_lbl.setVisibility(View.GONE); + request_data.setVisibility(View.GONE); + request_data_lbl.setVisibility(View.GONE); } updateStats(mConn); 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 29586c13..a791ab18 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 @@ -56,7 +56,7 @@ public class ConnectionDescriptor implements Serializable { public int rcvd_pkts; public String info; public String url; - public String http_request; + public String request_plaintext; public String l7proto; public int uid; public int incr_id; @@ -88,7 +88,7 @@ public class ConnectionDescriptor implements Serializable { status = _status; info = _info; url = _url; - http_request = _req; + request_plaintext = _req; l7proto = _l7proto; uid = _uid; incr_id = _incr_id; diff --git a/app/src/main/jni/vpnproxy-jni/vpnproxy.c b/app/src/main/jni/vpnproxy-jni/vpnproxy.c index 51ec8fbd..a88c30c8 100644 --- a/app/src/main/jni/vpnproxy-jni/vpnproxy.c +++ b/app/src/main/jni/vpnproxy-jni/vpnproxy.c @@ -42,13 +42,6 @@ static vpnproxy_data_t *global_proxy = NULL; /* ******************************************************* */ -static void trim_trailing_newlines(char *request_data, int request_len) { - while((request_len > 0) && (request_data[request_len - 1] == '\n')) - request_data[--request_len] = '\0'; -} - -/* ******************************************************* */ - static void conn_free_ndpi(conn_data_t *data) { if(data->ndpi_flow) { ndpi_free_flow(data->ndpi_flow); @@ -74,10 +67,10 @@ void conn_free_data(conn_data_t *data) { if(data->info) free(data->info); - if(data->http.url) - free(data->http.url); - if(data->http.request_data) - free(data->http.request_data); + if(data->url) + free(data->url); + if(data->request_data) + free(data->request_data); free(data); } @@ -372,11 +365,7 @@ void conn_end_ndpi_detection(conn_data_t *data, vpnproxy_data_t *proxy, const zd } if(data->ndpi_flow->http.url) - data->http.url = strndup(data->ndpi_flow->http.url, 256); - - if(data->http.request_data && !data->http.parsing_done) - trim_trailing_newlines(data->http.request_data, strlen(data->http.request_data)); - data->http.parsing_done = true; + data->url = strndup(data->ndpi_flow->http.url, 256); break; case NDPI_PROTOCOL_TLS: @@ -394,52 +383,47 @@ void conn_end_ndpi_detection(conn_data_t *data, vpnproxy_data_t *proxy, const zd /* ******************************************************* */ -static int http_is_printable(char c) { - return isprint(c) || (c == '\r') || (c == '\n'); +static int is_plaintext(char c) { + return isprint(c) || (c == '\r') || (c == '\n') || (c == '\t'); } /* ******************************************************* */ -static void process_http_data(conn_data_t *data, const struct zdtun_pkt *pkt, uint8_t from_tun) { +static void process_request_data(conn_data_t *data, const struct zdtun_pkt *pkt, uint8_t from_tun) { if(pkt->l7_len > 0) { - int request_len = data->http.request_data ? (int)strlen(data->http.request_data) : 0; - - if(from_tun) { - int num_chars = min(MAX_HTTP_REQUEST_LENGTH - request_len, pkt->l7_len); + if(from_tun && is_plaintext(pkt->l7[0])) { + int request_len = data->request_data ? (int)strlen(data->request_data) : 0; + int num_chars = min(MAX_PLAINTEXT_LENGTH - request_len, pkt->l7_len); if(num_chars <= 0) { - data->http.parsing_done = true; + data->request_done = true; return; } // +1 to add a NULL terminator - data->http.request_data = realloc(data->http.request_data, - request_len + num_chars + 1); + data->request_data = realloc(data->request_data,request_len + num_chars + 1); - if(!data->http.request_data) { - log_e("realloc(http.request_data.buffer) failed with code %d/%s", + if(!data->request_data) { + log_e("realloc(request_data) failed with code %d/%s", errno, strerror(errno)); - data->http.parsing_done = true; + data->request_done = true; return; } for(int i = 0; i < num_chars; i++) { char ch = pkt->l7[i]; - if(!http_is_printable(ch)) { - data->http.parsing_done = true; + if(!is_plaintext(ch)) { + data->request_done = true; break; } - if(ch != '\r') - data->http.request_data[request_len++] = ch; + data->request_data[request_len++] = ch; } - data->http.request_data[request_len] = '\0'; - } else { - trim_trailing_newlines(data->http.request_data, request_len); - data->http.parsing_done = true; - } + data->request_data[request_len] = '\0'; + } else + data->request_done = true; } } @@ -454,12 +438,8 @@ static void process_ndpi_packet(conn_data_t *data, vpnproxy_data_t *proxy, from_tun ? data->src_id : data->dst_id, from_tun ? data->dst_id : data->src_id); - if((data->l7proto.master_protocol == NDPI_PROTOCOL_HTTP) || (data->l7proto.app_protocol == NDPI_PROTOCOL_HTTP) - && (!data->http.parsing_done) - && !data->ndpi_flow->packet.tcp_retransmission) { - data->l7proto.master_protocol = NDPI_PROTOCOL_HTTP; - process_http_data(data, pkt, from_tun); - } + if((!data->request_done) && !data->ndpi_flow->packet.tcp_retransmission) + process_request_data(data, pkt, from_tun); if(giveup || ((data->l7proto.app_protocol != NDPI_PROTOCOL_UNKNOWN) && (!ndpi_extra_dissection_possible(proxy->ndpi, data->ndpi_flow)))) @@ -541,8 +521,8 @@ static int dumpConnection(vpnproxy_data_t *proxy, const vpn_conn_t *conn, jobjec #endif jobject info_string = (*env)->NewStringUTF(env, data->info ? data->info : ""); - jobject url_string = (*env)->NewStringUTF(env, data->http.url ? data->http.url : ""); - jobject req_string = (*env)->NewStringUTF(env, data->http.request_data ? data->http.request_data : ""); + jobject url_string = (*env)->NewStringUTF(env, data->url ? data->url : ""); + jobject req_string = (*env)->NewStringUTF(env, data->request_data ? data->request_data : ""); jobject proto_string = (*env)->NewStringUTF(env, getProtoName(proxy->ndpi, data->l7proto, conn_info->ipproto)); jobject src_string = (*env)->NewStringUTF(env, srcip); jobject dst_string = (*env)->NewStringUTF(env, dstip); diff --git a/app/src/main/jni/vpnproxy-jni/vpnproxy.h b/app/src/main/jni/vpnproxy-jni/vpnproxy.h index ec1740ae..3923bf98 100644 --- a/app/src/main/jni/vpnproxy-jni/vpnproxy.h +++ b/app/src/main/jni/vpnproxy-jni/vpnproxy.h @@ -34,7 +34,7 @@ #define MAX_HOST_LRU_SIZE 128 #define JAVA_PCAP_BUFFER_SIZE (512*1024) // 512K #define PERIODIC_PURGE_TIMEOUT_MS 5000 -#define MAX_HTTP_REQUEST_LENGTH 2048 +#define MAX_PLAINTEXT_LENGTH 1024 #define DNS_FLAGS_MASK 0x8000 #define DNS_TYPE_REQUEST 0x0000 @@ -68,12 +68,9 @@ typedef struct conn_data { char *info; jint uid; bool pending_notification; - - struct { - char *url; - char *request_data; - bool parsing_done; - } http; + bool request_done; + char *request_data; + char *url; } conn_data_t; typedef struct vpn_conn { diff --git a/app/src/main/res/layout/activity_connection_details.xml b/app/src/main/res/layout/activity_connection_details.xml index 8c967713..9456e7bf 100644 --- a/app/src/main/res/layout/activity_connection_details.xml +++ b/app/src/main/res/layout/activity_connection_details.xml @@ -253,23 +253,23 @@ + android:text="@string/request_plaintext"/> Donazioni Richiesta HTTP Log Root + Richiesta in Chiaro diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d8fe0d3e..b1241673 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -130,5 +130,6 @@ Donate HTTP Request Root Log + Request Plaintext diff --git a/submodules/nDPI b/submodules/nDPI index 9c6e6dad..82a8ffe5 160000 --- a/submodules/nDPI +++ b/submodules/nDPI @@ -1 +1 @@ -Subproject commit 9c6e6dadb1c3257de41869030cfffb4242001cc3 +Subproject commit 82a8ffe535253f4bd0d07eee1a0ba9cc2857a488