version 0.1.10
[fms.git] / src / message.cpp
index f4d3a95..123d370 100644 (file)
@@ -20,9 +20,30 @@ Message::Message(const long messageid)
        Load(messageid);\r
 }\r
 \r
+const bool Message::CheckForAdministrationBoard(const std::vector<std::string> &boards)\r
+{\r
+       std::string name;\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT BoardName FROM tblBoard INNER JOIN tblAdministrationBoard ON tblBoard.BoardID=tblAdministrationBoard.BoardID;");\r
+       st.Step();\r
+       \r
+       while(st.RowReturned())\r
+       {\r
+               st.ResultText(0,name);\r
+\r
+               if(std::find(boards.begin(),boards.end(),name)!=boards.end())\r
+               {\r
+                       return true;\r
+               }\r
+               \r
+               st.Step();\r
+       }\r
+\r
+       return false;\r
+}\r
+\r
 const std::string Message::GetNNTPArticleID() const\r
 {\r
-       return "<"+m_messageuuid+">";\r
+       return "<"+m_messageuuid+"@freenetproject.org>";\r
 }\r
 \r
 const std::string Message::GetNNTPBody() const\r
@@ -57,7 +78,7 @@ const std::string Message::GetNNTPHeaders() const
                        {\r
                                rval+=" ";\r
                        }\r
-                       rval+="<"+(*j).second+">";\r
+                       rval+="<"+(*j).second+"@freenetproject.org>";\r
                }\r
                rval+="\r\n";\r
        }\r
@@ -69,6 +90,108 @@ const std::string Message::GetNNTPHeaders() const
        return rval;\r
 }\r
 \r
+void Message::HandleAdministrationMessage()\r
+{\r
+       // only continue if this message was actually a reply to another message\r
+       if(m_inreplyto.size()>0)\r
+       {\r
+               int boardid=0;\r
+               std::string boardname="";\r
+               std::string identityname="";\r
+               int identityid;\r
+               int changemessagetrust=0;\r
+               int changetrustlisttrust=0;\r
+               int origmessagetrust=0;\r
+               int origtrustlisttrust=0;\r
+               SQLite3DB::Statement st=m_db->Prepare("SELECT tblBoard.BoardID,BoardName,ModifyLocalMessageTrust,ModifyLocalTrustListTrust FROM tblBoard INNER JOIN tblAdministrationBoard ON tblBoard.BoardID=tblAdministrationBoard.BoardID;");\r
+               st.Step();\r
+\r
+               while(st.RowReturned())\r
+               {\r
+                       st.ResultInt(0,boardid);\r
+                       st.ResultText(1,boardname);\r
+                       st.ResultInt(2,changemessagetrust);\r
+                       st.ResultInt(3,changetrustlisttrust);\r
+\r
+                       if(std::find(m_boards.begin(),m_boards.end(),boardname)!=m_boards.end())\r
+                       {\r
+                               SQLite3DB::Statement origmess=m_db->Prepare("SELECT tblIdentity.IdentityID,tblIdentity.Name,tblIdentity.LocalMessageTrust,tblIdentity.LocalTrustListTrust FROM tblIdentity INNER JOIN tblMessage ON tblIdentity.IdentityID=tblMessage.IdentityID WHERE tblMessage.MessageUUID=?;");\r
+                               origmess.Bind(0,m_inreplyto[0]);\r
+                               origmess.Step();\r
+\r
+                               if(origmess.RowReturned())\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
+                                       {\r
+                                               origmessagetrust=0;\r
+                                       }\r
+                                       if(origmessagetrust>100)\r
+                                       {\r
+                                               origmessagetrust=100;\r
+                                       }\r
+                                       if(origtrustlisttrust<0)\r
+                                       {\r
+                                               origtrustlisttrust=0;\r
+                                       }\r
+                                       if(origtrustlisttrust>100)\r
+                                       {\r
+                                               origtrustlisttrust=100;\r
+                                       }\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
+                                       update.Bind(1,origtrustlisttrust);\r
+                                       update.Bind(2,identityid);\r
+                                       update.Step();\r
+\r
+                                       // insert message to show what id was changed and what current levels are\r
+                                       int lastid=0;\r
+                                       std::string messagebody;\r
+                                       std::string messagetruststr="";\r
+                                       std::string trustlisttruststr="";\r
+                                       UUIDGenerator uuid;\r
+                                       DateTime now;\r
+                                       now.SetToGMTime();\r
+                                       StringFunctions::Convert(origmessagetrust,messagetruststr);\r
+                                       StringFunctions::Convert(origtrustlisttrust,trustlisttruststr);\r
+                                       messagebody="Trust Changed for "+identityname+"\r\n";\r
+                                       messagebody+="Local Message Trust : "+messagetruststr+"\r\n";\r
+                                       messagebody+="Local Trust List Trust : "+trustlisttruststr+"\r\n";\r
+                                       SQLite3DB::Statement insert=m_db->Prepare("INSERT INTO tblMessage(FromName,MessageDate,MessageTime,Subject,MessageUUID,ReplyBoardID,Body) VALUES('FMS',?,?,?,?,?,?);");\r
+                                       insert.Bind(0,now.Format("%Y-%m-%d"));\r
+                                       insert.Bind(1,now.Format("%H:%M:%S"));\r
+                                       insert.Bind(2,identityname+" Trust Changed");\r
+                                       insert.Bind(3,uuid.Generate());\r
+                                       insert.Bind(4,boardid);\r
+                                       insert.Bind(5,messagebody);\r
+                                       insert.Step(true);\r
+                                       lastid=insert.GetLastInsertRowID();\r
+\r
+                                       insert=m_db->Prepare("INSERT INTO tblMessageBoard(MessageID,BoardID) VALUES(?,?);");\r
+                                       insert.Bind(0,lastid);\r
+                                       insert.Bind(1,boardid);\r
+                                       insert.Step();\r
+\r
+                                       m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"Message::HandleAdministrationMessage updated "+identityname+" to "+messagetruststr+" , "+trustlisttruststr);\r
+\r
+                               }\r
+                       }\r
+\r
+                       st.Step();\r
+               }\r
+       }\r
+\r
+}\r
+\r
 void Message::Initialize()\r
 {\r
        m_messageid=-1;\r
@@ -121,6 +244,9 @@ const bool Message::Load(const long messageid, const long boardid)
                st.ResultText(7,m_fromname);\r
                st.Finalize();\r
 \r
+               // strip off any \r\n in subject\r
+               m_subject=StringFunctions::Replace(m_subject,"\r\n","");\r
+\r
                // get board list\r
                st=m_db->Prepare("SELECT tblBoard.BoardName FROM tblBoard INNER JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID WHERE tblMessageBoard.MessageID=?;");\r
                st.Bind(0,messageid);\r
@@ -255,6 +381,8 @@ const bool Message::ParseNNTPMessage(const std::string &nntpmessage)
        if(mime.GetFieldValue("From"))\r
        {\r
                m_fromname=mime.GetFieldValue("From");\r
+               // remove any path folding\r
+               m_fromname=StringFunctions::Replace(m_fromname,"\r\n","");\r
                // strip off everything between () and <> and any whitespace\r
                std::string::size_type startpos=m_fromname.find("(");\r
                std::string::size_type endpos;\r
@@ -276,6 +404,18 @@ const bool Message::ParseNNTPMessage(const std::string &nntpmessage)
                        }\r
                }\r
                m_fromname=StringFunctions::TrimWhitespace(m_fromname);\r
