Browse Source

Merge branch 'master' of ssh://pitanga//home/miguel/softs/twister

miguelfreitas
Miguel Freitas 11 years ago
parent
commit
543898da85
  1. 16
      libtorrent/src/kademlia/node.cpp
  2. 2
      src/init.cpp
  3. 81
      src/twister.cpp

16
libtorrent/src/kademlia/node.cpp

@ -55,6 +55,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/rsa.hpp" #include "libtorrent/rsa.hpp"
#include "../../src/twister.h" #include "../../src/twister.h"
//#define ENABLE_DHT_ITEM_EXPIRE
namespace libtorrent { namespace dht namespace libtorrent { namespace dht
{ {
@ -502,6 +503,12 @@ bool node_impl::refresh_storage() {
if( lsto.size() == 1 ) { if( lsto.size() == 1 ) {
dht_storage_item const& item = lsto.front(); dht_storage_item const& item = lsto.front();
#ifdef ENABLE_DHT_ITEM_EXPIRE
if( has_expired(item) ) {
continue;
}
#endif
lazy_entry p; lazy_entry p;
int pos; int pos;
error_code err; error_code err;
@ -638,9 +645,14 @@ void node_impl::load_storage(entry const* e) {
item.sig_user = j->find_key("sig_user")->string(); item.sig_user = j->find_key("sig_user")->string();
// just for printf for now // just for printf for now
has_expired(item); bool expired = has_expired(item);
#ifdef ENABLE_DHT_ITEM_EXPIRE
if( !expired ) {
#endif
to_add.push_back(item); to_add.push_back(item);
#ifdef ENABLE_DHT_ITEM_EXPIRE
}
#endif
} }
m_storage_table.insert(std::make_pair(target, to_add)); m_storage_table.insert(std::make_pair(target, to_add));
} }

2
src/init.cpp

@ -738,7 +738,7 @@ bool AppInit2(boost::thread_group& threadGroup)
// first suggest a reindex // first suggest a reindex
if (!fReset) { if (!fReset) {
/*bool fRet =*/ uiInterface.ThreadSafeMessageBox( /*bool fRet =*/ uiInterface.ThreadSafeMessageBox(
strLoadError + ".\n\n" + _("Do you want to rebuild the block database now?"), strLoadError + ".\n\n" + _("Do you want to rebuild the block database now? (assuming YES)"),
"", CClientUIInterface::MSG_ERROR | CClientUIInterface::BTN_ABORT); "", CClientUIInterface::MSG_ERROR | CClientUIInterface::BTN_ABORT);
if (true /* [MF] fRet*/) { if (true /* [MF] fRet*/) {
fReindex = true; fReindex = true;

81
src/twister.cpp

@ -31,6 +31,7 @@ twister::twister()
#include "libtorrent/aux_/session_impl.hpp" #include "libtorrent/aux_/session_impl.hpp"
#define DEBUG_ACCEPT_POST 1 #define DEBUG_ACCEPT_POST 1
#define DEBUG_EXPIRE_DHT_ITEM 1
using namespace libtorrent; using namespace libtorrent;
static session *ses = NULL; static session *ses = NULL;
@ -47,8 +48,12 @@ static map<std::string, torrent_handle> m_userTorrent;
static std::string m_preferredSpamLang = "[en]"; static std::string m_preferredSpamLang = "[en]";
static std::string m_receivedSpamMsgStr; static std::string m_receivedSpamMsgStr;
static std::string m_receivedSpamUserStr; static std::string m_receivedSpamUserStr;
static int64 m_lastSpamTime = 0;
static std::map<std::string,UserData> m_users; static std::map<std::string,UserData> m_users;
#define USER_DATA_FILE "user_data"
#define GLOBAL_DATA_FILE "global_data"
sha1_hash dhtTargetHash(std::string const &username, std::string const &resource, std::string const &type) sha1_hash dhtTargetHash(std::string const &username, std::string const &resource, std::string const &type)
{ {
entry target; entry target;
@ -96,6 +101,47 @@ int lastPostKfromTorrent(std::string const &username)
return status.last_have; return status.last_have;
} }
int saveGlobalData(std::string const& filename)
{
LOCK(cs_twister);
entry globalDict;
globalDict["preferredSpamLang"] = m_preferredSpamLang;
globalDict["receivedSpamMsg"] = m_receivedSpamMsgStr;
globalDict["receivedSpamUser"] = m_receivedSpamUserStr;
globalDict["lastSpamTime"] = m_lastSpamTime;
std::vector<char> buf;
bencode(std::back_inserter(buf), globalDict);
return save_file(filename, buf);
}
int loadGlobalData(std::string const& filename)
{
LOCK(cs_twister);
std::vector<char> in;
if (load_file(filename, in) == 0) {
lazy_entry userDict;
error_code ec;
if (lazy_bdecode(&in[0], &in[0] + in.size(), userDict, ec) == 0) {
if( userDict.type() != lazy_entry::dict_t ) goto data_error;
m_preferredSpamLang = userDict.dict_find_string_value("preferredSpamLang");
m_receivedSpamMsgStr = userDict.dict_find_string_value("receivedSpamMsg");
m_receivedSpamUserStr = userDict.dict_find_string_value("receivedSpamUser");
m_lastSpamTime = userDict.dict_find_int_value("lastSpamTime");
return 0;
}
}
return -1;
data_error:
printf("loadGlobalData: unexpected bencode type - global_data corrupt!\n");
return -2;
}
void ThreadWaitExtIP() void ThreadWaitExtIP()
{ {
RenameThread("wait-extip"); RenameThread("wait-extip");
@ -172,9 +218,12 @@ void ThreadWaitExtIP()
break; break;
} }
boost::filesystem::path globalDataPath = GetDataDir() / GLOBAL_DATA_FILE;
loadGlobalData(globalDataPath.string());
{ {
LOCK(cs_twister); LOCK(cs_twister);
boost::filesystem::path userDataPath = GetDataDir() / "user_data"; boost::filesystem::path userDataPath = GetDataDir() / USER_DATA_FILE;
loadUserData(userDataPath.string(), m_users); loadUserData(userDataPath.string(), m_users);
printf("loaded user_data for %zd users\n", m_users.size()); printf("loaded user_data for %zd users\n", m_users.size());
@ -457,9 +506,12 @@ void stopSessionTorrent()
ses = NULL; ses = NULL;
} }
boost::filesystem::path globalDataPath = GetDataDir() / GLOBAL_DATA_FILE;
saveGlobalData(globalDataPath.string());
if( m_users.size() ) { if( m_users.size() ) {
printf("saving user_data (followers and DMs)...\n"); printf("saving user_data (followers and DMs)...\n");
boost::filesystem::path userDataPath = GetDataDir() / "user_data"; boost::filesystem::path userDataPath = GetDataDir() / USER_DATA_FILE;
saveUserData(userDataPath.string(), m_users); saveUserData(userDataPath.string(), m_users);
} }
@ -585,9 +637,11 @@ bool processReceivedDM(lazy_entry const* post)
} else { } else {
std::string textOut; std::string textOut;
if( key.Decrypt(sec, textOut) ) { if( key.Decrypt(sec, textOut) ) {
/* this printf is good for debug, but bad for security.
printf("Received DM for user '%s' text = '%s'\n", printf("Received DM for user '%s' text = '%s'\n",
item.second.username.c_str(), item.second.username.c_str(),
textOut.c_str()); textOut.c_str());
*/
std::string n = post->dict_find_string_value("n"); std::string n = post->dict_find_string_value("n");
@ -827,7 +881,9 @@ bool shouldDhtResourceExpire(std::string resource, bool multi, int height)
{ {
if ((height + BLOCK_AGE_TO_EXPIRE_DHT_ENTRY) < getBestHeight() ) { if ((height + BLOCK_AGE_TO_EXPIRE_DHT_ENTRY) < getBestHeight() ) {
if( multi ) { if( multi ) {
#ifdef DEBUG_EXPIRE_DHT_ITEM
printf("shouldDhtResourceExpire: expiring resource multi '%s'\n", resource.c_str()); printf("shouldDhtResourceExpire: expiring resource multi '%s'\n", resource.c_str());
#endif
return true; return true;
} }
@ -847,12 +903,16 @@ bool shouldDhtResourceExpire(std::string resource, bool multi, int height)
} else { } else {
if( !m_noExpireResources[resourceBasic] && resourceNumber >= 0 ) { if( !m_noExpireResources[resourceBasic] && resourceNumber >= 0 ) {
// this resource admits no number. expire it! // this resource admits no number. expire it!
#ifdef DEBUG_EXPIRE_DHT_ITEM
printf("shouldDhtResourceExpire: expiring resource with unexpected numbering '%s'\n", resource.c_str()); printf("shouldDhtResourceExpire: expiring resource with unexpected numbering '%s'\n", resource.c_str());
#endif
return true; return true;
} }
if( m_noExpireResources[resourceBasic] && resourceNumber > 200 ) { if( m_noExpireResources[resourceBasic] && resourceNumber > 200 ) {
// try keeping a sane number here, otherwise expire it! // try keeping a sane number here, otherwise expire it!
#ifdef DEBUG_EXPIRE_DHT_ITEM
printf("shouldDhtResourceExpire: expiring resource with numbering too big '%s'\n", resource.c_str()); printf("shouldDhtResourceExpire: expiring resource with numbering too big '%s'\n", resource.c_str());
#endif
return true; return true;
} }
} }
@ -863,8 +923,13 @@ bool shouldDhtResourceExpire(std::string resource, bool multi, int height)
void receivedSpamMessage(std::string const &message, std::string const &user) void receivedSpamMessage(std::string const &message, std::string const &user)
{ {
LOCK(cs_twister); LOCK(cs_twister);
if( !m_receivedSpamMsgStr.length() || bool hasSingleLangCode = (message.find("[") == message.rfind("["));
(m_preferredSpamLang.length() && message.find(m_preferredSpamLang) != string::npos) ) { bool hasPreferredLang = m_preferredSpamLang.length();
bool isSameLang = hasPreferredLang && hasSingleLangCode &&
message.find(m_preferredSpamLang) != string::npos;
bool currentlyEmpty = !m_receivedSpamMsgStr.length();
if( currentlyEmpty || (isSameLang && rand() < (RAND_MAX/2)) ) {
m_receivedSpamMsgStr = message; m_receivedSpamMsgStr = message;
m_receivedSpamUserStr = user; m_receivedSpamUserStr = user;
} }
@ -1192,9 +1257,11 @@ Value getposts(const Array& params, bool fHelp)
{ {
LOCK(cs_twister); LOCK(cs_twister);
if( m_receivedSpamMsgStr.length() ) {
// we must agree on an acceptable level here // we must agree on an acceptable level here
if( rand() < (RAND_MAX/10) ) { // what about one every eight hours? (not cumulative)
if( m_receivedSpamMsgStr.length() && GetAdjustedTime() > m_lastSpamTime + (8*3600) ) {
m_lastSpamTime = GetAdjustedTime();
entry v; entry v;
entry &userpost = v["userpost"]; entry &userpost = v["userpost"];
@ -1209,7 +1276,7 @@ Value getposts(const Array& params, bool fHelp)
RAND_bytes(vchSig,sizeof(vchSig)); RAND_bytes(vchSig,sizeof(vchSig));
v["sig_userpost"] = std::string((const char *)vchSig, sizeof(vchSig)); v["sig_userpost"] = std::string((const char *)vchSig, sizeof(vchSig));
ret.insert(ret.begin(),entryToJson(v)); ret.insert(ret.begin(),entryToJson(v));
}
m_receivedSpamMsgStr = ""; m_receivedSpamMsgStr = "";
m_receivedSpamUserStr = ""; m_receivedSpamUserStr = "";
} }

Loading…
Cancel
Save