31 #include <boost/format.hpp> 37 #undef ELECTRONEUM_DEFAULT_LOG_CATEGORY 38 #define ELECTRONEUM_DEFAULT_LOG_CATEGORY "wallet.mms" 39 #define PYBITMESSAGE_DEFAULT_API_PORT 8442 44 namespace bitmessage_rpc
90 m_bitmessage_url = bitmessage_address;
93 if (address_parts.port == 0)
97 m_bitmessage_login = bitmessage_login;
99 m_http_client.set_server(address_parts.host,
std::to_string(address_parts.port), boost::none);
103 std::vector<transport_message> &messages)
112 m_run.store(
true, std::memory_order_relaxed);
114 start_xml_rpc_cmd(request,
"getAllInboxMessages");
115 end_xml_rpc_cmd(request);
117 post_request(request, answer);
119 std::string json = get_str_between_tags(answer,
"<string>",
"</string>");
123 MERROR(
"Failed to deserialize messages");
126 size_t size = bitmessage_res.inboxMessages.size();
129 for (
size_t i = 0; i < size; ++i)
131 if (!m_run.load(std::memory_order_relaxed))
137 if (std::find(destination_transport_addresses.begin(), destination_transport_addresses.end(),
message_info.toAddress) != destination_transport_addresses.end())
140 bool is_mms_message =
false;
148 MERROR(
"Failed to deserialize message");
150 is_mms_message =
true;
152 catch(
const std::exception& e)
170 start_xml_rpc_cmd(request,
"sendMessage");
171 add_xml_rpc_string_param(request,
message.destination_transport_address);
172 add_xml_rpc_string_param(request,
message.source_transport_address);
173 add_xml_rpc_base64_param(request,
message.subject);
176 add_xml_rpc_base64_param(request, message_body);
177 add_xml_rpc_integer_param(request, 2);
178 end_xml_rpc_cmd(request);
180 post_request(request, answer);
187 start_xml_rpc_cmd(request,
"trashMessage");
188 add_xml_rpc_string_param(request, transport_id);
189 end_xml_rpc_cmd(request);
191 post_request(request, answer);
201 start_xml_rpc_cmd(request,
"getDeterministicAddress");
202 add_xml_rpc_base64_param(request, seed);
203 add_xml_rpc_integer_param(request, 4);
204 add_xml_rpc_integer_param(request, 1);
205 end_xml_rpc_cmd(request);
207 post_request(request, answer);
221 start_xml_rpc_cmd(request,
"createDeterministicAddresses");
222 add_xml_rpc_base64_param(request, seed);
223 add_xml_rpc_integer_param(request, 1);
224 add_xml_rpc_integer_param(request, 4);
225 end_xml_rpc_cmd(request);
227 post_request(request, answer);
235 start_xml_rpc_cmd(request,
"deleteAddress");
236 add_xml_rpc_string_param(request, transport_address);
237 end_xml_rpc_cmd(request);
239 return post_request(request, answer);
253 auth_string.insert(0,
"Basic ");
254 additional_params.push_back(std::make_pair(
"Authorization", auth_string));
256 additional_params.push_back(std::make_pair(
"Content-Type",
"application/xml; charset=utf-8"));
258 std::chrono::milliseconds timeout = std::chrono::seconds(15);
259 bool r = m_http_client.invoke(
"/",
"POST", request, timeout, std::addressof(
response),
std::move(additional_params));
266 LOG_ERROR(
"POST request to Bitmessage failed: " << request.substr(0, 300));
269 m_http_client.disconnect();
270 std::string string_value = get_str_between_tags(answer,
"<string>",
"</string>");
271 if ((string_value.find(
"API Error") == 0) || (string_value.find(
"RPC ") == 0))
285 size_t first_delim_pos = s.find(start_delim);
286 if (first_delim_pos != std::string::npos)
288 size_t end_pos_of_first_delim = first_delim_pos + start_delim.length();
289 size_t last_delim_pos = s.find(stop_delim);
290 if (last_delim_pos != std::string::npos)
292 return s.substr(end_pos_of_first_delim, last_delim_pos - end_pos_of_first_delim);
300 xml = (boost::format(
"<?xml version=\"1.0\"?><methodCall><methodName>%s</methodName><params>") % method_name).str();
305 xml += (boost::format(
"<param><value><string>%s</string></value></param>") % param).str();
312 xml += (boost::format(
"<param><value><string>%s</string></value></param>") % encoded_param).str();
315 void message_transporter::add_xml_rpc_integer_param(
std::string &xml,
const int32_t ¶m)
317 xml += (boost::format(
"<param><value><int>%i</int></value></param>") % param).str();
320 void message_transporter::end_xml_rpc_cmd(
std::string &xml)
322 xml +=
"</params></methodCall>";
std::string base64_encode(unsigned char const *bytes_to_encode, size_t in_len)
std::list< std::pair< std::string, std::string > > fields_list
epee::misc_utils::struct_init< response_t > response
bool delete_transport_address(const std::string &transport_address)
bool store_t_to_json(t_struct &str_in, std::string &json_buff, size_t indent=0, bool insert_newlines=true)
bool delete_message(const std::string &transport_id)
std::string derive_transport_address(const std::string &seed)
bool load_t_from_json(t_struct &out, const std::string &json_buff)
std::vector< message_info > inboxMessages
std::string derive_and_receive_transport_address(const std::string &seed)
void set_options(const std::string &bitmessage_address, const epee::wipeable_string &bitmessage_login)
epee::misc_utils::struct_init< message_info_t > message_info
const T & move(const T &t)
bool parse_url(const std::string url_str, http::url_content &content)
bool send_message(const transport_message &message)
#define PYBITMESSAGE_DEFAULT_API_PORT
#define THROW_WALLET_EXCEPTION(err_type,...)
std::string to_string(t_connection_type type)
#define END_KV_SERIALIZE_MAP()
bool receive_messages(const std::vector< std::string > &destination_transport_addresses, std::vector< transport_message > &messages)
std::string base64_decode(std::string const &encoded_string)
#define BEGIN_KV_SERIALIZE_MAP()