From 89b1a0144856146c7c575d5bad59af823b1888d3 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 13 Jul 2026 09:37:46 +0300 Subject: [PATCH] invite+clipboard+conn_mgr: sock_meta for alien nodes, clipboard fix, bg_ping fix - chat_core_connect_from_invite: add TOPO_SOCKMETA4 (id=0, UNKNOWN, UNKNOWN) so cm_has_direct_ip/cm_start_phase_direct can match socket_id=0 addr - conn_mgr: cm_bg_ping_timer_cb reads real addr from nq->node->v4_addrs instead of NULL; added cm_bg_ping_noop_cb per required etcp_send_ping_to_socket - invitedialog: set both QClipboard::Clipboard and Selection on Linux/X11 --- src/conn_mgr.c | 19 +++++++++++++++++-- tools/chatgui/src/invitedialog.cpp | 5 ++++- tools/chatgui/transport/chat_core.c | 5 +++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/conn_mgr.c b/src/conn_mgr.c index 36f03c1f..78e6b145 100644 --- a/src/conn_mgr.c +++ b/src/conn_mgr.c @@ -914,6 +914,11 @@ static void cm_handle_disconnect(struct CONN_MGR* mgr, uint64_t node_id) { DEBUG_INFO(DEBUG_CATEGORY_GENERAL, "conn_mgr: remote disconnect from 0x%016llx", (unsigned long long)node_id); } +static void cm_bg_ping_noop_cb(int success, uint16_t rtt, void* arg, uint64_t nonce, + const uint8_t* resp_data, size_t resp_data_len) { + (void)success; (void)rtt; (void)arg; (void)nonce; (void)resp_data; (void)resp_data_len; +} + static void cm_bg_ping_timer_cb(void* arg) { struct CONN_MGR* mgr = (struct CONN_MGR*)arg; struct TOPO_GROUP* group = topo_groups_get_default(mgr->instance->topo_groups); @@ -952,8 +957,18 @@ static void cm_bg_ping_timer_cb(void* arg) { while (l) { if (l->initialized && l->link_status) { has_active = 1; break; } l = l->next; } } if (!has_active) { - etcp_send_ping(mgr->instance, nq->node->public_key, NULL, CONN_PROBE_TIMEOUT_MS, - NULL, NULL, NULL, 0); + for (const struct TOPO_ADDR4* a = nq->node->v4_addrs; a; a = a->next) { + if (a->type != TOPO_ADDR_REAL && a->type != TOPO_ADDR_NAT) continue; + struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; + memcpy(&sin.sin_addr.s_addr, a->addr, 4); sin.sin_port = htons(a->port); + struct sockaddr_storage sa; memcpy(&sa, &sin, sizeof(sin)); + struct ETCP_SOCKET* s = mgr->instance->etcp_sockets; + while (s) { if (s->local_addr.ss_family == AF_INET) break; s = s->next; } + if (!s) break; + etcp_send_ping_to_socket(mgr->instance, s, nq->node->public_key, &sa, + CONN_PROBE_TIMEOUT_MS, cm_bg_ping_noop_cb, NULL, NULL, 0); + break; + } } } mgr->bg_ping_cursor++; diff --git a/tools/chatgui/src/invitedialog.cpp b/tools/chatgui/src/invitedialog.cpp index 9c2fbcfc..3fb48255 100644 --- a/tools/chatgui/src/invitedialog.cpp +++ b/tools/chatgui/src/invitedialog.cpp @@ -26,7 +26,10 @@ InviteDialog::InviteDialog(const QString& link, QWidget* parent) auto *btnLayout = new QHBoxLayout(); auto *copyBtn = new QPushButton("Скопировать", this); connect(copyBtn, &QPushButton::clicked, this, [this, linkEdit]() { - QApplication::clipboard()->setText(m_link); + QClipboard* cb = QApplication::clipboard(); + cb->setText(m_link, QClipboard::Clipboard); + if (cb->supportsSelection()) + cb->setText(m_link, QClipboard::Selection); linkEdit->setFocus(); }); btnLayout->addWidget(copyBtn); diff --git a/tools/chatgui/transport/chat_core.c b/tools/chatgui/transport/chat_core.c index 9da541e7..eaa848f6 100644 --- a/tools/chatgui/transport/chat_core.c +++ b/tools/chatgui/transport/chat_core.c @@ -16,6 +16,7 @@ #include "../../../src/topo_group.h" #include "../../../src/topo_node.h" #include "../../../src/conn_mgr.h" +#include "../../../src/etcp_connections.h" #include "../../../src/secure_channel.h" #include "../../../lib/u_async.h" #include "../../../lib/ll_queue.h" @@ -641,6 +642,10 @@ void chat_core_connect_from_invite(struct chat_invite* inv) { } ni->v4_addrs = addrs_head; + /* alien-узел: sock_meta с неизвестной конфигурацией цели */ + struct TOPO_SOCKMETA4* sm = memory_pool_alloc(group->instance->topo_groups->v4_sock_meta_pool); + if (sm) { sm->id = 0; sm->config_type = CFG_SERVER_TYPE_UNKNOWN; sm->nat_type = NAT_TYPE_UNKNOWN; sm->next = NULL; ni->v4_sock_meta = sm; } + nq->node = ni; topo_node_ref(ni); nq->hash_node_id = node_id; nq->alien = 0; nq->dirty = 0; nq->last_ver = 0;