From 90216cf5d4929f4f47f90ce1e1bb2988e4d656d8 Mon Sep 17 00:00:00 2001 From: mom040267 Date: Fri, 16 Jan 2015 07:59:18 +0000 Subject: [PATCH] sessions filter --- src/apps/relay/turn_admin_server.c | 130 ++++++++++++++++++++++++++--- src/server/ns_turn_server.c | 1 + 2 files changed, 119 insertions(+), 12 deletions(-) diff --git a/src/apps/relay/turn_admin_server.c b/src/apps/relay/turn_admin_server.c index baff663..ae02a41 100644 --- a/src/apps/relay/turn_admin_server.c +++ b/src/apps/relay/turn_admin_server.c @@ -1367,6 +1367,9 @@ typedef enum _AS_FORM AS_FORM; #define HR_USERNAME "uname" #define HR_PASSWORD "pwd" #define HR_REALM "realm" +#define HR_CLIENT_PROTOCOL "cprotocol" +#define HR_USER_PATTERN "puser" +#define HR_MAX_SESSIONS "maxsess" struct form_name { AS_FORM form; @@ -1384,7 +1387,8 @@ static struct form_name form_names[] = { {AS_FORM_UNKNOWN,NULL} }; -static const char* admin_title = "TURN Server (https admin connection)"; +#define admin_title "TURN Server (https admin connection)" +#define bold_admin_title ""admin_title"" static const char* home_link = "
home page
\r\n
Logout

\r\n"; static const char* logout_link = "
Logout

\r\n"; @@ -1421,7 +1425,7 @@ static void write_https_logon_page(ioa_socket_handle s) str_buffer_append(sb,"\r\n\r\n \r\n "); str_buffer_append(sb,admin_title); str_buffer_append(sb,"\r\n \r\n \r\n "); - str_buffer_append(sb,admin_title); + str_buffer_append(sb,bold_admin_title); str_buffer_append(sb,"

\r\n"); str_buffer_append(sb,"
\r\n\r\n \r\n "); str_buffer_append(sb,admin_title); str_buffer_append(sb,"\r\n \r\n \r\n "); - str_buffer_append(sb,admin_title); + str_buffer_append(sb,bold_admin_title); str_buffer_append(sb,"

\r\n"); str_buffer_append(sb,logout_link); @@ -1489,6 +1493,10 @@ static void write_https_home_page(ioa_socket_handle s) str_buffer_append(sb,"
"); str_buffer_append(sb,"\r\n"); @@ -1668,7 +1676,7 @@ static void write_pc_page(ioa_socket_handle s) str_buffer_append(sb,"\r\n\r\n \r\n "); str_buffer_append(sb,admin_title); str_buffer_append(sb,"\r\n \r\n \r\n "); - str_buffer_append(sb,admin_title); + str_buffer_append(sb,bold_admin_title); str_buffer_append(sb,"
\r\n"); str_buffer_append(sb,home_link); str_buffer_append(sb,"
\r\n"); @@ -1905,6 +1913,9 @@ struct https_ps_arg { struct str_buffer* sb; size_t counter; turn_time_t ct; + const char* client_protocol; + const char* user_pattern; + size_t max_sessions; }; static int https_print_session(ur_map_key_type key, ur_map_value_type value, void *arg) @@ -1917,7 +1928,36 @@ static int https_print_session(ur_map_key_type key, ur_map_value_type value, voi if(get_eff_realm()[0] && strcmp(get_eff_realm(),tsi->realm)) return 0; - if((unsigned long)csarg->counter<(unsigned long)cli_max_output_sessions) { + { + if(csarg->user_pattern[0]) { + if(!strstr((char*)tsi->username,csarg->user_pattern)) { + return 0; + } + } + } + + { + const char *pn=csarg->client_protocol; + if(pn[0]) { + if(!strcmp(pn,"TLS") || !strcmp(pn,"tls") || !strcmp(pn,"Tls")) { + if(tsi->client_protocol != TLS_SOCKET) + return 0; + } else if(!strcmp(pn,"DTLS") || !strcmp(pn,"dtls") || !strcmp(pn,"Dtls")) { + if(tsi->client_protocol != DTLS_SOCKET) + return 0; + } else if(!strcmp(pn,"TCP") || !strcmp(pn,"tcp") || !strcmp(pn,"Tcp")) { + if(tsi->client_protocol != TCP_SOCKET) + return 0; + } else if(!strcmp(pn,"UDP") || !strcmp(pn,"udp") || !strcmp(pn,"Udp")) { + if(tsi->client_protocol != UDP_SOCKET) + return 0; + } else { + return 0; + } + } + } + + if((unsigned long)csarg->counter<(unsigned long)csarg->max_sessions) { str_buffer_append(sb,""); str_buffer_append_sz(sb,(size_t)(csarg->counter+1)); str_buffer_append(sb,""); @@ -2013,16 +2053,18 @@ static int https_print_session(ur_map_key_type key, ur_map_value_type value, voi return 0; } -static void https_print_sessions(struct str_buffer* sb) +static size_t https_print_sessions(struct str_buffer* sb, const char* client_protocol, const char* user_pattern, size_t max_sessions) { - struct https_ps_arg arg = {sb,0,0}; + struct https_ps_arg arg = {sb,0,0,client_protocol,user_pattern,max_sessions}; arg.ct = turn_time(); ur_map_foreach_arg(cliserver.sessions, (foreachcb_arg_type)https_print_session, &arg); + + return arg.counter; } -static void write_ps_page(ioa_socket_handle s) +static void write_ps_page(ioa_socket_handle s, const char* client_protocol, const char* user_pattern, size_t max_sessions) { if(s && !ioa_socket_tobeclosed(s)) { @@ -2035,16 +2077,64 @@ static void write_ps_page(ioa_socket_handle s) str_buffer_append(sb,"\r\n\r\n \r\n "); str_buffer_append(sb,admin_title); str_buffer_append(sb,"\r\n \r\n \r\n "); - str_buffer_append(sb,admin_title); + str_buffer_append(sb,bold_admin_title); str_buffer_append(sb,"
\r\n"); str_buffer_append(sb,home_link); str_buffer_append(sb,"
\r\n"); + + str_buffer_append(sb,"\r\n"); + str_buffer_append(sb,"
Filter:\r\n"); + + str_buffer_append(sb,"
Realm name: "); + + str_buffer_append(sb," Client protocol: "); + + str_buffer_append(sb," User name contains:

"); + + str_buffer_append(sb," Max number of output sessions in the page:
"); + + str_buffer_append(sb,"
"); + + str_buffer_append(sb,"
\r\n"); + str_buffer_append(sb,"
\r\n"); + str_buffer_append(sb,"TURN Sessions:
\r\n"); str_buffer_append(sb,"\r\n"); - https_print_sessions(sb); + size_t total_sz = https_print_sessions(sb,client_protocol,user_pattern,max_sessions); - str_buffer_append(sb,"\r\n
NSession IDUserRealmOriginAge, secsExpires, secsClient protocolRelay protocolClient addrServer addrRelay addr (IPv4)Relay addr (IPv6)FingerprintsMobileTLS methodTLS cipherBPS (allocated)PacketsRatePeers
\r\n\r\n"); + str_buffer_append(sb,"\r\n\r\n"); + + str_buffer_append(sb,"
Total sessions = "); + str_buffer_append_sz(sb,total_sz); + str_buffer_append(sb,"
\r\n"); + + str_buffer_append(sb,"\r\n\r\n"); send_str_from_ioa_socket_tcp(s,"HTTP/1.1 200 OK\r\nServer: "); send_str_from_ioa_socket_tcp(s,TURN_SOFTWARE); @@ -2161,7 +2251,23 @@ static void handle_https(ioa_socket_handle s, ioa_network_buffer_handle nbh) if(!is_superuser()) realm0 = current_socket->as_realm; STRCPY(current_socket->as_eff_realm,realm0); - write_ps_page(s); + + const char* client_protocol = get_http_header_value(hr, HR_CLIENT_PROTOCOL); + if(!client_protocol) client_protocol=""; + + const char* user_pattern = get_http_header_value(hr, HR_USER_PATTERN); + if(!user_pattern) user_pattern=""; + + size_t max_sessions = cli_max_output_sessions; + const char* s_max_sessions = get_http_header_value(hr, HR_MAX_SESSIONS); + if(s_max_sessions) { + max_sessions=strtoul(s_max_sessions,NULL,10); + if(!max_sessions) max_sessions = cli_max_output_sessions; + } + + if(!max_sessions) max_sessions = DEFAULT_CLI_MAX_OUTPUT_SESSIONS; + + write_ps_page(s,client_protocol,user_pattern,max_sessions); } else { write_https_logon_page(s); } diff --git a/src/server/ns_turn_server.c b/src/server/ns_turn_server.c index d8a84ef..6b9d8f8 100644 --- a/src/server/ns_turn_server.c +++ b/src/server/ns_turn_server.c @@ -4512,6 +4512,7 @@ static int read_client_connection(turn_turnserver *server, if((st == TCP_SOCKET)||(st==TLS_SOCKET)||(st==TENTATIVE_TCP_SOCKET)) { if(is_http((char*)ioa_network_buffer_data(in_buffer->nbh), ioa_network_buffer_get_size(in_buffer->nbh))) { const char *proto = "HTTP"; + ioa_network_buffer_data(in_buffer->nbh)[ioa_network_buffer_get_size(in_buffer->nbh)] = 0; if(st==TLS_SOCKET) { proto = "HTTPS"; set_ioa_socket_app_type(ss->client_socket,HTTPS_CLIENT_SOCKET);