version 0.3.10
authorSomeDude <SomeDude@NuBL7aaJ6Cn4fB7GXFb9Zfi8w1FhPyW3oKgU9TweZMw>
Sat, 19 Jul 2008 08:13:00 +0000 (10:13 +0200)
committerDavid ‘Bombe’ Roden <bombe@freenetproject.org>
Sat, 19 Jul 2008 08:13:00 +0000 (10:13 +0200)
13 files changed:
include/dbconversions.h
include/freenet/introductionpuzzleinserter.h
include/freenet/messagelistrequester.h
include/global.h
src/dbconversions.cpp
src/dbmaintenancethread.cpp
src/dbsetup.cpp
src/freenet/introductionpuzzleinserter.cpp
src/freenet/messagelistrequester.cpp
src/freenet/messagerequester.cpp
src/http/pages/homepage.cpp
src/message.cpp
src/optionssetup.cpp

index e850f58..8d090f4 100644 (file)
@@ -12,6 +12,7 @@ void ConvertDB0108To0109();
 void ConvertDB0109To0110();\r
 void ConvertDB0110To0111();\r
 void ConvertDB0111To0112();\r
+void ConvertDB0112To0113();\r
 \r
 // TODO remove sometime after 0.1.17\r
 void FixCapitalBoardNames();\r
index 3ac8d83..9cd88e3 100644 (file)
@@ -3,6 +3,7 @@
 \r
 #include "iindexinserter.h"\r
 \r
+#include <map>\r
 #include <Poco/DateTime.h>\r
 \r
 class IntroductionPuzzleInserter:public IIndexInserter<long>\r
@@ -20,6 +21,8 @@ private:
        const bool HandlePutFailed(FCPMessage &message);\r
 \r
        Poco::DateTime m_lastchecked;\r
+       int m_maxpuzzleinserts;\r
+       std::map<int,Poco::DateTime> m_lastinserted;\r
 \r
 };\r
 \r
index 106c2fe..e8b33c5 100644 (file)
@@ -19,6 +19,7 @@ private:
        const bool HandleAllData(FCPMessage &message);\r
        const bool HandleGetFailed(FCPMessage &message);\r
        void GetBoardList(std::map<std::string,bool> &boards);\r
+       const bool CheckDateNotFuture(const std::string &datestr) const;\r
 \r
        bool m_localtrustoverrides;\r
        bool m_savetonewboards;\r
index de4e04b..094d3f2 100644 (file)
@@ -7,7 +7,7 @@
 \r
 #define VERSION_MAJOR          "0"\r
 #define VERSION_MINOR          "3"\r
-#define VERSION_RELEASE                "9"\r
+#define VERSION_RELEASE                "10"\r
 #define FMS_VERSION                    VERSION_MAJOR"."VERSION_MINOR"."VERSION_RELEASE\r
 \r
 typedef Poco::ScopedLock<Poco::FastMutex> Guard;\r
index 206ab64..1fa11cd 100644 (file)
@@ -222,6 +222,17 @@ void ConvertDB0111To0112()
        db->Execute("UPDATE tblDBVersion SET Major=1, Minor=12;");\r
 }\r
 \r
+void ConvertDB0112To0113()\r
+{\r
+       // Add Tries and Key (for anonymous messages) to tblMessageRequests     \r
+       SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
+\r
+       db->Execute("ALTER TABLE tblMessageRequests ADD COLUMN Tries INTEGER DEFAULT 0;");\r
+       db->Execute("ALTER TABLE tblMessageRequests ADD COLUMN Key TEXT;");\r
+\r
+       db->Execute("UPDATE tblDBVersion SET Major=1, Minor=13;");\r
+}\r
+\r
 void FixCapitalBoardNames()\r
 {\r
        SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
index bfee4fb..59bc010 100644 (file)
@@ -258,6 +258,13 @@ void DBMaintenanceThread::Do1DayMaintenance()
        st.Bind(0,Poco::DateTimeFormatter::format(date,"%Y-%m-%d"));\r
        st.Step();\r
 \r
+       // delete old message requests\r
+       date=Poco::Timestamp();\r
+       date-=Poco::Timespan(90,0,0,0,0);\r
+       st=m_db->Prepare("DELETE FROM tblMessageRequests WHERE Day<?;");\r
+       st.Bind(0,Poco::DateTimeFormatter::format(date,"%Y-%m-%d"));\r
+       st.Step();\r
+\r
        // delete tblIdentityTrust for local identities and identities that have been deleted\r
        m_db->Execute("DELETE FROM tblIdentityTrust WHERE LocalIdentityID NOT IN (SELECT LocalIdentityID FROM tblLocalIdentity);");\r
        m_db->Execute("DELETE FROM tblIdentityTrust WHERE IdentityID NOT IN (SELECT IdentityID FROM tblIdentity);");\r
index e6bdcf6..9b2ab00 100644 (file)
@@ -97,13 +97,19 @@ void SetupDB()
                        major=1;\r
                        minor=12;\r
                }\r
