#include #include #include #include #include #include #include #include namespace llarp { namespace dht { PublishServiceJob::PublishServiceJob( const TXOwner& asker, const service::EncryptedIntroSet& introset_, AbstractContext* ctx, uint64_t relayOrder_) : TX(asker, asker, ctx) , relayOrder(relayOrder_) , introset(introset_) {} bool PublishServiceJob::Validate(const service::EncryptedIntroSet& value) const { if (value.derivedSigningKey != introset.derivedSigningKey) { llarp::LogWarn("publish introset acknowledgement acked a different service"); return false; } const llarp_time_t now = llarp::time_now_ms(); return value.Verify(now); } void PublishServiceJob::Start(const TXOwner& peer) { parent->DHTSendTo( peer.node.as_array(), new PublishIntroMessage(introset, peer.txid, false, relayOrder)); } void PublishServiceJob::SendReply() { parent->DHTSendTo(whoasked.node.as_array(), new GotIntroMessage({introset}, whoasked.txid)); } LocalPublishServiceJob::LocalPublishServiceJob( const TXOwner& peer, const PathID_t& fromID, uint64_t _txid, const service::EncryptedIntroSet& introset, AbstractContext* ctx, uint64_t relayOrder) : PublishServiceJob(peer, introset, ctx, relayOrder), localPath(fromID), txid(_txid) {} void LocalPublishServiceJob::SendReply() { auto path = parent->GetRouter()->pathContext().GetByUpstream(parent->OurKey().as_array(), localPath); if (!path) { llarp::LogWarn( "did not send reply for relayed dht request, no such local path " "for pathid=", localPath); return; } routing::DHTMessage msg; msg.M.emplace_back(new GotIntroMessage({introset}, txid)); if (!path->SendRoutingMessage(msg, parent->GetRouter())) { llarp::LogWarn( "failed to send routing message when informing result of dht " "request, pathid=", localPath); } } } // namespace dht } // namespace llarp