@ -1,7 +1,6 @@
# include <llarp/dns_dotlokilookup.hpp>
# include <llarp/handlers/tun.hpp>
# include <llarp/service/context.hpp>
# include <llarp/net.hpp>
std : : string const default_chars =
" abcdefghijklmnaoqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 " ;
@ -146,13 +145,13 @@ split(std::string str)
while ( ( pos = s . find ( " . " ) ) ! = std : : string : : npos )
{
token = s . substr ( 0 , pos ) ;
// llarp::LogInfo("token [", token, "]");
// llarp::LogInfo("token [", token, "]");
tokens . push_back ( token ) ;
s . erase ( 0 , pos + 1 ) ;
}
token = s . substr ( 0 , pos ) ;
tokens . push_back ( token ) ;
// llarp::LogInfo("token [", token, "]");
// llarp::LogInfo("token [", token, "]");
return tokens ;
}
@ -181,32 +180,48 @@ ReverseHandlerIter(struct llarp::service::Context::endpoint_iter *endpointCfg)
std : : string checkStr ( tunEndpoint - > tunif . ifaddr ) ;
std : : vector < std : : string > tokensSearch = split ( context - > lName ) ;
std : : vector < std : : string > tokensCheck = split ( checkStr ) ;
// well the tunif is just one ip on a network range...
// support "b._dns-sd._udp.0.0.200.10.in-addr.arpa"
size_t searchTokens = tokensSearch . size ( ) ;
std : : string searchIp = tokensSearch [ searchTokens - 3 ] + " . " + tokensSearch [ searchTokens - 4 ] + " . "
+ tokensSearch [ searchTokens - 5 ] + " . " + tokensSearch [ searchTokens - 6 ] ;
// support "b._dns-sd._udp.0.0.200.10.in-addr.arpa"
size_t searchTokens = tokensSearch . size ( ) ;
std : : string searchIp = tokensSearch [ searchTokens - 3 ] + " . "
+ tokensSearch [ searchTokens - 4 ] + " . " + tokensSearch [ searchTokens - 5 ]
+ " . " + tokensSearch [ searchTokens - 6 ] ;
std : : string checkIp = tokensCheck [ 0 ] + " . " + tokensCheck [ 1 ] + " . "
+ tokensCheck [ 2 ] + " . " + tokensCheck [ 3 ] ;
llarp : : LogDebug ( searchIp , " vs " , checkIp ) ;
llarp : : IPRange range = llarp : : iprange_ipv4 ( stoi ( tokensCheck [ 0 ] ) , stoi ( tokensCheck [ 1 ] ) , stoi ( tokensCheck [ 2 ] ) , stoi ( tokensCheck [ 3 ] ) , tunEndpoint - > tunif . netmask ) ; // create range
llarp : : IPRange range = llarp : : iprange_ipv4 (
stoi ( tokensCheck [ 0 ] ) , stoi ( tokensCheck [ 1 ] ) , stoi ( tokensCheck [ 2 ] ) ,
stoi ( tokensCheck [ 3 ] ) , tunEndpoint - > tunif . netmask ) ; // create range
// hack atm to work around limitations in ipaddr_ipv4_bits and llarp::IPRange
llarp : : huint32_t searchIPv4_fixed = llarp : : ipaddr_ipv4_bits ( stoi ( tokensSearch [ searchTokens - 6 ] ) , stoi ( tokensSearch [ searchTokens - 5 ] ) , stoi ( tokensSearch [ searchTokens - 4 ] ) , stoi ( tokensSearch [ searchTokens - 3 ] ) ) ; // create ip (llarp::Addr is untrustworthy atm)
llarp : : huint32_t searchIPv4_search = llarp : : ipaddr_ipv4_bits ( stoi ( tokensSearch [ searchTokens - 3 ] ) , stoi ( tokensSearch [ searchTokens - 4 ] ) , stoi ( tokensSearch [ searchTokens - 5 ] ) , stoi ( tokensSearch [ searchTokens - 6 ] ) ) ; // create ip (llarp::Addr is untrustworthy atm)
llarp : : huint32_t searchIPv4_fixed = llarp : : ipaddr_ipv4_bits (
stoi ( tokensSearch [ searchTokens - 6 ] ) ,
stoi ( tokensSearch [ searchTokens - 5 ] ) ,
stoi ( tokensSearch [ searchTokens - 4 ] ) ,
stoi ( tokensSearch [ searchTokens
- 3 ] ) ) ; // create ip (llarp::Addr is untrustworthy atm)
llarp : : huint32_t searchIPv4_search = llarp : : ipaddr_ipv4_bits (
stoi ( tokensSearch [ searchTokens - 3 ] ) ,
stoi ( tokensSearch [ searchTokens - 4 ] ) ,
stoi ( tokensSearch [ searchTokens - 5 ] ) ,
stoi ( tokensSearch [ searchTokens
- 6 ] ) ) ; // create ip (llarp::Addr is untrustworthy atm)
//bool inRange = range.Contains(searchAddr.xtohl());
// bool inRange = range.Contains(searchAddr.xtohl());
bool inRange = range . Contains ( searchIPv4_search ) ;
llarp : : Addr searchAddr ( searchIp ) ;
llarp : : Addr checkAddr ( checkIp ) ;
llarp : : LogDebug ( searchAddr , " vs " , range . ToString ( ) , " = " , inRange ? " inRange " : " not match " ) ;
if ( inRange )
llarp : : LogDebug ( searchAddr , " vs " , range . ToString ( ) , " = " ,
inRange ? " inRange " : " not match " ) ;
if ( inRange )
{
llarp : : service : : Address addr = tunEndpoint - > ObtainAddrForIP ( searchIPv4_fixed ) ;
if ( addr . ToString ( ) = = " yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy.loki " )
llarp : : service : : Address addr =
tunEndpoint - > ObtainAddrForIP ( searchIPv4_fixed ) ;
if ( addr . ToString ( )
= = " yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy.loki " )
{
write404_dnss_response ( context - > from ,
( dnsd_question_request * ) context - > request ) ;
@ -214,7 +229,7 @@ ReverseHandlerIter(struct llarp::service::Context::endpoint_iter *endpointCfg)
else
{
writesend_dnss_revresponse ( addr . ToString ( ) , context - > from ,
( dnsd_question_request * ) context - > request ) ;
( dnsd_question_request * ) context - > request ) ;
}
return false ;
}
@ -268,9 +283,10 @@ llarp_dotlokilookup_handler(std::string name, const struct sockaddr *from,
{
llarp : : LogInfo ( " Reverse is not ours " ) ;
}
} else
if ( ( lName . length ( ) > 5 & & lName . substr ( lName . length ( ) - 5 , 5 ) = = " .loki " )
| | ( lName . length ( ) > 6 & & lName . substr ( lName . length ( ) - 6 , 6 ) = = " .loki. " ) )
}
else if ( ( lName . length ( ) > 5 & & lName . substr ( lName . length ( ) - 5 , 5 ) = = " .loki " )
| | ( lName . length ( ) > 6
& & lName . substr ( lName . length ( ) - 6 , 6 ) = = " .loki. " ) )
{
llarp : : LogInfo ( " Detect Loki Lookup for " , lName ) ;
auto cache_check = loki_tld_lookup_cache . find ( lName ) ;