src/freenet/identityintroductionxml.cpp\r
src/freenet/identityrequester.cpp\r
src/freenet/identityxml.cpp\r
+src/freenet/inactivemessagelistrequester.cpp\r
src/freenet/introductionpuzzleinserter.cpp\r
src/freenet/introductionpuzzlerequester.cpp\r
src/freenet/introductionpuzzlexml.cpp\r
src/freenet/trustlistrequester.cpp\r
src/freenet/trustlistxml.cpp\r
src/freenet/unkeyedidcreator.cpp\r
+src/freenet/unknownidentityrequester.cpp\r
src/freenet/captcha/simplecaptcha.cpp\r
src/freenet/captcha/easybmp/EasyBMP.cpp\r
src/freenet/captcha/easybmp/EasyBMP_Font.cpp\r
IdentityRequester(FCPv2 *fcp);\r
\r
private:\r
- void Initialize();\r
- void PopulateIDList(); // clear and re-populate m_ids with identities we want to query\r
+ virtual void Initialize();\r
+ virtual void PopulateIDList(); // clear and re-populate m_ids with identities we want to query\r
void StartRequest(const long &identityid);\r
const bool HandleAllData(FCPMessage &message);\r
const bool HandleGetFailed(FCPMessage &message);\r
--- /dev/null
+#ifndef _inactivemessagelistrequester_\r
+#define _inactivemessagelistrequester_\r
+\r
+#include "messagelistrequester.h"\r
+\r
+#include <map>\r
+\r
+class InactiveMessageListRequester:public MessageListRequester\r
+{\r
+public:\r
+ InactiveMessageListRequester();\r
+ InactiveMessageListRequester(FCPv2 *fcp);\r
+\r
+private:\r
+ virtual void Initialize();\r
+ virtual void PopulateIDList();\r
+\r
+ bool m_localtrustoverrides;\r
+ bool m_savetonewboards;\r
+ long m_messagedownloadmaxdaysbackward;\r
+\r
+};\r
+\r
+#endif // _inactivemessagelistrequester_\r
MessageListRequester(FCPv2 *fcp);\r
\r
private:\r
- void Initialize();\r
- void PopulateIDList();\r
+ virtual void Initialize();\r
+ virtual void PopulateIDList();\r
void StartRequest(const long &id);\r
void StartRedirectRequest(FCPMessage &message);\r
const bool HandleAllData(FCPMessage &message);\r
--- /dev/null
+#ifndef _unknown_identity_requester_\r
+#define _unknown_identity_requester_\r
+\r
+#include "identityrequester.h"\r
+\r
+class UnknownIdentityRequester:public IdentityRequester\r
+{\r
+public:\r
+ UnknownIdentityRequester();\r
+ UnknownIdentityRequester(FCPv2 *fcp);\r
+\r
+private:\r
+ void Initialize();\r
+ void PopulateIDList();\r
+ \r
+};\r
+\r
+#endif // _unknown_identity_requester_\r
\r
#define VERSION_MAJOR "0"\r
#define VERSION_MINOR "3"\r
-#define VERSION_RELEASE "26"\r
+#define VERSION_RELEASE "27"\r
#define FMS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_RELEASE\r
-#define FMS_FREESITE_USK "USK@0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fms/87/"\r
-#define FMS_VERSION_EDITION "28"\r
+#define FMS_FREESITE_USK "USK@0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fms/89/"\r
+#define FMS_VERSION_EDITION "29"\r
\r
typedef Poco::ScopedLock<Poco::FastMutex> Guard;\r
\r
st.Step();\r
}\r
\r
+ // delete threads that have no messages\r
+ m_db->Execute("DELETE FROM tblThread WHERE ThreadID IN (SELECT tblThread.ThreadID FROM tblThread LEFT JOIN tblThreadPost ON tblThread.ThreadID=tblThreadPost.ThreadID WHERE tblThreadPost.ThreadID IS NULL);");\r
+\r
// TODO - remove after corruption issue fixed\r
if(ll=="8")\r
{\r
\r
// MessageInserter will insert a record into this temp table which the MessageListInserter will query for and insert a MessageList when needed\r
db->Execute("CREATE TEMPORARY TABLE IF NOT EXISTS tmpMessageListInsert(\\r
+ MessageListInsertID INTEGER PRIMARY KEY,\\r
LocalIdentityID INTEGER,\\r
Date DATETIME\\r
);");\r
else\r
{\r
logger().information("FMS startup v"FMS_VERSION);\r
+ logger().information("Using SQLite "SQLITE_VERSION);\r
\r
std::string tempval="";\r
Option::Instance()->Get("VacuumOnStartup",tempval);\r
#include "../../include/freenet/unkeyedidcreator.h"\r
#include "../../include/freenet/identityinserter.h"\r
#include "../../include/freenet/identityrequester.h"\r
+#include "../../include/freenet/unknownidentityrequester.h"\r
#include "../../include/freenet/introductionpuzzleinserter.h"\r
#include "../../include/freenet/identityintroductionrequester.h"\r
#include "../../include/freenet/introductionpuzzlerequester.h"\r
#include "../../include/freenet/trustlistinserter.h"\r
#include "../../include/freenet/trustlistrequester.h"\r
#include "../../include/freenet/messagelistrequester.h"\r
+#include "../../include/freenet/inactivemessagelistrequester.h"\r
#include "../../include/freenet/messagelistinserter.h"\r
#include "../../include/freenet/messagerequester.h"\r
#include "../../include/freenet/messageinserter.h"\r
m_registrables.push_back(new UnkeyedIDCreator(&m_fcp));\r
m_registrables.push_back(new IdentityInserter(&m_fcp));\r
m_registrables.push_back(new IdentityRequester(&m_fcp));\r
+ m_registrables.push_back(new UnknownIdentityRequester(&m_fcp));\r
m_registrables.push_back(new IntroductionPuzzleInserter(&m_fcp));\r
m_registrables.push_back(new IdentityIntroductionRequester(&m_fcp));\r
m_registrables.push_back(new IntroductionPuzzleRequester(&m_fcp));\r
m_registrables.push_back(new TrustListRequester(&m_fcp));\r
m_registrables.push_back(new MessageListInserter(&m_fcp));\r
m_registrables.push_back(new MessageListRequester(&m_fcp));\r
+ m_registrables.push_back(new InactiveMessageListRequester(&m_fcp));\r
m_registrables.push_back(new MessageInserter(&m_fcp));\r
m_registrables.push_back(new MessageRequester(&m_fcp));\r
m_registrables.push_back(new BoardListInserter(&m_fcp));\r
st.Step();\r
st.Finalize();\r
\r
- m_log->debug("IdentityRequester::HandleAllData parsed Identity XML file : "+message["Identifier"]);\r
+ m_log->debug(m_fcpuniquename+"::HandleAllData parsed Identity XML file : "+message["Identifier"]);\r
}\r
else\r
{\r
st.Step();\r
st.Finalize();\r
\r
- m_log->error("IdentityRequester::HandleAllData error parsing Identity XML file : "+message["Identifier"]);\r
+ m_log->error(m_fcpuniquename+"::HandleAllData error parsing Identity XML file : "+message["Identifier"]);\r
}\r
\r
// remove this identityid from request list\r
st.Step();\r
st.Finalize();\r
\r
- m_log->error("IdentityRequester::HandleGetFailed fatal error requesting "+message["Identifier"]);\r
+ m_log->error(m_fcpuniquename+"::HandleGetFailed fatal error requesting "+message["Identifier"]);\r
}\r
\r
// remove this identityid from request list\r
\r
void IdentityRequester::Initialize()\r
{\r
- m_fcpuniquename="IdentityRequester";\r
+ m_fcpuniquename="KnownIdentityRequester";\r
Option::Instance()->GetInt("MaxIdentityRequests",m_maxrequests);\r
+\r
+ // known identities get 4/5 + any remaining if not evenly divisible - unknown identities get 1/5 of the max requests option\r
+ m_maxrequests=((m_maxrequests*4)/5)+(m_maxrequests%5);\r
+\r
if(m_maxrequests<1)\r
{\r
m_maxrequests=1;\r
date.assign(date.year(),date.month(),date.day(),0,0,0);\r
\r
// select identities we want to query (haven't seen yet today) - sort by their trust level (descending) with secondary sort on how long ago we saw them (ascending)\r
- SQLite3DB::Statement st=m_db->Prepare("SELECT IdentityID FROM tblIdentity WHERE PublicKey IS NOT NULL AND PublicKey <> '' AND (LastSeen IS NULL OR LastSeen<'"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"') ORDER BY LocalMessageTrust+LocalTrustListTrust DESC, LastSeen;");\r
+ SQLite3DB::Statement st=m_db->Prepare("SELECT IdentityID FROM tblIdentity WHERE PublicKey IS NOT NULL AND PublicKey <> '' AND LastSeen IS NOT NULL AND LastSeen<'"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S")+"' ORDER BY LocalMessageTrust+LocalTrustListTrust DESC, LastSeen;");\r
st.Step();\r
\r
m_ids.clear();\r
--- /dev/null
+#include "../../include/freenet/inactivemessagelistrequester.h"\r
+\r
+#include <Poco/DateTimeFormatter.h>\r
+\r
+#ifdef XMEM\r
+ #include <xmem.h>\r
+#endif\r
+\r
+InactiveMessageListRequester::InactiveMessageListRequester()\r
+{\r
+ Initialize();\r
+}\r
+\r
+InactiveMessageListRequester::InactiveMessageListRequester(FCPv2 *fcp):MessageListRequester(fcp)\r
+{\r
+ Initialize();\r
+}\r
+\r
+void InactiveMessageListRequester::Initialize()\r
+{\r
+ m_fcpuniquename="InactiveMessageListRequester";\r
+ std::string tempval="";\r
+\r
+ m_maxrequests=0;\r
+ Option::Instance()->GetInt("MaxMessageListRequests",m_maxrequests);\r
+\r
+ // inactive identities get 1/2 of the max requests option - active identities get 1/2 + any remaining if not evenly divisible\r
+ m_maxrequests=(m_maxrequests/2)+(m_maxrequests%2);\r
+\r
+ if(m_maxrequests<1)\r
+ {\r
+ m_maxrequests=1;\r
+ m_log->error("Option MaxMessageListRequests is currently set at "+tempval+". It must be 1 or greater.");\r
+ }\r
+ if(m_maxrequests>100)\r
+ {\r
+ m_log->warning("Option MaxMessageListRequests is currently set at "+tempval+". This value might be incorrectly configured.");\r
+ }\r
+\r
+ tempval="";\r
+ Option::Instance()->Get("LocalTrustOverridesPeerTrust",tempval);\r
+ if(tempval=="true")\r
+ {\r
+ m_localtrustoverrides=true;\r
+ }\r
+ else\r
+ {\r
+ m_localtrustoverrides=false;\r
+ }\r
+\r
+ tempval="";\r
+ Option::Instance()->Get("SaveMessagesFromNewBoards",tempval);\r
+ if(tempval=="true")\r
+ {\r
+ m_savetonewboards=true;\r
+ }\r
+ else\r
+ {\r
+ m_savetonewboards=false;\r
+ }\r
+\r
+ m_messagedownloadmaxdaysbackward=5;\r
+ tempval="5";\r
+ Option::Instance()->Get("MessageDownloadMaxDaysBackward",tempval);\r
+ StringFunctions::Convert(tempval,m_messagedownloadmaxdaysbackward);\r
+\r
+}\r
+\r
+void InactiveMessageListRequester::PopulateIDList()\r
+{\r
+ Poco::DateTime date;\r
+ Poco::DateTime yesterday=date-Poco::Timespan(1,0,0,0,0);\r
+ int id;\r
+\r
+ SQLite3DB::Statement st;\r
+\r
+ // select identities we want to query (we've seen them today) - sort by their trust level (descending) with secondary sort on how long ago we saw them (ascending)\r
+ if(m_localtrustoverrides==false)\r
+ {\r
+ st=m_db->Prepare("SELECT tblIdentity.IdentityID FROM tblIdentity INNER JOIN vwIdentityStats ON tblIdentity.IdentityID=vwIdentityStats.IdentityID WHERE PublicKey IS NOT NULL AND PublicKey <> '' AND LastSeen>='"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d")+"' AND (vwIdentityStats.LastMessageDate IS NULL OR vwIdentityStats.LastMessageDate<'"+Poco::DateTimeFormatter::format(yesterday,"%Y-%m-%d")+"') AND (LocalMessageTrust IS NULL OR LocalMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalMessageTrust')) AND (PeerMessageTrust IS NULL OR PeerMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerMessageTrust')) ORDER BY LocalMessageTrust+LocalTrustListTrust DESC, LastSeen;");\r
+ }\r
+ else\r
+ {\r
+ st=m_db->Prepare("SELECT tblIdentity.IdentityID FROM tblIdentity INNER JOIN vwIdentityStats ON tblIdentity.IdentityID=vwIdentityStats.IdentityID WHERE PublicKey IS NOT NULL AND PublicKey <> '' AND LastSeen>='"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d")+"' AND (vwIdentityStats.LastMessageDate IS NULL OR vwIdentityStats.LastMessageDate<'"+Poco::DateTimeFormatter::format(yesterday,"%Y-%m-%d")+"') AND (LocalMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalMessageTrust') OR (LocalMessageTrust IS NULL AND (PeerMessageTrust IS NULL OR PeerMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerMessageTrust')))) ORDER BY LocalMessageTrust+LocalTrustListTrust DESC, LastSeen;");\r
+ }\r
+ st.Step();\r
+\r
+ m_ids.clear();\r
+\r
+ while(st.RowReturned())\r
+ {\r
+ st.ResultInt(0,id);\r
+ m_ids[id]=false;\r
+ st.Step();\r
+ }\r
+}\r
st.Bind(1,localidentityid);\r
st.Step();\r
\r
- // delete any record from tmpMessageListInsert\r
- st=m_db->Prepare("DELETE FROM tmpMessageListInsert WHERE LocalIdentityID=?;");\r
+ // delete only a single record from tmpMessageListInsert\r
+ st=m_db->Prepare("SELECT MessageListInsertID FROM tmpMessageListInsert WHERE LocalIdentityID=?;");\r
st.Bind(0,localidentityid);\r
st.Step();\r
+ if(st.RowReturned())\r
+ {\r
+ int id=-1;\r
+ st.ResultInt(0,id);\r
+\r
+ st=m_db->Prepare("DELETE FROM tmpMessageListInsert WHERE MessageListInsertID=?;");\r
+ st.Bind(0,id);\r
+ st.Step();\r
+ }\r
\r
RemoveFromInsertList(localidentityid);\r
\r
if(CheckDateNotFuture(xml.GetDate(i))==false)\r
{\r
addmessage=false;\r
- m_log->error("MessageListRequester::HandleAllData date for message is in future! "+xml.GetDate(i));\r
+ m_log->error(m_fcpuniquename+"::HandleAllData date for message is in future! "+xml.GetDate(i));\r
}\r
\r
if(addmessage==true && CheckDateWithinMaxDays(xml.GetDate(i))==false)\r
if(CheckDateNotFuture(xml.GetExternalDate(i))==false)\r
{\r
addmessage=false;\r
- m_log->error("MessageListRequester::HandleAllData date for external message is in future! "+xml.GetExternalDate(i));\r
+ m_log->error(m_fcpuniquename+"::HandleAllData date for external message is in future! "+xml.GetExternalDate(i));\r
}\r
\r
if(addmessage==true && CheckDateWithinMaxDays(xml.GetExternalDate(i))==false)\r
st.Step();\r
st.Finalize();\r
\r
- m_log->debug("MessageListRequester::HandleAllData parsed MessageList XML file : "+message["Identifier"]);\r
+ m_log->debug(m_fcpuniquename+"::HandleAllData parsed MessageList XML file : "+message["Identifier"]);\r
}\r
else\r
{\r
st.Step();\r
st.Finalize();\r
\r
- m_log->error("MessageListRequester::HandleAllData error parsing MessageList XML file : "+message["Identifier"]);\r
+ m_log->error(m_fcpuniquename+"::HandleAllData error parsing MessageList XML file : "+message["Identifier"]);\r
}\r
\r
// remove this identityid from request list\r
st.Step();\r
st.Finalize();\r
\r
- m_log->error("MessageListRequester::HandleGetFailed fatal error code="+message["Code"]+" requesting "+message["Identifier"]);\r
+ m_log->error(m_fcpuniquename+"::HandleGetFailed fatal error code="+message["Code"]+" requesting "+message["Identifier"]);\r
}\r
\r
// remove this identityid from request list\r
\r
void MessageListRequester::Initialize()\r
{\r
- m_fcpuniquename="MessageListRequester";\r
+ m_fcpuniquename="ActiveMessageListRequester";\r
std::string tempval="";\r
\r
m_maxrequests=0;\r
Option::Instance()->GetInt("MaxMessageListRequests",m_maxrequests);\r
+\r
+ // active identities get 1/2 of the max requests option + any remaining if not evenly divisible - inactive identities get 1/2\r
+ m_maxrequests=(m_maxrequests/2)+(m_maxrequests%2);\r
+\r
if(m_maxrequests<1)\r
{\r
m_maxrequests=1;\r
void MessageListRequester::PopulateIDList()\r
{\r
Poco::DateTime date;\r
+ Poco::DateTime yesterday=date-Poco::Timespan(1,0,0,0,0);\r
int id;\r
\r
SQLite3DB::Statement st;\r
// select identities we want to query (we've seen them today) - sort by their trust level (descending) with secondary sort on how long ago we saw them (ascending)\r
if(m_localtrustoverrides==false)\r
{\r
- st=m_db->Prepare("SELECT IdentityID FROM tblIdentity WHERE PublicKey IS NOT NULL AND PublicKey <> '' AND LastSeen>='"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d")+"' AND (LocalMessageTrust IS NULL OR LocalMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalMessageTrust')) AND (PeerMessageTrust IS NULL OR PeerMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerMessageTrust')) ORDER BY LocalMessageTrust+LocalTrustListTrust DESC, LastSeen;");\r
+ st=m_db->Prepare("SELECT tblIdentity.IdentityID FROM tblIdentity INNER JOIN vwIdentityStats ON tblIdentity.IdentityID=vwIdentityStats.IdentityID WHERE PublicKey IS NOT NULL AND PublicKey <> '' AND LastSeen>='"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d")+"' AND (vwIdentityStats.LastMessageDate>='"+Poco::DateTimeFormatter::format(yesterday,"%Y-%m-%d")+"') AND (LocalMessageTrust IS NULL OR LocalMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalMessageTrust')) AND (PeerMessageTrust IS NULL OR PeerMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerMessageTrust')) ORDER BY LocalMessageTrust+LocalTrustListTrust DESC, LastSeen;");\r
}\r
else\r
{\r
- st=m_db->Prepare("SELECT IdentityID FROM tblIdentity WHERE PublicKey IS NOT NULL AND PublicKey <> '' AND LastSeen>='"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d")+"' AND (LocalMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalMessageTrust') OR (LocalMessageTrust IS NULL AND (PeerMessageTrust IS NULL OR PeerMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerMessageTrust')))) ORDER BY LocalMessageTrust+LocalTrustListTrust DESC, LastSeen;");\r
+ st=m_db->Prepare("SELECT tblIdentity.IdentityID FROM tblIdentity INNER JOIN vwIdentityStats ON tblIdentity.IdentityID=vwIdentityStats.IdentityID WHERE PublicKey IS NOT NULL AND PublicKey <> '' AND LastSeen>='"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d")+"' AND (vwIdentityStats.LastMessageDate>='"+Poco::DateTimeFormatter::format(yesterday,"%Y-%m-%d")+"') AND (LocalMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalMessageTrust') OR (LocalMessageTrust IS NULL AND (PeerMessageTrust IS NULL OR PeerMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerMessageTrust')))) ORDER BY LocalMessageTrust+LocalTrustListTrust DESC, LastSeen;");\r
}\r
st.Step();\r
\r
--- /dev/null
+#include "../../include/freenet/unknownidentityrequester.h"\r
+#include "../../include/option.h"\r
+\r
+#ifdef XMEM\r
+ #include <xmem.h>\r
+#endif\r
+\r
+UnknownIdentityRequester::UnknownIdentityRequester()\r
+{\r
+ Initialize();\r
+}\r
+\r
+UnknownIdentityRequester::UnknownIdentityRequester(FCPv2 *fcp):IdentityRequester(fcp)\r
+{\r
+ Initialize();\r
+}\r
+\r
+void UnknownIdentityRequester::Initialize()\r
+{\r
+ m_fcpuniquename="UnknownIdentityRequester";\r
+ Option::Instance()->GetInt("MaxIdentityRequests",m_maxrequests);\r
+\r
+ // unknown identities get 1/5 of the max requests option - known identities get 4/5 + any remaining if not evenly divisible\r
+ m_maxrequests=(m_maxrequests/5);\r
+\r
+ if(m_maxrequests<1)\r
+ {\r
+ m_maxrequests=1;\r
+ m_log->error("Option MaxIdentityRequests is currently set at less than 1. It must be 1 or greater.");\r
+ }\r
+ if(m_maxrequests>100)\r
+ {\r
+ m_log->warning("Option MaxIdentityRequests is currently set at more than 100. This value might be incorrectly configured.");\r
+ }\r
+}\r
+\r
+void UnknownIdentityRequester::PopulateIDList()\r
+{\r
+ int id;\r
+\r
+ // select identities we want to query (haven't seen at all) - sort by their trust level (descending)\r
+ SQLite3DB::Statement st=m_db->Prepare("SELECT IdentityID FROM tblIdentity WHERE PublicKey IS NOT NULL AND PublicKey <> '' AND LastSeen IS NULL ORDER BY LocalMessageTrust+LocalTrustListTrust DESC;");\r
+ st.Step();\r
+\r
+ m_ids.clear();\r
+\r
+ while(st.RowReturned())\r
+ {\r
+ st.ResultInt(0,id);\r
+ m_ids[id]=false;\r
+ st.Step();\r
+ }\r
+}\r
replytomessageidstr=(*queryvars.find("replytomessageid")).second;\r
}\r
\r
- if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="send")\r
+ if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="send" && ValidateFormPassword(queryvars))\r
{\r
if(queryvars.find("localidentityid")!=queryvars.end() && (*queryvars.find("localidentityid")).second!="")\r
{\r
{\r
if(replytomessageidstr!="")\r
{\r
- SQLite3DB::Statement replyst=m_db->Prepare("SELECT Subject, Body FROM tblMessage WHERE MessageID=?;");\r
+ std::string fromname="";\r
+ SQLite3DB::Statement replyst=m_db->Prepare("SELECT Subject, Body, FromName FROM tblMessage WHERE MessageID=?;");\r
replyst.Bind(0,replytomessageidstr);\r
replyst.Step();\r
if(replyst.RowReturned())\r
{\r
replyst.ResultText(0,subject);\r
replyst.ResultText(1,body);\r
+ replyst.ResultText(2,fromname);\r
\r
if(subject.size()<3 || (subject.substr(0,3)!="re:" && subject.substr(0,3)!="Re:"))\r
{\r
}\r
body+="\n";\r
}\r
+ body=fromname+" wrote:\n"+body;\r
\r
}\r
}\r
content+="<input type=\"hidden\" name=\"threadid\" value=\""+threadidstr+"\">";\r
content+="<input type=\"hidden\" name=\"replytomessageid\" value=\""+replytomessageidstr+"\">";\r
content+="<input type=\"hidden\" name=\"formaction\" value=\"send\">";\r
+ content+=CreateFormPassword();\r
content+="<table class=\"createpost\">";\r
content+="<tr><td class=\"identity\">From</td><td>"+LocalIdentityDropDown("localidentityid",localidentityidstr)+"</td></tr>";\r
content+="<tr><td class=\"subject\">Subject</td><td><input type=\"text\" name=\"subject\" maxlength=\"60\" size=\"60\" value=\""+SanitizeOutput(subject)+"\"></td></tr>";\r
mt.Load(messageid,boardid,bydate);\r
m_threadmessages=mt.GetNodes();\r
\r
- // find threadid of this thread if it already exists in a thread\r
+ // find threadid of this mesage if it already exists in a thread\r
SQLite3DB::Statement st=m_db->Prepare("SELECT tblThread.ThreadID FROM tblThread INNER JOIN tblThreadPost ON tblThread.ThreadID=tblThreadPost.ThreadID WHERE tblThread.BoardID=? AND tblThreadPost.MessageID=?;");\r
st.Bind(0,boardid);\r
st.Bind(1,messageid);\r
deleteotherst.Step();\r
deleteotherst.Reset();\r
\r
- // TODO - remove after corruption issue fixed\r
- if(ll=="8")\r
- {\r
- std::string dbres=TestDBIntegrity();\r
- if(dbres!="ok")\r
- {\r
- m_log->trace("ThreadBuilder::Build after delete other TestDBIntegrity returned "+dbres);\r
- }\r
- }\r
-\r
st4.Bind(0,threadid);\r
st4.Bind(1,(*i).m_messageid);\r
st4.Bind(2,count);\r
st4.Step();\r
st4.Reset();\r
-\r
- // TODO - remove after corruption issue fixed\r
- if(ll=="8")\r
- {\r
- std::string dbres=TestDBIntegrity();\r
- if(dbres!="ok")\r
- {\r
- m_log->trace("ThreadBuilder::Build after insert TestDBIntegrity returned "+dbres);\r
- }\r
- }\r
}\r
}\r
else\r