feat: enhance DomainConnectRequest payload structure and logging details

This commit is contained in:
MayaTheShy
2025-11-08 18:31:47 -05:00
parent d63deb6f9b
commit 695a91c3e8

View File

@@ -577,31 +577,61 @@ void OverteClient::sendDomainConnectRequest() {
NLPacket packet(PacketType::DomainConnectRequest, PacketVersions::DomainConnectRequest_SocketTypes, true);
packet.setSequenceNumber(m_sequenceNumber++);
// Build payload using Qt wire format
// Build payload using Qt wire format (match Overte's NodeList.cpp structure exactly)
QtStream qs;
// UUID
// 1. UUID
qs.writeQUuidFromString(m_sessionUUID);
// Protocol signature (QByteArray)
// 2. Protocol signature (QByteArray)
auto protocolSig = NLPacket::computeProtocolVersionSignature();
qs.writeQByteArray(protocolSig);
// Hardware address (QString) - leave blank for now
std::string macAddr = ""; // leave empty if unknown
// 3. Hardware/MAC address (QString) - empty if unknown
std::string macAddr = "";
qs.writeQString(macAddr);
// Machine fingerprint (QString) - use session UUID as placeholder
// 4. Machine fingerprint (QString) - use session UUID as stable ID
qs.writeQString(m_sessionUUID);
// Timestamp (qint64) for HasTimestamp version stage
auto nowMs = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
qs.writeUInt64BE(static_cast<uint64_t>(nowMs));
// Reason (quint8) for HasReason stage - 0 = Unknown/Other
qs.writeUInt8(0);
// System info (compressed QByteArray) for HasCompressedSystemInfo
std::string sysJson = "{\"computer\":{\"OS\":\"Linux\"},\"cpus\":[{\"model\":\"Stardust\"}],\"nics\":[],\"displays\":[]}";
// 5. Compressed system info (QByteArray)
std::string sysJson = "{\"computer\":{\"OS\":\"Linux\"},\"cpus\":[{\"model\":\"Stardust\"}],\"memory\":4096,\"nics\":[],\"gpus\":[],\"displays\":[]}";
std::vector<uint8_t> sysBytes(sysJson.begin(), sysJson.end());
auto sysCompressed = qCompressLike(sysBytes, Z_BEST_SPEED);
qs.writeQByteArray(sysCompressed);
// Socket types (two quint8): public, local
qs.writeUInt8(0); // public
qs.writeUInt8(0); // local
// 6. Connect reason (quint8) - 0 = Unknown
qs.writeUInt8(0);
// 7. Previous connection uptime (quint64) - 0 for first connection
qs.writeUInt64BE(0);
// 8. Current timestamp in microseconds (quint64)
auto nowUs = std::chrono::duration_cast<std::chrono::microseconds>(
std::chrono::system_clock::now().time_since_epoch()).count();
qs.writeUInt64BE(static_cast<uint64_t>(nowUs));
// 9. Owner type (quint8) - 0 = Unknown
qs.writeUInt8(0);
// 10. Public socket: type (quint8) + address
qs.writeUInt8(0); // SocketType::Unknown
// Public IP and port (we don't know our public IP, use local)
qs.writeUInt32BE(0x7F000001); // 127.0.0.1 placeholder
qs.writeUInt16BE(0); // port 0 (unknown)
// 11. Local socket: type (quint8) + address
qs.writeUInt8(0); // SocketType::Unknown
// Local IP and port (use our bound UDP socket info)
qs.writeUInt32BE(0x7F000001); // 127.0.0.1
qs.writeUInt16BE(0); // ephemeral port (0 = unknown)
// 12. Node types of interest (QVector/QList of quint8)
// Write as Qt container: size (qint32) + elements
qs.writeInt32BE(0); // empty list for now
// 13. Place name (QString) - empty
qs.writeQString("");
// Append payload to packet
if (!qs.buf.empty()) packet.write(qs.buf.data(), qs.buf.size());
@@ -613,10 +643,9 @@ void OverteClient::sendDomainConnectRequest() {
std::cout << "[OverteClient] DomainConnectRequest sent (" << s << " bytes, seq=" << (m_sequenceNumber-1) << ")" << std::endl;
std::cout << "[OverteClient] Session UUID: " << m_sessionUUID << std::endl;
std::cout << "[OverteClient] Protocol signature: " << protocolSig.size() << " bytes (MD5)" << std::endl;
// Note: username is not sent in this packet; Overte uses signature-based auth.
// Hex dump first 48 bytes
// Hex dump first 64 bytes
std::cout << "[OverteClient] >>> NLPacket Hex: ";
for (size_t i = 0; i < std::min(size_t(48), data.size()); ++i) {
for (size_t i = 0; i < std::min(size_t(64), data.size()); ++i) {
printf("%02x ", data[i]);
}
std::cout << std::endl;