Merge pull request #5355
c68fe787
device/trezor: add button pressed request (Dusan Klinec)827f52ad
wallet: API changes to enable passphrase entry (Dusan Klinec)
This commit is contained in:
commit
37aea526a9
|
@ -76,6 +76,7 @@ namespace hw {
|
||||||
class i_device_callback {
|
class i_device_callback {
|
||||||
public:
|
public:
|
||||||
virtual void on_button_request(uint64_t code=0) {}
|
virtual void on_button_request(uint64_t code=0) {}
|
||||||
|
virtual void on_button_pressed() {}
|
||||||
virtual boost::optional<epee::wipeable_string> on_pin_request() { return boost::none; }
|
virtual boost::optional<epee::wipeable_string> on_pin_request() { return boost::none; }
|
||||||
virtual boost::optional<epee::wipeable_string> on_passphrase_request(bool on_device) { return boost::none; }
|
virtual boost::optional<epee::wipeable_string> on_passphrase_request(bool on_device) { return boost::none; }
|
||||||
virtual void on_progress(const device_progress& event) {}
|
virtual void on_progress(const device_progress& event) {}
|
||||||
|
|
|
@ -43,7 +43,7 @@ namespace trezor {
|
||||||
|
|
||||||
const uint32_t device_trezor_base::DEFAULT_BIP44_PATH[] = {0x8000002c, 0x80000080};
|
const uint32_t device_trezor_base::DEFAULT_BIP44_PATH[] = {0x8000002c, 0x80000080};
|
||||||
|
|
||||||
device_trezor_base::device_trezor_base(): m_callback(nullptr) {
|
device_trezor_base::device_trezor_base(): m_callback(nullptr), m_last_msg_type(messages::MessageType_Success) {
|
||||||
#ifdef WITH_TREZOR_DEBUGGING
|
#ifdef WITH_TREZOR_DEBUGGING
|
||||||
m_debug = false;
|
m_debug = false;
|
||||||
#endif
|
#endif
|
||||||
|
@ -275,6 +275,12 @@ namespace trezor {
|
||||||
// Later if needed this generic message handler can be replaced by a pointer to
|
// Later if needed this generic message handler can be replaced by a pointer to
|
||||||
// a protocol message handler which by default points to the device class which implements
|
// a protocol message handler which by default points to the device class which implements
|
||||||
// the default handler.
|
// the default handler.
|
||||||
|
|
||||||
|
if (m_last_msg_type == messages::MessageType_ButtonRequest){
|
||||||
|
on_button_pressed();
|
||||||
|
}
|
||||||
|
m_last_msg_type = input.m_type;
|
||||||
|
|
||||||
switch(input.m_type){
|
switch(input.m_type){
|
||||||
case messages::MessageType_ButtonRequest:
|
case messages::MessageType_ButtonRequest:
|
||||||
on_button_request(input, dynamic_cast<const messages::common::ButtonRequest*>(input.m_msg.get()));
|
on_button_request(input, dynamic_cast<const messages::common::ButtonRequest*>(input.m_msg.get()));
|
||||||
|
@ -413,6 +419,11 @@ namespace trezor {
|
||||||
resp = read_raw();
|
resp = read_raw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void device_trezor_base::on_button_pressed()
|
||||||
|
{
|
||||||
|
TREZOR_CALLBACK(on_button_pressed);
|
||||||
|
}
|
||||||
|
|
||||||
void device_trezor_base::on_pin_request(GenericMessage & resp, const messages::common::PinMatrixRequest * msg)
|
void device_trezor_base::on_pin_request(GenericMessage & resp, const messages::common::PinMatrixRequest * msg)
|
||||||
{
|
{
|
||||||
MDEBUG("on_pin_request");
|
MDEBUG("on_pin_request");
|
||||||
|
|
|
@ -98,6 +98,7 @@ namespace trezor {
|
||||||
std::shared_ptr<messages::management::Features> m_features; // features from the last device reset
|
std::shared_ptr<messages::management::Features> m_features; // features from the last device reset
|
||||||
boost::optional<epee::wipeable_string> m_pin;
|
boost::optional<epee::wipeable_string> m_pin;
|
||||||
boost::optional<epee::wipeable_string> m_passphrase;
|
boost::optional<epee::wipeable_string> m_passphrase;
|
||||||
|
messages::MessageType m_last_msg_type;
|
||||||
|
|
||||||
cryptonote::network_type network_type;
|
cryptonote::network_type network_type;
|
||||||
|
|
||||||
|
@ -311,6 +312,7 @@ namespace trezor {
|
||||||
|
|
||||||
// Protocol callbacks
|
// Protocol callbacks
|
||||||
void on_button_request(GenericMessage & resp, const messages::common::ButtonRequest * msg);
|
void on_button_request(GenericMessage & resp, const messages::common::ButtonRequest * msg);
|
||||||
|
void on_button_pressed();
|
||||||
void on_pin_request(GenericMessage & resp, const messages::common::PinMatrixRequest * msg);
|
void on_pin_request(GenericMessage & resp, const messages::common::PinMatrixRequest * msg);
|
||||||
void on_passphrase_request(GenericMessage & resp, const messages::common::PassphraseRequest * msg);
|
void on_passphrase_request(GenericMessage & resp, const messages::common::PassphraseRequest * msg);
|
||||||
void on_passphrase_state_request(GenericMessage & resp, const messages::common::PassphraseStateRequest * msg);
|
void on_passphrase_state_request(GenericMessage & resp, const messages::common::PassphraseStateRequest * msg);
|
||||||
|
|
|
@ -249,6 +249,13 @@ struct Wallet2CallbackImpl : public tools::i_wallet2_callback
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void on_device_button_pressed()
|
||||||
|
{
|
||||||
|
if (m_listener) {
|
||||||
|
m_listener->onDeviceButtonPressed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
virtual boost::optional<epee::wipeable_string> on_device_pin_request()
|
virtual boost::optional<epee::wipeable_string> on_device_pin_request()
|
||||||
{
|
{
|
||||||
if (m_listener) {
|
if (m_listener) {
|
||||||
|
@ -449,6 +456,11 @@ WalletImpl::~WalletImpl()
|
||||||
close(false); // do not store wallet as part of the closing activities
|
close(false); // do not store wallet as part of the closing activities
|
||||||
// Stop refresh thread
|
// Stop refresh thread
|
||||||
stopRefresh();
|
stopRefresh();
|
||||||
|
|
||||||
|
if (m_wallet2Callback->getListener()) {
|
||||||
|
m_wallet2Callback->getListener()->onSetWallet(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
LOG_PRINT_L1(__FUNCTION__ << " finished");
|
LOG_PRINT_L1(__FUNCTION__ << " finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
// Public interface for libwallet library
|
// Public interface for libwallet library
|
||||||
namespace Monero {
|
namespace Monero {
|
||||||
|
@ -337,6 +338,7 @@ protected:
|
||||||
bool m_indeterminate;
|
bool m_indeterminate;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Wallet;
|
||||||
struct WalletListener
|
struct WalletListener
|
||||||
{
|
{
|
||||||
virtual ~WalletListener() = 0;
|
virtual ~WalletListener() = 0;
|
||||||
|
@ -381,7 +383,12 @@ struct WalletListener
|
||||||
/**
|
/**
|
||||||
* @brief called by device if the action is required
|
* @brief called by device if the action is required
|
||||||
*/
|
*/
|
||||||
virtual void onDeviceButtonRequest(uint64_t code) {}
|
virtual void onDeviceButtonRequest(uint64_t code) { (void)code; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief called by device if the button was pressed
|
||||||
|
*/
|
||||||
|
virtual void onDeviceButtonPressed() { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief called by device when PIN is needed
|
* @brief called by device when PIN is needed
|
||||||
|
@ -401,7 +408,12 @@ struct WalletListener
|
||||||
/**
|
/**
|
||||||
* @brief Signalizes device operation progress
|
* @brief Signalizes device operation progress
|
||||||
*/
|
*/
|
||||||
virtual void onDeviceProgress(const DeviceProgress & event) {};
|
virtual void onDeviceProgress(const DeviceProgress & event) { (void)event; };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief If the listener is created before the wallet this enables to set created wallet object
|
||||||
|
*/
|
||||||
|
virtual void onSetWallet(Wallet * wallet) { (void)wallet; };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -440,8 +452,8 @@ struct Wallet
|
||||||
//! returns both error and error string atomically. suggested to use in instead of status() and errorString()
|
//! returns both error and error string atomically. suggested to use in instead of status() and errorString()
|
||||||
virtual void statusWithErrorString(int& status, std::string& errorString) const = 0;
|
virtual void statusWithErrorString(int& status, std::string& errorString) const = 0;
|
||||||
virtual bool setPassword(const std::string &password) = 0;
|
virtual bool setPassword(const std::string &password) = 0;
|
||||||
virtual bool setDevicePin(const std::string &password) { return false; };
|
virtual bool setDevicePin(const std::string &pin) { (void)pin; return false; };
|
||||||
virtual bool setDevicePassphrase(const std::string &password) { return false; };
|
virtual bool setDevicePassphrase(const std::string &passphrase) { (void)passphrase; return false; };
|
||||||
virtual std::string address(uint32_t accountIndex = 0, uint32_t addressIndex = 0) const = 0;
|
virtual std::string address(uint32_t accountIndex = 0, uint32_t addressIndex = 0) const = 0;
|
||||||
std::string mainAddress() const { return address(0, 0); }
|
std::string mainAddress() const { return address(0, 0); }
|
||||||
virtual std::string path() const = 0;
|
virtual std::string path() const = 0;
|
||||||
|
@ -1020,9 +1032,10 @@ struct WalletManager
|
||||||
* \param password Password of wallet file
|
* \param password Password of wallet file
|
||||||
* \param nettype Network type
|
* \param nettype Network type
|
||||||
* \param kdf_rounds Number of rounds for key derivation function
|
* \param kdf_rounds Number of rounds for key derivation function
|
||||||
|
* \param listener Wallet listener to set to the wallet after creation
|
||||||
* \return Wallet instance (Wallet::status() needs to be called to check if opened successfully)
|
* \return Wallet instance (Wallet::status() needs to be called to check if opened successfully)
|
||||||
*/
|
*/
|
||||||
virtual Wallet * openWallet(const std::string &path, const std::string &password, NetworkType nettype, uint64_t kdf_rounds = 1) = 0;
|
virtual Wallet * openWallet(const std::string &path, const std::string &password, NetworkType nettype, uint64_t kdf_rounds = 1, WalletListener * listener = nullptr) = 0;
|
||||||
Wallet * openWallet(const std::string &path, const std::string &password, bool testnet = false) // deprecated
|
Wallet * openWallet(const std::string &path, const std::string &password, bool testnet = false) // deprecated
|
||||||
{
|
{
|
||||||
return openWallet(path, password, testnet ? TESTNET : MAINNET);
|
return openWallet(path, password, testnet ? TESTNET : MAINNET);
|
||||||
|
@ -1134,6 +1147,7 @@ struct WalletManager
|
||||||
* \param restoreHeight restore from start height (0 sets to current height)
|
* \param restoreHeight restore from start height (0 sets to current height)
|
||||||
* \param subaddressLookahead Size of subaddress lookahead (empty sets to some default low value)
|
* \param subaddressLookahead Size of subaddress lookahead (empty sets to some default low value)
|
||||||
* \param kdf_rounds Number of rounds for key derivation function
|
* \param kdf_rounds Number of rounds for key derivation function
|
||||||
|
* \param listener Wallet listener to set to the wallet after creation
|
||||||
* \return Wallet instance (Wallet::status() needs to be called to check if recovered successfully)
|
* \return Wallet instance (Wallet::status() needs to be called to check if recovered successfully)
|
||||||
*/
|
*/
|
||||||
virtual Wallet * createWalletFromDevice(const std::string &path,
|
virtual Wallet * createWalletFromDevice(const std::string &path,
|
||||||
|
@ -1142,7 +1156,8 @@ struct WalletManager
|
||||||
const std::string &deviceName,
|
const std::string &deviceName,
|
||||||
uint64_t restoreHeight = 0,
|
uint64_t restoreHeight = 0,
|
||||||
const std::string &subaddressLookahead = "",
|
const std::string &subaddressLookahead = "",
|
||||||
uint64_t kdf_rounds = 1) = 0;
|
uint64_t kdf_rounds = 1,
|
||||||
|
WalletListener * listener = nullptr) = 0;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Closes wallet. In case operation succeeded, wallet object deleted. in case operation failed, wallet object not deleted
|
* \brief Closes wallet. In case operation succeeded, wallet object deleted. in case operation failed, wallet object not deleted
|
||||||
|
|
|
@ -57,9 +57,14 @@ Wallet *WalletManagerImpl::createWallet(const std::string &path, const std::stri
|
||||||
return wallet;
|
return wallet;
|
||||||
}
|
}
|
||||||
|
|
||||||
Wallet *WalletManagerImpl::openWallet(const std::string &path, const std::string &password, NetworkType nettype, uint64_t kdf_rounds)
|
Wallet *WalletManagerImpl::openWallet(const std::string &path, const std::string &password, NetworkType nettype, uint64_t kdf_rounds, WalletListener * listener)
|
||||||
{
|
{
|
||||||
WalletImpl * wallet = new WalletImpl(nettype, kdf_rounds);
|
WalletImpl * wallet = new WalletImpl(nettype, kdf_rounds);
|
||||||
|
wallet->setListener(listener);
|
||||||
|
if (listener){
|
||||||
|
listener->onSetWallet(wallet);
|
||||||
|
}
|
||||||
|
|
||||||
wallet->open(path, password);
|
wallet->open(path, password);
|
||||||
//Refresh addressBook
|
//Refresh addressBook
|
||||||
wallet->addressBook()->refresh();
|
wallet->addressBook()->refresh();
|
||||||
|
@ -122,9 +127,15 @@ Wallet *WalletManagerImpl::createWalletFromDevice(const std::string &path,
|
||||||
const std::string &deviceName,
|
const std::string &deviceName,
|
||||||
uint64_t restoreHeight,
|
uint64_t restoreHeight,
|
||||||
const std::string &subaddressLookahead,
|
const std::string &subaddressLookahead,
|
||||||
uint64_t kdf_rounds)
|
uint64_t kdf_rounds,
|
||||||
|
WalletListener * listener)
|
||||||
{
|
{
|
||||||
WalletImpl * wallet = new WalletImpl(nettype, kdf_rounds);
|
WalletImpl * wallet = new WalletImpl(nettype, kdf_rounds);
|
||||||
|
wallet->setListener(listener);
|
||||||
|
if (listener){
|
||||||
|
listener->onSetWallet(wallet);
|
||||||
|
}
|
||||||
|
|
||||||
if(restoreHeight > 0){
|
if(restoreHeight > 0){
|
||||||
wallet->setRefreshFromBlockHeight(restoreHeight);
|
wallet->setRefreshFromBlockHeight(restoreHeight);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -40,7 +40,7 @@ class WalletManagerImpl : public WalletManager
|
||||||
public:
|
public:
|
||||||
Wallet * createWallet(const std::string &path, const std::string &password,
|
Wallet * createWallet(const std::string &path, const std::string &password,
|
||||||
const std::string &language, NetworkType nettype, uint64_t kdf_rounds = 1) override;
|
const std::string &language, NetworkType nettype, uint64_t kdf_rounds = 1) override;
|
||||||
Wallet * openWallet(const std::string &path, const std::string &password, NetworkType nettype, uint64_t kdf_rounds = 1) override;
|
Wallet * openWallet(const std::string &path, const std::string &password, NetworkType nettype, uint64_t kdf_rounds = 1, WalletListener * listener = nullptr) override;
|
||||||
virtual Wallet * recoveryWallet(const std::string &path,
|
virtual Wallet * recoveryWallet(const std::string &path,
|
||||||
const std::string &password,
|
const std::string &password,
|
||||||
const std::string &mnemonic,
|
const std::string &mnemonic,
|
||||||
|
@ -72,7 +72,8 @@ public:
|
||||||
const std::string &deviceName,
|
const std::string &deviceName,
|
||||||
uint64_t restoreHeight = 0,
|
uint64_t restoreHeight = 0,
|
||||||
const std::string &subaddressLookahead = "",
|
const std::string &subaddressLookahead = "",
|
||||||
uint64_t kdf_rounds = 1) override;
|
uint64_t kdf_rounds = 1,
|
||||||
|
WalletListener * listener = nullptr) override;
|
||||||
virtual bool closeWallet(Wallet *wallet, bool store = true) override;
|
virtual bool closeWallet(Wallet *wallet, bool store = true) override;
|
||||||
bool walletExists(const std::string &path) override;
|
bool walletExists(const std::string &path) override;
|
||||||
bool verifyWalletPassword(const std::string &keys_file_name, const std::string &password, bool no_spend_key, uint64_t kdf_rounds = 1) const override;
|
bool verifyWalletPassword(const std::string &keys_file_name, const std::string &password, bool no_spend_key, uint64_t kdf_rounds = 1) const override;
|
||||||
|
|
|
@ -992,6 +992,12 @@ void wallet_device_callback::on_button_request(uint64_t code)
|
||||||
wallet->on_device_button_request(code);
|
wallet->on_device_button_request(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wallet_device_callback::on_button_pressed()
|
||||||
|
{
|
||||||
|
if (wallet)
|
||||||
|
wallet->on_device_button_pressed();
|
||||||
|
}
|
||||||
|
|
||||||
boost::optional<epee::wipeable_string> wallet_device_callback::on_pin_request()
|
boost::optional<epee::wipeable_string> wallet_device_callback::on_pin_request()
|
||||||
{
|
{
|
||||||
if (wallet)
|
if (wallet)
|
||||||
|
@ -12946,6 +12952,12 @@ void wallet2::on_device_button_request(uint64_t code)
|
||||||
m_callback->on_device_button_request(code);
|
m_callback->on_device_button_request(code);
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
void wallet2::on_device_button_pressed()
|
||||||
|
{
|
||||||
|
if (nullptr != m_callback)
|
||||||
|
m_callback->on_device_button_pressed();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
boost::optional<epee::wipeable_string> wallet2::on_device_pin_request()
|
boost::optional<epee::wipeable_string> wallet2::on_device_pin_request()
|
||||||
{
|
{
|
||||||
if (nullptr != m_callback)
|
if (nullptr != m_callback)
|
||||||
|
|
|
@ -105,6 +105,7 @@ namespace tools
|
||||||
virtual void on_lw_money_spent(uint64_t height, const crypto::hash &txid, uint64_t amount) {}
|
virtual void on_lw_money_spent(uint64_t height, const crypto::hash &txid, uint64_t amount) {}
|
||||||
// Device callbacks
|
// Device callbacks
|
||||||
virtual void on_device_button_request(uint64_t code) {}
|
virtual void on_device_button_request(uint64_t code) {}
|
||||||
|
virtual void on_device_button_pressed() {}
|
||||||
virtual boost::optional<epee::wipeable_string> on_device_pin_request() { return boost::none; }
|
virtual boost::optional<epee::wipeable_string> on_device_pin_request() { return boost::none; }
|
||||||
virtual boost::optional<epee::wipeable_string> on_device_passphrase_request(bool on_device) { return boost::none; }
|
virtual boost::optional<epee::wipeable_string> on_device_passphrase_request(bool on_device) { return boost::none; }
|
||||||
virtual void on_device_progress(const hw::device_progress& event) {};
|
virtual void on_device_progress(const hw::device_progress& event) {};
|
||||||
|
@ -118,6 +119,7 @@ namespace tools
|
||||||
public:
|
public:
|
||||||
wallet_device_callback(wallet2 * wallet): wallet(wallet) {};
|
wallet_device_callback(wallet2 * wallet): wallet(wallet) {};
|
||||||
void on_button_request(uint64_t code=0) override;
|
void on_button_request(uint64_t code=0) override;
|
||||||
|
void on_button_pressed() override;
|
||||||
boost::optional<epee::wipeable_string> on_pin_request() override;
|
boost::optional<epee::wipeable_string> on_pin_request() override;
|
||||||
boost::optional<epee::wipeable_string> on_passphrase_request(bool on_device) override;
|
boost::optional<epee::wipeable_string> on_passphrase_request(bool on_device) override;
|
||||||
void on_progress(const hw::device_progress& event) override;
|
void on_progress(const hw::device_progress& event) override;
|
||||||
|
@ -1378,6 +1380,7 @@ namespace tools
|
||||||
|
|
||||||
wallet_device_callback * get_device_callback();
|
wallet_device_callback * get_device_callback();
|
||||||
void on_device_button_request(uint64_t code);
|
void on_device_button_request(uint64_t code);
|
||||||
|
void on_device_button_pressed();
|
||||||
boost::optional<epee::wipeable_string> on_device_pin_request();
|
boost::optional<epee::wipeable_string> on_device_pin_request();
|
||||||
boost::optional<epee::wipeable_string> on_device_passphrase_request(bool on_device);
|
boost::optional<epee::wipeable_string> on_device_passphrase_request(bool on_device);
|
||||||
void on_device_progress(const hw::device_progress& event);
|
void on_device_progress(const hw::device_progress& event);
|
||||||
|
|
Loading…
Reference in New Issue