diff --git a/avrestream/avrestream.c b/avrestream/avrestream.c index 56e8d6deeb559040a9fc2bf59408dc106d50d9c6..6991adcd03b22d9b2665c4054eec7ae30f1526eb 100644 --- a/avrestream/avrestream.c +++ b/avrestream/avrestream.c @@ -33,7 +33,7 @@ #ifdef DAP_SYS_DEBUG #ifndef DAP_VERSION - #define DAP_VERSION 0.9-15 + #define DAP_VERSION "0.9-15" #endif #endif diff --git a/core/src/dap_common.c b/core/src/dap_common.c index 75ff8be87c6ab952e30683783b9e67fb6d789de3..e0059835b68a663307d113516c8920b984220ce6 100755 --- a/core/src/dap_common.c +++ b/core/src/dap_common.c @@ -152,7 +152,7 @@ static char s_last_error[LAST_ERROR_MAX] = {'\0'}, static enum dap_log_level s_dap_log_level = L_DEBUG; static FILE *s_log_file = NULL; -#define LOG_FORMAT_LEN 12800 +#define LOG_FORMAT_LEN 4096 static char* s_appname = NULL; @@ -317,7 +317,7 @@ int dap_common_init( const char *a_console_title, const char *a_log_file_path, c fprintf( stderr, "Can't open log file %s \n", a_log_file_path ); return -1; //switch off show log in cosole if file not open } - setvbuf(s_log_file, NULL, _IOLBF, LOG_FORMAT_LEN * 4); + setvbuf(s_log_file, NULL, _IOLBF, LOG_FORMAT_LEN / 2); if (a_log_dirpath != s_log_dir_path) dap_stpcpy(s_log_dir_path, a_log_dirpath); if (a_log_file_path != s_log_file_path) @@ -390,7 +390,7 @@ void _log_it(const char * func_name, int line_num, const char *a_log_tag, enum d ? snprintf(s_format + offset, LOG_FORMAT_LEN - offset,"%s[%s][%s:%d] %s\n", s_log_level_tag[a_ll], a_log_tag, func_name, line_num, a_fmt) : snprintf(s_format + offset, LOG_FORMAT_LEN - offset, "%s[%s] %s\n", s_log_level_tag[a_ll], a_log_tag, a_fmt); if (offset >= LOG_FORMAT_LEN) { - return; + dap_strncpy(s_format + LOG_FORMAT_LEN - 5, "...\n", 4); } va_list va; va_start(va, a_fmt); diff --git a/core/src/dap_strfuncs.c b/core/src/dap_strfuncs.c index 9c153339f84dc5ab4ea1661631620a344e7f0770..06fe9371edca191e38a95682c5b32c003cf66988 100755 --- a/core/src/dap_strfuncs.c +++ b/core/src/dap_strfuncs.c @@ -421,13 +421,14 @@ char *dap_strncpy(char *a_dst, const char *a_src, size_t a_limit) { dap_return_val_if_fail(a_dst && a_src, NULL); do { - *a_dst++ = *a_src; - a_limit--; - } while (*a_src++ != '\0' && a_limit); - --a_dst; - if (*a_dst != '\0') - *a_dst = '\0'; - return a_dst; + if (a_limit--) + *a_dst++ = *a_src; + else { + *a_dst++ = '\0'; + break; + } + } while (*a_src++ != '\0'); + return --a_dst; } /** diff --git a/global-db/include/dap_global_db_driver.h b/global-db/include/dap_global_db_driver.h index bf75c43c284e560f320a525058996089fb888fc9..42fb98225f3c7be2835678620b62b5aa2c176694 100644 --- a/global-db/include/dap_global_db_driver.h +++ b/global-db/include/dap_global_db_driver.h @@ -95,7 +95,7 @@ DAP_STATIC_INLINE int dap_store_obj_driver_hash_compare(dap_store_obj_t *a_obj1, DAP_STATIC_INLINE const char *dap_global_db_driver_hash_print(dap_global_db_driver_hash_t a_hash) { - return dap_uint128_to_hex_str(*(uint128_t *)&a_hash); + return dap_uint128_to_hex_str(GET_128_FROM_64_64(a_hash.becrc, a_hash.bets)); } extern const dap_global_db_driver_hash_t c_dap_global_db_driver_hash_blank; diff --git a/io/dap_events_socket.c b/io/dap_events_socket.c index c338c5986ebe1e323f41f757b032ae9c464684f1..bb366824ca8ceb728536c776c19d72777d92a035 100644 --- a/io/dap_events_socket.c +++ b/io/dap_events_socket.c @@ -1440,7 +1440,7 @@ void dap_events_socket_set_writable_unsafe( dap_events_socket_t *a_esocket, bool .sin_addr = {{ .S_addr = INADDR_ANY }} }; if ( bind(a_esocket->socket, (PSOCKADDR)&l_addr_any, sizeof(l_addr_any)) == SOCKET_ERROR ) { - log_it(L_ERROR, "Failed to create socket for accept()'ing, errno %d", WSAGetLastError()); + log_it(L_ERROR, "Failed to create socket for connect()'ing, errno %d", WSAGetLastError()); return; } l_res = pfn_ConnectEx(a_esocket->socket, (PSOCKADDR)&a_esocket->addr_storage, sizeof(SOCKADDR), diff --git a/io/dap_net.c b/io/dap_net.c index be9da69cf36c63f0fd98a29eb9c12fe7200da50f..ae510726d6092f45dcab76c9b9f9b2e172cb816a 100644 --- a/io/dap_net.c +++ b/io/dap_net.c @@ -26,57 +26,81 @@ #include <errno.h> #include <string.h> #include "dap_net.h" - +#include "dap_strfuncs.h" #define LOG_TAG "dap_net" #ifdef _WIN32 #define poll WSAPoll #endif -/** - * @brief dap_net_resolve_host - * @param a_host hostname - * @param ai_family AF_INET for ipv4 or AF_INET6 for ipv6 - * @param a_addr_out out addr (struct in_addr or struct in6_addr) - * @param return 0 of OK, <0 Error - */ -int dap_net_resolve_host(const char *a_host, int ai_family, struct sockaddr *a_addr_out) +int dap_net_resolve_host(const char *a_host, const char *a_port, struct sockaddr_storage *a_addr_out, bool a_passive_flag) { - struct addrinfo l_hints, *l_res; - void *l_cur_addr = NULL; + dap_return_val_if_fail(a_addr_out && a_host, -1); + int l_ret = 0; + struct addrinfo l_hints = { + .ai_flags = a_passive_flag + ? AI_CANONNAME | AI_PASSIVE | AI_V4MAPPED | AI_ADDRCONFIG + : AI_CANONNAME | AI_V4MAPPED | AI_ADDRCONFIG, + .ai_family = AF_UNSPEC, + .ai_socktype= SOCK_STREAM, + }, *l_res; - memset(&l_hints, 0, sizeof(l_hints)); - l_hints.ai_family = ai_family == AF_INET ? PF_INET : PF_INET6; - l_hints.ai_socktype = SOCK_STREAM; - l_hints.ai_flags = AI_CANONNAME; + if (( l_ret = getaddrinfo(a_host, a_port, &l_hints, &l_res) )) + return l_ret; - int l_res_code = getaddrinfo(a_host, NULL, &l_hints, &l_res); - if (l_res_code) - return l_res_code; - - while(l_res) + // for (struct addrinfo *l_res_it = l_res; l_res_it; l_res_it = l_res_it->ai_next) // What shall we do? { - if(ai_family == l_res->ai_family) - switch (l_res->ai_family) - { - case AF_INET: - l_cur_addr = &((struct sockaddr_in *) l_res->ai_addr)->sin_addr; - memcpy(a_addr_out, l_cur_addr, sizeof(struct in_addr)); - break; - case AF_INET6: - l_cur_addr = &((struct sockaddr_in6 *) l_res->ai_addr)->sin6_addr; - memcpy(a_addr_out, l_cur_addr, sizeof(struct in6_addr)); - break; - } - if(l_cur_addr) { - freeaddrinfo(l_res); - return 0; - } - l_res = l_res->ai_next; + memset(a_addr_out, 0, sizeof(*a_addr_out)); + memcpy(a_addr_out, l_res->ai_addr, l_res->ai_addrlen); + } + freeaddrinfo(l_res); + return 0; +} + + +int dap_net_parse_hostname(const char *a_src, char *a_addr, uint16_t *a_port) { + if (!a_src) + return -1; + if (!a_addr && !a_port) + return log_it(L_ERROR, "No output buffers provided!"), -2; + + char l_type = 0, *l_cpos = NULL, *l_bpos = NULL; + /* + type 4,5 - hostname or IPv4 (no port, with port) + type 6,7 - IPv6 (no port, with port) + */ + if ((l_cpos = strrchr(a_src, ':') )) { + l_type = strchr(a_src, ':') == l_cpos ? 5 : 6; + } else + l_type = 4; + + if (*a_src == '[') { // It's likely an IPv6 with port, see https://www.ietf.org/rfc/rfc2732.txt + if ( l_type != 6 || !(l_bpos = strrchr(a_src, ']')) || l_cpos < l_bpos ) + return -1; + a_src++; + l_type = 7; + } else if ( (l_bpos = strrchr(a_src, ']')) ) + return -1; + + int l_len; + switch (l_type) { + case 4: + case 6: + l_len = strlen(a_src); + if (a_port) + *a_port = 0; + break; + case 5: + l_bpos = l_cpos; + case 7: + if (a_port) + *a_port = strtoul(l_cpos + 1, NULL, 10); + l_len = l_bpos - a_src; + break; + default: + return -1; } - if (l_res) - freeaddrinfo(l_res); - return -1; + return l_len > 0xFF ? -2 : ( dap_strncpy(a_addr, a_src, l_len), 0 ); } /** diff --git a/io/dap_server.c b/io/dap_server.c index d2e24dba8839cf2086ef34b1a8afdf9a7c8db783..4aa2e8dec0c5f2fe011ca927dc7c4ab3a95382bd 100644 --- a/io/dap_server.c +++ b/io/dap_server.c @@ -70,6 +70,7 @@ #include "dap_server.h" #include "dap_worker.h" #include "dap_events.h" +#include "dap_net.h" #include "dap_strfuncs.h" #define LOG_TAG "dap_server" @@ -236,16 +237,13 @@ int dap_server_listen_addr_add(dap_server_t *a_server, const char *a_addr, uint1 log_it(L_WARNING, "Can't set up REUSEPORT flag to the socket"); #endif - struct addrinfo l_hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM }, *l_addr_res; - if ( getaddrinfo(a_addr, dap_itoa(l_es->listener_port), &l_hints, &l_addr_res) ) { + if ( dap_net_resolve_host(a_addr, dap_itoa(l_es->listener_port), &l_es->addr_storage, true) ) { log_it(L_ERROR, "Wrong listen address '%s : %u'", a_addr, l_es->listener_port); goto clean_n_quit; } - memcpy(&l_es->addr_storage, l_addr_res->ai_addr, l_addr_res->ai_addrlen); - freeaddrinfo(l_addr_res); if (a_server->type != DAP_SERVER_LOCAL) { - strncpy(l_es->listener_addr_str, a_addr, sizeof(l_es->listener_addr_str)); // If NULL we listen everything + dap_strncpy(l_es->listener_addr_str, a_addr, INET6_ADDRSTRLEN - 1); // If NULL we listen everything } #ifdef DAP_OS_UNIX else { @@ -306,35 +304,17 @@ dap_server_t *dap_server_new(char **a_addrs, uint16_t a_count, dap_server_type_t }; l_server->type = a_type; - char l_curr_ip[INET6_ADDRSTRLEN] = {0}; -// func work - for(size_t i = 0; i < a_count; ++i) { - // parsing full addr - int l_ret = -1; + char l_cur_ip[INET6_ADDRSTRLEN] = { '\0' }; uint16_t l_cur_port = 0; + + for (size_t i = 0; i < a_count; ++i) { + int l_add_res = 0; if (l_server->type != DAP_SERVER_LOCAL) { - const char *l_curr_port_str = strstr(a_addrs[i], ":"); - uint16_t l_curr_port = 0; - if (l_curr_port_str) { - memset(l_curr_ip, 0, sizeof(l_curr_ip)); - strncpy(l_curr_ip, a_addrs[i], dap_min((size_t)(l_curr_port_str - a_addrs[i]), sizeof(l_curr_ip) - 1)); - l_curr_port = atol(++l_curr_port_str); - } else { - l_curr_port = atol(a_addrs[i]); + if ( dap_net_parse_hostname(a_addrs[i], l_cur_ip, &l_cur_port) ) + log_it( L_ERROR, "Incorrect format of address \"%s\", fix net config and restart node", a_addrs[i] ); + else { + if (( l_add_res = dap_server_listen_addr_add(l_server, l_cur_ip, l_cur_port, &l_callbacks) )) + log_it( L_ERROR, "Can't add address \"%s : %u\" to listen in server, errno %d", l_cur_ip, l_cur_port, l_add_res); } - switch (l_server->type) { - case DAP_SERVER_TCP: - case DAP_SERVER_UDP: - if (!l_curr_ip[0]) - strcpy(l_curr_ip, "0.0.0.0"); // If NULL we listen everything - break; - case DAP_SERVER_TCP_V6: - if (!l_curr_ip[0]) - strcpy(l_curr_ip, "::0"); - break; - default: - break; - } - l_ret = dap_server_listen_addr_add(l_server, l_curr_ip, l_curr_port, &l_callbacks); } #ifdef DAP_OS_UNIX else { @@ -348,12 +328,14 @@ dap_server_t *dap_server_new(char **a_addrs, uint16_t a_count, dap_server_type_t strncpy(l_curr_path, a_addrs[i], dap_min((size_t)(l_curr_mode_str - a_addrs[i]), sizeof(l_curr_path) - 1)); sscanf(l_curr_mode_str,"%ou", &l_listen_unix_socket_permissions ); } - l_ret = dap_server_listen_addr_add(l_server, l_curr_path, l_listen_unix_socket_permissions, &l_callbacks); + if (( l_add_res = dap_server_listen_addr_add(l_server, l_curr_path, l_listen_unix_socket_permissions, &l_callbacks) )) { + log_it( L_ERROR, "Can't add path \"%s ( %d )\" to listen in server, errno %d", + l_curr_path, l_listen_unix_socket_permissions, l_add_res ); + } } #endif - if (l_ret) - continue; } + if (!l_server->es_listeners) { log_it(L_ERROR, "Server not created"); DAP_DELETE(l_server); @@ -486,7 +468,7 @@ static void s_es_server_accept(dap_events_socket_t *a_es_listener, SOCKET a_remo } l_es_new = dap_events_socket_wrap_no_add(a_remote_socket, &l_server->client_callbacks); l_es_new->server = l_server; - unsigned short int l_family = a_remote_addr->ss_family; + unsigned short l_family = a_remote_addr->ss_family; l_es_new->type = DESCRIPTOR_TYPE_SOCKET_CLIENT; l_es_new->addr_storage = *a_remote_addr; diff --git a/io/include/dap_net.h b/io/include/dap_net.h index 3a5c8350eb4cc0a172f62275f9518d710c84f490..6e9c69cddfee07c18aff94ceaebf1394ff8faa3e 100644 --- a/io/include/dap_net.h +++ b/io/include/dap_net.h @@ -45,5 +45,6 @@ #include "dap_common.h" #include "dap_events_socket.h" -int dap_net_resolve_host(const char *a_host, int ai_family, struct sockaddr *a_addr_out); +int dap_net_resolve_host(const char *a_host, const char *a_port, struct sockaddr_storage *a_addr_out, bool a_passive_flag); +int dap_net_parse_hostname(const char *a_src, char *a_addr, uint16_t *a_port); long dap_net_recv(SOCKET sd, unsigned char *buf, size_t bufsize, int timeout); diff --git a/net/client/dap_client_http.c b/net/client/dap_client_http.c index 5b7adb4850decd7834b399c0ccc6ceb44d2cbd70..b088bec927bc3ee3d13c4721bd665c15ef5bef33 100644 --- a/net/client/dap_client_http.c +++ b/net/client/dap_client_http.c @@ -609,7 +609,7 @@ dap_client_http_t * dap_client_http_request_custom ( l_client_http->request_size = a_request_size; memcpy(l_client_http->request, a_request, a_request_size); } - strncpy(l_client_http->uplink_addr, a_uplink_addr, INET_ADDRSTRLEN - 1); + dap_strncpy(l_client_http->uplink_addr, a_uplink_addr, 0xFF); l_client_http->uplink_port = a_uplink_port; l_client_http->cookie = a_cookie; l_client_http->request_custom_headers = dap_strdup(a_custom_headers); @@ -625,20 +625,17 @@ dap_client_http_t * dap_client_http_request_custom ( l_client_http->worker = a_worker; l_client_http->is_over_ssl = a_over_ssl; - struct addrinfo l_hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM }, *l_addr_res; - if ( getaddrinfo(a_uplink_addr, dap_itoa(a_uplink_port), &l_hints, &l_addr_res) ) { + if ( dap_net_resolve_host(a_uplink_addr, dap_itoa(a_uplink_port), &l_ev_socket->addr_storage, false) ) { log_it(L_ERROR, "Wrong remote address '%s : %u'", a_uplink_addr, a_uplink_port); s_client_http_delete(l_client_http); l_ev_socket->_inheritor = NULL; dap_events_socket_delete_unsafe( l_ev_socket, true); if(a_error_callback) a_error_callback(errno, a_callbacks_arg); - return NULL; + return NULL; } - memcpy(&l_ev_socket->addr_storage, l_addr_res->ai_addr, l_addr_res->ai_addrlen); - freeaddrinfo(l_addr_res); - strncpy(l_ev_socket->remote_addr_str, a_uplink_addr, INET6_ADDRSTRLEN); + dap_strncpy(l_ev_socket->remote_addr_str, a_uplink_addr, INET6_ADDRSTRLEN - 1); l_ev_socket->remote_port = a_uplink_port; // connect diff --git a/net/client/dap_client_pvt.c b/net/client/dap_client_pvt.c index 059e7ba9e60391f0cc33c468cb19922992b31e9e..5dc015ecc4df9c4895cfb05e9fa975bcf1ad1178 100644 --- a/net/client/dap_client_pvt.c +++ b/net/client/dap_client_pvt.c @@ -55,6 +55,7 @@ #include "dap_stream_ch_pkt.h" #include "dap_stream_pkt.h" #include "dap_http_client.h" +#include "dap_net.h" #include "dap_link_manager.h" #define LOG_TAG "dap_client_pvt" @@ -383,7 +384,7 @@ static void s_stage_status_after(dap_client_pvt_t *a_client_pvt) case STAGE_ENC_INIT: { log_it(L_INFO, "Go to stage ENC: prepare the request"); - if (!a_client_pvt->client->uplink_addr || !a_client_pvt->client->uplink_addr[0] || !a_client_pvt->client->uplink_port) { + if (!a_client_pvt->client->uplink_addr || !*a_client_pvt->client->uplink_addr || !a_client_pvt->client->uplink_port) { log_it(L_ERROR, "Wrong remote address %s : %u", a_client_pvt->client->uplink_addr, a_client_pvt->client->uplink_port); a_client_pvt->stage_status = STAGE_STATUS_ERROR; a_client_pvt->last_error = ERROR_WRONG_ADDRESS; @@ -516,19 +517,20 @@ static void s_stage_status_after(dap_client_pvt_t *a_client_pvt) l_es->flags |= DAP_SOCK_READY_TO_WRITE; #endif l_es->_inheritor = a_client_pvt->client; - struct addrinfo l_hints = (struct addrinfo){ .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM }, *l_addr_res; - if ( getaddrinfo(a_client_pvt->client->uplink_addr, dap_itoa(a_client_pvt->client->uplink_port), &l_hints, &l_addr_res) ) { + if ( dap_net_resolve_host(a_client_pvt->client->uplink_addr, + dap_itoa(a_client_pvt->client->uplink_port), + &l_es->addr_storage, + false) + ) { log_it(L_ERROR, "Wrong remote address '%s : %u'", a_client_pvt->client->uplink_addr, a_client_pvt->client->uplink_port); a_client_pvt->stage_status = STAGE_STATUS_ERROR; a_client_pvt->last_error = ERROR_WRONG_ADDRESS; s_stage_status_after(a_client_pvt); break; } - memcpy(&l_es->addr_storage, l_addr_res->ai_addr, l_addr_res->ai_addrlen); - freeaddrinfo(l_addr_res); l_es->remote_port = a_client_pvt->client->uplink_port; - strncpy(l_es->remote_addr_str, a_client_pvt->client->uplink_addr, INET_ADDRSTRLEN); + dap_strncpy(l_es->remote_addr_str, a_client_pvt->client->uplink_addr, 0xFF); a_client_pvt->stream = dap_stream_new_es_client(l_es, &DAP_LINK(a_client_pvt->client)->node_addr); a_client_pvt->stream->authorized = a_client_pvt->authorized; @@ -542,7 +544,7 @@ static void s_stage_status_after(dap_client_pvt_t *a_client_pvt) // connect #ifdef DAP_EVENTS_CAPS_IOCP - log_it(L_DEBUG, "Stream connecting to remote %s:%u", a_client_pvt->client->uplink_addr, a_client_pvt->client->uplink_port); + log_it(L_DEBUG, "Stream connecting to remote %s : %u", a_client_pvt->client->uplink_addr, a_client_pvt->client->uplink_port); dap_worker_add_events_socket(l_worker, a_client_pvt->stream_es); dap_events_socket_uuid_t *l_stream_es_uuid_ptr = DAP_NEW_Z(dap_events_socket_uuid_t); *l_stream_es_uuid_ptr = a_client_pvt->stream_es->uuid; diff --git a/net/client/include/dap_client.h b/net/client/include/dap_client.h index d388eba247623585faf4ddb479c5b0df8896b617..141df2914237da8f741cbbd8d8ea655daffbf191 100644 --- a/net/client/include/dap_client.h +++ b/net/client/include/dap_client.h @@ -83,7 +83,7 @@ typedef void (*dap_client_callback_data_size_t) (dap_client_t *, void *, size_t) typedef struct dap_client { char *active_channels; - char uplink_addr[INET6_ADDRSTRLEN];; + char uplink_addr[0xFF + 1]; uint16_t uplink_port; dap_cert_t *auth_cert; diff --git a/net/client/include/dap_client_http.h b/net/client/include/dap_client_http.h index 686f0b74f5066d21a24f413ded10d4231cdd2b6a..373ef00cafdfa221492ece6790506860df61db09 100644 --- a/net/client/include/dap_client_http.h +++ b/net/client/include/dap_client_http.h @@ -56,7 +56,7 @@ typedef struct dap_client_http { size_t response_size_max; // Request args - char uplink_addr[INET_ADDRSTRLEN]; + char uplink_addr[0xFF + 1]; uint16_t uplink_port; char *method; char *request_content_type; diff --git a/net/link_manager/dap_link_manager.c b/net/link_manager/dap_link_manager.c index 5e1dcbfd54ff3110637981cde6f110da4bb784b3..1d05f0b5d22fef53e0fa0bcc0e140fd76e94814e 100644 --- a/net/link_manager/dap_link_manager.c +++ b/net/link_manager/dap_link_manager.c @@ -474,7 +474,7 @@ void dap_link_manager_set_net_status(uint64_t a_net_id, bool a_status) void dap_link_manager_add_links_cluster(dap_stream_node_addr_t *a_addr, dap_cluster_t *a_cluster) { dap_return_if_pass(!s_link_manager || !a_addr || !a_cluster); - dap_link_t *l_link = dap_link_manager_link_create_or_update(a_addr, NULL, NULL, 0); + dap_link_t *l_link = dap_link_manager_link_create_or_update(a_addr, NULL, 0); l_link->links_clusters = dap_list_append(l_link->links_clusters, a_cluster); dap_list_t *l_item = NULL; if (a_cluster->role == DAP_CLUSTER_ROLE_EMBEDDED) @@ -527,8 +527,7 @@ void dap_link_manager_remove_links_cluster(dap_stream_node_addr_t *a_addr, dap_c * @param a_port - host port * @return if ERROR null, other - pointer to dap_link_t */ -dap_link_t *dap_link_manager_link_create_or_update(dap_stream_node_addr_t *a_node_addr, - struct in_addr *a_addr_v4, struct in6_addr *a_addr_v6, uint16_t a_port) +dap_link_t *dap_link_manager_link_create_or_update(dap_stream_node_addr_t *a_node_addr, const char *a_host, uint16_t a_port) { // sanity check dap_return_val_if_pass(!a_node_addr || !a_node_addr->uint64, NULL); @@ -543,24 +542,22 @@ dap_link_t *dap_link_manager_link_create_or_update(dap_stream_node_addr_t *a_nod pthread_rwlock_unlock(&s_link_manager->links_lock); return NULL; } - l_ret->node_addr.uint64 = a_node_addr->uint64; - l_ret->link_manager = s_link_manager; - l_ret->client = dap_client_new(s_client_delete_callback, s_client_error_callback, NULL); - dap_client_set_is_always_reconnect(l_ret->client, false); - dap_client_set_active_channels_unsafe(l_ret->client, "CGND"); + dap_client_t *l_client = dap_client_new(s_client_delete_callback, s_client_error_callback, NULL); + dap_client_set_is_always_reconnect(l_client, false); + dap_client_set_active_channels_unsafe(l_client, "CGND"); + *l_ret = (dap_link_t) { + .node_addr.uint64 = a_node_addr->uint64, + .client = l_client, + .link_manager = s_link_manager + }; l_ret->client->_inheritor = l_ret; HASH_ADD(hh, s_link_manager->links, node_addr, sizeof(l_ret->node_addr), l_ret); } - // fill addr - if(a_addr_v4 && a_addr_v4->s_addr){ - inet_ntop(AF_INET, a_addr_v4, l_ret->client->uplink_addr, INET_ADDRSTRLEN); - } else if (a_addr_v6) { - inet_ntop(AF_INET6, a_addr_v6, l_ret->client->uplink_addr, INET6_ADDRSTRLEN); - } + if (a_host) + dap_strncpy(l_ret->client->uplink_addr, a_host, 0xFF); if (a_port) l_ret->client->uplink_port = a_port; - l_ret->node_addr.uint64 = a_node_addr->uint64; - l_ret->valid = l_ret->client->uplink_port && (strlen(l_ret->client->uplink_addr) && strcmp(l_ret->client->uplink_addr, "::")); + l_ret->valid = l_ret->client->uplink_addr && *l_ret->client->uplink_addr && l_ret->client->uplink_port && dap_strcmp(a_host, "::"); if (l_ret->valid) { log_it(L_INFO, "Create link to node " NODE_ADDR_FP_STR " with address %s : %d", NODE_ADDR_FP_ARGS_S(l_ret->node_addr), l_ret->client->uplink_addr, l_ret->client->uplink_port); } @@ -612,7 +609,7 @@ int dap_link_manager_downlink_add(dap_stream_node_addr_t *a_node_addr) // sanity check dap_return_val_if_pass(!a_node_addr || !a_node_addr->uint64 || !s_link_manager->active || !s_check_active_nets(), -1); // func work - dap_link_t *l_link = dap_link_manager_link_create_or_update(a_node_addr, NULL, NULL, 0); + dap_link_t *l_link = dap_link_manager_link_create_or_update(a_node_addr, NULL, 0); if (l_link->state != LINK_STATE_DISCONNECTED) { log_it(L_WARNING, "Get dowlink from "NODE_ADDR_FP_STR" with existed link", NODE_ADDR_FP_ARGS(a_node_addr)); return -3; @@ -689,7 +686,7 @@ void dap_link_manager_add_static_links_cluster(dap_stream_node_addr_t *a_node_ad dap_return_if_pass_err(!s_link_manager, s_init_error); dap_return_if_pass(!a_node_addr || !a_cluster); // func work - dap_link_t *l_link = dap_link_manager_link_create_or_update(a_node_addr, NULL, NULL, 0); + dap_link_t *l_link = dap_link_manager_link_create_or_update(a_node_addr, NULL, 0); dap_return_if_pass(!l_link); l_link->static_links_clusters = dap_list_append(l_link->static_links_clusters, a_cluster); } diff --git a/net/link_manager/include/dap_link_manager.h b/net/link_manager/include/dap_link_manager.h index e9c859eb337a6748eba241c5278a5e72b02de8f5..e701212566838684c0691eeb9e8c5063c5bbbb51 100644 --- a/net/link_manager/include/dap_link_manager.h +++ b/net/link_manager/include/dap_link_manager.h @@ -90,7 +90,7 @@ void dap_link_manager_add_links_cluster(dap_stream_node_addr_t *a_addr, dap_clus void dap_link_manager_remove_links_cluster(dap_stream_node_addr_t *a_addr, dap_cluster_t *a_cluster); void dap_link_manager_add_static_links_cluster(dap_stream_node_addr_t *a_node_addr, dap_cluster_t *a_cluster); void dap_link_manager_remove_static_links_cluster_all(dap_cluster_t *a_cluster); -dap_link_t *dap_link_manager_link_create_or_update(dap_stream_node_addr_t *a_node_addr, struct in_addr *a_addr_v4, struct in6_addr *a_addr_v6, uint16_t a_port); +dap_link_t *dap_link_manager_link_create_or_update(dap_stream_node_addr_t *a_node_addr, const char *a_host, uint16_t a_port); int dap_link_manager_link_add(uint64_t a_net_id, dap_link_t *a_link); int dap_link_manager_downlink_add(dap_stream_node_addr_t *a_node_addr); void dap_accounting_downlink_in_net(uint64_t a_net_id, dap_stream_node_addr_t *a_node_addr); diff --git a/net/server/http_server/dap_http_simple.c b/net/server/http_server/dap_http_simple.c index b136033f986dcd069d3b5176695c8eeaf6922b6e..ee7917228a8af2d5bc7d0bc0f7e114847fbb9722 100644 --- a/net/server/http_server/dap_http_simple.c +++ b/net/server/http_server/dap_http_simple.c @@ -47,6 +47,7 @@ See more details here <http://www.gnu.org/licenses/>. #include "dap_config.h" #include "dap_worker.h" #include "dap_events.h" +#include "dap_strfuncs.h" #include "dap_proc_thread.h" #include "dap_http_server.h" #include "dap_http_client.h" @@ -391,8 +392,7 @@ static void s_http_client_headers_read( dap_http_client_t *a_http_client, void U { assert(a_http_client->esocket->server); if (a_http_client->esocket->server->type == DAP_SERVER_TCP || a_http_client->esocket->server->type == DAP_SERVER_UDP) { - if ( dap_http_ban_list_client_check_ipv4( ((struct sockaddr_in*)&a_http_client->esocket->addr_storage)->sin_addr ) ) { - // TODO make it universal for IPv6 + if ( dap_http_ban_list_client_check(a_http_client->esocket->remote_addr_str, NULL, NULL) ) { a_http_client->reply_status_code = Http_Status_Forbidden; return; } @@ -407,7 +407,7 @@ static void s_http_client_headers_read( dap_http_client_t *a_http_client, void U l_http_simple->worker = a_http_client->esocket->worker; l_http_simple->reply_size_max = DAP_HTTP_SIMPLE_URL_PROC( a_http_client->proc )->reply_size_max; l_http_simple->reply_byte = DAP_NEW_Z_SIZE(uint8_t, DAP_HTTP_SIMPLE(a_http_client)->reply_size_max ); - strncpy(l_http_simple->es_hostaddr, l_http_simple->esocket->remote_addr_str, INET6_ADDRSTRLEN); + dap_strncpy(l_http_simple->es_hostaddr, l_http_simple->esocket->remote_addr_str, INET6_ADDRSTRLEN); // Made a temporary solution to handle simple CORS requests. // This is necessary in order to be able to request information using JavaScript obtained from another source. dap_http_header_t* l_header_origin = dap_http_header_find(a_http_client->in_headers, "Origin"); diff --git a/net/server/http_server/http_client/dap_http_ban_list_client.c b/net/server/http_server/http_client/dap_http_ban_list_client.c index e57f9a02036bdcef923ddcd24568af2839bfce89..56299d1e10e2918f1b0e3d604cc7b0e97ba53735 100644 --- a/net/server/http_server/http_client/dap_http_ban_list_client.c +++ b/net/server/http_server/http_client/dap_http_ban_list_client.c @@ -1,123 +1,99 @@ #include "dap_http_ban_list_client.h" +#include "dap_strfuncs.h" +#include "dap_hash.h" -//IP V4 -static dap_http_ban_list_client_record_t *s_ipv4_ban_list = NULL; -static pthread_rwlock_t s_ipv4_ban_list_rwlock; +typedef struct ban_record { + dap_hash_fast_t decree_hash; + dap_time_t ts_created; + UT_hash_handle hh; + char addr[]; +} ban_record_t; -bool dap_http_ban_list_client_check_ipv4(struct in_addr a_ip) { - pthread_rwlock_rdlock(&s_ipv4_ban_list_rwlock); - dap_http_ban_list_client_record_t *l_record = NULL; - HASH_FIND(hh, s_ipv4_ban_list, &a_ip, sizeof (struct in_addr), l_record); - pthread_rwlock_unlock(&s_ipv4_ban_list_rwlock); - return l_record ? true : false; -} - -void dap_http_ban_list_client_add_ipv4(struct in_addr a_ip, dap_hash_fast_t a_decree_hash, dap_time_t a_ts_created) { - dap_http_ban_list_client_record_t *l_record = DAP_NEW(dap_http_ban_list_client_record_t); - l_record->ip_v4 = a_ip; - l_record->decree_hash = a_decree_hash; - l_record->ts_created = a_ts_created; - pthread_rwlock_wrlock(&s_ipv4_ban_list_rwlock); - HASH_ADD(hh, s_ipv4_ban_list, ip_v4, sizeof(struct in_addr), l_record); - pthread_rwlock_unlock(&s_ipv4_ban_list_rwlock); -} +pthread_rwlock_t s_ban_list_lock = PTHREAD_RWLOCK_INITIALIZER; +ban_record_t *s_ban_list; -void dap_http_ban_list_client_remove_ipv4(struct in_addr a_ip){ - pthread_rwlock_wrlock(&s_ipv4_ban_list_rwlock); - dap_http_ban_list_client_record_t *l_record = NULL, *tmp = NULL; - HASH_FIND(hh, s_ipv4_ban_list, &a_ip, sizeof (struct in_addr), l_record); - if (l_record) { - HASH_DEL(s_ipv4_ban_list, l_record); - DAP_DELETE(l_record); +bool dap_http_ban_list_client_check(const char *a_addr, dap_hash_fast_t *a_decree_hash, dap_time_t *a_ts) { + ban_record_t *l_rec = NULL; + pthread_rwlock_rdlock(&s_ban_list_lock); + HASH_FIND_STR(s_ban_list, a_addr, l_rec); + pthread_rwlock_unlock(&s_ban_list_lock); + if (l_rec) { + if (a_decree_hash) *a_decree_hash = l_rec->decree_hash; + if (a_ts) *a_ts = l_rec->ts_created; + return true; } - pthread_rwlock_unlock(&s_ipv4_ban_list_rwlock); + return false; } -void dap_http_ban_list_client_ipv4_print(dap_string_t *a_str_out){ - a_str_out = dap_string_append(a_str_out, "\t IP v4.\n\n"); - pthread_rwlock_rdlock(&s_ipv4_ban_list_rwlock); - if (!s_ipv4_ban_list) { - a_str_out = dap_string_append(a_str_out, "\t\t Not found.\n"); - return; - } - int number = 1; - dap_http_ban_list_client_record_t *l_record = NULL, *l_tmp = NULL; - HASH_ITER(hh, s_ipv4_ban_list, l_record, l_tmp) { - char l_tm[85]; - char l_tm_ip[INET_ADDRSTRLEN]; - dap_time_to_str_rfc822(l_tm, 85, l_record->ts_created); - dap_string_append_printf(a_str_out, "\t\t%d) %s\n" - "\t\t\tIP: %s\n" - "\t\t\tCreated: %s\n\n", - number++, dap_chain_hash_fast_to_str_static(&l_record->decree_hash), - inet_ntop(AF_INET, &l_record->ip_v4, l_tm_ip, INET_ADDRSTRLEN), l_tm); - } - pthread_rwlock_unlock(&s_ipv4_ban_list_rwlock); +int dap_http_ban_list_client_add(const char *a_addr, dap_hash_fast_t a_decree_hash, dap_time_t a_ts) { + if ( dap_http_ban_list_client_check(a_addr, NULL, NULL) ) + return -1; + ban_record_t *l_rec = DAP_NEW_Z_SIZE( ban_record_t, sizeof(ban_record_t) + strlen(a_addr) + 1); + *l_rec = (ban_record_t) { + .decree_hash = a_decree_hash, + .ts_created = a_ts, + }; + strcpy(l_rec->addr, a_addr); + pthread_rwlock_wrlock(&s_ban_list_lock); + HASH_ADD_STR(s_ban_list, addr, l_rec); + pthread_rwlock_unlock(&s_ban_list_lock); + return 0; } -//IP V6 - -static dap_http_ban_list_client_record_t *s_ipv6_ban_list = NULL; -static pthread_rwlock_t s_ipv6_ban_list_rwlock; - -bool dap_http_ban_list_client_check_ipv6(struct in6_addr a_ip_v6) { - pthread_rwlock_rdlock(&s_ipv6_ban_list_rwlock); - dap_http_ban_list_client_record_t *l_record = NULL; - HASH_FIND(hh, s_ipv6_ban_list, &a_ip_v6, sizeof(struct in6_addr), l_record); - pthread_rwlock_unlock(&s_ipv6_ban_list_rwlock); - return l_record ? true : false; +int dap_http_ban_list_client_remove(const char *a_addr) { + ban_record_t *l_rec = NULL; + int l_ret = 0; + pthread_rwlock_wrlock(&s_ban_list_lock); + HASH_FIND_STR(s_ban_list, a_addr, l_rec); + if (l_rec) { + HASH_DEL(s_ban_list, l_rec); + DAP_DELETE(l_rec); + } else + l_ret = -1; + pthread_rwlock_unlock(&s_ban_list_lock); + return l_ret; } -void dap_http_ban_list_client_add_ipv6(struct in6_addr a_ip_v6, dap_hash_fast_t a_decree_hash, dap_time_t a_ts_created) { - dap_http_ban_list_client_record_t *l_record = DAP_NEW(dap_http_ban_list_client_record_t); - l_record->ip_v6 = a_ip_v6; - l_record->decree_hash = a_decree_hash; - l_record->ts_created = a_ts_created; - pthread_rwlock_wrlock(&s_ipv6_ban_list_rwlock); - HASH_ADD(hh, s_ipv6_ban_list, ip_v6, sizeof(struct in6_addr), l_record); - pthread_rwlock_unlock(&s_ipv6_ban_list_rwlock); -} -void dap_http_ban_list_client_remove_ipv6(struct in6_addr a_ip_v6) { - pthread_rwlock_wrlock(&s_ipv6_ban_list_rwlock); - dap_http_ban_list_client_record_t *l_record = NULL; - HASH_FIND(hh, s_ipv6_ban_list, &a_ip_v6, sizeof(struct in6_addr), l_record); - if (l_record) { - HASH_DEL(s_ipv6_ban_list, l_record); - DAP_DELETE(l_record); - } - pthread_rwlock_unlock(&s_ipv6_ban_list_rwlock); +static void s_dap_http_ban_list_client_dump_single(ban_record_t *a_rec, dap_string_t *a_str) { + char *l_decree_hash_str = dap_hash_fast_to_str_static(&a_rec->decree_hash), + l_ts[80] = { '\0' }; + dap_time_to_str_rfc822(l_ts, sizeof(l_ts), a_rec->ts_created); + dap_string_append_printf(a_str, "%s\n\t\t\tAddress: %s\n\t\t\tCreated at %s\n\n", + l_decree_hash_str, a_rec->addr, l_ts); } -void dap_http_ban_list_client_ipv6_print(dap_string_t *a_str_out) { - a_str_out = dap_string_append(a_str_out, "\t IP v6.\n"); - pthread_rwlock_rdlock(&s_ipv6_ban_list_rwlock); - if (!s_ipv6_ban_list) { - a_str_out = dap_string_append(a_str_out, "\t\t Not found.\n\n"); - return; +char *dap_http_ban_list_client_dump(const char *a_addr) { + int num = 1; + ban_record_t *l_rec = NULL, *l_tmp = NULL; + dap_string_t *l_res = dap_string_new(NULL); + pthread_rwlock_rdlock(&s_ban_list_lock); + if (a_addr) { + HASH_FIND_STR(s_ban_list, a_addr, l_rec); + if (l_rec) + s_dap_http_ban_list_client_dump_single(l_rec, l_res); + else + dap_string_append_printf(l_res, "Address %s is not banlisted", a_addr); + } else { + HASH_ITER(hh, s_ban_list, l_rec, l_tmp) { + dap_string_append_printf(l_res, "\t\t%d. ", num++); + s_dap_http_ban_list_client_dump_single(l_rec, l_res); + } } - int number = 1; - dap_http_ban_list_client_record_t *l_record = NULL, *tmp = NULL; - HASH_ITER(hh, s_ipv6_ban_list, l_record, tmp) { - char l_tm[85]; - char l_tm_ip[INET6_ADDRSTRLEN]; - dap_time_to_str_rfc822(l_tm, 85, l_record->ts_created); - dap_string_append_printf(a_str_out, "\t\t%d) %s\n" - "\t\t\tIP: %s\n" - "\t\t\tCreated: %s\n\n", - number++, dap_chain_hash_fast_to_str_static(&l_record->decree_hash), - inet_ntop(AF_INET6, &l_record->ip_v6, l_tm_ip, INET6_ADDRSTRLEN), l_tm); - } - pthread_rwlock_unlock(&s_ipv6_ban_list_rwlock); + pthread_rwlock_unlock(&s_ban_list_lock); + return dap_string_free(l_res, false); } int dap_http_ban_list_client_init() { - s_ipv4_ban_list = NULL; - s_ipv6_ban_list = NULL; - pthread_rwlock_init(&s_ipv4_ban_list_rwlock, NULL); - pthread_rwlock_init(&s_ipv6_ban_list_rwlock, NULL); return 0; } + void dap_http_ban_list_client_deinit() { - pthread_rwlock_destroy(&s_ipv4_ban_list_rwlock); - pthread_rwlock_destroy(&s_ipv6_ban_list_rwlock); + ban_record_t *l_rec = NULL, *l_tmp = NULL; + pthread_rwlock_wrlock(&s_ban_list_lock); + HASH_ITER(hh, s_ban_list, l_rec, l_tmp) { + HASH_DEL(s_ban_list, l_rec); + DAP_DELETE(l_rec); + } + pthread_rwlock_unlock(&s_ban_list_lock); + pthread_rwlock_destroy(&s_ban_list_lock); } diff --git a/net/server/http_server/http_client/include/dap_http_ban_list_client.h b/net/server/http_server/http_client/include/dap_http_ban_list_client.h index 9c5c51c16b2bee42d0d1cb452464092dd490a865..ba699f363d530cff3d3ab150509de65e2502cc1e 100644 --- a/net/server/http_server/http_client/include/dap_http_ban_list_client.h +++ b/net/server/http_server/http_client/include/dap_http_ban_list_client.h @@ -5,7 +5,7 @@ #include "dap_time.h" #include "dap_string.h" #include "uthash.h" -#ifdef WIN32 +#ifdef DAP_OS_WINDOWS #include <winsock2.h> #include <in6addr.h> #include <ws2tcpip.h> @@ -14,25 +14,11 @@ #include <arpa/inet.h> #endif -typedef struct dap_http_ban_list_client_record{ - dap_hash_fast_t decree_hash; - dap_time_t ts_created; - union { - struct in_addr ip_v4; - struct in6_addr ip_v6; - }; - UT_hash_handle hh; -}dap_http_ban_list_client_record_t; - int dap_http_ban_list_client_init(); void dap_http_ban_list_client_deinit(); -bool dap_http_ban_list_client_check_ipv4(struct in_addr); -void dap_http_ban_list_client_add_ipv4(struct in_addr, dap_hash_fast_t, dap_time_t); -void dap_http_ban_list_client_remove_ipv4(struct in_addr); -void dap_http_ban_list_client_ipv4_print(dap_string_t *a_str_out); +bool dap_http_ban_list_client_check(const char *a_addr, dap_hash_fast_t *a_decree_hash, dap_time_t *a_ts); +int dap_http_ban_list_client_add(const char *a_addr, dap_hash_fast_t a_decree_hash, dap_time_t a_ts); +int dap_http_ban_list_client_remove(const char *a_addr); +char *dap_http_ban_list_client_dump(const char *a_addr); -bool dap_http_ban_list_client_check_ipv6(struct in6_addr); -void dap_http_ban_list_client_add_ipv6(struct in6_addr, dap_hash_fast_t, dap_time_t); -void dap_http_ban_list_client_remove_ipv6(struct in6_addr); -void dap_http_ban_list_client_ipv6_print(dap_string_t *a_str_out);