X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Ffreenet%2Fmessagerequester.cpp;h=fefe8988948a14fedc717be214b6247c102c3b12;hb=9ae3b1434e51788e6feb72e1415ec800d05c535a;hp=4ea393a19fc39e5443876841ceff81f3f635c3fb;hpb=278ee758050cb7772cd95946688c5b40104f4d8b;p=fms.git diff --git a/src/freenet/messagerequester.cpp b/src/freenet/messagerequester.cpp index 4ea393a..fefe898 100644 --- a/src/freenet/messagerequester.cpp +++ b/src/freenet/messagerequester.cpp @@ -11,12 +11,14 @@ #include #endif -MessageRequester::MessageRequester() +std::string MessageRequester::m_validuuidchars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890~@_-"; + +MessageRequester::MessageRequester(SQLite3DB::DB *db):IIndexRequester(db) { Initialize(); } -MessageRequester::MessageRequester(FCPv2 *fcp):IIndexRequester(fcp) +MessageRequester::MessageRequester(SQLite3DB::DB *db, FCPv2::Connection *fcp):IIndexRequester(db,fcp) { Initialize(); } @@ -85,7 +87,7 @@ const std::string MessageRequester::GetIdentityName(const long identityid) } } -const bool MessageRequester::HandleAllData(FCPMessage &message) +const bool MessageRequester::HandleAllData(FCPv2::Message &message) { SQLite3DB::Statement st; std::vector idparts; @@ -104,20 +106,16 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) StringFunctions::Convert(idparts[4],index); // wait for all data to be received from connection - while(m_fcp->Connected() && m_fcp->ReceiveBufferSize()Update(1); - } + m_fcp->WaitForBytes(1000,datalength); // if we got disconnected- return immediately - if(m_fcp->Connected()==false) + if(m_fcp->IsConnected()==false) { return false; } // receive the file - data.resize(datalength); - m_fcp->ReceiveRaw(&data[0],datalength); + m_fcp->Receive(data,datalength); // mark this index as received st=m_db->Prepare("UPDATE tblMessageRequests SET Found='true' WHERE IdentityID=? AND Day=? AND RequestIndex=?;"); @@ -128,7 +126,7 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) st.Finalize(); // parse file into xml and update the database - if(xml.ParseXML(std::string(data.begin(),data.end()))==true) + if(data.size()>0 && xml.ParseXML(std::string(data.begin(),data.end()))==true) { std::vector boards=xml.GetBoards(); std::map replyto=xml.GetInReplyTo(); @@ -176,7 +174,7 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) StringFunctions::SplitMultiple(publickey,"@,",keyparts); StringFunctions::SplitMultiple(xml.GetMessageID(),"@",uuidparts); - if(uuidparts.size()>1 && keyparts.size()>1) + if(uuidparts.size()>1 && keyparts.size()>1 && xml.GetMessageID().find_first_not_of(m_validuuidchars)==std::string::npos) { keypart=StringFunctions::Replace(StringFunctions::Replace(keyparts[1],"-",""),"~",""); if(keypart!=uuidparts[1]) @@ -228,7 +226,9 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) nntpbody+="\r\n"; } - st=m_db->Prepare("INSERT INTO tblMessage(IdentityID,FromName,MessageDate,MessageTime,Subject,MessageUUID,ReplyBoardID,Body,MessageIndex) VALUES(?,?,?,?,?,?,?,?,?);"); + m_db->Execute("BEGIN;"); + + st=m_db->Prepare("INSERT INTO tblMessage(IdentityID,FromName,MessageDate,MessageTime,Subject,MessageUUID,ReplyBoardID,Body,MessageIndex,InsertDate) VALUES(?,?,?,?,?,?,?,?,?,?);"); st.Bind(0,identityid); st.Bind(1,GetIdentityName(identityid)); st.Bind(2,xml.GetDate()); @@ -238,8 +238,9 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) st.Bind(6,GetBoardID(xml.GetReplyBoard(),GetIdentityName(identityid))); st.Bind(7,nntpbody); st.Bind(8,index); + st.Bind(9,idparts[3]); inserted=st.Step(true); - int messageid=st.GetLastInsertRowID(); + long messageid=st.GetLastInsertRowID(); if(inserted==true) { @@ -276,6 +277,10 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) //m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"MessageRequester::HandleAddData could not insert message into database. "+message["Identifier"]); } + st.Finalize(); + + m_db->Execute("COMMIT;"); + } // if validmessage } else @@ -288,7 +293,7 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) return true; } -const bool MessageRequester::HandleGetFailed(FCPMessage &message) +const bool MessageRequester::HandleGetFailed(FCPv2::Message &message) { SQLite3DB::Statement st; std::vector idparts; @@ -314,6 +319,14 @@ const bool MessageRequester::HandleGetFailed(FCPMessage &message) m_log->error("MessageRequester::HandleGetFailed fatal error requesting "+message["Identifier"]); } + // increase the failure count of the identity who gave us this index + st=m_db->Prepare("UPDATE tblIdentity SET FailureCount=FailureCount+1 WHERE IdentityID IN (SELECT FromIdentityID FROM tblMessageRequests WHERE IdentityID=? AND Day=? AND RequestIndex=?);"); + st.Bind(0,identityid); + st.Bind(1,idparts[3]); + st.Bind(2,index); + st.Step(); + st.Finalize(); + // remove this identityid from request list RemoveFromRequestList(requestid); @@ -323,10 +336,11 @@ const bool MessageRequester::HandleGetFailed(FCPMessage &message) void MessageRequester::Initialize() { m_fcpuniquename="MessageRequester"; - std::string tempval; - + std::string tempval(""); m_maxrequests=0; - Option::Instance()->GetInt("MaxMessageRequests",m_maxrequests); + Option option(m_db); + + option.GetInt("MaxMessageRequests",m_maxrequests); if(m_maxrequests<1) { m_maxrequests=1; @@ -338,7 +352,7 @@ void MessageRequester::Initialize() } m_maxdaysbackward=0; - Option::Instance()->GetInt("MessageDownloadMaxDaysBackward",m_maxdaysbackward); + option.GetInt("MessageDownloadMaxDaysBackward",m_maxdaysbackward); if(m_maxdaysbackward<0) { m_maxdaysbackward=0; @@ -350,7 +364,7 @@ void MessageRequester::Initialize() } m_maxpeermessages=0; - Option::Instance()->GetInt("MaxPeerMessagesPerDay",m_maxpeermessages); + option.GetInt("MaxPeerMessagesPerDay",m_maxpeermessages); if(m_maxpeermessages<1) { m_maxpeermessages=1; @@ -362,7 +376,7 @@ void MessageRequester::Initialize() } m_maxboardspermessage=0; - Option::Instance()->GetInt("MaxBoardsPerMessage",m_maxboardspermessage); + option.GetInt("MaxBoardsPerMessage",m_maxboardspermessage); if(m_maxboardspermessage<1) { m_maxboardspermessage=1; @@ -373,7 +387,7 @@ void MessageRequester::Initialize() m_log->warning("Option MaxBoardsPerMessage is currently set at "+tempval+". This value might be incorrectly configured."); } - Option::Instance()->Get("SaveMessagesFromNewBoards",tempval); + option.Get("SaveMessagesFromNewBoards",tempval); if(tempval=="true") { m_savemessagesfromnewboards=true; @@ -383,7 +397,7 @@ void MessageRequester::Initialize() m_savemessagesfromnewboards=false; } - Option::Instance()->Get("LocalTrustOverridesPeerTrust",tempval); + option.Get("LocalTrustOverridesPeerTrust",tempval); if(tempval=="true") { m_localtrustoverrides=true; @@ -418,7 +432,7 @@ void MessageRequester::PopulateIDList() { sql+="AND (tblIdentity.LocalMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalMessageTrust') OR (tblIdentity.LocalMessageTrust IS NULL AND (tblIdentity.PeerMessageTrust IS NULL OR tblIdentity.PeerMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerMessageTrust')))) "; } - sql+="AND tblIdentity.Name <> '' "; + sql+="AND tblIdentity.Name <> '' AND tblIdentity.FailureCount<=(SELECT OptionValue FROM tblOption WHERE Option='MaxFailureCount') "; // sort by day descending - in case there is a bunch of messages on a day that keep timing out, we will eventually get to the next day and hopefully find messages there // secondary ascending sort on tries // tertiary sort on request index (so we get low indexes first) @@ -476,7 +490,7 @@ const bool MessageRequester::SaveToBoard(const std::string &boardname) void MessageRequester::StartRequest(const std::string &requestid) { - FCPMessage message; + FCPv2::Message message; std::vector parts; std::string tempval; long identityid; @@ -502,9 +516,10 @@ void MessageRequester::StartRequest(const std::string &requestid) message["Identifier"]=m_fcpuniquename+"|"+requestid+"|"+parts[0]+"|"+parts[1]+"|"+parts[2]+"|"+message["URI"]; message["ReturnType"]="direct"; message["MaxSize"]="1000000"; // 1 MB - message["MaxRetries"]="-1"; // use ULPR since we are fairly sure message exists since the author says it does + // don't use ULPR - we wan't to know of failures ASAP so we can mark them as such + //message["MaxRetries"]="-1"; // use ULPR since we are fairly sure message exists since the author says it does - m_fcp->SendMessage(message); + m_fcp->Send(message); m_requesting.push_back(requestid);