diff options
author | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2022-08-18 07:14:45 +0000 |
---|---|---|
committer | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2022-08-18 19:29:03 +0000 |
commit | a0985044d926383fba0272cc08617ce8b3f56316 (patch) | |
tree | 04739d330cdd3ff88291ae9d8f35d572b6a4632e | |
parent | allow exporting outputs in chunks (diff) | |
download | monero-a0985044d926383fba0272cc08617ce8b3f56316.tar.xz |
wallet2: better test on whether to allow output import
Being offline is not a good enough heuristic, so we keep track
of whether the wallet ever refreshed from a daemon, which is a
lot better, and probably the best we can do without manual user
designation (which would break existing cold wallet setups till
the user designates those wallets)
-rw-r--r-- | src/wallet/wallet2.cpp | 11 | ||||
-rw-r--r-- | src/wallet/wallet2.h | 20 | ||||
-rwxr-xr-x | tests/functional_tests/cold_signing.py | 9 |
3 files changed, 34 insertions, 6 deletions
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 05d86a817..8be4aabb4 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -1218,7 +1218,8 @@ wallet2::wallet2(network_type nettype, uint64_t kdf_rounds, bool unattended, std m_export_format(ExportFormat::Binary), m_load_deprecated_formats(false), m_credits_target(0), - m_enable_multisig(false) + m_enable_multisig(false), + m_has_ever_refreshed_from_node(false) { set_rpc_client_secret_key(rct::rct2sk(rct::skGen())); } @@ -3535,6 +3536,8 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo throw std::runtime_error("proxy exception in refresh thread"); } + m_has_ever_refreshed_from_node = true; + if(!first && blocks_start_height == next_blocks_start_height) { m_node_rpc_proxy.set_height(m_blockchain.size()); @@ -13175,7 +13178,8 @@ size_t wallet2::import_outputs(const std::tuple<uint64_t, uint64_t, std::vector< { PERF_TIMER(import_outputs); - THROW_WALLET_EXCEPTION_IF(!m_offline, error::wallet_internal_error, "Hot wallets cannot import outputs"); + THROW_WALLET_EXCEPTION_IF(m_has_ever_refreshed_from_node, error::wallet_internal_error, + "Hot wallets cannot import outputs"); // we can now import piecemeal const size_t offset = std::get<0>(outputs); @@ -13254,7 +13258,8 @@ size_t wallet2::import_outputs(const std::tuple<uint64_t, uint64_t, std::vector< { PERF_TIMER(import_outputs); - THROW_WALLET_EXCEPTION_IF(!m_offline, error::wallet_internal_error, "Hot wallets cannot import outputs"); + THROW_WALLET_EXCEPTION_IF(m_has_ever_refreshed_from_node, error::wallet_internal_error, + "Hot wallets cannot import outputs"); // we can now import piecemeal const size_t offset = std::get<0>(outputs); diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index e684505f6..1f84458a6 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -1229,11 +1229,17 @@ private: if(ver < 29) return; a & m_rpc_client_secret_key; + if(ver < 30) + { + m_has_ever_refreshed_from_node = false; + return; + } + a & m_has_ever_refreshed_from_node; } BEGIN_SERIALIZE_OBJECT() MAGIC_FIELD("monero wallet cache") - VERSION_FIELD(0) + VERSION_FIELD(1) FIELD(m_blockchain) FIELD(m_transfers) FIELD(m_account_public_address) @@ -1259,6 +1265,12 @@ private: FIELD(m_device_last_key_image_sync) FIELD(m_cold_key_images) FIELD(m_rpc_client_secret_key) + if (version < 1) + { + m_has_ever_refreshed_from_node = false; + return true; + } + FIELD(m_has_ever_refreshed_from_node) END_SERIALIZE() /*! @@ -1471,7 +1483,7 @@ private: // Import/Export wallet data std::tuple<uint64_t, uint64_t, std::vector<tools::wallet2::exported_transfer_details>> export_outputs(bool all = false, uint32_t start = 0, uint32_t count = 0xffffffff) const; - std::string export_outputs_to_str(bool all = false, uint32_t start = 0, uint32_t count = 0) const; + std::string export_outputs_to_str(bool all = false, uint32_t start = 0, uint32_t count = 0xffffffff) const; size_t import_outputs(const std::tuple<uint64_t, uint64_t, std::vector<tools::wallet2::exported_transfer_details>> &outputs); size_t import_outputs(const std::tuple<uint64_t, uint64_t, std::vector<tools::wallet2::transfer_details>> &outputs); size_t import_outputs_from_str(const std::string &outputs_st); @@ -1906,11 +1918,13 @@ private: ExportFormat m_export_format; bool m_load_deprecated_formats; + bool m_has_ever_refreshed_from_node; + static boost::mutex default_daemon_address_lock; static std::string default_daemon_address; }; } -BOOST_CLASS_VERSION(tools::wallet2, 29) +BOOST_CLASS_VERSION(tools::wallet2, 30) BOOST_CLASS_VERSION(tools::wallet2::transfer_details, 12) BOOST_CLASS_VERSION(tools::wallet2::multisig_info, 1) BOOST_CLASS_VERSION(tools::wallet2::multisig_info::LR, 0) diff --git a/tests/functional_tests/cold_signing.py b/tests/functional_tests/cold_signing.py index 983cd9029..bd48671a2 100755 --- a/tests/functional_tests/cold_signing.py +++ b/tests/functional_tests/cold_signing.py @@ -109,6 +109,15 @@ class ColdSigningTest(): num_outputs -= 1 count = 1 + int(random.random() * 5) res = self.hot_wallet.export_outputs(all = True, start = start, count = count) + + # the hot wallet cannot import outputs + ok = False + try: + self.hot_wallet.import_outputs(res.outputs_data_hex) + except: + ok = True + assert ok + try: self.cold_wallet.import_outputs(res.outputs_data_hex) except Exception as e: |