mirror of https://github.com/oxen-io/oxen-core.git
Replace epee base64 with oxen-encoding
This commit is contained in:
parent
a66fc8ae61
commit
c86a7a2a28
|
@ -1,243 +0,0 @@
|
|||
// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * 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.
|
||||
// * Neither the name of the Andrey N. Sabelnikov 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 OWNER 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.
|
||||
//
|
||||
|
||||
|
||||
#ifndef _STRING_CODING_H_
|
||||
#define _STRING_CODING_H_
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace epee
|
||||
{
|
||||
namespace string_encoding
|
||||
{
|
||||
inline std::string convert_to_ansii(const std::wstring& str_from)
|
||||
{
|
||||
|
||||
std::string res(str_from.begin(), str_from.end());
|
||||
return res;
|
||||
/*
|
||||
std::string result;
|
||||
std::locale loc;
|
||||
for(unsigned int i= 0; i < str_from.size(); ++i)
|
||||
{
|
||||
result += std::use_facet<std::ctype<wchar_t> >(loc).narrow(str_from[i]);
|
||||
}
|
||||
return result;
|
||||
*/
|
||||
|
||||
//return boost::lexical_cast<std::string>(str_from);
|
||||
/*
|
||||
std::string str_trgt;
|
||||
if(!str_from.size())
|
||||
return str_trgt;
|
||||
int cb = ::WideCharToMultiByte( code_page, 0, str_from.data(), (__int32)str_from.size(), 0, 0, 0, 0 );
|
||||
if(!cb)
|
||||
return str_trgt;
|
||||
str_trgt.resize(cb);
|
||||
::WideCharToMultiByte( code_page, 0, str_from.data(), (int)str_from.size(),
|
||||
(char*)str_trgt.data(), (int)str_trgt.size(), 0, 0);
|
||||
return str_trgt;*/
|
||||
}
|
||||
|
||||
inline std::string convert_to_ansii(const std::string& str_from)
|
||||
{
|
||||
return str_from;
|
||||
}
|
||||
|
||||
inline std::wstring convert_to_unicode(const std::string& str_from)
|
||||
{
|
||||
std::wstring result;
|
||||
std::locale loc;
|
||||
for(unsigned int i= 0; i < str_from.size(); ++i)
|
||||
{
|
||||
result += std::use_facet<std::ctype<wchar_t> >(loc).widen(str_from[i]);
|
||||
}
|
||||
return result;
|
||||
|
||||
//return boost::lexical_cast<std::wstring>(str_from);
|
||||
/*
|
||||
std::wstring str_trgt;
|
||||
if(!str_from.size())
|
||||
return str_trgt;
|
||||
|
||||
int cb = ::MultiByteToWideChar( code_page, 0, str_from.data(), (int)str_from.size(), 0, 0 );
|
||||
if(!cb)
|
||||
return str_trgt;
|
||||
|
||||
str_trgt.resize(cb);
|
||||
::MultiByteToWideChar( code_page, 0, str_from.data(),(int)str_from.size(),
|
||||
(wchar_t*)str_trgt.data(),(int)str_trgt.size());
|
||||
return str_trgt;*/
|
||||
}
|
||||
inline std::wstring convert_to_unicode(const std::wstring& str_from)
|
||||
{
|
||||
return str_from;
|
||||
}
|
||||
|
||||
template<class target_string>
|
||||
inline target_string convert_to_t(const std::wstring& str_from);
|
||||
|
||||
template<>
|
||||
inline std::string convert_to_t<std::string>(const std::wstring& str_from)
|
||||
{
|
||||
return convert_to_ansii(str_from);
|
||||
}
|
||||
|
||||
template<>
|
||||
inline std::wstring convert_to_t<std::wstring>(const std::wstring& str_from)
|
||||
{
|
||||
return str_from;
|
||||
}
|
||||
|
||||
template<class target_string>
|
||||
inline target_string convert_to_t(const std::string& str_from);
|
||||
|
||||
template<>
|
||||
inline std::string convert_to_t<std::string>(const std::string& str_from)
|
||||
{
|
||||
return str_from;
|
||||
}
|
||||
|
||||
template<>
|
||||
inline std::wstring convert_to_t<std::wstring>(const std::string& str_from)
|
||||
{
|
||||
return convert_to_unicode(str_from);
|
||||
}
|
||||
|
||||
inline
|
||||
std::string& base64_chars()
|
||||
{
|
||||
|
||||
static std::string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
"abcdefghijklmnopqrstuvwxyz"
|
||||
"0123456789+/";
|
||||
|
||||
return chars;
|
||||
|
||||
}
|
||||
|
||||
inline
|
||||
std::string base64_encode(unsigned char const* bytes_to_encode, size_t in_len) {
|
||||
std::string ret;
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
unsigned char char_array_3[3];
|
||||
unsigned char char_array_4[4];
|
||||
|
||||
while (in_len--) {
|
||||
char_array_3[i++] = *(bytes_to_encode++);
|
||||
if (i == 3) {
|
||||
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
|
||||
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
|
||||
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
|
||||
char_array_4[3] = char_array_3[2] & 0x3f;
|
||||
|
||||
for(i = 0; (i <4) ; i++)
|
||||
ret += base64_chars()[char_array_4[i]];
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (i)
|
||||
{
|
||||
for(j = i; j < 3; j++)
|
||||
char_array_3[j] = '\0';
|
||||
|
||||
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
|
||||
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
|
||||
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
|
||||
char_array_4[3] = char_array_3[2] & 0x3f;
|
||||
|
||||
for (j = 0; (j < i + 1); j++)
|
||||
ret += base64_chars()[char_array_4[j]];
|
||||
|
||||
while((i++ < 3))
|
||||
ret += '=';
|
||||
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
inline
|
||||
std::string base64_encode(const std::string& str)
|
||||
{
|
||||
return base64_encode((unsigned char const* )str.data(), str.size());
|
||||
}
|
||||
|
||||
inline bool is_base64(unsigned char c) {
|
||||
return (isalnum(c) || (c == '+') || (c == '/'));
|
||||
}
|
||||
|
||||
|
||||
inline
|
||||
std::string base64_decode(std::string const& encoded_string) {
|
||||
size_t in_len = encoded_string.size();
|
||||
size_t i = 0;
|
||||
size_t j = 0;
|
||||
size_t in_ = 0;
|
||||
unsigned char char_array_4[4], char_array_3[3];
|
||||
std::string ret;
|
||||
|
||||
while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
|
||||
char_array_4[i++] = encoded_string[in_]; in_++;
|
||||
if (i ==4) {
|
||||
for (i = 0; i <4; i++)
|
||||
char_array_4[i] = (unsigned char)base64_chars().find(char_array_4[i]);
|
||||
|
||||
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
|
||||
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
|
||||
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
|
||||
|
||||
for (i = 0; (i < 3); i++)
|
||||
ret += char_array_3[i];
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (i) {
|
||||
for (j = i; j <4; j++)
|
||||
char_array_4[j] = 0;
|
||||
|
||||
for (j = 0; j <4; j++)
|
||||
char_array_4[j] = (unsigned char)base64_chars().find(char_array_4[j]);
|
||||
|
||||
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
|
||||
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
|
||||
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
|
||||
|
||||
for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif //_STRING_CODING_H_
|
|
@ -39,7 +39,6 @@
|
|||
#include "common/util.h"
|
||||
#include "common/file.h"
|
||||
#include "common/string_util.h"
|
||||
#include "epee/string_coding.h"
|
||||
#include "epee/string_tools.h"
|
||||
#include "epee/storages/portable_storage_template_helper.h"
|
||||
|
||||
|
|
|
@ -84,7 +84,6 @@
|
|||
#include "wallet/message_store.h"
|
||||
#endif
|
||||
#include "wallet/wallet_rpc_server_commands_defs.h"
|
||||
#include "epee/string_coding.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
|
|
@ -27,10 +27,10 @@
|
|||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include "message_transporter.h"
|
||||
#include "epee/string_coding.h"
|
||||
#include <boost/format.hpp>
|
||||
#include "wallet_errors.h"
|
||||
#include <algorithm>
|
||||
#include <oxenc/base64.h>
|
||||
|
||||
#undef OXEN_DEFAULT_LOG_CATEGORY
|
||||
#define OXEN_DEFAULT_LOG_CATEGORY "wallet.mms"
|
||||
|
@ -129,26 +129,26 @@ bool message_transporter::receive_messages(const std::vector<std::string> &desti
|
|||
const bitmessage_rpc::message_info &message_info = bitmessage_res.inboxMessages[i];
|
||||
if (std::find(destination_transport_addresses.begin(), destination_transport_addresses.end(), message_info.toAddress) != destination_transport_addresses.end())
|
||||
{
|
||||
transport_message message{};
|
||||
bool is_mms_message = false;
|
||||
try
|
||||
{
|
||||
// First Base64-decoding: The message body is Base64 in the Bitmessage API
|
||||
std::string message_body = epee::string_encoding::base64_decode(message_info.message);
|
||||
if (!oxenc::is_base64(message_info.message))
|
||||
throw std::runtime_error{"not base64"};
|
||||
std::string message_body = oxenc::from_base64(message_info.message);
|
||||
// Second Base64-decoding: The MMS uses Base64 to hide non-textual data in its JSON from Bitmessage
|
||||
json = epee::string_encoding::base64_decode(message_body);
|
||||
if (!epee::serialization::load_t_from_json(message, json))
|
||||
MERROR("Failed to deserialize message");
|
||||
else
|
||||
is_mms_message = true;
|
||||
// (WTF?)
|
||||
if (!oxenc::is_base64(message_body))
|
||||
throw std::runtime_error{"decoded base64 does not contain more base64"};
|
||||
transport_message message{};
|
||||
if (!epee::serialization::load_t_from_json(message, oxenc::from_base64(message_body)))
|
||||
throw std::runtime_error{"epee json-to-type deserialization failed"};
|
||||
|
||||
message.transport_id = message_info.msgid;
|
||||
messages.push_back(std::move(message));
|
||||
}
|
||||
catch(const std::exception& e)
|
||||
{
|
||||
}
|
||||
if (is_mms_message)
|
||||
{
|
||||
message.transport_id = message_info.msgid;
|
||||
messages.push_back(message);
|
||||
MERROR("Failed to deserialize message: " << e.what());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -164,9 +164,8 @@ void message_transporter::send_message(const transport_message &message)
|
|||
add_xml_rpc_string_param(request, message.destination_transport_address);
|
||||
add_xml_rpc_string_param(request, message.source_transport_address);
|
||||
add_xml_rpc_base64_param(request, message.subject);
|
||||
std::string json = epee::serialization::store_t_to_json(message);
|
||||
std::string message_body = epee::string_encoding::base64_encode(json); // See comment in "receive_message" about reason for (double-)Base64 encoding
|
||||
add_xml_rpc_base64_param(request, message_body);
|
||||
// See comment in "receive_message" about (shitty) reason for (double-)Base64 encoding
|
||||
add_xml_rpc_base64_param(request, oxenc::to_base64(epee::serialization::store_t_to_json(message)));
|
||||
add_xml_rpc_integer_param(request, 2);
|
||||
end_xml_rpc_cmd(request);
|
||||
std::string answer;
|
||||
|
@ -294,8 +293,7 @@ void message_transporter::add_xml_rpc_string_param(std::string &xml, const std::
|
|||
void message_transporter::add_xml_rpc_base64_param(std::string &xml, const std::string ¶m)
|
||||
{
|
||||
// Bitmessage expects some arguments Base64-encoded, but it wants them as parameters of type "string", not "base64" that is also part of XML-RPC
|
||||
std::string encoded_param = epee::string_encoding::base64_encode(param);
|
||||
xml += (boost::format("<param><value><string>%s</string></value></param>") % encoded_param).str();
|
||||
xml += (boost::format("<param><value><string>%s</string></value></param>") % oxenc::to_base64(param)).str();
|
||||
}
|
||||
|
||||
void message_transporter::add_xml_rpc_integer_param(std::string &xml, const int32_t ¶m)
|
||||
|
|
|
@ -89,7 +89,6 @@
|
|||
#include "cryptonote_core/service_node_rules.h"
|
||||
#include "common/oxen.h"
|
||||
#include "oxen_economy.h"
|
||||
#include "epee/string_coding.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include "cryptonote_basic/cryptonote_basic_impl.h"
|
||||
#include <chrono>
|
||||
#include <exception>
|
||||
#include <oxenc/base64.h>
|
||||
|
||||
#include "wallet_rpc_server_error_codes.h"
|
||||
#include "wallet_rpc_server.h"
|
||||
|
@ -47,7 +48,6 @@
|
|||
#include "cryptonote_basic/account.h"
|
||||
#include "multisig/multisig.h"
|
||||
#include "epee/misc_language.h"
|
||||
#include "epee/string_coding.h"
|
||||
#include "epee/string_tools.h"
|
||||
#include "epee/wipeable_string.h"
|
||||
#include "crypto/hash.h"
|
||||
|
@ -544,7 +544,7 @@ namespace tools
|
|||
crypto::rand(rand_128bit.size(), rand_128bit.data());
|
||||
m_login.emplace(
|
||||
default_rpc_username,
|
||||
epee::string_encoding::base64_encode(rand_128bit.data(), rand_128bit.size())
|
||||
oxenc::to_base64(rand_128bit.begin(), rand_128bit.end())
|
||||
);
|
||||
|
||||
std::string temp = "oxen-wallet-rpc." + std::to_string(port) + ".login";
|
||||
|
|
Loading…
Reference in New Issue