X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Ffreenet%2Fmessagerequester.cpp;h=f1429ab44b21b689bf0907f49ab46f69f3c83bb4;hb=59a5414ec47a2932a7802fcd1d98c4d80166564f;hp=adf8168cef16a6b9e4b08cbbf1228f12c99998d1;hpb=4430e7762844c66428b6f822288beb71b7f82b95;p=fms.git diff --git a/src/freenet/messagerequester.cpp b/src/freenet/messagerequester.cpp index adf8168..f1429ab 100644 --- a/src/freenet/messagerequester.cpp +++ b/src/freenet/messagerequester.cpp @@ -3,24 +3,30 @@ #include +#include +#include +#include + #ifdef XMEM #include #endif -MessageRequester::MessageRequester() +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(); } -const long MessageRequester::GetBoardID(const std::string &boardname) +const long MessageRequester::GetBoardID(const std::string &boardname, const std::string &identityname) { + std::string lowerboard=boardname; + StringFunctions::LowerCase(lowerboard,lowerboard); SQLite3DB::Statement st=m_db->Prepare("SELECT BoardID FROM tblBoard WHERE BoardName=?;"); - st.Bind(0,boardname); + st.Bind(0,lowerboard); st.Step(); if(st.RowReturned()) @@ -31,11 +37,19 @@ const long MessageRequester::GetBoardID(const std::string &boardname) } else { - DateTime now; - now.SetToGMTime(); - st=m_db->Prepare("INSERT INTO tblBoard(BoardName,DateAdded) VALUES(?,?);"); + Poco::DateTime now; + st=m_db->Prepare("INSERT INTO tblBoard(BoardName,DateAdded,SaveReceivedMessages,AddedMethod) VALUES(?,?,?,?);"); st.Bind(0,boardname); - st.Bind(1,now.Format("%Y-%m-%d %H:%M:%S")); + st.Bind(1,Poco::DateTimeFormatter::format(now,"%Y-%m-%d %H:%M:%S")); + if(m_savemessagesfromnewboards) + { + st.Bind(2,"true"); + } + else + { + st.Bind(2,"false"); + } + st.Bind(3,"Message from "+identityname); st.Step(true); return st.GetLastInsertRowID(); } @@ -71,7 +85,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; @@ -90,20 +104,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=?;"); @@ -114,7 +124,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(); @@ -126,12 +136,16 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) if(boards.size()<=0) { - m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"MessageRequester::HandleAllData Message XML did not contain any boards! "+message["Identifier"]); + m_log->error("MessageRequester::HandleAllData Message XML did not contain any boards! "+message["Identifier"]); + // remove this identityid from request list + RemoveFromRequestList(idparts[1]); return true; } if(xml.GetReplyBoard()=="") { - m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"MessageRequester::HandleAllData Message XML did not contain a reply board! "+message["Identifier"]); + m_log->error("MessageRequester::HandleAllData Message XML did not contain a reply board! "+message["Identifier"]); + // remove this identityid from request list + RemoveFromRequestList(idparts[1]); return true; } @@ -163,19 +177,19 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) keypart=StringFunctions::Replace(StringFunctions::Replace(keyparts[1],"-",""),"~",""); if(keypart!=uuidparts[1]) { - m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"MessageRequester::HandleAllData MessageID in Message doesn't match public key of identity : "+message["Identifier"]); + m_log->error("MessageRequester::HandleAllData MessageID in Message doesn't match public key of identity : "+message["Identifier"]); validmessage=false; } } else { - m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"MessageRequester::HandleAllData Error with identity's public key or Message ID : "+message["Identifier"]); + m_log->error("MessageRequester::HandleAllData Error with identity's public key or Message ID : "+message["Identifier"]); validmessage=false; } } else { - m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"MessageRequester::HandleAllData Error couldn't find identity : "+message["Identifier"]); + m_log->error("MessageRequester::HandleAllData Error couldn't find identity : "+message["Identifier"]); validmessage=false; } @@ -191,6 +205,27 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) if(validmessage && savetoboardcount>0) { + std::string nntpbody=""; + nntpbody=xml.GetBody(); + + //add file keys/sizes to body + std::vector fileattachments=xml.GetFileAttachments(); + if(fileattachments.size()>0) + { + nntpbody+="\r\nAttachments"; + } + for(std::vector::iterator i=fileattachments.begin(); i!=fileattachments.end(); i++) + { + std::string sizestr="0"; + StringFunctions::Convert((*i).m_size,sizestr); + + nntpbody+="\r\n"+(*i).m_key; + nntpbody+="\r\n"+sizestr+" bytes"; + nntpbody+="\r\n"; + } + + m_db->Execute("BEGIN;"); + st=m_db->Prepare("INSERT INTO tblMessage(IdentityID,FromName,MessageDate,MessageTime,Subject,MessageUUID,ReplyBoardID,Body,MessageIndex) VALUES(?,?,?,?,?,?,?,?,?);"); st.Bind(0,identityid); st.Bind(1,GetIdentityName(identityid)); @@ -198,8 +233,8 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) st.Bind(3,xml.GetTime()); st.Bind(4,xml.GetSubject()); st.Bind(5,xml.GetMessageID()); - st.Bind(6,GetBoardID(xml.GetReplyBoard())); - st.Bind(7,xml.GetBody()); + st.Bind(6,GetBoardID(xml.GetReplyBoard(),GetIdentityName(identityid))); + st.Bind(7,nntpbody); st.Bind(8,index); inserted=st.Step(true); int messageid=st.GetLastInsertRowID(); @@ -213,7 +248,7 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) if(SaveToBoard((*i))) { st.Bind(0,messageid); - st.Bind(1,GetBoardID((*i))); + st.Bind(1,GetBoardID((*i),GetIdentityName(identityid))); st.Step(); st.Reset(); } @@ -231,7 +266,7 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) } st.Finalize(); - m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"MessageRequester::HandleAllData parsed Message XML file : "+message["Identifier"]); + m_log->debug("MessageRequester::HandleAllData parsed Message XML file : "+message["Identifier"]); } else // couldn't insert - was already in database @@ -239,11 +274,13 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) //m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"MessageRequester::HandleAddData could not insert message into database. "+message["Identifier"]); } + m_db->Execute("COMMIT;"); + } // if validmessage } else { - m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"MessageRequester::HandleAllData error parsing Message XML file : "+message["Identifier"]); + m_log->error("MessageRequester::HandleAllData error parsing Message XML file : "+message["Identifier"]); } RemoveFromRequestList(idparts[1]); @@ -251,16 +288,14 @@ const bool MessageRequester::HandleAllData(FCPMessage &message) return true; } -const bool MessageRequester::HandleGetFailed(FCPMessage &message) +const bool MessageRequester::HandleGetFailed(FCPv2::Message &message) { - DateTime now; SQLite3DB::Statement st; std::vector idparts; std::string requestid; long index; long identityid; - now.SetToGMTime(); StringFunctions::Split(message["Identifier"],"|",idparts); requestid=idparts[1]; StringFunctions::Convert(idparts[2],identityid); @@ -276,7 +311,7 @@ const bool MessageRequester::HandleGetFailed(FCPMessage &message) st.Step(); st.Finalize(); - m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"MessageRequester::HandleGetFailed fatal error requesting "+message["Identifier"]); + m_log->error("MessageRequester::HandleGetFailed fatal error requesting "+message["Identifier"]); } // remove this identityid from request list @@ -288,70 +323,107 @@ const bool MessageRequester::HandleGetFailed(FCPMessage &message) void MessageRequester::Initialize() { m_fcpuniquename="MessageRequester"; - std::string tempval; - Option::Instance()->Get("MaxMessageRequests",tempval); - StringFunctions::Convert(tempval,m_maxrequests); + std::string tempval(""); + m_maxrequests=0; + Option option(m_db); + + option.GetInt("MaxMessageRequests",m_maxrequests); if(m_maxrequests<1) { m_maxrequests=1; - m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"Option MaxMessageRequests is currently set at "+tempval+". It must be 1 or greater."); + m_log->error("Option MaxMessageRequests is currently set at "+tempval+". It must be 1 or greater."); } if(m_maxrequests>100) { - m_log->WriteLog(LogFile::LOGLEVEL_WARNING,"Option MaxMessageRequests is currently set at "+tempval+". This value might be incorrectly configured."); + m_log->warning("Option MaxMessageRequests is currently set at "+tempval+". This value might be incorrectly configured."); } - Option::Instance()->Get("MessageDownloadMaxDaysBackward",tempval); - StringFunctions::Convert(tempval,m_maxdaysbackward); + + m_maxdaysbackward=0; + option.GetInt("MessageDownloadMaxDaysBackward",m_maxdaysbackward); if(m_maxdaysbackward<0) { m_maxdaysbackward=0; - m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"Option MessageDownloadMaxDaysBackward is currently set at "+tempval+". It must be 0 or greater."); + m_log->error("Option MessageDownloadMaxDaysBackward is currently set at "+tempval+". It must be 0 or greater."); } if(m_maxdaysbackward>30) { - m_log->WriteLog(LogFile::LOGLEVEL_WARNING,"Option MessageDownloadMaxDaysBackward is currently set at "+tempval+". This value might be incorrectly configured."); + m_log->warning("Option MessageDownloadMaxDaysBackward is currently set at "+tempval+". This value might be incorrectly configured."); } - Option::Instance()->Get("MaxPeerMessagesPerDay",tempval); - StringFunctions::Convert(tempval,m_maxpeermessages); + + m_maxpeermessages=0; + option.GetInt("MaxPeerMessagesPerDay",m_maxpeermessages); if(m_maxpeermessages<1) { m_maxpeermessages=1; - m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"Option MaxPeerMessagesPerDay is currently set at "+tempval+". It must be 1 or greater."); + m_log->error("Option MaxPeerMessagesPerDay is currently set at "+tempval+". It must be 1 or greater."); } if(m_maxpeermessages<20 || m_maxpeermessages>1000) { - m_log->WriteLog(LogFile::LOGLEVEL_WARNING,"Option MaxPeerMessagesPerDay is currently set at "+tempval+". This value might be incorrectly configured. The suggested value is 200."); + m_log->warning("Option MaxPeerMessagesPerDay is currently set at "+tempval+". This value might be incorrectly configured. The suggested value is 200."); } - Option::Instance()->Get("MaxBoardsPerMessage",tempval); - StringFunctions::Convert(tempval,m_maxboardspermessage); + + m_maxboardspermessage=0; + option.GetInt("MaxBoardsPerMessage",m_maxboardspermessage); if(m_maxboardspermessage<1) { m_maxboardspermessage=1; - m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"Option MaxBoardsPerMessage is currently set at "+tempval+". It must be 1 or greater."); + m_log->error("Option MaxBoardsPerMessage is currently set at "+tempval+". It must be 1 or greater."); } if(m_maxboardspermessage>20) { - m_log->WriteLog(LogFile::LOGLEVEL_WARNING,"Option MaxBoardsPerMessage is currently set at "+tempval+". This value might be incorrectly configured."); + m_log->warning("Option MaxBoardsPerMessage is currently set at "+tempval+". This value might be incorrectly configured."); + } + + option.Get("SaveMessagesFromNewBoards",tempval); + if(tempval=="true") + { + m_savemessagesfromnewboards=true; + } + else + { + m_savemessagesfromnewboards=false; + } + + option.Get("LocalTrustOverridesPeerTrust",tempval); + if(tempval=="true") + { + m_localtrustoverrides=true; + } + else + { + m_localtrustoverrides=false; } + } void MessageRequester::PopulateIDList() { - DateTime date; + Poco::DateTime date; std::string val1; std::string val2; std::string val3; std::string sql; long requestindex; - date.SetToGMTime(); - date.Add(0,0,0,-m_maxdaysbackward); + date-=Poco::Timespan(m_maxdaysbackward,0,0,0,0); sql="SELECT tblIdentity.IdentityID,Day,RequestIndex "; sql+="FROM tblMessageRequests INNER JOIN tblIdentity ON tblMessageRequests.IdentityID=tblIdentity.IdentityID "; - sql+="WHERE (tblIdentity.LocalMessageTrust IS NULL OR tblIdentity.LocalMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalMessageTrust')) "; - sql+="AND FromMessageList='true' AND Found='false' AND Day>='"+date.Format("%Y-%m-%d")+"' "; - sql+="AND (tblIdentity.PeerMessageTrust IS NULL OR tblIdentity.PeerMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerMessageTrust')) "; + sql+="WHERE FromMessageList='true' AND Found='false' AND Day>='"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d")+"' "; + if(m_localtrustoverrides==false) + { + sql+="AND (tblIdentity.LocalMessageTrust IS NULL OR tblIdentity.LocalMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalMessageTrust')) "; + sql+="AND (tblIdentity.PeerMessageTrust IS NULL OR tblIdentity.PeerMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerMessageTrust')) "; + } + else + { + 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 <> '' "; + // 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) + sql+="ORDER BY tblMessageRequests.Day DESC, tblMessageRequests.Tries ASC, tblMessageRequests.RequestIndex ASC "; sql+=";"; SQLite3DB::Statement st=m_db->Prepare(sql); @@ -405,7 +477,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; @@ -431,13 +503,20 @@ 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 new ULPR since we are fairly sure message exists since the author says it does + 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); - m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"MessageRequester::StartRequest requesting "+message["Identifier"]); + // update tries + st=m_db->Prepare("UPDATE tblMessageRequests SET Tries=Tries+1 WHERE IdentityID=? AND Day=? AND RequestIndex=?;"); + st.Bind(0,identityid); + st.Bind(1,date); + st.Bind(2,indexstr); + st.Step(); + + m_log->debug("MessageRequester::StartRequest requesting "+message["Identifier"]); } m_ids[requestid]=true;