Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
coverage = os.environ.get("COVERAGE") == "1"
this_dir = Path(__file__).parent.resolve()
extra_compile_args = ['/std:c++17'] if sys.platform == "win32" else ['-std=c++17']
extra_link_args = []
extra_link_args: list[str] = []

if coverage:
extra_compile_args += ['-O0', '-g', '--coverage']
Expand Down
2 changes: 1 addition & 1 deletion src/cpp/common/py_monero_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class PyMoneroSslOptions {
boost::optional<std::string> m_ssl_ca_file;
std::vector<std::string> m_ssl_allowed_fingerprints;
boost::optional<bool> m_ssl_allow_any_cert;

PyMoneroSslOptions() {}
};

Expand Down
30 changes: 23 additions & 7 deletions src/cpp/py_monero.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ PYBIND11_MODULE(monero, m) {
m.doc() = "";

auto py_serializable_struct = py::class_<monero::serializable_struct, PySerializableStruct, std::shared_ptr<monero::serializable_struct>>(m, "SerializableStruct");
auto py_monero_ssl_options = py::class_<PyMoneroSslOptions>(m, "MoneroSslOptions");
auto py_monero_version = py::class_<monero::monero_version, monero::serializable_struct, std::shared_ptr<monero::monero_version>>(m, "MoneroVersion");
auto py_monero_block_header = py::class_<monero::monero_block_header, monero::serializable_struct, std::shared_ptr<monero::monero_block_header>>(m, "MoneroBlockHeader");
auto py_monero_block = py::class_<monero::monero_block, monero::monero_block_header, std::shared_ptr<monero::monero_block>>(m, "MoneroBlock");
Expand Down Expand Up @@ -192,6 +193,15 @@ PYBIND11_MODULE(monero, m) {
MONERO_CATCH_AND_RETHROW(self.serialize());
});

// monero_ssl_options
py_monero_ssl_options
.def(py::init<>())
.def_readwrite("ssl_private_key_path", &PyMoneroSslOptions::m_ssl_private_key_path)
.def_readwrite("ssl_certificate_path", &PyMoneroSslOptions::m_ssl_certificate_path)
.def_readwrite("ssl_ca_file", &PyMoneroSslOptions::m_ssl_ca_file)
.def_readwrite("ssl_allowed_fingerprints", &PyMoneroSslOptions::m_ssl_allowed_fingerprints)
.def_readwrite("ssl_allow_any_cert", &PyMoneroSslOptions::m_ssl_allow_any_cert);