+               if(major==1 && minor==12)\r
+               {\r
+                       ConvertDB0112To0113();\r
+                       major=1;\r
+                       minor=13;\r
+               }\r
        }\r
        else\r
        {\r
-               db->Execute("INSERT INTO tblDBVersion(Major,Minor) VALUES(1,12);");\r
+               db->Execute("INSERT INTO tblDBVersion(Major,Minor) VALUES(1,13);");\r
        }\r
 \r
-       db->Execute("UPDATE tblDBVersion SET Major=1, Minor=12;");\r
+       db->Execute("UPDATE tblDBVersion SET Major=1, Minor=13;");\r
 \r
        db->Execute("CREATE TABLE IF NOT EXISTS tblFMSVersion(\\r
                                Major                           INTEGER,\\r
@@ -181,6 +187,9 @@ void SetupDB()
                                FoundSolution           BOOL CHECK(FoundSolution IN('true','false')) DEFAULT 'false'\\r
                                );");\r
 \r
+       /*\r
+               PurgeDate is not used yet\r
+       */\r
        db->Execute("CREATE TABLE IF NOT EXISTS tblIdentity(\\r
                                IdentityID                              INTEGER PRIMARY KEY,\\r
                                PublicKey                               TEXT UNIQUE,\\r
@@ -319,12 +328,17 @@ void SetupDB()
                                Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
                                );");\r
 \r
+       /*\r
+               Key is for anonymous messages (future)\r
+       */\r
        db->Execute("CREATE TABLE IF NOT EXISTS tblMessageRequests(\\r
                                IdentityID                      INTEGER,\\r
                                Day                                     DATE,\\r
                                RequestIndex            INTEGER,\\r
                                FromMessageList         BOOL CHECK(FromMessageList IN('true','false')) DEFAULT 'false',\\r
-                               Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
+                               Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false',\\r
+                               Tries                           INTEGER DEFAULT 0,\\r
+                               Key                                     TEXT\\r
                                );");\r
 \r
        db->Execute("CREATE UNIQUE INDEX IF NOT EXISTS idxMessageRequest ON tblMessageRequests(IdentityID,Day,RequestIndex);");\r
