#include "findname.hpp" #include #include #include "gotname.hpp" #include #include #include #include namespace llarp::dht { FindNameMessage::FindNameMessage(const Key_t& from, Key_t namehash, uint64_t txid) : AbstractDHTMessage(from), NameHash(std::move(namehash)), TxID(txid) {} void FindNameMessage::bt_encode(oxenc::bt_dict_producer& btdp) const { try { btdp.append("A", "N"); btdp.append("H", NameHash.ToView()); btdp.append("T", TxID); } catch (...) { log::error(dht_cat, "Error: FindNameMessage failed to bt encode contents!"); } } bool FindNameMessage::decode_key(const llarp_buffer_t& key, llarp_buffer_t* val) { if (key.startswith("H")) { return NameHash.BDecode(val); } if (key.startswith("T")) { return bencode_read_integer(val, &TxID); } return bencode_discard(val); } bool FindNameMessage::handle_message(struct llarp_dht_context* dht, std::vector& replies) const { (void)replies; auto r = dht->impl->GetRouter(); if (pathID.IsZero() or not r->IsServiceNode()) return false; r->RpcClient()->LookupLNSNameHash(NameHash, [r, pathID = pathID, TxID = TxID](auto maybe) { auto path = r->pathContext().GetPathForTransfer(pathID); if (path == nullptr) return; routing::DHTMessage msg; if (maybe.has_value()) { msg.M.emplace_back(new GotNameMessage(dht::Key_t{}, TxID, *maybe)); } else { msg.M.emplace_back(new GotNameMessage(dht::Key_t{}, TxID, service::EncryptedName{})); } path->SendRoutingMessage(msg, r); }); return true; } } // namespace llarp::dht