added unmapexit and listexit endpoints

pull/2121/head
dan 1 year ago
parent d37398a915
commit d3e69fe3c5

@ -223,11 +223,11 @@ main(int argc, char* argv[])
} }
if (options.vpnUp) if (options.vpnUp)
{ {
nlohmann::json opts{{"exit", options.exitAddress}, {"token", options.token}}; nlohmann::json opts{{"address", options.exitAddress}, {"token", options.token}};
if (options.range) if (options.range)
opts["range"] = *options.range; opts["IP_range"] = *options.range;
auto maybe_result = OMQ_Request(omq, connectionID, "llarp.exit", std::move(opts)); auto maybe_result = OMQ_Request(omq, connectionID, "llarp.map_exit", std::move(opts));
if (not maybe_result) if (not maybe_result)
return exit_error("could not add exit"); return exit_error("could not add exit");

@ -13,6 +13,7 @@
#include <oxenmq/address.h> #include <oxenmq/address.h>
#include <oxen/log/omq_logger.hpp> #include <oxen/log/omq_logger.hpp>
#include <unordered_map> #include <unordered_map>
#include <vector>
namespace llarp::rpc namespace llarp::rpc
{ {
@ -158,29 +159,25 @@ namespace llarp::rpc
} request; } request;
}; };
// RPC: exit // RPC: map_exit
// Seems like this adds an exit node? // Map a new connection to an exit node
//
// Note: ask Jason about the internals of this
// //
// Inputs: // Inputs:
// "endpoint" : // "address" : ID of endpoint to map
// "unmap" : if true, unmaps connection to exit node (bool)
// "range" : IP range to map to exit node // "range" : IP range to map to exit node
// "token" : // "token" : auth token
// //
// Returns: // Returns:
// //
struct Exit : RPCRequest struct MapExit : RPCRequest
{ {
static constexpr auto name = "exit"sv; static constexpr auto name = "map_exit"sv;
struct request_parameters struct request_parameters
{ {
std::string address; std::string address;
std::string ip_range; std::vector<std::string> ip_range;
std::string token; std::string token;
bool unmap;
} request; } request;
void void
@ -246,6 +243,38 @@ namespace llarp::rpc
} }
}; };
// RPC: list_exits
// List all currently mapped exit node connections
//
// Inputs: none
//
// Returns:
//
struct ListExits : NoArgs
{
static constexpr auto name = "list_exits"sv;
};
// RPC: unmap_exit
// Unmap a connection to an exit node
//
// Inputs:
// "endpoint" : ID of endpoint to map
// "range" : IP range to map to exit node
// "token" : auth token
//
// Returns:
//
struct UnmapExit : RPCRequest
{
static constexpr auto name = "unmap_exit"sv;
struct request_parameters
{
std::vector<std::string> ip_range;
} request;
};
// RPC: dns_query // RPC: dns_query
// Attempts to query endpoint by domain name // Attempts to query endpoint by domain name
// //
@ -301,7 +330,9 @@ namespace llarp::rpc
QuicConnect, QuicConnect,
QuicListener, QuicListener,
LookupSnode, LookupSnode,
Exit, MapExit,
ListExits,
UnmapExit,
DNSQuery, DNSQuery,
Config>; Config>;

@ -1,4 +1,5 @@
#include "rpc_request_parser.hpp" #include "rpc_request_parser.hpp"
#include "llarp/rpc/rpc_request_definitions.hpp"
#include "param_parser.hpp" #include "param_parser.hpp"
#include <string_view> #include <string_view>
#include <llarp/config/config.hpp> #include <llarp/config/config.hpp>
@ -51,18 +52,25 @@ namespace llarp::rpc
} }
void void
parse_request(Exit& exit, rpc_input input) parse_request(MapExit& mapexit, rpc_input input)
{ {
get_values( get_values(
input, input,
"address", "address",
exit.request.address, mapexit.request.address,
"IP_range", "IP_range",
exit.request.ip_range, mapexit.request.ip_range,
"token", "token",
exit.request.token, mapexit.request.token);
"unmap", }
exit.request.unmap);
void
parse_request(UnmapExit& unmapexit, rpc_input input)
{
get_values(
input,
"IP_range",
unmapexit.request.ip_range);
} }
void void

