#include "../../include/freenet/trustlistxml.h"\r
#include "../../include/stringfunctions.h"\r
\r
+#include <Poco/Timespan.h>\r
+#include <Poco/DateTimeFormatter.h>\r
+#include <Poco/DateTimeParser.h>\r
+\r
#ifdef XMEM\r
#include <xmem.h>\r
#endif\r
\r
-TrustListInserter::TrustListInserter()\r
+TrustListInserter::TrustListInserter(SQLite3DB::DB *db):IDatabase(db)\r
{\r
Initialize();\r
}\r
\r
-TrustListInserter::TrustListInserter(FCPv2 *fcp):IFCPConnected(fcp)\r
+TrustListInserter::TrustListInserter(SQLite3DB::DB *db, FCPv2::Connection *fcp):IDatabase(db),IFCPConnected(fcp)\r
{\r
Initialize();\r
}\r
\r
void TrustListInserter::CheckForNeededInsert()\r
{\r
- DateTime date;\r
- date.SetToGMTime();\r
- date.Add(0,0,-1);\r
- SQLite3DB::Recordset rs=m_db->Query("SELECT LocalIdentityID, PrivateKey FROM tblLocalIdentity WHERE PrivateKey IS NOT NULL AND PrivateKey <> '' AND PublishTrustList='true' AND InsertingTrustList='false' AND (LastInsertedTrustList<='"+date.Format("%Y-%m-%d %H:%M:%S")+"' OR LastInsertedTrustList IS NULL);");\r
+ Poco::DateTime date;\r
+ int currentday=date.day();\r
+ date-=Poco::Timespan(0,6,0,0,0);\r
+ // insert trust lists every 6 hours - if 6 hours ago was different day then set to midnight of current day to insert list today ASAP\r
+ if(currentday!=date.day())\r
+ {\r
+ date.assign(date.year(),date.month(),currentday,0,0,0);\r
+ }\r
+ SQLite3DB::Recordset rs=m_db->Query("SELECT LocalIdentityID, PrivateKey FROM tblLocalIdentity WHERE PrivateKey IS NOT NULL AND PrivateKey <> '' AND PublishTrustList='true' AND InsertingTrustList='false' AND (LastInsertedTrustList<='"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"' OR LastInsertedTrustList IS NULL);");\r
\r
if(rs.Empty()==false)\r
{\r
\r
}\r
\r
-const bool TrustListInserter::HandleMessage(FCPMessage &message)\r
+const bool TrustListInserter::HandleMessage(FCPv2::Message &message)\r
{\r
\r
if(message["Identifier"].find("TrustListInserter")==0)\r
{\r
\r
- DateTime now;\r
+ Poco::DateTime now;\r
std::vector<std::string> idparts;\r
\r
- now.SetToGMTime();\r
StringFunctions::Split(message["Identifier"],"|",idparts);\r
\r
// no action for URIGenerated\r
\r
if(message.GetName()=="PutSuccessful")\r
{\r
- m_db->Execute("UPDATE tblLocalIdentity SET InsertingTrustList='false', LastInsertedTrustList='"+now.Format("%Y-%m-%d %H:%M:%S")+"' WHERE LocalIdentityID="+idparts[1]+";");\r
- m_db->Execute("INSERT INTO tblTrustListInserts(LocalIdentityID,Day,InsertIndex) VALUES("+idparts[1]+",'"+idparts[4]+"',"+idparts[2]+");");\r
- m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"TrustListInserter::HandleMessage inserted TrustList xml");\r
+ // non USK\r
+ if(idparts[0]=="TrustListInserter")\r
+ {\r
+ m_db->Execute("UPDATE tblLocalIdentity SET InsertingTrustList='false', LastInsertedTrustList='"+Poco::DateTimeFormatter::format(now,"%Y-%m-%d %H:%M:%S")+"' WHERE LocalIdentityID="+idparts[1]+";");\r
+ m_db->Execute("INSERT INTO tblTrustListInserts(LocalIdentityID,Day,InsertIndex) VALUES("+idparts[1]+",'"+idparts[4]+"',"+idparts[2]+");");\r
+ m_log->debug("TrustListInserter::HandleMessage inserted TrustList xml");\r
+ }\r
return true;\r
}\r
\r
- if(message.GetName()=="PutFailed")\r
+ if(message.GetName()=="PutFailed" && idparts[0]=="TrustListInserter")\r
{\r
- m_db->Execute("UPDATE tblLocalIdentity SET InsertingTrustList='false' WHERE LocalIdentityID="+idparts[1]+";");\r
- m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"TrustListInserter::HandleMessage failure inserting TrustList xml. Code="+message["Code"]+" Description="+message["CodeDescription"]);\r
- \r
- // if code 9 (collision), then insert index into inserted table\r
- if(message["Code"]=="9")\r
+ // non USK\r
+ if(idparts[0]=="TrustListInserter")\r
{\r
- m_db->Execute("INSERT INTO tblTrustListInserts(LocalIdentityID,Day,InsertIndex) VALUES("+idparts[1]+",'"+idparts[4]+"',"+idparts[2]+");");\r
- }\r
+ m_db->Execute("UPDATE tblLocalIdentity SET InsertingTrustList='false' WHERE LocalIdentityID="+idparts[1]+";");\r
+ m_log->debug("TrustListInserter::HandleMessage failure inserting TrustList xml. Code="+message["Code"]+" Description="+message["CodeDescription"]);\r
\r
+ // if code 9 (collision), then insert index into inserted table\r
+ if(message["Code"]=="9")\r
+ {\r
+ m_db->Execute("INSERT INTO tblTrustListInserts(LocalIdentityID,Day,InsertIndex) VALUES("+idparts[1]+",'"+idparts[4]+"',"+idparts[2]+");");\r
+ }\r
+ }\r
return true;\r
}\r
\r
\r
void TrustListInserter::Initialize()\r
{\r
- Option::Instance()->Get("MessageBase",m_messagebase);\r
- m_lastchecked.SetToGMTime();\r
+ Option option(m_db);\r
+ option.Get("MessageBase",m_messagebase);\r
+ m_lastchecked=Poco::Timestamp();\r
}\r
\r
void TrustListInserter::Process()\r
{\r
- DateTime now;\r
- now.SetToGMTime();\r
+ Poco::DateTime now;\r
\r
// check every minute\r
- if(m_lastchecked<=(now-(1.0/1440.0)))\r
+ if(m_lastchecked<=(now-Poco::Timespan(0,0,1,0,0)))\r
{\r
CheckForNeededInsert();\r
m_lastchecked=now;\r
\r
void TrustListInserter::StartInsert(const long localidentityid, const std::string &privatekey)\r
{\r
- FCPMessage message;\r
+ FCPv2::Message message;\r
TrustListXML xml;\r
std::string data;\r
std::string datasizestr;\r
std::string publickey;\r
int messagetrust;\r
int trustlisttrust;\r
- DateTime now,date;\r
+ Poco::DateTime now,date,dateminus30,tempdate;\r
int index;\r
std::string indexstr;\r
std::string localidentityidstr;\r
+ std::string messagetrustcomment="";\r
+ std::string trustlisttrustcomment="";\r
+ int identityid=-1;\r
+ int count=0;\r
+ bool add=false;\r
+ std::string dateadded="";\r
\r
- now.SetToGMTime();\r
- date.SetToGMTime();\r
+ dateminus30-=Poco::Timespan(30,0,0,0,0);\r
+\r
+ // insert all identities not in trust list already\r
+ m_db->Execute("INSERT INTO tblIdentityTrust(LocalIdentityID,IdentityID) SELECT LocalIdentityID,IdentityID FROM tblLocalIdentity,tblIdentity WHERE LocalIdentityID || '_' || IdentityID NOT IN (SELECT LocalIdentityID || '_' || IdentityID FROM tblIdentityTrust);");\r
+\r
+ // select statement for last message date for an identity\r
+ SQLite3DB::Statement countst=m_db->Prepare("SELECT COUNT(*) FROM tblMessage WHERE IdentityID=? AND MessageDate>=?;");\r
\r
// build the xml file - we only want to add identities that we recently saw, otherwise we could be inserting a ton of identities\r
- date.Add(0,0,0,-20); // identities seen in last 20 days\r
- SQLite3DB::Statement st=m_db->Prepare("SELECT PublicKey, LocalMessageTrust, LocalTrustListTrust FROM tblIdentity WHERE PublicKey IS NOT NULL AND PublicKey<>'' AND LastSeen>=?;");\r
- st.Bind(0,date.Format("%Y-%m-%d"));\r
+ date-=Poco::Timespan(15,0,0,0,0); // identities seen in last 15 days - the maintenance page lets us delete identities not seen in 20 days, so this gives us a window where the identity won't be deleted and then found in a trust list and readded immediately\r
+ //SQLite3DB::Statement st=m_db->Prepare("SELECT PublicKey, LocalMessageTrust, LocalTrustListTrust, MessageTrustComment, TrustListTrustComment FROM tblIdentity WHERE PublicKey IS NOT NULL AND PublicKey<>'' AND LastSeen>=?;");\r
+ // we want to order by public key so we can't do identity correllation based on the sequence of identities in the list.\r
+ SQLite3DB::Statement st=m_db->Prepare("SELECT PublicKey, tblIdentityTrust.LocalMessageTrust, tblIdentityTrust.LocalTrustListTrust, tblIdentityTrust.MessageTrustComment, tblIdentityTrust.TrustListTrustComment, tblIdentity.IdentityID, tblIdentity.DateAdded FROM tblIdentity INNER JOIN tblIdentityTrust ON tblIdentity.IdentityID=tblIdentityTrust.IdentityID WHERE PublicKey IS NOT NULL AND PublicKey<>'' AND LastSeen>=? AND tblIdentityTrust.LocalIdentityID=? ORDER BY PublicKey;");\r
+ st.Bind(0,Poco::DateTimeFormatter::format(date,"%Y-%m-%d"));\r
+ st.Bind(1,localidentityid);\r
st.Step();\r
while(st.RowReturned())\r
{\r
st.ResultText(0,publickey);\r
- st.ResultInt(1,messagetrust);\r
- st.ResultInt(2,trustlisttrust);\r
- xml.AddTrust(publickey,messagetrust,trustlisttrust);\r
+ if(st.ResultNull(1)==false)\r
+ {\r
+ st.ResultInt(1,messagetrust);\r
+ }\r
+ else\r
+ {\r
+ messagetrust=-1;\r
+ }\r
+ if(st.ResultNull(2)==false)\r
+ {\r
+ st.ResultInt(2,trustlisttrust);\r
+ }\r
+ else\r
+ {\r
+ trustlisttrust=-1;\r
+ }\r
+ st.ResultText(3,messagetrustcomment);\r
+ st.ResultText(4,trustlisttrustcomment);\r
+ identityid=-1;\r
+ st.ResultInt(5,identityid);\r
+ dateadded="";\r
+ st.ResultText(6,dateadded);\r
+\r
+ add=false;\r
+\r
+ // add the identity to the trust list if they have posted a message in the last 30 days\r
+ countst.Bind(0,identityid);\r
+ countst.Bind(1,Poco::DateTimeFormatter::format(dateminus30,"%Y-%m-%d"));\r
+ countst.Step();\r
+ if(countst.RowReturned())\r
+ {\r
+ count=0;\r
+ countst.ResultInt(0,count);\r
+ if(count>0)\r
+ {\r
+ add=true;\r
+ }\r
+ }\r
+ countst.Reset();\r
+\r
+ // no messages in last 30 days - add the identity if we learned about them less than 5 days ago\r
+ if(add==false && dateadded!="")\r
+ {\r
+ int tzdiff=0;\r
+ if(Poco::DateTimeParser::tryParse(dateadded,tempdate,tzdiff)==false)\r
+ {\r
+ tempdate=Poco::Timestamp();\r
+ m_log->fatal("TrustListInserter::StartInsert could not parse date "+dateadded);\r
+ }\r
+ if(tempdate>=(now-Poco::Timespan(5,0,0,0,0)))\r
+ {\r
+ add=true;\r
+ }\r
+ }\r
+\r
+ if(add==true)\r
+ {\r
+ xml.AddTrust(publickey,messagetrust,trustlisttrust,messagetrustcomment,trustlisttrustcomment);\r
+ }\r
+\r
st.Step();\r
}\r
\r
// get next insert index\r
st=m_db->Prepare("SELECT MAX(InsertIndex) FROM tblTrustListInserts WHERE LocalIdentityID=? AND Day=?;");\r
st.Bind(0,localidentityid);\r
- st.Bind(1,now.Format("%Y-%m-%d"));\r
+ st.Bind(1,Poco::DateTimeFormatter::format(now,"%Y-%m-%d"));\r
st.Step();\r
\r
index=0;\r
StringFunctions::Convert(data.size(),datasizestr);\r
\r
message.SetName("ClientPut");\r
- message["URI"]=privatekey+m_messagebase+"|"+now.Format("%Y-%m-%d")+"|TrustList|"+indexstr+".xml";\r
+ message["URI"]=privatekey+m_messagebase+"|"+Poco::DateTimeFormatter::format(now,"%Y-%m-%d")+"|TrustList|"+indexstr+".xml";\r
message["Identifier"]="TrustListInserter|"+localidentityidstr+"|"+indexstr+"|"+message["URI"];\r
message["UploadFrom"]="direct";\r
message["DataLength"]=datasizestr;\r
- m_fcp->SendMessage(message);\r
- m_fcp->SendRaw(data.c_str(),data.size());\r
+ m_fcp->Send(message);\r
+ m_fcp->Send(std::vector<char>(data.begin(),data.end()));\r
+\r
+ // insert to USK - not used, but don't remove code yet\r
+ /*\r
+ message.Clear();\r
+ message.SetName("ClientPutComplexDir");\r
+ message["URI"]="USK"+privatekey.substr(3)+m_messagebase+"|"+Poco::DateTimeFormatter::format(now,"%Y.%m.%d")+"|TrustList/0/";\r
+ message["Identifier"]="TrustListInserterUSK|"+message["URI"];\r
+ message["DefaultName"]="TrustList.xml";\r
+ message["Files.0.Name"]="TrustList.xml";\r
+ message["Files.0.UplaodFrom"]="direct";\r
+ message["Files.0.DataLength"]=datasizestr;\r
+ m_fcp->Send(message);\r
+ m_fcp->Send(std::vector<char>(data.begin(),data.end()));\r
+ */\r
\r
m_db->Execute("UPDATE tblLocalIdentity SET InsertingTrustList='true' WHERE LocalIdentityID="+localidentityidstr+";");\r
\r