1
1
Fork 0
mirror of https://github.com/oxen-io/lokinet synced 2023-12-14 06:53:00 +01:00

handle snode and clean up codepath for hooked dns

This commit is contained in:
Jeff Becker 2020-02-13 10:44:43 -05:00
parent e8f262ba1c
commit 9c30ff7a26
No known key found for this signature in database
GPG key ID: F357B3B42F6F9B05
5 changed files with 34 additions and 14 deletions

View file

@ -24,7 +24,7 @@ namespace llarp
/// handle a hooked message
virtual bool
HandleHookedDNSMessage(dns::Message&& query,
HandleHookedDNSMessage(Message query,
std::function< void(Message) > sendReply) = 0;
};

View file

@ -98,7 +98,7 @@ namespace llarp
bool
ExitEndpoint::HandleHookedDNSMessage(
dns::Message &&msg, std::function< void(dns::Message) > reply)
dns::Message msg, std::function< void(dns::Message) > reply)
{
if(msg.questions[0].qtype == dns::qTypePTR)
{

View file

@ -39,7 +39,7 @@ namespace llarp
ShouldHookDNSMessage(const dns::Message& msg) const override;
bool
HandleHookedDNSMessage(dns::Message&& msg,
HandleHookedDNSMessage(dns::Message msg,
std::function< void(dns::Message) >) override;
bool

View file

@ -391,9 +391,19 @@ namespace llarp
return false;
}
static dns::Message &
clear_dns_message(dns::Message &msg)
{
msg.authorities.resize(0);
msg.additional.resize(0);
msg.answers.resize(0);
msg.hdr_fields &= ~dns::flags_RCODENameError;
return msg;
}
bool
TunEndpoint::HandleHookedDNSMessage(
dns::Message &&msg, std::function< void(dns::Message) > reply)
dns::Message msg, std::function< void(dns::Message) > reply)
{
// llarp::LogInfo("Tun.HandleHookedDNSMessage ", msg.questions[0].qname, "
// of type", msg.questions[0].qtype);
@ -401,7 +411,23 @@ namespace llarp
if(msg.answers.size() > 0)
{
const auto &answer = msg.answers[0];
if(answer.HasCNameForTLD(".loki"))
if(answer.HasCNameForTLD(".snode"))
{
dns::Name_t qname;
llarp_buffer_t buf(answer.rData);
if(not dns::DecodeName(&buf, qname, true))
return false;
RouterID addr;
if(not addr.FromString(qname))
return false;
auto replyMsg =
std::make_shared< dns::Message >(clear_dns_message(msg));
return EnsurePathToSNode(
addr.as_array(), [=](const RouterID &, exit::BaseSession_ptr s) {
SendDNSReply(addr, s, replyMsg, reply, true, false);
});
}
else if(answer.HasCNameForTLD(".loki"))
{
dns::Name_t qname;
llarp_buffer_t buf(answer.rData);
@ -409,14 +435,8 @@ namespace llarp
return false;
service::Address addr;
if(not addr.FromString(qname))
{
LogError("bad name ", qname);
return false;
}
msg.authorities.resize(0);
msg.additional.resize(0);
msg.answers.resize(0);
msg.hdr_fields &= ~dns::flags_RCODENameError;
clear_dns_message(msg);
if(HasAddress(addr))
{
huint128_t ip = ObtainIPForAddr(addr, false);
@ -426,7 +446,7 @@ namespace llarp
}
else
{
auto replyMsg = std::make_shared< dns::Message >(std::move(msg));
auto replyMsg = std::make_shared< dns::Message >(msg);
using service::Address;
using service::OutboundContext;
return EnsurePathToService(

View file

@ -50,7 +50,7 @@ namespace llarp
bool
HandleHookedDNSMessage(
dns::Message&& query,
dns::Message query,
std::function< void(dns::Message) > sendreply) override;
void