Browse Source

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

stream-multiview
evgeny 7 days ago
parent
commit
a485b10e63
  1. 22
      tools/chatgui/src/accountlist.cpp
  2. 3
      tools/chatgui/src/accountlist.h
  3. 22
      tools/chatgui/src/addressprofiletext.h

22
tools/chatgui/src/accountlist.cpp

@ -1,5 +1,6 @@
#include <QCoreApplication>
#include "accountlist.h"
#include "addressprofiletext.h"
#include "accountdelegate.h"
#include "memberlistmodel.h"
#include "avatars/avatargallery.h"
@ -34,19 +35,6 @@ static void memberDetailCb(const uint8_t* data, int 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) {
if (family == 4) {
const uint8_t* a = (const uint8_t*)addr;
@ -269,7 +257,8 @@ void AccountList::showMemberDetail(quint64 nodeId) {
sqlite3_stmt* na = nullptr;
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);
if (na) {
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.socket_id = sqlite3_column_int(na, 4);
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);
}
sqlite3_finalize(na);
@ -414,7 +406,7 @@ void AccountList::updateDetailDisplay() {
.arg(a.ifname)
.arg(addrStr(a.addr.constData(), a.family))
.arg(a.port)
.arg(addrRoleStr(a.addr_type)));
.arg(addressProfileText(a.nat_mapping, a.nat_inbound, a.nat_source)));
}
}

3
tools/chatgui/src/accountlist.h

@ -22,6 +22,9 @@ struct DetailAddress {
int port;
int socket_id;
int addr_type;
int nat_mapping;
int nat_inbound;
int nat_source;
QString ifname;
};

22
tools/chatgui/src/addressprofiletext.h

@ -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;
}
Loading…
Cancel
Save