mirror of
https://github.com/twisterarmy/twister-core.git
synced 2025-01-11 07:17:53 +00:00
"hexcape" binary strings before json encoding.
because json doesn't support binary we need to escape to hex, unfortunatly, this add requirement to twisterd to know each possible binary field we may add to dht items. (unlike bencode that simply doesn't care).
This commit is contained in:
parent
d5a81fdcdd
commit
bc990abfff
@ -1115,6 +1115,8 @@ Value dhtput(const Array& params, bool fHelp)
|
|||||||
string strResource = params[1].get_str();
|
string strResource = params[1].get_str();
|
||||||
string strMulti = params[2].get_str();
|
string strMulti = params[2].get_str();
|
||||||
entry value = jsonToEntry(params[3]);
|
entry value = jsonToEntry(params[3]);
|
||||||
|
// value is already "p":"v": contents, so post may be unhexcaped directly
|
||||||
|
unHexcapePost(value);
|
||||||
string strSigUser = params[4].get_str();
|
string strSigUser = params[4].get_str();
|
||||||
|
|
||||||
// Test for private key here to avoid going into dht
|
// Test for private key here to avoid going into dht
|
||||||
@ -1173,7 +1175,12 @@ Value dhtget(const Array& params, bool fHelp)
|
|||||||
|
|
||||||
dht_reply_data_alert const* rd = alert_cast<dht_reply_data_alert>(&(*a));
|
dht_reply_data_alert const* rd = alert_cast<dht_reply_data_alert>(&(*a));
|
||||||
if( rd ) {
|
if( rd ) {
|
||||||
ret = entryToJson(rd->m_lst);
|
entry::list_type dhtLst = rd->m_lst;
|
||||||
|
entry::list_type::iterator it;
|
||||||
|
for( it = dhtLst.begin(); it != dhtLst.end(); ++it ) {
|
||||||
|
hexcapeDht( *it );
|
||||||
|
}
|
||||||
|
ret = entryToJson(dhtLst);
|
||||||
} else {
|
} else {
|
||||||
// cast failed => dht_reply_data_done_alert => no data
|
// cast failed => dht_reply_data_done_alert => no data
|
||||||
}
|
}
|
||||||
@ -1293,6 +1300,7 @@ Value newpostmsg(const Array& params, bool fHelp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hexcapePost(v);
|
||||||
return entryToJson(v);
|
return entryToJson(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1341,6 +1349,7 @@ Value newdirectmsg(const Array& params, bool fHelp)
|
|||||||
torrent_handle h = startTorrentUser(strFrom);
|
torrent_handle h = startTorrentUser(strFrom);
|
||||||
h.add_piece(k,buf.data(),buf.size());
|
h.add_piece(k,buf.data(),buf.size());
|
||||||
|
|
||||||
|
hexcapePost(v);
|
||||||
return entryToJson(v);
|
return entryToJson(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1357,6 +1366,7 @@ Value newrtmsg(const Array& params, bool fHelp)
|
|||||||
int k = params[1].get_int();
|
int k = params[1].get_int();
|
||||||
string strK = boost::lexical_cast<std::string>(k);
|
string strK = boost::lexical_cast<std::string>(k);
|
||||||
entry vrt = jsonToEntry(params[2].get_obj());
|
entry vrt = jsonToEntry(params[2].get_obj());
|
||||||
|
unHexcapePost(vrt);
|
||||||
entry const *rt = vrt.find_key("userpost");
|
entry const *rt = vrt.find_key("userpost");
|
||||||
entry const *sig_rt= vrt.find_key("sig_userpost");
|
entry const *sig_rt= vrt.find_key("sig_userpost");
|
||||||
|
|
||||||
@ -1402,6 +1412,7 @@ Value newrtmsg(const Array& params, bool fHelp)
|
|||||||
v, strUsername, GetAdjustedTime(), 0);
|
v, strUsername, GetAdjustedTime(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hexcapePost(v);
|
||||||
return entryToJson(v);
|
return entryToJson(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1446,6 +1457,7 @@ Value getposts(const Array& params, bool fHelp)
|
|||||||
|
|
||||||
entry vEntry;
|
entry vEntry;
|
||||||
vEntry = v;
|
vEntry = v;
|
||||||
|
hexcapePost(vEntry);
|
||||||
postsByTime.insert( pair<int64,entry>(time, vEntry) );
|
postsByTime.insert( pair<int64,entry>(time, vEntry) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1477,7 +1489,7 @@ Value getposts(const Array& params, bool fHelp)
|
|||||||
|
|
||||||
unsigned char vchSig[65];
|
unsigned char vchSig[65];
|
||||||
RAND_bytes(vchSig,sizeof(vchSig));
|
RAND_bytes(vchSig,sizeof(vchSig));
|
||||||
v["sig_userpost"] = std::string((const char *)vchSig, sizeof(vchSig));
|
v["sig_userpost"] = HexStr( string((const char *)vchSig, sizeof(vchSig)) );
|
||||||
ret.insert(ret.begin(),entryToJson(v));
|
ret.insert(ret.begin(),entryToJson(v));
|
||||||
|
|
||||||
m_receivedSpamMsgStr = "";
|
m_receivedSpamMsgStr = "";
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#include "twister_utils.h"
|
#include "twister_utils.h"
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
#include <libtorrent/session.hpp>
|
#include <libtorrent/session.hpp>
|
||||||
#include <libtorrent/bencode.hpp>
|
#include <libtorrent/bencode.hpp>
|
||||||
|
|
||||||
@ -230,3 +232,101 @@ data_error:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void findAndHexcape(libtorrent::entry &e, string const& key)
|
||||||
|
{
|
||||||
|
if( e.type() == libtorrent::entry::dictionary_t &&
|
||||||
|
e.find_key(key) && e[key].type() == libtorrent::entry::string_t ) {
|
||||||
|
e[key] = HexStr(e[key].string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void findAndUnHexcape(libtorrent::entry &e, string const& key)
|
||||||
|
{
|
||||||
|
if( e.type() == libtorrent::entry::dictionary_t &&
|
||||||
|
e.find_key(key) && e[key].type() == libtorrent::entry::string_t ) {
|
||||||
|
vector<unsigned char> vch = ParseHex(e[key].string());
|
||||||
|
e[key] = string((const char *)vch.data(), vch.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void hexcapePost(libtorrent::entry &e)
|
||||||
|
{
|
||||||
|
if( e.type() == libtorrent::entry::dictionary_t ) {
|
||||||
|
findAndHexcape(e,"sig_userpost");
|
||||||
|
if( e.find_key("userpost") ) {
|
||||||
|
entry &userpost = e["userpost"];
|
||||||
|
if( userpost.type() == libtorrent::entry::dictionary_t ) {
|
||||||
|
findAndHexcape(userpost,"sig_rt");
|
||||||
|
if( userpost.find_key("dm") ) {
|
||||||
|
entry &dm = userpost["dm"];
|
||||||
|
if( dm.type() == libtorrent::entry::dictionary_t ) {
|
||||||
|
findAndHexcape(dm,"body");
|
||||||
|
findAndHexcape(dm,"key");
|
||||||
|
findAndHexcape(dm,"mac");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void unHexcapePost(libtorrent::entry &e)
|
||||||
|
{
|
||||||
|
if( e.type() == libtorrent::entry::dictionary_t ) {
|
||||||
|
findAndUnHexcape(e,"sig_userpost");
|
||||||
|
if( e.find_key("userpost") ) {
|
||||||
|
entry &userpost = e["userpost"];
|
||||||
|
if( userpost.type() == libtorrent::entry::dictionary_t ) {
|
||||||
|
findAndUnHexcape(userpost,"sig_rt");
|
||||||
|
if( userpost.find_key("dm") ) {
|
||||||
|
entry &dm = userpost["dm"];
|
||||||
|
if( dm.type() == libtorrent::entry::dictionary_t ) {
|
||||||
|
findAndUnHexcape(dm,"body");
|
||||||
|
findAndUnHexcape(dm,"key");
|
||||||
|
findAndUnHexcape(dm,"mac");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void hexcapeDht(libtorrent::entry &e)
|
||||||
|
{
|
||||||
|
if( e.type() == libtorrent::entry::dictionary_t ) {
|
||||||
|
findAndHexcape(e,"sig_p");
|
||||||
|
if( e.find_key("p") ) {
|
||||||
|
entry &p = e["p"];
|
||||||
|
if( p.type() == libtorrent::entry::dictionary_t ) {
|
||||||
|
if( p.find_key("v") ) {
|
||||||
|
entry &v = p["v"];
|
||||||
|
if( v.type() == libtorrent::entry::dictionary_t ) {
|
||||||
|
hexcapePost(v);
|
||||||
|
// any other possible content to hexcape?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void unHexcapeDht(libtorrent::entry &e)
|
||||||
|
{
|
||||||
|
if( e.type() == libtorrent::entry::dictionary_t ) {
|
||||||
|
findAndUnHexcape(e,"sig_p");
|
||||||
|
if( e.find_key("p") ) {
|
||||||
|
entry &p = e["p"];
|
||||||
|
if( p.type() == libtorrent::entry::dictionary_t ) {
|
||||||
|
if( p.find_key("v") ) {
|
||||||
|
entry &v = p["v"];
|
||||||
|
if( v.type() == libtorrent::entry::dictionary_t ) {
|
||||||
|
unHexcapePost(v);
|
||||||
|
// any other possible content to unhexcape?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -38,4 +38,10 @@ libtorrent::entry jsonToEntry(const json_spirit::Value &v);
|
|||||||
int saveUserData(std::string const& filename, std::map<std::string,UserData> const &users);
|
int saveUserData(std::string const& filename, std::map<std::string,UserData> const &users);
|
||||||
int loadUserData(std::string const& filename, std::map<std::string,UserData> &users);
|
int loadUserData(std::string const& filename, std::map<std::string,UserData> &users);
|
||||||
|
|
||||||
|
void hexcapePost(libtorrent::entry &e);
|
||||||
|
void unHexcapePost(libtorrent::entry &e);
|
||||||
|
|
||||||
|
void hexcapeDht(libtorrent::entry &e);
|
||||||
|
void unHexcapeDht(libtorrent::entry &e);
|
||||||
|
|
||||||
#endif // TWISTER_UTILS_H
|
#endif // TWISTER_UTILS_H
|
||||||
|
Loading…
Reference in New Issue
Block a user