// monero_json_request_params
py::class_<PyMoneroJsonRequestParams, PySerializableStruct, std::shared_ptr<PyMoneroJsonRequestParams>>(m, "MoneroJsonRequestParams")
.def(py::init());
Expand Down Expand Up @@ -1776,13 +1786,9 @@ PYBIND11_MODULE(monero, m) {
MONERO_CATCH_AND_RETHROW(self.parse_payment_uri(uri));
}, py::arg("uri"))
.def("get_attribute", [](PyMoneroWallet& self, const std::string& key) {
try {
std::string val;
self.get_attribute(key, val);
return val;
} catch (const std::exception& e) {
throw PyMoneroError(e.what());
}
std::string val;
self.get_attribute(key, val);
return val;
}, py::arg("key"))
.def("set_attribute", [](PyMoneroWallet& self, const std::string& key, const std::string& val) {
MONERO_CATCH_AND_RETHROW(self.set_attribute(key, val));
Expand Down Expand Up @@ -1936,6 +1942,16 @@ PYBIND11_MODULE(monero, m) {
.def("get_rpc_connection", [](PyMoneroWalletRpc& self) {
MONERO_CATCH_AND_RETHROW(self.get_rpc_connection());
})
// this because of function hiding
.def("set_daemon_connection", [](PyMoneroWallet& self, const boost::optional<monero::monero_rpc_connection>& connection) {
MONERO_CATCH_AND_RETHROW(self.set_daemon_connection(connection));
}, py::arg("connection"))
.def("set_daemon_connection", [](PyMoneroWallet& self, const std::string& uri, const std::string& username, const std::string& password, const std::string& proxy) {
MONERO_CATCH_AND_RETHROW(self.set_daemon_connection(uri, username, password, proxy));
}, py::arg("uri"), py::arg("username") = "", py::arg("password") = "", py::arg("proxy") = "")
.def("set_daemon_connection", [](PyMoneroWalletRpc& self, const boost::optional<monero::monero_rpc_connection>& connection, bool is_trusted, const boost::optional<PyMoneroSslOptions>& ssl_options) {
MONERO_CATCH_AND_RETHROW(self.set_daemon_connection(connection, is_trusted, ssl_options));
}, py::arg("connection"), py::arg("is_trusted"), py::arg("ssl_options"))
.def("stop", [](PyMoneroWalletRpc& self) {
MONERO_CATCH_AND_RETHROW(self.stop());
});
Expand Down
9 changes: 6 additions & 3 deletions src/cpp/wallet/py_monero_wallet_model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1043,7 +1043,7 @@ rapidjson::Value PyMoneroCreateAccountParams::to_rapidjson_val(rapidjson::Docume

rapidjson::Value PyMoneroCloseWalletParams::to_rapidjson_val(rapidjson::Document::AllocatorType& allocator) const {
rapidjson::Value root(rapidjson::kObjectType);
if (m_save != boost::none) monero_utils::add_json_member("save", m_save.get(), allocator, root);
if (m_save != boost::none) monero_utils::add_json_member("autosave_current", m_save.get(), allocator, root);
return root;
}

Expand All @@ -1064,6 +1064,9 @@ rapidjson::Value PyMoneroWalletAttributeParams::to_rapidjson_val(rapidjson::Docu
}

void PyMoneroWalletAttributeParams::from_property_tree(const boost::property_tree::ptree& node, const std::shared_ptr<PyMoneroWalletAttributeParams>& attributes) {
attributes->m_key = boost::none;
attributes->m_value = boost::none;

for (boost::property_tree::ptree::const_iterator it = node.begin(); it != node.end(); ++it) {
std::string key = it->first;
if (key == std::string("key")) attributes->m_key = it->second.data();
Expand Down Expand Up @@ -1301,10 +1304,10 @@ rapidjson::Value PyMoneroImportExportKeyImagesParams::to_rapidjson_val(rapidjson
}

PyMoneroCreateOpenWalletParams::PyMoneroCreateOpenWalletParams(const boost::optional<std::string>& filename, const boost::optional<std::string> &password):
m_filename(filename), m_password(password) { }
m_filename(filename), m_password(password), m_autosave_current(false) { }

PyMoneroCreateOpenWalletParams::PyMoneroCreateOpenWalletParams(const boost::optional<std::string>& filename, const boost::optional<std::string> &password, const boost::optional<std::string> &language):
m_filename(filename), m_password(password), m_language(language) { }
m_filename(filename), m_password(password), m_language(language), m_autosave_current(false) { }

PyMoneroCreateOpenWalletParams::PyMoneroCreateOpenWalletParams(const boost::optional<std::string>& filename, const boost::optional<std::string> &password, const boost::optional<std::string> &seed, const boost::optional<std::string> &seed_offset, const boost::optional<uint64_t> &restore_height, const boost::optional<std::string> &language, const boost::optional<bool> &autosave_current, const boost::optional<bool> &enable_multisig_experimental):
m_filename(filename),
Expand Down
2 changes: 1 addition & 1 deletion src/cpp/wallet/py_monero_wallet_model.h
Original file line number Diff line number Diff line change
Expand Up @@ -495,7 +495,7 @@ class PyMoneroCloseWalletParams : public PyMoneroJsonRequestParams {
public:
boost::optional<bool> m_save;

PyMoneroCloseWalletParams(bool save = true) {
PyMoneroCloseWalletParams(bool save = false) {
m_save = save;
};

Expand Down
22 changes: 13 additions & 9 deletions src/cpp/wallet/py_monero_wallet_rpc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -320,8 +320,7 @@ void PyMoneroWalletRpc::set_daemon_connection(const std::string& uri, const std:
set_daemon_connection(rpc);
}


void PyMoneroWalletRpc::set_daemon_connection(const boost::optional<monero_rpc_connection>& connection, bool is_trusted, const boost::optional<std::shared_ptr<PyMoneroSslOptions>> ssl_options) {
void PyMoneroWalletRpc::set_daemon_connection(const boost::optional<monero_rpc_connection>& connection, bool is_trusted, const boost::optional<PyMoneroSslOptions>& ssl_options) {
auto params = std::make_shared<PyMoneroSetDaemonParams>();
if (connection == boost::none) {
params->m_address = "placeholder";
Expand All @@ -338,11 +337,11 @@ void PyMoneroWalletRpc::set_daemon_connection(const boost::optional<monero_rpc_c
params->m_ssl_support = "autodetect";

if (ssl_options != boost::none) {
params->m_ssl_private_key_path = ssl_options.get()->m_ssl_private_key_path;
params->m_ssl_certificate_path = ssl_options.get()->m_ssl_certificate_path;
params->m_ssl_ca_file = ssl_options.get()->m_ssl_ca_file;
params->m_ssl_allowed_fingerprints = ssl_options.get()->m_ssl_allowed_fingerprints;
params->m_ssl_allow_any_cert = ssl_options.get()->m_ssl_allow_any_cert;
params->m_ssl_private_key_path = ssl_options->m_ssl_private_key_path;
params->m_ssl_certificate_path = ssl_options->m_ssl_certificate_path;
params->m_ssl_ca_file = ssl_options->m_ssl_ca_file;
params->m_ssl_allowed_fingerprints = ssl_options->m_ssl_allowed_fingerprints;
params->m_ssl_allow_any_cert = ssl_options->m_ssl_allow_any_cert;
}

PyMoneroJsonRequest request("set_daemon", params);
Expand Down Expand Up @@ -1387,9 +1386,14 @@ bool PyMoneroWalletRpc::get_attribute(const std::string& key, std::string& value
value = params->m_value.get();
return true;
}
catch (...) {
return false;
catch (const PyMoneroRpcError& ex) {
if (ex.code == -45) { // attribute not found
value = std::string("");
return true;
}
}

return false;
}

void PyMoneroWalletRpc::start_mining(boost::optional<uint64_t> num_threads, boost::optional<bool> background_mining, boost::optional<bool> ignore_battery) {
Expand Down
2 changes: 1 addition & 1 deletion src/cpp/wallet/py_monero_wallet_rpc.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class PyMoneroWalletRpc : public PyMoneroWallet {
void stop();
bool is_view_only() const override;
boost::optional<monero::monero_rpc_connection> get_daemon_connection() const override;
void set_daemon_connection(const boost::optional<monero_rpc_connection>& connection, bool is_trusted, const boost::optional<std::shared_ptr<PyMoneroSslOptions>> ssl_options);
void set_daemon_connection(const boost::optional<monero_rpc_connection>& connection, bool is_trusted, const boost::optional<PyMoneroSslOptions>& ssl_options);
void set_daemon_connection(const boost::optional<monero_rpc_connection>& connection) override;
void set_daemon_connection(const std::string& uri, const std::string& username = "", const std::string& password = "", const std::string& proxy_uri = "") override;
bool is_connected_to_daemon() const override;
Expand Down
162 changes: 82 additions & 80 deletions src/python/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ from .monero_prune_result import MoneroPruneResult
from .monero_request import MoneroRequest
from .monero_rpc_connection import MoneroRpcConnection
from .monero_rpc_error import MoneroRpcError
from .monero_ssl_options import MoneroSslOptions
from .monero_subaddress import MoneroSubaddress
from .monero_submit_tx_result import MoneroSubmitTxResult
from .monero_sync_result import MoneroSyncResult
Expand All @@ -139,85 +140,86 @@ from .monero_wallet_rpc import MoneroWalletRpc


__all__ = [
'MoneroAccount',
'MoneroAccountTag',
'MoneroAddressBookEntry',
'MoneroAddressType',
'MoneroAltChain',
'MoneroBan',
'MoneroBlock',
'MoneroBlockHeader',
'MoneroBlockTemplate',
'MoneroCheck',
'MoneroCheckReserve',
'MoneroCheckTx',
'MoneroConnectionManager',
'MoneroConnectionManagerListener',
'MoneroConnectionPollType',
'MoneroConnectionProriotyComparator',
'MoneroConnectionSpan',
'MoneroConnectionType',
'MoneroDaemon',
'MoneroDaemonDefault',
'MoneroDaemonInfo',
'MoneroDaemonListener',
'MoneroDaemonRpc',
'MoneroDaemonSyncInfo',
'MoneroDaemonUpdateCheckResult',
'MoneroDaemonUpdateDownloadResult',
'MoneroDecodedAddress',
'MoneroDestination',
'MoneroError',
'MoneroFeeEstimate',
'MoneroHardForkInfo',
'MoneroIncomingTransfer',
'MoneroIntegratedAddress',
'MoneroJsonRequest',
'MoneroJsonRequestParams',
'MoneroJsonResponse',
'MoneroKeyImage',
'MoneroKeyImageImportResult',
'MoneroKeyImageSpentStatus',
'MoneroMessageSignatureResult',
'MoneroMessageSignatureType',
'MoneroMinerTxSum',
'MoneroMiningStatus',
'MoneroMultisigInfo',
'MoneroMultisigInitResult',
'MoneroMultisigSignResult',
'MoneroNetworkType',
'MoneroOutgoingTransfer',
'MoneroOutput',
'MoneroOutputDistributionEntry',
'MoneroOutputHistogramEntry',
'MoneroOutputQuery',
'MoneroOutputWallet',
'MoneroPathRequest',
'MoneroPeer',
'MoneroPruneResult',
'MoneroRequest',
'MoneroRpcConnection',
'MoneroRpcError',
'MoneroSubaddress',
'MoneroSubmitTxResult',
'MoneroSyncResult',
'MoneroTransfer',
'MoneroTransferQuery',
'MoneroTx',
'MoneroTxBacklogEntry',
'MoneroTxConfig',
'MoneroTxPoolStats',
'MoneroTxPriority',
'MoneroTxQuery',
'MoneroTxSet',
'MoneroTxWallet',
'MoneroUtils',
'MoneroVersion',
'MoneroWallet',
'MoneroWalletConfig',
'MoneroWalletFull',
'MoneroWalletKeys',
'MoneroWalletListener',
'MoneroWalletRpc',
'MoneroAccount',
'MoneroAccountTag',
'MoneroAddressBookEntry',
'MoneroAddressType',
'MoneroAltChain',
'MoneroBan',
'MoneroBlock',
'MoneroBlockHeader',
'MoneroBlockTemplate',
'MoneroCheck',
'MoneroCheckReserve',
'MoneroCheckTx',
'MoneroConnectionManager',
'MoneroConnectionManagerListener',
'MoneroConnectionPollType',
'MoneroConnectionProriotyComparator',
'MoneroConnectionSpan',
'MoneroConnectionType',
'MoneroDaemon',
'MoneroDaemonDefault',
'MoneroDaemonInfo',
'MoneroDaemonListener',
'MoneroDaemonRpc',
'MoneroDaemonSyncInfo',
'MoneroDaemonUpdateCheckResult',
'MoneroDaemonUpdateDownloadResult',
'MoneroDecodedAddress',
'MoneroDestination',
'MoneroError',
'MoneroFeeEstimate',
'MoneroHardForkInfo',
'MoneroIncomingTransfer',
'MoneroIntegratedAddress',
'MoneroJsonRequest',
'MoneroJsonRequestParams',
'MoneroJsonResponse',
'MoneroKeyImage',
'MoneroKeyImageImportResult',
'MoneroKeyImageSpentStatus',
'MoneroMessageSignatureResult',
'MoneroMessageSignatureType',
'MoneroMinerTxSum',
'MoneroMiningStatus',
'MoneroMultisigInfo',
'MoneroMultisigInitResult',
'MoneroMultisigSignResult',
'MoneroNetworkType',
'MoneroOutgoingTransfer',
'MoneroOutput',
'MoneroOutputDistributionEntry',
'MoneroOutputHistogramEntry',
'MoneroOutputQuery',
'MoneroOutputWallet',
'MoneroPathRequest',
'MoneroPeer',
'MoneroPruneResult',
'MoneroRequest',
'MoneroRpcConnection',
'MoneroRpcError',
'MoneroSubaddress',
'MoneroSubmitTxResult',
'MoneroSyncResult',
'MoneroTransfer',
'MoneroTransferQuery',
'MoneroTx',
'MoneroTxBacklogEntry',
'MoneroTxConfig',
'MoneroTxPoolStats',
'MoneroTxPriority',
'MoneroTxQuery',
'MoneroTxSet',
'MoneroTxWallet',
'MoneroUtils',
'MoneroVersion',
'MoneroWallet',
'MoneroWalletConfig',
'MoneroWalletFull',
'MoneroWalletKeys',
'MoneroWalletListener',
'MoneroWalletRpc',
'MoneroSslOptions',
'SerializableStruct'
]
11 changes: 11 additions & 0 deletions src/python/monero_ssl_options.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class MoneroSslOptions:
ssl_private_key_path: str
"""Path to private ssl key"""
ssl_certificate_path: str
"""Path to private ssl certificate"""
ssl_ca_file: str
"""Path to ssl CA file"""
ssl_allowed_fingerprints: list[str]
"""Allowed ssl fingerprints"""
ssl_allow_any_cert: bool | None
"""Allow any certificate"""
Loading