+\r
+               // trim off " from beginning and end\r
+               if(m_fromname.size()>0 && m_fromname[0]=='\"')\r
+               {\r
+                       m_fromname.erase(0,1);\r
+               }\r
+               if(m_fromname.size()>0 && m_fromname[m_fromname.size()-1]=='\"')\r
+               {\r
+                       m_fromname.erase(m_fromname.size()-1,1);\r
+               }\r
+\r
+               m_fromname=StringFunctions::TrimWhitespace(m_fromname);\r
        }\r
        else\r
        {\r
@@ -285,6 +425,8 @@ const bool Message::ParseNNTPMessage(const std::string &nntpmessage)
        if(mime.GetFieldValue("Newsgroups"))\r
        {\r
                std::string temp=mime.GetFieldValue("Newsgroups");\r
+               // remove any path folding\r
+               temp=StringFunctions::Replace(temp,"\r\n","");\r
                std::vector<std::string> parts;\r
                StringFunctions::SplitMultiple(temp,", \t",parts);\r
                for(std::vector<std::string>::iterator i=parts.begin(); i!=parts.end(); i++)\r
@@ -302,6 +444,8 @@ const bool Message::ParseNNTPMessage(const std::string &nntpmessage)
        if(mime.GetFieldValue("Followup-To"))\r
        {\r
                m_replyboardname=mime.GetFieldValue("Followup-To");\r
+               // remove any path folding\r
+               m_replyboardname=StringFunctions::Replace(m_replyboardname,"\r\n","");\r
        }\r
        else\r
        {\r
@@ -314,6 +458,8 @@ const bool Message::ParseNNTPMessage(const std::string &nntpmessage)
        if(mime.GetFieldValue("Subject"))\r
        {\r
                m_subject=mime.GetFieldValue("Subject");\r
+               // remove any path folding\r
+               m_subject=StringFunctions::Replace(m_subject,"\r\n","");\r
        }\r
        else\r
        {\r
@@ -323,14 +469,22 @@ const bool Message::ParseNNTPMessage(const std::string &nntpmessage)
        if(mime.GetFieldValue("References"))\r
        {\r
                std::string temp=mime.GetFieldValue("References");\r
+               // remove any path folding\r
+               temp=StringFunctions::Replace(temp,"\r\n","");\r
                std::vector<std::string> parts;\r
                int count=0;\r
                StringFunctions::SplitMultiple(temp,", \t",parts);\r
                for(std::vector<std::string>::reverse_iterator i=parts.rbegin(); i!=parts.rend(); i++)\r
                {\r
+                       // get rid of < and > and any whitespace\r
                        (*i)=StringFunctions::Replace((*i),"<","");\r
                        (*i)=StringFunctions::Replace((*i),">","");\r
                        (*i)=StringFunctions::TrimWhitespace((*i));\r
+                       // erase @ and everything after\r
+                       if((*i).find("@")!=std::string::npos)\r
+                       {\r
+                               (*i).erase((*i).find("@"));\r
+                       }\r
                        if((*i)!="")\r
                        {\r
                                m_inreplyto[count++]=(*i);\r
@@ -355,6 +509,7 @@ const bool Message::ParseNNTPMessage(const std::string &nntpmessage)
 \r
 void Message::StartFreenetInsert()\r
 {\r
+\r
        MessageXML xml;\r
        int localidentityid=-1;\r
 \r