From 695a91c3e81307d2bd79a06eab8b1cbcd5ab77ac Mon Sep 17 00:00:00 2001 From: MayaTheShy Date: Sat, 8 Nov 2025 18:31:47 -0500 Subject: [PATCH] feat: enhance DomainConnectRequest payload structure and logging details --- src/OverteClient.cpp | 67 +++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 19 deletions(-) diff --git a/src/OverteClient.cpp b/src/OverteClient.cpp index 6d6ef5c..0027242 100644 --- a/src/OverteClient.cpp +++ b/src/OverteClient.cpp @@ -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::system_clock::now().time_since_epoch()).count(); - qs.writeUInt64BE(static_cast(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 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::system_clock::now().time_since_epoch()).count(); + qs.writeUInt64BE(static_cast(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;