index 1fa13c0..b185b9d 100644 (file)
@@ -33,8 +33,13 @@ void IntroductionPuzzleInserter::CheckForNeededInsert()
                \r
                while(!rs.AtEnd())\r
                {\r
-                       std::string localidentityidstr;\r
+                       int localidentityid=0;\r
+                       std::string localidentityidstr="";\r
                        Poco::DateTime now;\r
+                       float minutesbetweeninserts=0;\r
+                       minutesbetweeninserts=1440.0/(float)m_maxpuzzleinserts;\r
+                       Poco::DateTime lastinsert=now;\r
+                       lastinsert-=Poco::Timespan(0,0,minutesbetweeninserts,0,0);\r
 \r
                        if(rs.GetField(0))\r
                        {\r
@@ -47,7 +52,15 @@ void IntroductionPuzzleInserter::CheckForNeededInsert()
                        // identity doesn't have any non-solved puzzles for today - start a new insert\r
                        if(rs2.Empty()==true)\r
                        {\r
-                               StartInsert(rs.GetInt(0));\r
+                               if(m_lastinserted.find(rs.GetInt(0))==m_lastinserted.end() || m_lastinserted[rs.GetInt(0)]<=lastinsert)\r
+                               {\r
+                                       StartInsert(rs.GetInt(0));\r
+                                       m_lastinserted[rs.GetInt(0)]=now;\r
+                               }\r
+                               else\r
+                               {\r
+                                       m_log->trace("IntroductionPuzzleInserter::CheckForNeededInsert waiting to insert puzzle for "+localidentityidstr);\r
+                               }\r
                        }\r
 \r
                        rs.Next();\r
@@ -139,6 +152,7 @@ const bool IntroductionPuzzleInserter::HandlePutSuccessful(FCPMessage &message)
 void IntroductionPuzzleInserter::Initialize()\r
 {\r
        m_fcpuniquename="IntroductionPuzzleInserter";\r
+       m_maxpuzzleinserts=50;\r
 }\r
 \r
 const bool IntroductionPuzzleInserter::StartInsert(const long &localidentityid)\r
@@ -173,7 +187,7 @@ const bool IntroductionPuzzleInserter::StartInsert(const long &localidentityid)
        }\r
        StringFunctions::Convert(index,indexstr);\r
 \r
-       if(index<50)\r
+       if(index<m_maxpuzzleinserts)\r
        {\r
                SQLite3DB::Recordset rs2=m_db->Query("SELECT PrivateKey,PublicKey FROM tblLocalIdentity WHERE LocalIdentityID="+idstring+";");\r
                if(rs2.Empty()==false && rs2.GetField(0)!=NULL)\r
@@ -241,7 +255,7 @@ const bool IntroductionPuzzleInserter::StartInsert(const long &localidentityid)
        }\r
        else\r
        {\r
-               m_log->warning("IntroductionPuzzleInserter::StartInsert already inserted 50 puzzles for "+idstring);\r
+               m_log->warning("IntroductionPuzzleInserter::StartInsert already inserted max puzzles for "+idstring);\r
        }\r
 \r
        return true;\r
index 62d5bb2..24f70d1 100644 (file)
@@ -19,6 +19,36 @@ MessageListRequester::MessageListRequester(FCPv2 *fcp):IIndexRequester<long>(fcp
        Initialize();\r
 }\r
 \r
+const bool MessageListRequester::CheckDateNotFuture(const std::string &datestr) const\r
+{\r
+       std::vector<std::string> dateparts;\r
+       int year=0;\r
+       int month=0;\r
+       int day=0;\r
+       Poco::DateTime today;\r
+\r
+       StringFunctions::Split(datestr,"-",dateparts);\r
+       if(dateparts.size()==3)\r
+       {\r
+               StringFunctions::Convert(dateparts[0],year);\r
+               StringFunctions::Convert(dateparts[1],month);\r
+               StringFunctions::Convert(dateparts[2],day);\r
+               if(today.year()>year || (today.year()==year && today.month()>month) || (today.year()==year && today.month()==month && today.day()>=day))\r
+               {\r
+                       return true;\r
+               }\r
+               else\r
+               {\r
+                       return false;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               return false;\r
+       }\r
+\r
+}\r
+\r
 void MessageListRequester::GetBoardList(std::map<std::string,bool> &boards)\r
 {\r
        SQLite3DB::Statement st=m_db->Prepare("SELECT BoardName, SaveReceivedMessages FROM tblBoard;");\r
@@ -56,6 +86,8 @@ const bool MessageListRequester::HandleAllData(FCPMessage &message)
        std::map<std::string,bool> boards;      // list of boards and if we will save messages for that board or not\r
        bool addmessage=false;\r
        std::string boardsstr="";\r
+       std::string datestr="";\r
+       std::vector<std::string> dateparts;\r
 \r
        GetBoardList(boards);\r
 \r
@@ -115,6 +147,12 @@ const bool MessageListRequester::HandleAllData(FCPMessage &message)
                                boardsstr+=(*j);\r
                        }\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
+                       }\r
+\r
                        if(addmessage==true)\r
                        {\r
                                st.Bind(0,identityid);\r
@@ -167,6 +205,12 @@ const bool MessageListRequester::HandleAllData(FCPMessage &message)
                                        boardsstr+=(*j);\r
                                }\r
 \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
+                               }\r
+\r
                                if(addmessage==true)\r
                                {\r
                                        spk.Bind(0,xml.GetExternalIdentity(i));\r
index ea3ec85..c641c95 100644 (file)
@@ -416,7 +416,9 @@ void MessageRequester::PopulateIDList()
        }\r
        sql+="AND tblIdentity.Name <> '' ";\r
        // sort by day descending - in case there is a bunch of messages on a day that keep timing out, we will eventually get to the next day and hopefully find messages there\r
-       sql+="ORDER BY tblMessageRequests.Day DESC ";\r
+       // secondary ascending sort on tries\r
+       // tertiary sort on request index (so we get low indexes first)\r
+       sql+="ORDER BY tblMessageRequests.Day DESC, tblMessageRequests.Tries ASC, tblMessageRequests.RequestIndex ASC ";\r
        sql+=";";\r
 \r
        SQLite3DB::Statement st=m_db->Prepare(sql);\r
