fix(chatgui): show measured NAT profile in member addresses

This commit is contained in:
evgeny committed 2026-10-17 23:18:57 +02:00
1 parent 3e29a7ca1c
commit a485b10e63
3 files changed
+32 -15

No files matched your search

+7 -15
View File
@@ -1,5 +1,6 @@
#include <QCoreApplication> #include <QCoreApplication>
#include "accountlist.h" #include "accountlist.h"
#include "addressprofiletext.h"
#include "accountdelegate.h" #include "accountdelegate.h"
#include "memberlistmodel.h" #include "memberlistmodel.h"
#include "avatars/avatargallery.h" #include "avatars/avatargallery.h"
@@ -34,19 +35,6 @@ static void memberDetailCb(const uint8_t* data, int len) {
g_detailTarget->onMemberDetailData(nodeId, data, len); g_detailTarget->onMemberDetailData(nodeId, data, len);
} }
static QString addrRoleStr(int t) {
switch (t) {
case 0: return "local";
case 1: return "public";
case 2: return "nat_eim";
case 3: return "nat_dependent";
case 4: return "NAT?";
case 5: return "contact_required";
case 6: return "EIM?";
default: return QString("?%1").arg(t);
}
}
QString AccountList::addrStr(const void* addr, int family) { QString AccountList::addrStr(const void* addr, int family) {
if (family == 4) { if (family == 4) {
const uint8_t* a = (const uint8_t*)addr; const uint8_t* a = (const uint8_t*)addr;
@@ -269,7 +257,8 @@ void AccountList::showMemberDetail(quint64 nodeId) {
sqlite3_stmt* na = nullptr; sqlite3_stmt* na = nullptr;
sqlite3_prepare_v2(d, sqlite3_prepare_v2(d,
"SELECT family, protocol, address, port, socket_id, addr_type FROM node_addresses WHERE node_id=?", "SELECT family, protocol, address, port, socket_id, addr_type, nat_mapping, nat_inbound, nat_source"
" FROM node_addresses WHERE node_id=?",
-1, &na, nullptr); -1, &na, nullptr);
if (na) { if (na) {
sqlite3_bind_int64(na, 1, (sqlite3_int64)nodeId); sqlite3_bind_int64(na, 1, (sqlite3_int64)nodeId);
@@ -283,6 +272,9 @@ void AccountList::showMemberDetail(quint64 nodeId) {
a.port = sqlite3_column_int(na, 3); a.port = sqlite3_column_int(na, 3);
a.socket_id = sqlite3_column_int(na, 4); a.socket_id = sqlite3_column_int(na, 4);
a.addr_type = sqlite3_column_int(na, 5); a.addr_type = sqlite3_column_int(na, 5);
a.nat_mapping = sqlite3_column_int(na, 6);
a.nat_inbound = sqlite3_column_int(na, 7);
a.nat_source = sqlite3_column_int(na, 8);
if (!a.addr.isEmpty()) m_detailAddrs.append(a); if (!a.addr.isEmpty()) m_detailAddrs.append(a);
} }
sqlite3_finalize(na); sqlite3_finalize(na);
@@ -414,7 +406,7 @@ void AccountList::updateDetailDisplay() {
.arg(a.ifname) .arg(a.ifname)
.arg(addrStr(a.addr.constData(), a.family)) .arg(addrStr(a.addr.constData(), a.family))
.arg(a.port) .arg(a.port)
.arg(addrRoleStr(a.addr_type))); .arg(addressProfileText(a.nat_mapping, a.nat_inbound, a.nat_source)));
} }
} }
+3
View File
@@ -22,6 +22,9 @@ struct DetailAddress {
int port; int port;
int socket_id; int socket_id;
int addr_type; int addr_type;
int nat_mapping;
int nat_inbound;
int nat_source;
QString ifname; QString ifname;
}; };
+22
View File
@@ -0,0 +1,22 @@
#pragma once
#include <QCoreApplication>
#include <QString>
#include "../../../src/routing_layer/address_profile.h"
// Показывает результат измерения отдельно от происхождения адреса (интерфейс или NAT).
inline QString addressProfileText(int mapping, int inbound, int source) {
if (source == ADDRESS_SOURCE_NONE) return QCoreApplication::translate("ChatGui", "NAT not determined");
QString text;
switch (mapping) {
case ADDRESS_MAP_UNCHANGED: text = QCoreApplication::translate("ChatGui", "No NAT"); break;
case ADDRESS_MAP_EIM: text = inbound == ADDRESS_IN_UNKNOWN ? "EIM?" : "EIM"; break;
case ADDRESS_MAP_DEPENDENT: return "DEPENDENT";
default: return "NAT?";
}
if (inbound == ADDRESS_IN_OPEN) text += QCoreApplication::translate("ChatGui", "; inbound open");
else if (inbound == ADDRESS_IN_CONTACT) text += QCoreApplication::translate("ChatGui", "; inbound filtered");
else if (mapping == ADDRESS_MAP_UNCHANGED) text += QCoreApplication::translate("ChatGui", "; inbound untested");
if (source == ADDRESS_SOURCE_STUN) text += " (STUN)";
return text;
}