Merge pull request #1645

9bd9906e Factor is_address_local code into a tools function (moneromooo-monero)
This commit is contained in:
Riccardo Spagni 2017-02-02 21:27:45 +02:00
commit 10b625079b
No known key found for this signature in database
GPG Key ID: 55432DF31CCD4FCD
4 changed files with 43 additions and 65 deletions

View File

@ -35,6 +35,7 @@ using namespace epee;
#include "util.h" #include "util.h"
#include "cryptonote_config.h" #include "cryptonote_config.h"
#include "net/http_client.h" // epee::net_utils::...
#ifdef WIN32 #ifdef WIN32
#include <windows.h> #include <windows.h>
@ -44,6 +45,7 @@ using namespace epee;
#include <sys/utsname.h> #include <sys/utsname.h>
#endif #endif
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include <boost/asio.hpp>
namespace tools namespace tools
@ -531,4 +533,39 @@ std::string get_nix_version_display_string()
boost::lock_guard<boost::mutex> lock(max_concurrency_lock); boost::lock_guard<boost::mutex> lock(max_concurrency_lock);
return max_concurrency; return max_concurrency;
} }
bool is_local_address(const std::string &address)
{
// extract host
epee::net_utils::http::url_content u_c;
if (!epee::net_utils::parse_url(address, u_c))
{
MWARNING("Failed to determine whether address '" << address << "' is local, assuming not");
return false;
}
if (u_c.host.empty())
{
MWARNING("Failed to determine whether address '" << address << "' is local, assuming not");
return false;
}
// resolve to IP
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(u_c.host, "");
boost::asio::ip::tcp::resolver::iterator i = resolver.resolve(query);
while (i != boost::asio::ip::tcp::resolver::iterator())
{
const boost::asio::ip::tcp::endpoint &ep = *i;
if (ep.address().is_loopback())
{
MDEBUG("Address '" << address << "' is local");
return true;
}
++i;
}
MDEBUG("Address '" << address << "' is not local");
return false;
}
} }

View File

@ -181,4 +181,6 @@ namespace tools
void set_max_concurrency(unsigned n); void set_max_concurrency(unsigned n);
unsigned get_max_concurrency(); unsigned get_max_concurrency();
bool is_local_address(const std::string &address);
} }

View File

@ -892,33 +892,6 @@ void simple_wallet::print_seed(std::string seed)
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
static bool is_local_daemon(const std::string &address) static bool is_local_daemon(const std::string &address)
{ {
// extract host
epee::net_utils::http::url_content u_c;
if (!epee::net_utils::parse_url(address, u_c))
{
LOG_PRINT_L1("Failed to determine whether daemon is local, assuming not");
return false;
}
if (u_c.host.empty())
{
LOG_PRINT_L1("Failed to determine whether daemon is local, assuming not");
return false;
}
// resolve to IP
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(u_c.host, "");
boost::asio::ip::tcp::resolver::iterator i = resolver.resolve(query);
while (i != boost::asio::ip::tcp::resolver::iterator())
{
const boost::asio::ip::tcp::endpoint &ep = *i;
if (ep.address().is_loopback())
return true;
++i;
}
return false;
} }
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
bool simple_wallet::init(const boost::program_options::variables_map& vm) bool simple_wallet::init(const boost::program_options::variables_map& vm)
@ -1182,9 +1155,9 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
// set --trusted-daemon if local // set --trusted-daemon if local
try try
{ {
if (is_local_daemon(m_wallet->get_daemon_address())) if (tools::is_local_address(m_wallet->get_daemon_address()))
{ {
LOG_PRINT_L1(tr("Daemon is local, assuming trusted")); MINFO(tr("Daemon is local, assuming trusted"));
m_trusted_daemon = true; m_trusted_daemon = true;
} }
} }

View File

@ -31,50 +31,16 @@
#include "include_base_utils.h" // LOG_PRINT_x #include "include_base_utils.h" // LOG_PRINT_x
#include "net/http_client.h" // epee::net_utils::... #include "common/util.h"
#include <boost/asio.hpp>
using namespace std; using namespace std;
namespace Monero { namespace Monero {
namespace Utils { namespace Utils {
// copy-pasted from simplewallet.
bool isAddressLocal(const std::string &address) bool isAddressLocal(const std::string &address)
{ {
// extract host return tools::is_local_address(address);
epee::net_utils::http::url_content u_c;
if (!epee::net_utils::parse_url(address, u_c))
{
LOG_PRINT_L1("Failed to determine whether daemon is local, assuming not");
return false;
}
if (u_c.host.empty())
{
LOG_PRINT_L1("Failed to determine whether daemon is local, assuming not");
return false;
}
// resolver::resolve can throw an exception
try {
// resolve to IP
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(u_c.host, "", boost::asio::ip::tcp::resolver::query::canonical_name);
boost::asio::ip::tcp::resolver::iterator i = resolver.resolve(query);
while (i != boost::asio::ip::tcp::resolver::iterator())
{
const boost::asio::ip::tcp::endpoint &ep = *i;
if (ep.address().is_loopback())
return true;
++i;
}
} catch (const boost::system::system_error &e) {
LOG_ERROR("Failed to resolve " << address << ", :" << e.what());
}
return false;
} }
} }