@@ -502,6 +504,13 @@ void MessageRequester::StartRequest(const std::string &requestid)
 \r
                m_requesting.push_back(requestid);\r
 \r
+               // update tries\r
+               st=m_db->Prepare("UPDATE tblMessageRequests SET Tries=Tries+1 WHERE IdentityID=? AND Day=? AND RequestIndex=?;");\r
+               st.Bind(0,identityid);\r
+               st.Bind(1,date);\r
+               st.Bind(2,indexstr);\r
+               st.Step();\r
+\r
                m_log->debug("MessageRequester::StartRequest requesting "+message["Identifier"]);\r
        }\r
        \r
index fc60f78..a37d50f 100644 (file)
@@ -36,22 +36,34 @@ const std::string HomePage::GeneratePage(const std::string &method, const std::m
        st.Step();\r
        if(st.RowReturned())\r
        {\r
-               std::string currentmajor=VERSION_MAJOR;\r
-               std::string currentminor=VERSION_MINOR;\r
-               std::string currentrelease=VERSION_RELEASE;\r
-               std::string major="";\r
-               std::string minor="";\r
-               std::string release="";\r
+               int major=0;\r
+               int minor=0;\r
+               int release=0;\r
+               int currentmajor=0;\r
+               int currentminor=0;\r
+               int currentrelease=0;\r
                std::string freesite="";\r
-               st.ResultText(0,major);\r
-               st.ResultText(1,minor);\r
-               st.ResultText(2,release);\r
+               std::string majorstr="";\r
+               std::string minorstr="";\r
+               std::string releasestr="";\r
+\r
+               StringFunctions::Convert(VERSION_MAJOR,currentmajor);\r
+               StringFunctions::Convert(VERSION_MINOR,currentminor);\r
+               StringFunctions::Convert(VERSION_RELEASE,currentrelease);\r
+\r
+               st.ResultInt(0,major);\r
+               st.ResultInt(1,minor);\r
+               st.ResultInt(2,release);\r
                st.ResultText(3,freesite);\r
 \r
+               StringFunctions::Convert(major,majorstr);\r
+               StringFunctions::Convert(minor,minorstr);\r
+               StringFunctions::Convert(release,releasestr);\r
+\r
                if(currentmajor<major || (currentmajor==major && currentminor<minor) || (currentmajor==major && currentminor==minor && currentrelease<release))\r
                {\r
-                       content+="<b>You are running an old version of FMS.  Please update here: <a href=\"http://"+fcphost+":"+fproxyport+"/"+freesite+"\">FMS "+major+"."+minor+"."+release+"</a></b><br>";\r
-                       content+="You can see the release info <a href=\"versioninfo.htm?Major="+major+"&Minor="+minor+"&Release="+release+"\">here</a><br>";\r
+                       content+="<b>You are running an old version of FMS.  Please update here: <a href=\"http://"+fcphost+":"+fproxyport+"/"+freesite+"\">FMS "+majorstr+"."+minorstr+"."+releasestr+"</a></b><br>";\r
+                       content+="You can see the release info <a href=\"versioninfo.htm?Major="+majorstr+"&Minor="+minorstr+"&Release="+releasestr+"\">here</a><br>";\r
                        showgenericupdate=false;\r
                }\r
 \r
index 897ceed..e078c95 100644 (file)
@@ -678,31 +678,34 @@ const bool Message::ParseNNTPMessage(const std::string &nntpmessage)
                std::string temp=mime.GetFieldValue("References");\r
                // remove any path folding\r
                temp=StringFunctions::Replace(temp,"\r\n","");\r
-               temp=StringFunctions::Replace(temp,"\t","");\r
+               temp=StringFunctions::Replace(temp,"\t"," ");\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
-                       /*\r
-                       // erase @ and everything after\r
-                       if((*i).find("@")!=std::string::npos)\r
+                       if((*i).size()>2)\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
+                               // get rid of < and > and any whitespace\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
+                               }\r
                        }\r
                }\r
        }\r
index eebd521..bfa73df 100644 (file)
@@ -68,7 +68,7 @@ void SetupDefaultOptions()
        upd.Reset();\r
 \r
        st.Bind(0,"FMSVersionEdition");\r
-       st.Bind(1,"9");\r
+       st.Bind(1,"11");\r
        st.Step();\r
        st.Reset();\r
        upd.Bind(0,"Program");\r