@ -22,7 +22,9 @@ namespace llarp::rpc
void void
parse_request(LookupSnode& lookupsnode, rpc_input input); parse_request(LookupSnode& lookupsnode, rpc_input input);
void void
parse_request(Exit& exit, rpc_input input); parse_request(MapExit& mapexit, rpc_input input);
void
parse_request(UnmapExit& unmapexit, rpc_input input);
void void
parse_request(DNSQuery& dnsquery, rpc_input input); parse_request(DNSQuery& dnsquery, rpc_input input);
void void

@ -1,6 +1,8 @@
#include "rpc_server.hpp" #include "rpc_server.hpp"
#include "llarp/rpc/rpc_request_definitions.hpp"
#include "rpc_request.hpp" #include "rpc_request.hpp"
#include "llarp/service/address.hpp" #include "llarp/service/address.hpp"
#include <exception>
#include <llarp/router/route_poker.hpp> #include <llarp/router/route_poker.hpp>
#include <llarp/config/config.hpp> #include <llarp/config/config.hpp>
#include <llarp/config/ini.hpp> #include <llarp/config/ini.hpp>
@ -16,6 +18,7 @@
#include <llarp/service/name.hpp> #include <llarp/service/name.hpp>
#include <llarp/router/abstractrouter.hpp> #include <llarp/router/abstractrouter.hpp>
#include <llarp/dns/dns.hpp> #include <llarp/dns/dns.hpp>
#include <vector>
#include <oxenmq/fmt.h> #include <oxenmq/fmt.h>
namespace llarp::rpc namespace llarp::rpc
@ -346,22 +349,59 @@ namespace llarp::rpc
}); });
} }
// get a ptr/ref to something in the lokinet service endpoint
// call some fxn like "obtain_exit_to" and pass exit info
// plus optional additional info on how to map
// plus callback to report when this happens
// callback is called much later (1-2s) when exit node flow is secured
// exit is now ready to use
//
void void
RPCServer::invoke(Exit& exit) RPCServer::invoke(MapExit& mapexit)
{ {
Exit exit_request; MapExit exit_request;
// steal replier from exit RPC endpoint // steal replier from exit RPC endpoint
exit_request.replier.emplace(std::move(*exit.replier)); exit_request.replier.emplace(std::move(*mapexit.replier));
//
//
//
//
//
}
void
RPCServer::invoke(ListExits& listexits)
{
if (not m_Router.hiddenServiceContext().hasEndpoints())
listexits.response = CreateJSONError("No mapped endpoints found");
else
listexits.response = CreateJSONResponse(
m_Router.hiddenServiceContext().GetDefault()->ExtractStatus()["m_ExitMap"]);
}
void
RPCServer::invoke(UnmapExit& unmapexit)
{
if (unmapexit.request.ip_range.empty())
{
unmapexit.response = CreateJSONError("No IP range provided");
return;
}
std::vector<IPRange> range{};
for (auto& ip : unmapexit.request.ip_range)
{
try {
range.push_back(IPRange::StringInit(ip));
} catch (std::exception& e) {
unmapexit.response = CreateJSONError(e.what());
}
}
try {
m_Router.routePoker()->Down();
for (auto& ip : range)
m_Router.hiddenServiceContext().GetDefault()->UnmapExitRange(ip);
} catch (std::exception& e) {
unmapexit.response = CreateJSONError("Unable to unmap to given range");
}
IPRange range = IPRange::StringInit(exit.request.ip_range); unmapexit.response = CreateJSONResponse("OK");
service::Address exitAddr{exit.request.address};
} }
void void

@ -103,7 +103,11 @@ namespace llarp::rpc
void void
invoke(LookupSnode& lookupsnode); invoke(LookupSnode& lookupsnode);
void void
invoke(Exit& exit); invoke(MapExit& mapexit);
void
invoke(ListExits& listexits);
void
invoke(UnmapExit& unmapexit);
void void
invoke(DNSQuery& dnsquery); invoke(DNSQuery& dnsquery);
void void

Loading…
Cancel
Save