#include "../../include/stringfunctions.h"\r
#include "../../include/freenet/trustlistxml.h"\r
\r
+#include <Poco/DateTimeFormatter.h>\r
+\r
#ifdef XMEM\r
#include <xmem.h>\r
#endif\r
Initialize();\r
}\r
\r
-TrustListRequester::TrustListRequester(FCPv2 *fcp):IFCPConnected(fcp)\r
+TrustListRequester::TrustListRequester(FCPv2 *fcp):IIndexRequester<long>(fcp)\r
{\r
Initialize();\r
}\r
\r
-void TrustListRequester::FCPConnected()\r
-{\r
- m_requesting.clear();\r
- PopulateIDList();\r
-}\r
-\r
-void TrustListRequester::FCPDisconnected()\r
-{\r
- \r
-}\r
-\r
const bool TrustListRequester::HandleAllData(FCPMessage &message)\r
{\r
- DateTime now;\r
+ Poco::DateTime now;\r
SQLite3DB::Statement st;\r
SQLite3DB::Statement trustst;\r
std::vector<std::string> idparts;\r
long identityid;\r
long index;\r
\r
- now.SetToGMTime();\r
StringFunctions::Split(message["Identifier"],"|",idparts);\r
StringFunctions::Convert(message["DataLength"],datalength);\r
StringFunctions::Convert(idparts[1],identityid);\r
// parse file into xml and update the database\r
if(xml.ParseXML(std::string(data.begin(),data.end()))==true)\r
{\r
+ // find the identity name and public key of the identity publishing the trust list\r
+ std::string publisherid="";\r
+ st=m_db->Prepare("SELECT Name,PublicKey FROM tblIdentity WHERE IdentityID=?;");\r
+ st.Bind(0,identityid);\r
+ st.Step();\r
+ if(st.RowReturned())\r
+ {\r
+ std::string publishername="";\r
+ std::string publisherpublickey="";\r
+ st.ResultText(0,publishername);\r
+ st.ResultText(1,publisherpublickey);\r
+ publisherid=publishername;\r
+ if(publisherpublickey.size()>4)\r
+ {\r
+ publisherid+=publisherpublickey.substr(3,44);\r
+ }\r
+ }\r
+ st.Finalize();\r
\r
// drop all existing peer trust from this identity - we will rebuild it when we go through each trust in the xml file\r
st=m_db->Prepare("DELETE FROM tblPeerTrust WHERE IdentityID=?;");\r
st.Finalize();\r
\r
st=m_db->Prepare("SELECT IdentityID FROM tblIdentity WHERE PublicKey=?;");\r
- trustst=m_db->Prepare("INSERT INTO tblPeerTrust(IdentityID,TargetIdentityID,MessageTrust,TrustListTrust) VALUES(?,?,?,?);");\r
+ trustst=m_db->Prepare("INSERT INTO tblPeerTrust(IdentityID,TargetIdentityID,MessageTrust,TrustListTrust,MessageTrustComment,TrustListTrustComment) VALUES(?,?,?,?,?,?);");\r
+ \r
+ SQLite3DB::Statement idinsert=m_db->Prepare("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES(?,?,?);");\r
+ \r
// loop through all trust entries in xml and add to database if we don't already know them\r
for(long i=0; i<xml.TrustCount(); i++)\r
{\r
int id;\r
std::string identity;\r
+ std::string messagetrustcomment="";\r
+ std::string trustlisttrustcomment="";\r
identity=xml.GetIdentity(i);\r
\r
st.Bind(0,identity);\r
st.Step();\r
if(st.RowReturned()==false)\r
{\r
- m_db->ExecuteInsert("INSERT INTO tblIdentity(PublicKey,DateAdded) VALUES('"+identity+"','"+now.Format("%Y-%m-%d %H:%M:%S")+"');",(long &)id);\r
+ idinsert.Bind(0,identity);\r
+ idinsert.Bind(1,Poco::DateTimeFormatter::format(now,"%Y-%m-%d %H:%M:%S"));\r
+ idinsert.Bind(2,"trust list of "+publisherid);\r
+ idinsert.Step(true);\r
+ id=idinsert.GetLastInsertRowID();\r
+ idinsert.Reset();\r
+ // m_db->ExecuteInsert("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('"+identity+"','"+now.Format("%Y-%m-%d %H:%M:%S")+"');",(long &)id);\r
}\r
else\r
{\r
{\r
trustst.Bind(3,xml.GetTrustListTrust(i));\r
}\r
+ messagetrustcomment=xml.GetMessageTrustComment(i);\r
+ trustlisttrustcomment=xml.GetTrustListTrustComment(i);\r
+ // limit comments to 50 characters each\r
+ if(messagetrustcomment.size()>50)\r
+ {\r
+ messagetrustcomment.erase(50);\r
+ }\r
+ if(trustlisttrustcomment.size()>50)\r
+ {\r
+ trustlisttrustcomment.erase(50);\r
+ }\r
+ trustst.Bind(4,messagetrustcomment);\r
+ trustst.Bind(5,trustlisttrustcomment);\r
trustst.Step();\r
trustst.Reset();\r
\r
st.Step();\r
st.Finalize();\r
\r
- m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"TrustListRequester::HandleAllData parsed TrustList XML file : "+message["Identifier"]);\r
+ m_log->debug("TrustListRequester::HandleAllData parsed TrustList XML file : "+message["Identifier"]);\r
}\r
else\r
{\r
st.Step();\r
st.Finalize();\r
\r
- m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"TrustListRequester::HandleAllData error parsing TrustList XML file : "+message["Identifier"]);\r
+ m_log->error("TrustListRequester::HandleAllData error parsing TrustList XML file : "+message["Identifier"]);\r
}\r
\r
// remove this identityid from request list\r
\r
const bool TrustListRequester::HandleGetFailed(FCPMessage &message)\r
{\r
- DateTime now;\r
SQLite3DB::Statement st;\r
std::vector<std::string> idparts;\r
long identityid;\r
long index;\r
\r
- now.SetToGMTime();\r
StringFunctions::Split(message["Identifier"],"|",idparts);\r
StringFunctions::Convert(idparts[1],identityid);\r
StringFunctions::Convert(idparts[2],index); \r
st.Step();\r
st.Finalize();\r
\r
- m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"TrustListRequester::HandleGetFailed fatal error requesting "+message["Identifier"]);\r
+ m_log->error("TrustListRequester::HandleGetFailed fatal error requesting "+message["Identifier"]);\r
}\r
\r
// remove this identityid from request list\r
\r
}\r
\r
-const bool TrustListRequester::HandleMessage(FCPMessage &message)\r
-{\r
-\r
- if(message["Identifier"].find("TrustListRequester")==0)\r
- {\r
- if(message.GetName()=="DataFound")\r
- {\r
- return true;\r
- }\r
-\r
- if(message.GetName()=="AllData")\r
- {\r
- return HandleAllData(message);\r
- }\r
-\r
- if(message.GetName()=="GetFailed")\r
- {\r
- return HandleGetFailed(message);\r
- }\r
-\r
- if(message.GetName()=="IdentifierCollision")\r
- {\r
- // remove one of the ids from the requesting list\r
- long identityid=0;\r
- std::vector<std::string> idparts;\r
- StringFunctions::Split(message["Identifier"],"|",idparts);\r
- StringFunctions::Convert(idparts[1],identityid);\r
- RemoveFromRequestList(identityid);\r
- return true;\r
- }\r
- }\r
-\r
- return false;\r
-}\r
-\r
void TrustListRequester::Initialize()\r
{\r
std::string tempval="";\r
+ m_fcpuniquename="TrustListRequester";\r
Option::Instance()->Get("MaxIdentityRequests",tempval);\r
StringFunctions::Convert(tempval,m_maxrequests);\r
if(m_maxrequests<1)\r
{\r
m_maxrequests=1;\r
- m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"Option MaxTrustListRequests is currently set at "+tempval+". It must be 1 or greater.");\r
+ m_log->error("Option MaxTrustListRequests is currently set at "+tempval+". It must be 1 or greater.");\r
}\r
if(m_maxrequests>100)\r
{\r
- m_log->WriteLog(LogFile::LOGLEVEL_WARNING,"Option MaxTrustListRequests is currently set at "+tempval+". This value might be incorrectly configured.");\r
+ m_log->warning("Option MaxTrustListRequests is currently set at "+tempval+". This value might be incorrectly configured.");\r
}\r
- Option::Instance()->Get("MessageBase",m_messagebase);\r
- m_tempdate.SetToGMTime();\r
+ m_tempdate=Poco::Timestamp();\r
}\r
\r
void TrustListRequester::PopulateIDList()\r
{\r
- DateTime date;\r
+ Poco::DateTime date;\r
int id;\r
std::string sql;\r
\r
- date.SetToGMTime();\r
-\r
// select identities we want to query (we've seen them today and they are publishing trust list) - sort by their trust level (descending) with secondary sort on how long ago we saw them (ascending)\r
sql="SELECT IdentityID FROM tblIdentity ";\r
- sql+="WHERE Name IS NOT NULL AND Name <> '' AND PublicKey IS NOT NULL AND PublicKey <> '' AND LastSeen>='"+date.Format("%Y-%m-%d")+"' AND PublishTrustList='true' AND LocalTrustListTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalTrustListTrust') AND ( PeerTrustListTrust IS NULL OR PeerTrustListTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerTrustListTrust') )";\r
+ sql+="WHERE Name IS NOT NULL AND Name <> '' AND PublicKey IS NOT NULL AND PublicKey <> '' AND LastSeen>='"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d")+"' AND PublishTrustList='true' AND LocalTrustListTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalTrustListTrust') AND ( PeerTrustListTrust IS NULL OR PeerTrustListTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerTrustListTrust') )";\r
sql+="ORDER BY LocalTrustListTrust DESC, LastSeen;";\r
\r
SQLite3DB::Statement st=m_db->Prepare(sql);\r
}\r
}\r
\r
-void TrustListRequester::Process()\r
-{\r
- // max is the smaller of the config value or the total number of identities we will request from\r
- long max=m_maxrequests>m_ids.size() ? m_ids.size() : m_maxrequests;\r
-\r
- // try to keep up to max requests going\r
- if(m_requesting.size()<max)\r
- {\r
- std::map<long,bool>::iterator i=m_ids.begin();\r
- while(i!=m_ids.end() && (*i).second==true)\r
- {\r
- i++;\r
- }\r
-\r
- if(i!=m_ids.end())\r
- {\r
- StartRequest((*i).first);\r
- }\r
- else\r
- {\r
- // we requested from all ids in the list, repopulate the list\r
- PopulateIDList();\r
- }\r
- }\r
- // special case - if there were 0 identities on the list when we started then we will never get a chance to repopulate the list\r
- // this will recheck for ids every minute\r
- DateTime now;\r
- now.SetToGMTime();\r
- if(m_ids.size()==0 && m_tempdate<(now-(1.0/1440.0)))\r
- {\r
- PopulateIDList();\r
- m_tempdate=now;\r
- }\r
-\r
-}\r
-\r
-void TrustListRequester::RegisterWithThread(FreenetMasterThread *thread)\r
-{\r
- thread->RegisterFCPConnected(this);\r
- thread->RegisterFCPMessageHandler(this);\r
- thread->RegisterPeriodicProcessor(this);\r
-}\r
-\r
-void TrustListRequester::RemoveFromRequestList(const long identityid)\r
-{\r
- std::vector<long>::iterator i=m_requesting.begin();\r
- while(i!=m_requesting.end() && (*i)!=identityid)\r
- {\r
- i++;\r
- }\r
- if(i!=m_requesting.end())\r
- {\r
- m_requesting.erase(i);\r
- }\r
-}\r
-\r
-void TrustListRequester::StartRequest(const long identityid)\r
+void TrustListRequester::StartRequest(const long &identityid)\r
{\r
- DateTime now;\r
+ Poco::DateTime now;\r
FCPMessage message;\r
std::string publickey;\r
int index;\r
{\r
st.ResultText(0,publickey);\r
\r
- now.SetToGMTime();\r
-\r
SQLite3DB::Statement st2=m_db->Prepare("SELECT MAX(RequestIndex) FROM tblTrustListRequests WHERE Day=? AND IdentityID=?;");\r
- st2.Bind(0,now.Format("%Y-%m-%d"));\r
+ st2.Bind(0,Poco::DateTimeFormatter::format(now,"%Y-%m-%d"));\r
st2.Bind(1,identityid);\r
st2.Step();\r
\r
StringFunctions::Convert(identityid,identityidstr);\r
\r
message.SetName("ClientGet");\r
- message["URI"]=publickey+m_messagebase+"|"+now.Format("%Y-%m-%d")+"|TrustList|"+indexstr+".xml";\r
- message["Identifier"]="TrustListRequester|"+identityidstr+"|"+indexstr+"|"+message["URI"];\r
+ message["URI"]=publickey+m_messagebase+"|"+Poco::DateTimeFormatter::format(now,"%Y-%m-%d")+"|TrustList|"+indexstr+".xml";\r
+ message["Identifier"]=m_fcpuniquename+"|"+identityidstr+"|"+indexstr+"|"+message["URI"];\r
message["ReturnType"]="direct";\r
message["MaxSize"]="1000000"; // 1 MB\r
\r