merged with upstream

This commit is contained in:
Ilya Kitaev 2016-04-26 13:46:20 +03:00
parent d500272fa8
commit 3dd4b4ccf9
5 changed files with 106 additions and 3 deletions

View file

@ -36,7 +36,8 @@ set(wallet_sources
api/wallet_manager.cpp api/wallet_manager.cpp
api/transaction_info.cpp api/transaction_info.cpp
api/transaction_history.cpp api/transaction_history.cpp
api/pending_transaction.cpp) api/pending_transaction.cpp
api/utils.cpp)
set(wallet_headers) set(wallet_headers)

79
src/wallet/api/utils.cpp Normal file
View file

@ -0,0 +1,79 @@
// Copyright (c) 2014-2016, The Monero Project
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
#include "include_base_utils.h" // LOG_PRINT_x
#include "net/http_client.h" // epee::net_utils::...
#include <boost/asio.hpp>
using namespace std;
namespace Bitmonero {
namespace Utils {
// copy-pasted from simplewallet.
bool isAddressLocal(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;
}
}
} // namespace

View file

@ -56,7 +56,7 @@ string Wallet::displayAmount(uint64_t amount)
///////////////////////// WalletImpl implementation //////////////////////// ///////////////////////// WalletImpl implementation ////////////////////////
WalletImpl::WalletImpl(bool testnet) WalletImpl::WalletImpl(bool testnet)
:m_wallet(nullptr), m_status(Wallet::Status_Ok) :m_wallet(nullptr), m_status(Wallet::Status_Ok), m_trustedDaemon(false)
{ {
m_wallet = new tools::wallet2(testnet); m_wallet = new tools::wallet2(testnet);
m_history = new TransactionHistoryImpl(this); m_history = new TransactionHistoryImpl(this);
@ -237,6 +237,10 @@ bool WalletImpl::init(const std::string &daemon_address, uint64_t upper_transact
clearStatus(); clearStatus();
try { try {
m_wallet->init(daemon_address, upper_transaction_size_limit); m_wallet->init(daemon_address, upper_transaction_size_limit);
if (Utils::isAddressLocal(daemon_address)) {
this->setTrustedDaemon(true);
}
} catch (const std::exception &e) { } catch (const std::exception &e) {
LOG_ERROR("Error initializing wallet: " << e.what()); LOG_ERROR("Error initializing wallet: " << e.what());
m_status = Status_Error; m_status = Status_Error;
@ -315,7 +319,8 @@ PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, uint64
try { try {
transaction->m_pending_tx = m_wallet->create_transactions(dsts, fake_outs_count, 0 /* unlock_time */, 0 /* unused fee arg*/, extra); transaction->m_pending_tx = m_wallet->create_transactions(dsts, fake_outs_count, 0 /* unlock_time */,
0 /* unused fee arg*/, extra, m_trustedDaemon);
} catch (const tools::error::daemon_busy&) { } catch (const tools::error::daemon_busy&) {
// TODO: make it translatable with "tr"? // TODO: make it translatable with "tr"?
@ -404,6 +409,16 @@ bool WalletImpl::connectToDaemon()
return result; return result;
} }
void WalletImpl::setTrustedDaemon(bool arg)
{
m_trustedDaemon = arg;
}
bool WalletImpl::trustedDaemon() const
{
return m_trustedDaemon;
}
void WalletImpl::clearStatus() void WalletImpl::clearStatus()
{ {
m_status = Status_Ok; m_status = Status_Ok;

View file

@ -62,6 +62,8 @@ public:
bool store(const std::string &path); bool store(const std::string &path);
bool init(const std::string &daemon_address, uint64_t upper_transaction_size_limit); bool init(const std::string &daemon_address, uint64_t upper_transaction_size_limit);
bool connectToDaemon(); bool connectToDaemon();
void setTrustedDaemon(bool arg);
bool trustedDaemon() const;
uint64_t balance() const; uint64_t balance() const;
uint64_t unlockedBalance() const; uint64_t unlockedBalance() const;
bool refresh(); bool refresh();
@ -81,6 +83,7 @@ private:
std::string m_errorString; std::string m_errorString;
std::string m_password; std::string m_password;
TransactionHistoryImpl * m_history; TransactionHistoryImpl * m_history;
bool m_trustedDaemon;
}; };

View file

@ -38,6 +38,9 @@
// Public interface for libwallet library // Public interface for libwallet library
namespace Bitmonero { namespace Bitmonero {
namespace Utils {
bool isAddressLocal(const std::string &hostaddr);
}
/** /**
* @brief Transaction-like interface for sending money * @brief Transaction-like interface for sending money
*/ */
@ -117,6 +120,8 @@ struct Wallet
virtual bool store(const std::string &path) = 0; virtual bool store(const std::string &path) = 0;
virtual bool init(const std::string &daemon_address, uint64_t upper_transaction_size_limit) = 0; virtual bool init(const std::string &daemon_address, uint64_t upper_transaction_size_limit) = 0;
virtual bool connectToDaemon() = 0; virtual bool connectToDaemon() = 0;
virtual void setTrustedDaemon(bool arg) = 0;
virtual bool trustedDaemon() const = 0;
virtual uint64_t balance() const = 0; virtual uint64_t balance() const = 0;
virtual uint64_t unlockedBalance() const = 0; virtual uint64_t unlockedBalance() const = 0;
static std::string displayAmount(uint64_t amount); static std::string displayAmount(uint64_t amount);