#include "../include/uuidgenerator.h"\r
#include "../include/stringfunctions.h"\r
#include "../include/freenet/messagexml.h"\r
+#include "../include/option.h"\r
\r
#include <algorithm>\r
\r
\r
const std::string Message::GetNNTPArticleID() const\r
{\r
- return "<"+m_messageuuid+"@freenetproject.org>";\r
+ // old message - before 0.1.12 - doesn't have @domain so add @freenetproject.org\r
+ if(m_messageuuid.find("@")==std::string::npos)\r
+ {\r
+ return "<"+m_messageuuid+"@freenetproject.org>";\r
+ }\r
+ else\r
+ {\r
+ return "<"+m_messageuuid+">";\r
+ }\r
}\r
\r
const std::string Message::GetNNTPBody() const\r
{\r
rval+=" ";\r
}\r
- rval+="<"+(*j).second+"@freenetproject.org>";\r
+ // old message - before 0.1.12 - doesn't have @domain so add @freenetproject.org\r
+ if((*j).second.find("@")==std::string::npos)\r
+ {\r
+ rval+="<"+(*j).second+"@freenetproject.org>";\r
+ }\r
+ else\r
+ {\r
+ rval+="<"+(*j).second+">";\r
+ }\r
}\r
rval+="\r\n";\r
}\r
{\r
origmess.ResultInt(0,identityid);\r
origmess.ResultText(1,identityname);\r
- origmess.ResultInt(2,origmessagetrust);\r
- origmess.ResultInt(3,origtrustlisttrust);\r
-\r
- origmessagetrust+=changemessagetrust;\r
- origtrustlisttrust+=changetrustlisttrust;\r
-\r
- if(origmessagetrust<0)\r
+ if(origmess.ResultNull(2)==false)\r
{\r
- origmessagetrust=0;\r
+ origmess.ResultInt(2,origmessagetrust);\r
}\r
- if(origmessagetrust>100)\r
+ else\r
{\r
- origmessagetrust=100;\r
+ origmessagetrust=m_minlocalmessagetrust;\r
}\r
- if(origtrustlisttrust<0)\r
+ if(origmess.ResultNull(3)==false)\r
{\r
- origtrustlisttrust=0;\r
+ origmess.ResultInt(3,origtrustlisttrust);\r
}\r
- if(origtrustlisttrust>100)\r
+ else\r
{\r
- origtrustlisttrust=100;\r
+ origtrustlisttrust=m_minlocaltrustlisttrust;\r
}\r
\r
+ origmessagetrust+=changemessagetrust;\r
+ origtrustlisttrust+=changetrustlisttrust;\r
+\r
+ origmessagetrust<0 ? origmessagetrust=0 : false;\r
+ origmessagetrust>100 ? origmessagetrust=100 : false;\r
+ origtrustlisttrust<0 ? origtrustlisttrust=0 : false;\r
+ origtrustlisttrust>100 ? origtrustlisttrust=100 : false;\r
+\r
// update new trust levels\r
SQLite3DB::Statement update=m_db->Prepare("UPDATE tblIdentity SET LocalMessageTrust=?, LocalTrustListTrust=? WHERE IdentityID=?;");\r
update.Bind(0,origmessagetrust);\r
\r
}\r
\r
+void Message::HandleChangeTrust()\r
+{\r
+ if(m_changemessagetrustonreply!=0 && m_inreplyto.size()>0)\r
+ {\r
+ SQLite3DB::Statement st=m_db->Prepare("SELECT tblIdentity.IdentityID,tblIdentity.LocalMessageTrust FROM tblIdentity INNER JOIN tblMessage ON tblIdentity.IdentityID=tblMessage.IdentityID WHERE tblMessage.MessageUUID=?;");\r
+ st.Bind(0,m_inreplyto[0]);\r
+ st.Step();\r
+ if(st.RowReturned())\r
+ {\r
+ int identityid=0;\r
+ int localmessagetrust=0;\r
+\r
+ st.ResultInt(0,identityid);\r
+ if(st.ResultNull(1)==false)\r
+ {\r
+ st.ResultInt(1,localmessagetrust);\r
+ }\r
+ else\r
+ {\r
+ localmessagetrust=m_minlocalmessagetrust;\r
+ }\r
+\r
+ localmessagetrust+=m_changemessagetrustonreply;\r
+ if(localmessagetrust<0)\r
+ {\r
+ localmessagetrust=0;\r
+ }\r
+ if(localmessagetrust>100)\r
+ {\r
+ localmessagetrust=100;\r
+ }\r
+\r
+ SQLite3DB::Statement st2=m_db->Prepare("UPDATE tblIdentity SET LocalMessageTrust=? WHERE IdentityID=?;");\r
+ st2.Bind(0,localmessagetrust);\r
+ st2.Bind(1,identityid);\r
+ st2.Step();\r
+\r
+ }\r
+ }\r
+}\r
+\r
void Message::Initialize()\r
{\r
+ std::string tempval="";\r
m_messageid=-1;\r
m_messageuuid="";\r
m_subject="";\r
m_fromname="";\r
m_boards.clear();\r
m_inreplyto.clear();\r
+ m_changemessagetrustonreply=0;\r
+ Option::Instance()->Get("ChangeMessageTrustOnReply",tempval);\r
+ StringFunctions::Convert(tempval,m_changemessagetrustonreply);\r
+ Option::Instance()->Get("AddNewPostFromIdentities",tempval);\r
+ if(tempval=="true")\r
+ {\r
+ m_addnewpostfromidentities=true;\r
+ }\r
+ else\r
+ {\r
+ m_addnewpostfromidentities=false;\r
+ }\r
+ tempval="50";\r
+ Option::Instance()->Get("MinLocalMessageTrust",tempval);\r
+ StringFunctions::Convert(tempval,m_minlocalmessagetrust);\r
+ tempval="51";\r
+ Option::Instance()->Get("MinLocalTrustListTrust",tempval);\r
+ StringFunctions::Convert(tempval,m_minlocaltrustlisttrust);\r
}\r
\r
const bool Message::Load(const long messageid, const long boardid)\r
\r
const bool Message::Load(const std::string &messageuuid)\r
{\r
+\r
+ std::string uuid=messageuuid;\r
+\r
+ if(uuid.size()>0 && uuid[0]=='<')\r
+ {\r
+ uuid.erase(0,1);\r
+ }\r
+ if(uuid.size()>0 && uuid[uuid.size()-1]=='>')\r
+ {\r
+ uuid.erase(uuid.size()-1);\r
+ }\r
+ if(uuid.find("@freenetproject.org")!=std::string::npos)\r
+ {\r
+ uuid.erase(uuid.find("@freenetproject.org"));\r
+ }\r
+\r
SQLite3DB::Statement st=m_db->Prepare("SELECT MessageID FROM tblMessage WHERE MessageUUID=?;");\r
- st.Bind(0,messageuuid);\r
+ st.Bind(0,uuid);\r
st.Step();\r
\r
if(st.RowReturned())\r
// get header info\r
// date is always set to now regardless of what message has\r
m_datetime.SetToGMTime();\r
+\r
// messageuuid is always a unique id we generate regardless of message message-id\r
m_messageuuid=uuid.Generate();\r
+ \r
// get from\r
if(mime.GetFieldValue("From"))\r
{\r
(*i)=StringFunctions::Replace((*i),"<","");\r
(*i)=StringFunctions::Replace((*i),">","");\r
(*i)=StringFunctions::TrimWhitespace((*i));\r
+ /*\r
// erase @ and everything after\r
if((*i).find("@")!=std::string::npos)\r
{\r
(*i).erase((*i).find("@"));\r
}\r
+ */\r
+ // only erase after @ if message is old type with @freenetproject.org\r
+ if((*i).find("@freenetproject.org")!=std::string::npos)\r
+ {\r
+ (*i).erase((*i).find("@"));\r
+ }\r
if((*i)!="")\r
{\r
m_inreplyto[count++]=(*i);\r
return true;\r
}\r
\r
-void Message::StartFreenetInsert()\r
+const bool Message::StartFreenetInsert()\r
{\r
- //TODO if message was posted to one of the special administration boards - don't really insert it, but perform the action\r
+\r
MessageXML xml;\r
int localidentityid=-1;\r
\r
xml.SetDate(m_datetime.Format("%Y-%m-%d"));\r
xml.SetTime(m_datetime.Format("%H:%M:%S"));\r
\r
+ StripAdministrationBoards();\r
for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); i++)\r
{\r
xml.AddBoard((*i));\r
// couldn't find identity with this name - insert a new identity\r
if(!st.RowReturned())\r
{\r
- DateTime now;\r
- now.SetToGMTime();\r
- st=m_db->Prepare("INSERT INTO tblLocalIdentity(Name) VALUES(?);");\r
- st.Bind(0,m_fromname);\r
- st.Step(true);\r
- localidentityid=st.GetLastInsertRowID();\r
+ if(m_addnewpostfromidentities==true)\r
+ {\r
+ DateTime now;\r
+ now.SetToGMTime();\r
+ st=m_db->Prepare("INSERT INTO tblLocalIdentity(Name) VALUES(?);");\r
+ st.Bind(0,m_fromname);\r
+ st.Step(true);\r
+ localidentityid=st.GetLastInsertRowID();\r
+ }\r
+ else\r
+ {\r
+ return false;\r
+ }\r
}\r
else\r
{\r
st.Bind(2,xml.GetXML());\r
st.Step();\r
\r
+ HandleChangeTrust();\r
+\r
+ return true;\r
+\r
+}\r
+\r
+void Message::StripAdministrationBoards()\r
+{\r
+ SQLite3DB::Statement st=m_db->Prepare("SELECT tblBoard.BoardID FROM tblBoard INNER JOIN tblAdministrationBoard ON tblBoard.BoardID=tblAdministrationBoard.BoardID WHERE BoardName=?;");\r
+ for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); )\r
+ {\r
+ st.Bind(0,(*i));\r
+ st.Step();\r
+ if(st.RowReturned())\r
+ {\r
+ i=m_boards.erase(i);\r
+ }\r
+ else\r
+ {\r
+ i++;\r
+ }\r
+ st.Reset();\r
+ }\r
}\r