version 0.2.7
[fms.git] / src / message.cpp
index f95f541..eea0633 100644 (file)
@@ -42,6 +42,35 @@ const bool Message::CheckForAdministrationBoard(const std::vector<std::string> &
        return false;\r
 }\r
 \r
+const int Message::FindLocalIdentityID(const std::string &name)\r
+{\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID FROM tblLocalIdentity WHERE Name=?;");\r
+       st.Bind(0,name);\r
+       st.Step();\r
+       if(st.RowReturned())\r
+       {\r
+               int result=-1;\r
+               st.ResultInt(0,result);\r
+               return result;\r
+       }\r
+       else\r
+       {\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,name);\r
+                       st.Step(true);\r
+                       return st.GetLastInsertRowID();\r
+               }\r
+               else\r
+               {\r
+                       return -1;\r
+               }\r
+       }\r
+}\r
+\r
 const std::string Message::GetNNTPArticleID() const\r
 {\r
        // old message - before 0.1.12 - doesn't have @domain so add @freenetproject.org\r
@@ -112,6 +141,7 @@ void Message::HandleAdministrationMessage()
        // only continue if this message was actually a reply to another message\r
        if(m_inreplyto.size()>0)\r
        {\r
+               int localidentityid=-1;\r
                int boardid=0;\r
                std::string boardname="";\r
                std::string identityname="";\r
@@ -123,7 +153,9 @@ void Message::HandleAdministrationMessage()
                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
+               localidentityid=FindLocalIdentityID(m_fromname);\r
+\r
+               while(st.RowReturned() && localidentityid!=-1)\r
                {\r
                        st.ResultInt(0,boardid);\r
                        st.ResultText(1,boardname);\r
@@ -132,8 +164,9 @@ void Message::HandleAdministrationMessage()
 \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
+                               SQLite3DB::Statement origmess=m_db->Prepare("SELECT tblIdentity.IdentityID,tblIdentity.Name,tblIdentityTrust.LocalMessageTrust,tblIdentityTrust.LocalTrustListTrust FROM tblIdentity INNER JOIN tblMessage ON tblIdentity.IdentityID=tblMessage.IdentityID LEFT JOIN (SELECT IdentityID,LocalMessageTrust,LocalTrustListTrust FROM tblIdentityTrust WHERE LocalIdentityID=?) AS 'tblIdentityTrust' ON tblIdentity.IdentityID=tblIdentityTrust.IdentityID WHERE tblMessage.MessageUUID=?;");\r
+                               origmess.Bind(0,localidentityid);\r
+                               origmess.Bind(1,m_inreplyto[0]);\r
                                origmess.Step();\r
 \r
                                if(origmess.RowReturned())\r
@@ -165,11 +198,18 @@ void Message::HandleAdministrationMessage()
                                        origtrustlisttrust<0 ? origtrustlisttrust=0 : false;\r
                                        origtrustlisttrust>100 ? origtrustlisttrust=100 : false;\r
 \r
+                                       // make sure we have a record in tblIdentityTrust\r
+                                       SQLite3DB::Statement ins=m_db->Prepare("INSERT INTO tblIdentityTrust(LocalIdentityID,IdentityID) VALUES(?,?);");\r
+                                       ins.Bind(0,localidentityid);\r
+                                       ins.Bind(1,identityid);\r
+                                       ins.Step();\r
+\r
                                        // update new trust levels\r
-                                       SQLite3DB::Statement update=m_db->Prepare("UPDATE tblIdentity SET LocalMessageTrust=?, LocalTrustListTrust=? WHERE IdentityID=?;");\r
+                                       SQLite3DB::Statement update=m_db->Prepare("UPDATE tblIdentityTrust SET LocalMessageTrust=?, LocalTrustListTrust=? WHERE IdentityID=? AND LocalIdentityID=?;");\r
                                        update.Bind(0,origmessagetrust);\r
                                        update.Bind(1,origtrustlisttrust);\r
                                        update.Bind(2,identityid);\r
+                                       update.Bind(3,localidentityid);\r
                                        update.Step();\r
 \r
                                        // insert message to show what id was changed and what current levels are\r
@@ -182,6 +222,7 @@ void Message::HandleAdministrationMessage()
                                        now.SetToGMTime();\r
                                        StringFunctions::Convert(origmessagetrust,messagetruststr);\r
                                        StringFunctions::Convert(origtrustlisttrust,trustlisttruststr);\r
+                                       messagebody="Trust List of "+m_fromname+"\r\n";\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
@@ -215,39 +256,52 @@ void Message::HandleChangeTrust()
 {\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
+               int localidentityid=FindLocalIdentityID(m_fromname);\r
+               if(localidentityid!=-1)\r
                {\r
-                       int identityid=0;\r
-                       int localmessagetrust=0;\r
+                       // make sure we have a record in tblIdentityTrust\r
+                       SQLite3DB::Statement ins=m_db->Prepare("INSERT INTO tblIdentityTrust(LocalIdentityID,IdentityID) VALUES(?,?);");\r
 \r
-                       st.ResultInt(0,identityid);\r
-                       if(st.ResultNull(1)==false)\r
-                       {\r
-                               st.ResultInt(1,localmessagetrust);\r
-                       }\r
-                       else\r
+                       SQLite3DB::Statement st=m_db->Prepare("SELECT tblIdentity.IdentityID,tblIdentityTrust.LocalMessageTrust FROM tblIdentity INNER JOIN tblMessage ON tblIdentity.IdentityID=tblMessage.IdentityID LEFT JOIN (SELECT IdentityID,LocalMessageTrust FROM tblIdentityTrust WHERE LocalIdentityID=?) AS 'tblIdentityTrust' ON tblIdentity.IdentityID=tblIdentityTrust.IdentityID WHERE tblMessage.MessageUUID=?;");\r
+                       st.Bind(0,localidentityid);\r
+                       st.Bind(1,m_inreplyto[0]);\r
+                       st.Step();\r
+                       if(st.RowReturned())\r
                        {\r
-                               localmessagetrust=m_minlocalmessagetrust;\r
-                       }\r
+                               int identityid=0;\r
+                               int localmessagetrust=0;\r
 \r
-                       localmessagetrust+=m_changemessagetrustonreply;\r
-                       if(localmessagetrust<0)\r
-                       {\r
-                               localmessagetrust=0;\r
-                       }\r
-                       if(localmessagetrust>100)\r
-                       {\r
-                               localmessagetrust=100;\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
+                               ins.Bind(0,localidentityid);\r
+                               ins.Bind(1,identityid);\r
+                               ins.Step();\r
 \r
+                               SQLite3DB::Statement st2=m_db->Prepare("UPDATE tblIdentityTrust SET LocalMessageTrust=? WHERE IdentityID=? AND LocalIdentityID=?;");\r
+                               st2.Bind(0,localmessagetrust);\r
+                               st2.Bind(1,identityid);\r
+                               st2.Bind(2,localidentityid);\r
+                               st2.Step();\r
+\r
+                       }\r
                }\r
        }\r
 }\r
@@ -635,7 +689,9 @@ const bool Message::StartFreenetInsert()
                xml.AddInReplyTo((*j).first,(*j).second);\r
        }\r
 \r
+\r
        // find identity to insert with\r
+       /*\r
        SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID FROM tblLocalIdentity WHERE Name=?;");\r
        st.Bind(0,m_fromname);\r
        st.Step();\r
@@ -661,8 +717,14 @@ const bool Message::StartFreenetInsert()
        {\r
                st.ResultInt(0,localidentityid);\r
        }\r
+       */\r
+       localidentityid=FindLocalIdentityID(m_fromname);\r
+       if(localidentityid==-1)\r
+       {\r
+               return false;\r
+       }\r
 \r
-       st=m_db->Prepare("INSERT INTO tblMessageInserts(LocalIdentityID,MessageUUID,MessageXML) VALUES(?,?,?);");\r
+       SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tblMessageInserts(LocalIdentityID,MessageUUID,MessageXML) VALUES(?,?,?);");\r
        st.Bind(0,localidentityid);\r
        st.Bind(1,m_messageuuid);\r
        st.Bind(2,xml.GetXML());\r