Files
utun2/tools/chatgui/src/invite_link.h
T

53 lines
3.1 KiB
C++

/* Qt-обёртка общего C-кодека src/chat/invite_link.h: decodeInviteLink переводит QString в UTF-8 и копирует результат.
* Принимается версия 0x04 с типами CHANNEL/SERVER; ошибка возвращается в InviteData.error.
* Успешный разбор не проверяет срок регистрации join_key/членство и не запускает подключение.
* Структуры Qt и C имеют одинаковые имена, но различное представление: не передавать их между API. */
#pragma once
#include <QString>
#include <QByteArray>
#include <QList>
#include <cstdint>
#include "../db/db_manager.h"
#define INVITE_LINK_VERSION 0x04
#define INVITE_KIND_CHANNEL 0
#define INVITE_KIND_SERVER 1
#define INVITE_PROTO_UDP 0x01
#define INVITE_PROTO_TCP 0x02
#define INVITE_PROTO_REALITY 0x04 // флаг reality-камуфляжа поверх TCP (reality-TCP = 0x06)
#define INVITE_SNAME_MAX 64
struct InviteAddr {
int family; // 4=IPv4, 6=IPv6
QByteArray address; // 4/16 сетевых байтов в зависимости от family.
quint16 port; // Порт в host byte order.
uint8_t socketId; // socket_id из ETCP
uint8_t proto; // INVITE_PROTO_*
};
/* Reality-параметры узла (node-global: одинаковы для всех reality-сокетов). */
struct InviteReality {
bool has = false; // При false остальные поля не используются.
QByteArray shortId; // 8 байт
QByteArray serverPubkey; // 32 байта
QByteArray version; // 3 байта
QString serverName; // UTF-8 SNI из общего кодека, преобразованный в QString.
};
struct InviteData {
uint8_t kind = INVITE_KIND_CHANNEL; // Тип определяет действие; секрет сервера остаётся в исходной ссылке.
uint64_t channelId = 0; // Числовой ID канала, не десятичная строка GUI.
uint64_t joinKey = 0; // 64-битный ключ входа (генерируется инвайтером)
QByteArray pubkey; // 32 байта X25519 connection-узла при успешном разборе.
QList<InviteAddr> addrs; // Проверенные общим кодеком адреса того же connection-узла.
QString password; // Декодированный UTF-8 пароль либо пустая строка.
QString error; // Пусто при успехе; иначе текст ошибки, остальные поля не использовать.
InviteReality reality; // Общие REALITY-параметры connection-узла.
};
// link передаётся целиком, без trim/исправления регистра; возвращённые Qt-поля владеют своими данными.
InviteData decodeInviteLink(const QString& link);