version 0.3.2
authorSomeDude <SomeDude@NuBL7aaJ6Cn4fB7GXFb9Zfi8w1FhPyW3oKgU9TweZMw>
Sun, 29 Jun 2008 17:26:00 +0000 (19:26 +0200)
committerDavid ‘Bombe’ Roden <bombe@freenetproject.org>
Sun, 29 Jun 2008 17:26:00 +0000 (19:26 +0200)
25 files changed:
CMakeLists.txt
include/freenet/fmsversionrequester.h [new file with mode: 0644]
include/freenet/fmsversionxml.h [new file with mode: 0644]
include/global.h
include/ifmsxmldocument.h
src/dbmaintenancethread.cpp
src/dbsetup.cpp
src/freenet/boardlistxml.cpp
src/freenet/fmsversionrequester.cpp [new file with mode: 0644]
src/freenet/fmsversionxml.cpp [new file with mode: 0644]
src/freenet/freenetmasterthread.cpp
src/freenet/identityintroductionrequester.cpp
src/freenet/identityintroductionxml.cpp
src/freenet/identityxml.cpp
src/freenet/introductionpuzzlexml.cpp
src/freenet/messagelistxml.cpp
src/freenet/messagexml.cpp
src/freenet/trustlistxml.cpp
src/http/httpthread.cpp
src/http/identityexportxml.cpp
src/http/pages/createidentitypage.cpp
src/http/pages/homepage.cpp
src/ipaddressacl.cpp
src/optionssetup.cpp
src/threadwrapper/threadedexector.cpp

index 56d8174..03af9bd 100644 (file)
@@ -46,6 +46,8 @@ src/freenet/boardlistxml.cpp
 src/freenet/captcha\r
 src/freenet/fcpv2.cpp\r
 src/freenet/fileinserter.cpp\r
+src/freenet/fmsversionrequester.cpp\r
+src/freenet/fmsversionxml.cpp\r
 src/freenet/freenetmasterthread.cpp\r
 src/freenet/freenetssk.cpp\r
 src/freenet/identityinserter.cpp\r
diff --git a/include/freenet/fmsversionrequester.h b/include/freenet/fmsversionrequester.h
new file mode 100644 (file)
index 0000000..6a6d5f7
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef _fmsversionrequester_\r
+#define _fmsversionrequester_\r
+\r
+#include "ifreenetregistrable.h"\r
+#include "ifcpconnected.h"\r
+#include "ifcpmessagehandler.h"\r
+#include "iperiodicprocessor.h"\r
+#include "../idatabase.h"\r
+#include "../ilogger.h"\r
+\r
+#include <Poco/DateTime.h>\r
+\r
+class FMSVersionRequester:public IFreenetRegistrable,public IFCPConnected,public IFCPMessageHandler,public IPeriodicProcessor,public IDatabase,public ILogger\r
+{\r
+public:\r
+       FMSVersionRequester();\r
+       FMSVersionRequester(FCPv2 *fcp);\r
+\r
+       void FCPConnected()                     {}\r
+       void FCPDisconnected()          {}\r
+       const bool HandleMessage(FCPMessage &message);\r
+\r
+       void Process();\r
+\r
+       void RegisterWithThread(FreenetMasterThread *thread);\r
+\r
+private:\r
+       const bool HandleAllData(FCPMessage &message);\r
+       const bool HandleGetFailed(FCPMessage &message);\r
+       void Initialize();\r
+       void StartRequest();\r
+\r
+       Poco::DateTime m_lastchecked;\r
+       std::string m_fcpuniquename;\r
+};\r
+\r
+#endif // _fmsversionrequester_\r
diff --git a/include/freenet/fmsversionxml.h b/include/freenet/fmsversionxml.h
new file mode 100644 (file)
index 0000000..5219bb0
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef _fmsversionxml_\r
+#define _fmsversionxml_\r
+\r
+#include "../ifmsxmldocument.h"\r
+\r
+class FMSVersionXML:public IFMSXMLDocument\r
+{\r
+public:\r
+       FMSVersionXML();\r
+\r
+       std::string GetXML();\r
+\r
+       const bool ParseXML(const std::string &xml);\r
+\r
+       const int GetMajor()                            { return m_major; }\r
+       const int GetMinor()                            { return m_minor; }\r
+       const int GetRelease()                          { return m_release; }\r
+       const std::string GetNotes()            { return m_notes; }\r
+       const std::string GetChanges()          { return m_changes; }\r
+       const std::string GetPageKey()          { return m_pagekey; }\r
+       const std::string GetSourceKey()        { return m_sourcekey; }\r
+\r
+private:\r
+       void Initialize();\r
+\r
+       int m_major;\r
+       int m_minor;\r
+       int m_release;\r
+       std::string m_notes;\r
+       std::string m_changes;\r
+       std::string m_pagekey;\r
+       std::string m_sourcekey;\r
+\r
+};\r
+\r
+#endif // _fmsversionxml_\r
index 1576e55..d6ba0df 100644 (file)
@@ -5,7 +5,10 @@
 #include <Poco/ScopedLock.h>\r
 #include <Poco/Mutex.h>\r
 \r
-#define FMS_VERSION    "0.3.0"\r
+#define VERSION_MAJOR          "0"\r
+#define VERSION_MINOR          "3"\r
+#define VERSION_RELEASE                "2"\r
+#define FMS_VERSION                    VERSION_MAJOR"."VERSION_MINOR"."VERSION_RELEASE\r
 \r
 typedef Poco::ScopedLock<Poco::FastMutex> Guard;\r
 \r
index 6358e8f..ae3f4e6 100644 (file)
@@ -77,12 +77,12 @@ protected:
        /**\r
                \brief Creates and returns an element with a boolean value\r
        */\r
-       virtual Poco::XML::Element *XMLCreateBooleanElement(Poco::XML::Document *doc, const std::string &name, const bool value)\r
+       virtual Poco::AutoPtr<Poco::XML::Element> XMLCreateBooleanElement(Poco::AutoPtr<Poco::XML::Document> doc, const std::string &name, const bool value)\r
        {\r
                if(doc)\r
                {\r
-                       Poco::XML::Text *txt=doc->createTextNode(value ? "true" : "false");\r
-                       Poco::XML::Element *el=doc->createElement(name);\r
+                       Poco::AutoPtr<Poco::XML::Text> txt=doc->createTextNode(value ? "true" : "false");\r
+                       Poco::AutoPtr<Poco::XML::Element> el=doc->createElement(name);\r
                        el->appendChild(txt);\r
                        return el;\r
                }\r
@@ -95,15 +95,15 @@ protected:
        /**\r
                \brief Creates and returns an element with a CDATA value\r
        */\r
-       virtual Poco::XML::Element *XMLCreateCDATAElement(Poco::XML::Document *doc, const std::string &name, const std::string &data)\r
+       virtual Poco::AutoPtr<Poco::XML::Element> XMLCreateCDATAElement(Poco::AutoPtr<Poco::XML::Document> doc, const std::string &name, const std::string &data)\r
        {\r
                if(doc)\r
                {\r
                        // Poco XML won't break up CDATA sections correctly when assigned a string with the \r
                        // end tag is present.  However, it will parse it correctly, so we will manually break the\r
                        // CDATA into separate parts\r
-                       Poco::XML::CDATASection *sec=doc->createCDATASection(StringFunctions::Replace(data,"]]>","]]]><![CDATA[]>"));\r
-                       Poco::XML::Element *el=doc->createElement(name);\r
+                       Poco::AutoPtr<Poco::XML::CDATASection> sec=doc->createCDATASection(StringFunctions::Replace(data,"]]>","]]]><![CDATA[]>"));\r
+                       Poco::AutoPtr<Poco::XML::Element> el=doc->createElement(name);\r
                        el->appendChild(sec);\r
                        return el;\r
                }\r
@@ -116,12 +116,12 @@ protected:
        /**\r
                \brief Creates and returns a text element\r
        */\r
-       virtual Poco::XML::Element *XMLCreateTextElement(Poco::XML::Document *doc, const std::string &name, const std::string &data)\r
+       virtual Poco::AutoPtr<Poco::XML::Element> XMLCreateTextElement(Poco::AutoPtr<Poco::XML::Document> doc, const std::string &name, const std::string &data)\r
        {\r
                if(doc)\r
                {\r
-                       Poco::XML::Text *txt=doc->createTextNode(data);\r
-                       Poco::XML::Element *el=doc->createElement(name);\r
+                       Poco::AutoPtr<Poco::XML::Text> txt=doc->createTextNode(data);\r
+                       Poco::AutoPtr<Poco::XML::Element> el=doc->createElement(name);\r
                        el->appendChild(txt);\r
                        return el;\r
                }\r
@@ -131,7 +131,7 @@ protected:
                }\r
        }\r
 \r
-       virtual Poco::XML::Element *XMLCreateTextElement(Poco::XML::Document *doc, const std::string &name, const long data)\r
+       virtual Poco::AutoPtr<Poco::XML::Element> XMLCreateTextElement(Poco::AutoPtr<Poco::XML::Document> doc, const std::string &name, const long data)\r
        {\r
                if(doc)\r
                {\r
@@ -171,6 +171,7 @@ protected:
                        {\r
                                child=child->nextSibling();\r
                        }\r
+                       //return child.cast<Poco::XML::Element>();\r
                        return static_cast<Poco::XML::Element *>(child);\r
                }\r
                else\r
@@ -188,6 +189,7 @@ protected:
                        {\r
                                next=next->nextSibling();\r
                        }\r
+                       //return next.cast<Poco::XML::Element>();\r
                        return static_cast<Poco::XML::Element *>(next);\r
                }\r
                else\r
@@ -207,7 +209,7 @@ protected:
                return returntext;\r
        }\r
 \r
-       const std::string GenerateXML(Poco::XML::Document *doc)\r
+       const std::string GenerateXML(Poco::AutoPtr<Poco::XML::Document> doc)\r
        {\r
                std::ostringstream str;\r
                if(doc)\r
index 0309414..b613715 100644 (file)
@@ -95,6 +95,9 @@ void DBMaintenanceThread::Do1HourMaintenance()
                st.Step();\r
        }\r
 \r
+       // insert all identities not in trust list already\r
+       m_db->Execute("INSERT INTO tblIdentityTrust(LocalIdentityID,IdentityID) SELECT LocalIdentityID,IdentityID FROM tblLocalIdentity,tblIdentity WHERE LocalIdentityID || '_' || IdentityID NOT IN (SELECT LocalIdentityID || '_' || IdentityID FROM tblIdentityTrust);");\r
+\r
        m_log->debug("PeriodicDBMaintenance::Do1HourMaintenance");\r
 }\r
 \r
index bc197cc..68ee676 100644 (file)
@@ -15,7 +15,7 @@ void SetupDB()
        SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
 \r
        db->Open("fms.db3");\r
-       db->SetBusyTimeout(10000);              // set timeout to 10 seconds\r
+       db->SetBusyTimeout(20000);              // set timeout to 20 seconds\r
 \r
        tempval="";\r
        Option::Instance()->Get("VacuumOnStartup",tempval);\r
@@ -112,6 +112,18 @@ void SetupDB()
 \r
        db->Execute("UPDATE tblDBVersion SET Major=1, Minor=12;");\r
 \r
+       db->Execute("CREATE TABLE IF NOT EXISTS tblFMSVersion(\\r
+                               Major                           INTEGER,\\r
+                               Minor                           INTEGER,\\r
+                               Release                         INTEGER,\\r
+                               Notes                           TEXT,\\r
+                               Changes                         TEXT,\\r
+                               PageKey                         TEXT,\\r
+                               SourceKey                       TEXT\\r
+                               );");\r
+\r
+       db->Execute("CREATE UNIQUE INDEX IF NOT EXISTS idxFMSVersion_Version ON tblFMSVersion(Major,Minor,Release);");\r
+\r
        db->Execute("CREATE TABLE IF NOT EXISTS tblOption(\\r
                                Option                          TEXT UNIQUE,\\r
                                OptionValue                     TEXT NOT NULL,\\r
index b4c3985..55d877b 100644 (file)
@@ -50,33 +50,20 @@ const std::string BoardListXML::GetName(const long index)
 std::string BoardListXML::GetXML()\r
 {\r
        Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;\r
-       //TiXmlDocument td;\r
-       //TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
-       Poco::XML::Element *root=doc->createElement("BoardList");\r
-       //TiXmlElement *tid;\r
-       //TiXmlPrinter tp;\r
+       Poco::AutoPtr<Poco::XML::Element> root=doc->createElement("BoardList");\r
 \r
        doc->appendChild(root);\r
-       //td.LinkEndChild(tdec);\r
-       //tid=new TiXmlElement("BoardList");\r
-       //td.LinkEndChild(tid);\r
 \r
        for(std::vector<board>::iterator i=m_boards.begin(); i!=m_boards.end(); i++)\r
        {\r
                std::string boardname=(*i).m_name;\r
                StringFunctions::LowerCase(boardname,boardname);\r
-               Poco::XML::Element *tr=doc->createElement("Board");\r
-               //TiXmlElement *tr=new TiXmlElement("Board");\r
+               Poco::AutoPtr<Poco::XML::Element> tr=doc->createElement("Board");\r
                root->appendChild(tr);\r
-               //tid->LinkEndChild(tr);\r
                tr->appendChild(XMLCreateCDATAElement(doc,"Name",boardname));\r
-               //tr->LinkEndChild(XMLCreateCDATAElement("Name",boardname));\r
                tr->appendChild(XMLCreateCDATAElement(doc,"Description",(*i).m_description));\r
-               //tr->LinkEndChild(XMLCreateCDATAElement("Description",(*i).m_description));\r
        }\r
 \r
-       //td.Accept(&tp);\r
-       //return std::string(tp.CStr());\r
        return GenerateXML(doc);\r
 }\r
 \r
@@ -136,57 +123,4 @@ const bool BoardListXML::ParseXML(const std::string &xml)
        }\r
 \r
        return parsed;\r
-\r
-       /*\r
-       std::string name;\r
-       std::string description;\r
-       TiXmlDocument td;\r
-       td.Parse(xml.c_str());\r
-\r
-       if(!td.Error())\r
-       {\r
-               TiXmlText *txt;\r
-               TiXmlHandle hnd(&td);\r
-               TiXmlNode *node;\r
-\r
-               Initialize();\r
-\r
-               node=hnd.FirstChild("BoardList").FirstChild("Board").ToElement();\r
-               while(node)\r
-               {\r
-                       name="";\r
-                       description="";\r
-\r
-                       TiXmlHandle hnd2(node);\r
-                       txt=hnd2.FirstChild("Name").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               name=txt->ValueStr();\r
-                               StringFunctions::LowerCase(name,name);\r
-                               if(name.size()>40)\r
-                               {\r
-                                       name.erase(40);\r
-                               }\r
-                       }\r
-                       txt=hnd2.FirstChild("Description").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               description=txt->ValueStr();\r
-                       }\r
-\r
-                       if(name!="" && description!="")\r
-                       {\r
-                               m_boards.push_back(board(name,description));\r
-                       }\r
-                       \r
-                       node=node->NextSibling("Board");\r
-               }\r
-               return true;\r
-\r
-       }\r
-       else\r
-       {\r
-               return false;\r
-       }\r
-       */\r
 }\r
diff --git a/src/freenet/fmsversionrequester.cpp b/src/freenet/fmsversionrequester.cpp
new file mode 100644 (file)
index 0000000..027d530
--- /dev/null
@@ -0,0 +1,176 @@
+#include "../../include/freenet/fmsversionrequester.h"\r
+#include "../../include/freenet/fmsversionxml.h"\r
+#include "../../include/option.h"\r
+#include "../../include/stringfunctions.h"\r
+\r
+#include <Poco/Timestamp.h>\r
+#include <Poco/Timespan.h>\r
+\r
+FMSVersionRequester::FMSVersionRequester()\r
+{\r
+       Initialize();\r
+}\r
+\r
+FMSVersionRequester::FMSVersionRequester(FCPv2 *fcp):IFCPConnected(fcp)\r
+{\r
+       Initialize();\r
+}\r
+\r
+const bool FMSVersionRequester::HandleAllData(FCPMessage &message)\r
+{\r
+       std::vector<char> data;\r
+       long datalength;\r
+       FMSVersionXML xml;\r
+\r
+       StringFunctions::Convert(message["DataLength"],datalength);\r
+\r
+       // wait for all data to be received from connection\r
+       while(m_fcp->Connected() && m_fcp->ReceiveBufferSize()<datalength)\r
+       {\r
+               m_fcp->Update(1);\r
+       }\r
+\r
+       // if we got disconnected- return immediately\r
+       if(m_fcp->Connected()==false)\r
+       {\r
+               return false;\r
+       }\r
+\r
+       // receive the file\r
+       data.resize(datalength);\r
+       m_fcp->ReceiveRaw(&data[0],datalength);\r
+\r
+       // update latest edition #\r
+       std::vector<std::string> parts;\r
+       StringFunctions::Split(message["Identifier"],"/",parts);\r
+       if(parts.size()>2)\r
+       {\r
+               std::string editionstr=parts[2];\r
+               Option::Instance()->Set("FMSVersionEdition",editionstr);\r
+       }\r
+\r
+       // parse file into xml and update the database\r
+       if(xml.ParseXML(std::string(data.begin(),data.end()))==true)\r
+       {\r
+\r
+               SQLite3DB::Statement st=m_db->Prepare("REPLACE INTO tblFMSVersion(Major,Minor,Release,Notes,Changes,PageKey,SourceKey) VALUES(?,?,?,?,?,?,?);");\r
+               st.Bind(0,xml.GetMajor());\r
+               st.Bind(1,xml.GetMinor());\r
+               st.Bind(2,xml.GetRelease());\r
+               st.Bind(3,xml.GetNotes());\r
+               st.Bind(4,xml.GetChanges());\r
+               st.Bind(5,xml.GetPageKey());\r
+               st.Bind(6,xml.GetSourceKey());\r
+               st.Step();\r
+\r
+               m_log->debug("FMSVersionRequester::HandleAllData parsed FMSVersion XML file : "+message["Identifier"]);\r
+       }\r
+       else\r
+       {\r
+               m_log->error("FMSVersionRequester::HandleAllData error parsing FMSVersion XML file : "+message["Identifier"]);\r
+       }\r
+\r
+       return true;\r
+}\r
+\r
+const bool FMSVersionRequester::HandleGetFailed(FCPMessage &message)\r
+{\r
+       std::vector<std::string> parts;\r
+       StringFunctions::Split(message["Identifier"],"/",parts);\r
+\r
+       // fatal error - don't try to download again\r
+       if(message["Fatal"]=="true")\r
+       {\r
+               if(parts.size()>2)\r
+               {\r
+                       std::string editionstr=parts[2];\r
+                       Option::Instance()->Set("FMSVersionEdition",editionstr);\r
+               }\r
+               m_log->debug("FMSVersionRequester::HandleGetFailed Fatal GetFailed for "+message["Identifier"]);\r
+       }\r
+\r
+       return true;\r
+}\r
+\r
+const bool FMSVersionRequester::HandleMessage(FCPMessage &message)\r
+{\r
+       if(message["Identifier"].find(m_fcpuniquename)==0)\r
+       {\r
+               \r
+               // ignore DataFound\r
+               if(message.GetName()=="DataFound")\r
+               {\r
+                       return true;\r
+               }\r
+\r
+               if(message.GetName()=="AllData")\r
+               {\r
+                       return HandleAllData(message);\r
+               }\r
+\r
+               if(message.GetName()=="GetFailed")\r
+               {\r
+                       return HandleGetFailed(message);\r
+               }\r
+\r
+               if(message.GetName()=="IdentifierCollision")\r
+               {\r
+                       return true;\r
+               }\r
+\r
+       }\r
+\r
+       return false;   \r
+}\r
+\r
+void FMSVersionRequester::Initialize()\r
+{\r
+       m_fcpuniquename="FMSVersionRequester";\r
+       m_lastchecked=Poco::Timestamp();\r
+       m_lastchecked-=Poco::Timespan(0,6,0,0,0);\r
+}\r
+\r
+void FMSVersionRequester::Process()\r
+{\r
+       Poco::DateTime now;\r
+\r
+       // check every 6 hours\r
+       if((m_lastchecked+Poco::Timespan(0,5,45,0,0))<=now)\r
+       {\r
+               StartRequest();\r
+               m_lastchecked=now;\r
+       }\r
+}\r
+\r
+void FMSVersionRequester::RegisterWithThread(FreenetMasterThread *thread)\r
+{\r
+       thread->RegisterFCPConnected(this);\r
+       thread->RegisterFCPMessageHandler(this);\r
+       thread->RegisterPeriodicProcessor(this);\r
+}\r
+\r
+void FMSVersionRequester::StartRequest()\r
+{\r
+       FCPMessage message;\r
+       std::string key="";\r
+       std::string editionstr="0";\r
+       int edition=0;\r
+       \r
+       Option::Instance()->Get("FMSVersionKey",key);\r
+       if(Option::Instance()->Get("FMSVersionEdition",editionstr))\r
+       {\r
+               StringFunctions::Convert(editionstr,edition);\r
+               edition++;\r
+               StringFunctions::Convert(edition,editionstr);\r
+       }\r
+\r
+       //start request\r
+       message.SetName("ClientGet");\r
+       message["URI"]=key+editionstr+"/FMSVersion.xml";\r
+       message["Identifier"]=m_fcpuniquename+"|"+message["URI"];\r
+       message["ReturnType"]="direct";\r
+       message["MaxSize"]="30000";             // 30K\r
+\r
+       m_fcp->SendMessage(message);\r
+\r
+}\r
diff --git a/src/freenet/fmsversionxml.cpp b/src/freenet/fmsversionxml.cpp
new file mode 100644 (file)
index 0000000..655faa5
--- /dev/null
@@ -0,0 +1,104 @@
+#include "../../include/freenet/fmsversionxml.h"\r
+\r
+FMSVersionXML::FMSVersionXML()\r
+{\r
+       Initialize();\r
+}\r
+\r
+std::string FMSVersionXML::GetXML()\r
+{\r
+       Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;\r
+       Poco::AutoPtr<Poco::XML::Element> root=doc->createElement("FMSVersion");\r
+\r
+       doc->appendChild(root);\r
+\r
+       root->appendChild(XMLCreateTextElement(doc,"Major",m_major));\r
+\r
+       root->appendChild(XMLCreateTextElement(doc,"Minor",m_minor));\r
+\r
+       root->appendChild(XMLCreateTextElement(doc,"Release",m_release));\r
+\r
+       root->appendChild(XMLCreateCDATAElement(doc,"Notes",m_notes));\r
+\r
+       root->appendChild(XMLCreateCDATAElement(doc,"Changes",m_changes));\r
+\r
+       root->appendChild(XMLCreateCDATAElement(doc,"PageKey",m_pagekey));\r
+\r
+       root->appendChild(XMLCreateCDATAElement(doc,"SourceKey",m_sourcekey));\r
+\r
+       return GenerateXML(doc);\r
+}\r
+\r
+void FMSVersionXML::Initialize()\r
+{\r
+       m_major=0;\r
+       m_minor=0;\r
+       m_release=0;\r
+       m_notes="";\r
+       m_changes="";\r
+       m_pagekey="";\r
+       m_sourcekey="";\r
+}\r
+\r
+const bool FMSVersionXML::ParseXML(const std::string &xml)\r
+{\r
+\r
+       bool parsed=false;\r
+       Poco::XML::DOMParser dp;\r
+\r
+       Initialize();\r
+\r
+       try\r
+       {\r
+               Poco::AutoPtr<Poco::XML::Document> doc=dp.parseString(FixCDATA(xml));\r
+               Poco::XML::Element *root=XMLGetFirstChild(doc,"FMSVersion");\r
+               Poco::XML::Element *txt=NULL;\r
+\r
+               txt=XMLGetFirstChild(root,"Major");\r
+               if(txt && txt->firstChild())\r
+               {\r
+                       std::string tempstr=txt->firstChild()->getNodeValue();\r
+                       StringFunctions::Convert(tempstr,m_major);\r
+               }\r
+               txt=XMLGetFirstChild(root,"Minor");\r
+               if(txt && txt->firstChild())\r
+               {\r
+                       std::string tempstr=txt->firstChild()->getNodeValue();\r
+                       StringFunctions::Convert(tempstr,m_minor);\r
+               }\r
+               txt=XMLGetFirstChild(root,"Release");\r
+               if(txt && txt->firstChild())\r
+               {\r
+                       std::string tempstr=txt->firstChild()->getNodeValue();\r
+                       StringFunctions::Convert(tempstr,m_release);\r
+               }\r
+               txt=XMLGetFirstChild(root,"Notes");\r
+               if(txt && txt->firstChild())\r
+               {\r
+                       m_notes=txt->firstChild()->getNodeValue();\r
+               }\r
+               txt=XMLGetFirstChild(root,"Changes");\r
+               if(txt && txt->firstChild())\r
+               {\r
+                       m_changes=txt->firstChild()->getNodeValue();\r
+               }\r
+               txt=XMLGetFirstChild(root,"PageKey");\r
+               if(txt && txt->firstChild())\r
+               {\r
+                       m_pagekey=txt->firstChild()->getNodeValue();\r
+               }\r
+               txt=XMLGetFirstChild(root,"SourceKey");\r
+               if(txt && txt->firstChild())\r
+               {\r
+                       m_sourcekey=txt->firstChild()->getNodeValue();\r
+               }\r
+\r
+               parsed=true;\r
+\r
+       }\r
+       catch(...)\r
+       {\r
+       }\r
+\r
+       return parsed;\r
+}\r
index 9e0670c..4d16043 100644 (file)
@@ -18,6 +18,7 @@
 #include "../../include/freenet/boardlistrequester.h"\r
 #include "../../include/freenet/siteinserter.h"\r
 #include "../../include/freenet/fileinserter.h"\r
+#include "../../include/freenet/fmsversionrequester.h"\r
 \r
 #include <Poco/UUID.h>\r
 #include <Poco/UUIDGenerator.h>\r
@@ -297,6 +298,7 @@ void FreenetMasterThread::Setup()
        m_registrables.push_back(new BoardListRequester(&m_fcp));\r
        m_registrables.push_back(new SiteInserter(&m_fcp));\r
        m_registrables.push_back(new FileInserter(&m_fcp));\r
+       m_registrables.push_back(new FMSVersionRequester(&m_fcp));\r
 \r
        for(std::vector<IFreenetRegistrable *>::iterator i=m_registrables.begin(); i!=m_registrables.end(); i++)\r
        {\r
index 7def9f2..6552770 100644 (file)
@@ -277,7 +277,6 @@ void IdentityIntroductionRequester::StartRequest(const std::string &UUID)
 {\r
        std::string day;\r
        std::string solution;\r
-//     std::vector<unsigned char> solutionhash;\r
        std::string encodedhash;\r
        FCPMessage message;\r
        SQLite3DB::Statement st=m_db->Prepare("SELECT Day, PuzzleSolution FROM tblIntroductionPuzzleInserts WHERE FoundSolution='false' AND UUID=?;");\r
@@ -289,16 +288,12 @@ void IdentityIntroductionRequester::StartRequest(const std::string &UUID)
                st.ResultText(0,day);\r
                st.ResultText(1,solution);\r
 \r
+               // get the hash of the solution\r
                Poco::SHA1Engine sha1;\r
                sha1.update(solution);\r
                encodedhash=Poco::DigestEngine::digestToHex(sha1.digest());\r
                StringFunctions::UpperCase(encodedhash,encodedhash);\r
 \r
-               // get the hash of the solution\r
-//             solutionhash.resize(20);\r
-//             sha1((unsigned char *)solution.c_str(),solution.size(),&solutionhash[0]);\r
-//             Hex::Encode(solutionhash,encodedhash);\r
-\r
                //start request for the solution\r
                message.SetName("ClientGet");\r
                message["URI"]="KSK@"+m_messagebase+"|"+day+"|"+UUID+"|"+encodedhash+".xml";\r
index 82ed285..f6b8a2e 100644 (file)
@@ -13,22 +13,12 @@ IdentityIntroductionXML::IdentityIntroductionXML()
 std::string IdentityIntroductionXML::GetXML()\r
 {\r
        Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;\r
-       //TiXmlDocument td;\r
-       //TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
-       Poco::XML::Element *root=doc->createElement("IdentityIntroduction");\r
-       //TiXmlElement *tid;\r
-       //TiXmlPrinter tp;\r
+       Poco::AutoPtr<Poco::XML::Element> root=doc->createElement("IdentityIntroduction");\r
 \r
        doc->appendChild(root);\r
-       //td.LinkEndChild(tdec);\r
-       //tid=new TiXmlElement("IdentityIntroduction");\r
-       //td.LinkEndChild(tid);\r
 \r
        root->appendChild(XMLCreateCDATAElement(doc,"Identity",m_identity));\r
-       //tid->LinkEndChild(XMLCreateCDATAElement("Identity",m_identity));\r
 \r
-       //td.Accept(&tp);\r
-       //return std::string(tp.CStr());\r
        return GenerateXML(doc);\r
 }\r
 \r
@@ -73,36 +63,4 @@ const bool IdentityIntroductionXML::ParseXML(const std::string &xml)
        }\r
 \r
        return parsed;\r
-\r
-       /*\r
-       TiXmlDocument td;\r
-       td.Parse(xml.c_str());\r
-\r
-       if(!td.Error())\r
-       {\r
-               TiXmlText *txt;\r
-               TiXmlHandle hnd(&td);\r
-\r
-               Initialize();\r
-\r
-               txt=hnd.FirstChild("IdentityIntroduction").FirstChild("Identity").FirstChild().ToText();\r
-               if(txt)\r
-               {\r
-                       m_identity=SanitizeSingleString(txt->ValueStr());\r
-               }\r
-               ssk.SetPublicKey(m_identity);\r
-               if(ssk.ValidPublicKey()==false)\r
-               {\r
-                       return false;\r
-               }\r
-\r
-               return true;\r
-\r
-       }\r
-       else\r
-       {\r
-               return false;\r
-       }\r
-       */\r
-\r
 }\r
index a440573..e30989a 100644 (file)
@@ -12,39 +12,24 @@ IdentityXML::IdentityXML()
 std::string IdentityXML::GetXML()\r
 {\r
        Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;\r
-       //TiXmlDocument td;\r
-       //TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
-       Poco::XML::Element *root=doc->createElement("Identity");\r
-       //TiXmlElement *tid;\r
-       //TiXmlPrinter tp;\r
+       Poco::AutoPtr<Poco::XML::Element> root=doc->createElement("Identity");\r
 \r
        doc->appendChild(root);\r
-       //td.LinkEndChild(tdec);\r
-       //tid=new TiXmlElement("Identity");\r
-       //td.LinkEndChild(tid);\r
 \r
        root->appendChild(XMLCreateCDATAElement(doc,"Name",m_name));\r
-       //tid->LinkEndChild(XMLCreateCDATAElement("Name",m_name));\r
 \r
        root->appendChild(XMLCreateBooleanElement(doc,"SingleUse",m_singleuse));\r
-       //tid->LinkEndChild(XMLCreateBooleanElement("SingleUse",m_singleuse));\r
 \r
        root->appendChild(XMLCreateBooleanElement(doc,"PublishTrustList",m_publishtrustlist));\r
-       //tid->LinkEndChild(XMLCreateBooleanElement("PublishTrustList",m_publishtrustlist));\r
 \r
        root->appendChild(XMLCreateBooleanElement(doc,"PublishBoardList",m_publishboardlist));\r
-       //tid->LinkEndChild(XMLCreateBooleanElement("PublishBoardList",m_publishboardlist));\r
 \r
        // freesite edition will be -1 if identity isn't publishing a freesite\r
        if(m_freesiteedition>=0)\r
        {\r
                root->appendChild(XMLCreateTextElement(doc,"FreesiteEdition",m_freesiteedition));\r
-               //tid->LinkEndChild(XMLCreateTextElement("FreesiteEdition",m_freesiteedition));\r
        }\r
 \r
-       //td.Accept(&tp);\r
-       //return std::string(tp.CStr());\r
-\r
        return GenerateXML(doc);\r
 }\r
 \r
@@ -106,48 +91,4 @@ const bool IdentityXML::ParseXML(const std::string &xml)
        }\r
 \r
        return parsed;\r
-\r
-       /*\r
-       TiXmlDocument td;\r
-       td.Parse(xml.c_str());\r
-\r
-       if(!td.Error())\r
-       {\r
-               TiXmlText *txt;\r
-               TiXmlHandle hnd(&td);\r
-\r
-               Initialize();\r
-\r
-               txt=hnd.FirstChild("Identity").FirstChild("Name").FirstChild().ToText();\r
-               if(txt)\r
-               {\r
-                       m_name=txt->ValueStr();\r
-               }\r
-\r
-               if(m_name.size()>40)\r
-               {\r
-                       m_name.erase(40);\r
-               }\r
-\r
-               m_singleuse=XMLGetBooleanElement(hnd.FirstChild("Identity").ToElement(),"SingleUse");\r
-\r
-               m_publishtrustlist=XMLGetBooleanElement(hnd.FirstChild("Identity").ToElement(),"PublishTrustList");\r
-\r
-               m_publishboardlist=XMLGetBooleanElement(hnd.FirstChild("Identity").ToElement(),"PublishBoardList");\r
-\r
-               txt=hnd.FirstChild("Identity").FirstChild("FreesiteEdition").FirstChild().ToText();\r
-               if(txt)\r
-               {\r
-                       std::string editionstr=SanitizeSingleString(txt->ValueStr());\r
-                       StringFunctions::Convert(editionstr,m_freesiteedition);\r
-               }\r
-\r
-               return true;\r
-\r
-       }\r
-       else\r
-       {\r
-               return false;\r
-       }\r
-*/\r
 }\r
index bb45722..735ddf9 100644 (file)
@@ -12,31 +12,18 @@ IntroductionPuzzleXML::IntroductionPuzzleXML()
 std::string IntroductionPuzzleXML::GetXML()\r
 {\r
        Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;\r
-       //TiXmlDocument td;\r
-       //TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
-       Poco::XML::Element *root=doc->createElement("IntroductionPuzzle");\r
-       //TiXmlElement *tid;\r
-       //TiXmlPrinter tp;\r
+       Poco::AutoPtr<Poco::XML::Element> root=doc->createElement("IntroductionPuzzle");\r
 \r
        doc->appendChild(root);\r
-       //td.LinkEndChild(tdec);\r
-       //tid=new TiXmlElement("IntroductionPuzzle");\r
-       //td.LinkEndChild(tid);\r
 \r
        root->appendChild(XMLCreateTextElement(doc,"Type",m_type));\r
-       //tid->LinkEndChild(XMLCreateTextElement("Type",m_type));\r
 \r
        root->appendChild(XMLCreateCDATAElement(doc,"UUID",m_uuid));\r
-       //tid->LinkEndChild(XMLCreateCDATAElement("UUID",m_uuid));\r
 \r
        root->appendChild(XMLCreateTextElement(doc,"MimeType",m_mimetype));\r
-       //tid->LinkEndChild(XMLCreateTextElement("MimeType",m_mimetype));\r
 \r
        root->appendChild(XMLCreateTextElement(doc,"PuzzleData",m_puzzledata));\r
-       //tid->LinkEndChild(XMLCreateTextElement("PuzzleData",m_puzzledata));\r
 \r
-       //td.Accept(&tp);\r
-       //return std::string(tp.CStr());\r
        return GenerateXML(doc);\r
 }\r
 \r
@@ -101,48 +88,4 @@ const bool IntroductionPuzzleXML::ParseXML(const std::string &xml)
        }\r
 \r
        return parsed;\r
-\r
-       /*\r
-       TiXmlDocument td;\r
-       td.Parse(xml.c_str());\r
-\r
-       if(!td.Error())\r
-       {\r
-               TiXmlText *txt;\r
-               TiXmlHandle hnd(&td);\r
-\r
-               Initialize();\r
-\r
-               txt=hnd.FirstChild("IntroductionPuzzle").FirstChild("Type").FirstChild().ToText();\r
-               if(txt)\r
-               {\r
-                       m_type=SanitizeSingleString(txt->ValueStr());\r
-               }\r
-\r
-               txt=hnd.FirstChild("IntroductionPuzzle").FirstChild("UUID").FirstChild().ToText();\r
-               if(txt)\r
-               {\r
-                       m_uuid=SanitizeSingleString(txt->ValueStr());\r
-               }\r
-\r
-               txt=hnd.FirstChild("IntroductionPuzzle").FirstChild("MimeType").FirstChild().ToText();\r
-               if(txt)\r
-               {\r
-                       m_mimetype=SanitizeSingleString(txt->ValueStr());\r
-               }\r
-\r
-               txt=hnd.FirstChild("IntroductionPuzzle").FirstChild("PuzzleData").FirstChild().ToText();\r
-               if(txt)\r
-               {\r
-                       m_puzzledata=txt->ValueStr();\r
-               }\r
-\r
-               return true;\r
-\r
-       }\r
-       else\r
-       {\r
-               return false;\r
-       }\r
-       */\r
 }\r
index c35e10f..eb57240 100644 (file)
@@ -135,73 +135,49 @@ const long MessageListXML::GetIndex(const long index)
 std::string MessageListXML::GetXML()\r
 {\r
        Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;\r
-       //TiXmlDocument td;\r
-       //TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
-       Poco::XML::Element *root=doc->createElement("MessageList");\r
-       //TiXmlElement *tid;\r
-       //TiXmlPrinter tp;\r
+       Poco::AutoPtr<Poco::XML::Element> root=doc->createElement("MessageList");\r
 \r
        doc->appendChild(root);\r
-       //td.LinkEndChild(tdec);\r
-       //tid=new TiXmlElement("MessageList");\r
-       //td.LinkEndChild(tid);\r
 \r
        for(std::vector<message>::iterator i=m_messages.begin(); i!=m_messages.end(); i++)\r
        {\r
-               Poco::XML::Element *tr=doc->createElement("Message");\r
-               //TiXmlElement *tr=new TiXmlElement("Message");\r
+               Poco::AutoPtr<Poco::XML::Element> tr=doc->createElement("Message");\r
                root->appendChild(tr);\r
-               //tid->LinkEndChild(tr);\r
                tr->appendChild(XMLCreateTextElement(doc,"Date",(*i).m_date));\r
-               //tr->LinkEndChild(XMLCreateTextElement("Date",(*i).m_date));\r
                tr->appendChild(XMLCreateTextElement(doc,"Index",(*i).m_index));\r
-               //tr->LinkEndChild(XMLCreateTextElement("Index",(*i).m_index));\r
-               Poco::XML::Element *boards=doc->createElement("Boards");\r
-               //TiXmlElement *brds=new TiXmlElement("Boards");\r
+               \r
+               Poco::AutoPtr<Poco::XML::Element> boards=doc->createElement("Boards");\r
                tr->appendChild(boards);\r
-               //tr->LinkEndChild(brds);\r
                for(std::vector<std::string>::iterator j=(*i).m_boards.begin(); j!=(*i).m_boards.end(); j++)\r
                {\r
                        boards->appendChild(XMLCreateCDATAElement(doc,"Board",(*j)));\r
-                       //brds->LinkEndChild(XMLCreateCDATAElement("Board",(*j)));\r
                }\r
        }\r
 \r
        for(std::vector<externalmessage>::iterator i=m_externalmessages.begin(); i!=m_externalmessages.end(); i++)\r
        {\r
-               Poco::XML::Element *tr=doc->createElement("ExternalMessage");\r
-               //TiXmlElement *tr=new TiXmlElement("ExternalMessage");\r
+               Poco::AutoPtr<Poco::XML::Element> tr=doc->createElement("ExternalMessage");\r
                root->appendChild(tr);\r
-               //tid->LinkEndChild(tr);\r
                tr->appendChild(XMLCreateTextElement(doc,"Type",(*i).m_type));\r
-               //tr->LinkEndChild(XMLCreateTextElement("Type",(*i).m_type));\r
                if((*i).m_type=="Keyed")\r
                {\r
                        tr->appendChild(XMLCreateCDATAElement(doc,"Identity",(*i).m_identity));\r
-                       //tr->LinkEndChild(XMLCreateCDATAElement("Identity",(*i).m_identity));\r
                        tr->appendChild(XMLCreateTextElement(doc,"Index",(*i).m_index));\r
-                       //tr->LinkEndChild(XMLCreateTextElement("Index",(*i).m_index));\r
                }\r
                else\r
                {\r
                        tr->appendChild(XMLCreateCDATAElement(doc,"MessageKey",(*i).m_messagekey));\r
-                       //tr->LinkEndChild(XMLCreateCDATAElement("MessageKey",(*i).m_messagekey));\r
                }\r
                tr->appendChild(XMLCreateTextElement(doc,"Date",(*i).m_date));\r
-               //tr->LinkEndChild(XMLCreateTextElement("Date",(*i).m_date));\r
-               Poco::XML::Element *boards=doc->createElement("Boards");\r
-               //TiXmlElement *brds=new TiXmlElement("Boards");\r
+\r
+               Poco::AutoPtr<Poco::XML::Element> boards=doc->createElement("Boards");\r
                tr->appendChild(boards);\r
-               //tr->LinkEndChild(brds);\r
                for(std::vector<std::string>::iterator j=(*i).m_boards.begin(); j!=(*i).m_boards.end(); j++)\r
                {\r
                        boards->appendChild(XMLCreateCDATAElement(doc,"Board",(*j)));\r
-                       //brds->LinkEndChild(XMLCreateCDATAElement("Board",(*j)));\r
                }\r
        }\r
 \r
-       //td.Accept(&tp);\r
-       //return std::string(tp.CStr());\r
        return GenerateXML(doc);\r
 }\r
 \r
@@ -331,116 +307,4 @@ const bool MessageListXML::ParseXML(const std::string &xml)
        }\r
 \r
        return parsed;\r
-\r
-       /*\r
-       TiXmlDocument td;\r
-       td.Parse(xml.c_str());\r
-\r
-       if(!td.Error())\r
-       {\r
-               std::string tempstr;\r
-               std::string date;\r
-               long index;\r
-               std::vector<std::string> boards;\r
-               TiXmlText *txt;\r
-               TiXmlHandle hnd(&td);\r
-               TiXmlNode *node;\r
-               TiXmlNode *node2;\r
-\r
-               Initialize();\r
-\r
-               node=hnd.FirstChild("MessageList").FirstChild("Message").ToNode();\r
-               while(node)\r
-               {\r
-                       date="";\r
-                       index=-1;\r
-                       boards.clear();\r
-\r
-                       TiXmlHandle hnd2(node);\r
-                       txt=hnd2.FirstChild("Date").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               date=SanitizeSingleString(txt->ValueStr());\r
-                       }\r
-                       txt=hnd2.FirstChild("Index").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               tempstr=SanitizeSingleString(txt->ValueStr());\r
-                               StringFunctions::Convert(tempstr,index);\r
-                       }\r
-                       node2=hnd2.FirstChild("Boards").FirstChild("Board").ToNode();\r
-                       while(node2)\r
-                       {\r
-                               if(node2->FirstChild())\r
-                               {\r
-                                       std::string boardname=SanitizeSingleString(node2->FirstChild()->ValueStr());\r
-                                       StringFunctions::LowerCase(boardname,boardname);\r
-                                       boards.push_back(boardname);\r
-                               }\r
-                               node2=node2->NextSibling("Board");\r
-                       }\r
-\r
-                       m_messages.push_back(message(date,index,boards));\r
-\r
-                       node=node->NextSibling("Message");\r
-               }\r
-\r
-               node=hnd.FirstChild("MessageList").FirstChild("ExternalMessage").ToNode();\r
-               while(node)\r
-               {\r
-                       std::string type="";\r
-                       std::string identity="";\r
-                       date="";\r
-                       index=-1;\r
-                       boards.clear();\r
-\r
-                       TiXmlHandle hnd2(node);\r
-                       txt=hnd2.FirstChild("Type").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               type=SanitizeSingleString(txt->ValueStr());\r
-                       }\r
-\r
-                       if(type=="Keyed")\r
-                       {\r
-                               txt=hnd2.FirstChild("Identity").FirstChild().ToText();\r
-                               if(txt)\r
-                               {\r
-                                       identity=SanitizeSingleString(txt->ValueStr());\r
-                               }\r
-                               txt=hnd2.FirstChild("Date").FirstChild().ToText();\r
-                               if(txt)\r
-                               {\r
-                                       date=SanitizeSingleString(txt->ValueStr());\r
-                               }\r
-                               txt=hnd2.FirstChild("Index").FirstChild().ToText();\r
-                               if(txt)\r
-                               {\r
-                                       tempstr=SanitizeSingleString(txt->ValueStr());\r
-                                       StringFunctions::Convert(tempstr,index);\r
-                               }\r
-                               node2=hnd2.FirstChild("Boards").FirstChild("Board").ToNode();\r
-                               while(node2)\r
-                               {\r
-                                       if(node2->FirstChild())\r
-                                       {\r
-                                               std::string boardname=SanitizeSingleString(node2->FirstChild()->ValueStr());\r
-                                               StringFunctions::LowerCase(boardname,boardname);\r
-                                               boards.push_back(boardname);\r
-                                       }\r
-                                       node2=node2->NextSibling("Board");\r
-                               }\r
-                               m_externalmessages.push_back(externalmessage("Keyed",identity,date,index,boards));\r
-                       }\r
-\r
-                       node=node->NextSibling("ExternalMessage");\r
-               }\r
-\r
-               return true;\r
-       }\r
-       else\r
-       {\r
-               return false;\r
-       }\r
-       */\r
 }\r
index 70b660d..7105da1 100644 (file)
@@ -12,87 +12,58 @@ MessageXML::MessageXML()
 std::string MessageXML::GetXML()\r
 {\r
        Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;\r
-       //TiXmlDocument td;\r
-       //TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
-       Poco::XML::Element *root=doc->createElement("Message");\r
-       //TiXmlElement *tid;\r
-       //TiXmlPrinter tp;\r
+       Poco::AutoPtr<Poco::XML::Element> root=doc->createElement("Message");\r
 \r
        doc->appendChild(root);\r
-       //td.LinkEndChild(tdec);\r
-       //tid=new TiXmlElement("Message");\r
-       //td.LinkEndChild(tid);\r
 \r
        root->appendChild(XMLCreateTextElement(doc,"Date",m_date));\r
        root->appendChild(XMLCreateTextElement(doc,"Time",m_time));\r
        root->appendChild(XMLCreateCDATAElement(doc,"Subject",m_subject));\r
        root->appendChild(XMLCreateCDATAElement(doc,"MessageID",m_messageid));\r
        root->appendChild(XMLCreateCDATAElement(doc,"ReplyBoard",m_replyboard));\r
-       /*\r
-       tid->LinkEndChild(XMLCreateTextElement("Date",m_date));\r
-       tid->LinkEndChild(XMLCreateTextElement("Time",m_time));\r
-       tid->LinkEndChild(XMLCreateCDATAElement("Subject",m_subject));\r
-       tid->LinkEndChild(XMLCreateCDATAElement("MessageID",m_messageid));\r
-       tid->LinkEndChild(XMLCreateCDATAElement("ReplyBoard",m_replyboard));\r
-       */\r
        \r
        root->appendChild(XMLCreateCDATAElement(doc,"Body",m_body));\r
-       // a little hack because TinyXML doesn't handle ]]> inside a CDATA section - manually separate into multiple CDATA sections\r
-       // TinyXML still won't be able to parse past the 1st CDATA section, but other implementations might\r
-       //tid->LinkEndChild(XMLCreateCDATAElement("Body",StringFunctions::Replace(m_body,"]]>","]]]]><![CDATA[>")));\r
 \r
-       Poco::XML::Element *brds=doc->createElement("Boards");\r
-       //TiXmlElement *brds=new TiXmlElement("Boards");\r
+       Poco::AutoPtr<Poco::XML::Element> brds=doc->createElement("Boards");\r
+\r
        root->appendChild(brds);\r
-       //tid->LinkEndChild(brds);\r
+\r
+       // attach boards\r
        for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); i++)\r
        {\r
                std::string boardname=(*i);\r
                StringFunctions::Convert(boardname,boardname);\r
                brds->appendChild(XMLCreateCDATAElement(doc,"Board",boardname));\r
-               //brds->LinkEndChild(XMLCreateCDATAElement("Board",boardname));\r
        }\r
 \r
+       // attach inreplyto ids\r
        if(m_inreplyto.size()>0)\r
        {\r
-               Poco::XML::Element *rply=doc->createElement("InReplyTo");\r
-               //TiXmlElement *rply=new TiXmlElement("InReplyTo");\r
+               Poco::AutoPtr<Poco::XML::Element> rply=doc->createElement("InReplyTo");\r
                root->appendChild(rply);\r
-               //tid->LinkEndChild(rply);\r
                for(std::map<long,std::string>::iterator j=m_inreplyto.begin(); j!=m_inreplyto.end(); j++)\r
                {\r
-                       Poco::XML::Element *mess=doc->createElement("Message");\r
-                       //TiXmlElement *mess=new TiXmlElement("Message");\r
+                       Poco::AutoPtr<Poco::XML::Element> mess=doc->createElement("Message");\r
                        rply->appendChild(mess);\r
                        mess->appendChild(XMLCreateTextElement(doc,"Order",(*j).first));\r
                        mess->appendChild(XMLCreateCDATAElement(doc,"MessageID",(*j).second));\r
-                       //mess->LinkEndChild(XMLCreateTextElement("Order",(*j).first));\r
-                       //mess->LinkEndChild(XMLCreateCDATAElement("MessageID",(*j).second));\r
                }\r
        }\r
 \r
        // add attachemnt node if we have attachments\r
        if(m_fileattachments.size()>0)\r
        {\r
-               Poco::XML::Element *attachments=doc->createElement("Attachments");\r
-               //TiXmlElement *attachments=new TiXmlElement("Attachments");\r
+               Poco::AutoPtr<Poco::XML::Element> attachments=doc->createElement("Attachments");\r
                root->appendChild(attachments);\r
-               //tid->LinkEndChild(attachments);\r
                for(std::vector<fileattachment>::iterator j=m_fileattachments.begin(); j!=m_fileattachments.end(); j++)\r
                {\r
-                       Poco::XML::Element *f=doc->createElement("File");\r
-                       //TiXmlElement *f=new TiXmlElement("File");\r
+                       Poco::AutoPtr<Poco::XML::Element> f=doc->createElement("File");\r
                        attachments->appendChild(f);\r
-                       //attachments->LinkEndChild(f);\r
                        f->appendChild(XMLCreateCDATAElement(doc,"Key",(*j).m_key));\r
                        f->appendChild(XMLCreateTextElement(doc,"Size",(*j).m_size));\r
-                       //f->LinkEndChild(XMLCreateCDATAElement("Key",(*j).m_key));\r
-                       //f->LinkEndChild(XMLCreateTextElement("Size",(*j).m_size));\r
                }\r
        }\r
 \r
-       //td.Accept(&tp);\r
-       //return std::string(tp.CStr());\r
        return GenerateXML(doc);\r
 }\r
 \r
@@ -252,133 +223,4 @@ const bool MessageXML::ParseXML(const std::string &xml)
        }\r
 \r
        return parsed;\r
-\r
-/*\r
-       TiXmlDocument td;\r
-       td.Parse(xml.c_str());\r
-\r
-       if(!td.Error())\r
-       {\r
-               TiXmlHandle hnd(&td);\r
-               TiXmlNode *node2;\r
-               TiXmlText *txt;\r
-\r
-               Initialize();\r
-\r
-               txt=hnd.FirstChild("Message").FirstChild("Date").FirstChild().ToText();\r
-               if(txt)\r
-               {\r
-                       m_date=SanitizeSingleString(txt->ValueStr());\r
-               }\r
-               txt=hnd.FirstChild("Message").FirstChild("Time").FirstChild().ToText();\r
-               if(txt)\r
-               {\r
-                       m_time=SanitizeSingleString(txt->ValueStr());\r
-               }\r
-               txt=hnd.FirstChild("Message").FirstChild("Subject").FirstChild().ToText();\r
-               if(txt)\r
-               {\r
-                       m_subject=SanitizeSingleString(txt->ValueStr());\r
-               }\r
-               txt=hnd.FirstChild("Message").FirstChild("MessageID").FirstChild().ToText();\r
-               if(txt)\r
-               {\r
-                       m_messageid=SanitizeSingleString(txt->ValueStr());\r
-               }\r
-               txt=hnd.FirstChild("Message").FirstChild("ReplyBoard").FirstChild().ToText();\r
-               if(txt)\r
-               {\r
-                       m_replyboard=SanitizeSingleString(txt->ValueStr());\r
-                       StringFunctions::LowerCase(m_replyboard,m_replyboard);\r
-                       if(m_replyboard.size()>40)\r
-                       {\r
-                               m_replyboard.erase(40);\r
-                       }\r
-               }\r
-               txt=hnd.FirstChild("Message").FirstChild("Body").FirstChild().ToText();\r
-               if(txt)\r
-               {\r
-                       m_body=txt->ValueStr();\r
-               }\r
-\r
-               node2=hnd.FirstChild("Message").FirstChild("Boards").FirstChild("Board").ToNode();\r
-               while(node2)\r
-               {\r
-                       if(node2->FirstChild())\r
-                       {\r
-                               std::string boardname=SanitizeSingleString(node2->FirstChild()->ValueStr());\r
-                               StringFunctions::LowerCase(boardname,boardname);\r
-                               if(boardname.size()>40)\r
-                               {\r
-                                       boardname.erase(40);\r
-                               }\r
-                               m_boards.push_back(boardname);\r
-                       }\r
-                       node2=node2->NextSibling("Board");\r
-               }\r
-\r
-               node2=hnd.FirstChild("Message").FirstChild("InReplyTo").FirstChild("Message").ToNode();\r
-               while(node2)\r
-               {\r
-                       std::string orderstr;\r
-                       long order=-1;\r
-                       std::string messageid="";\r
-                       TiXmlHandle hnd2(node2);\r
-                       txt=hnd2.FirstChild("Order").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               orderstr=SanitizeSingleString(txt->ValueStr());\r
-                               StringFunctions::Convert(orderstr,order);\r
-                       }\r
-                       txt=hnd2.FirstChild("MessageID").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               messageid=SanitizeSingleString(txt->ValueStr());\r
-                       }\r
-\r
-                       if(order!=-1 && messageid!="")\r
-                       {\r
-                               m_inreplyto[order]=messageid;\r
-                       }\r
-\r
-                       node2=node2->NextSibling("Message");\r
-               }\r
-\r
-               node2=hnd.FirstChild("Message").FirstChild("Attachments").FirstChild("File").ToNode();\r
-               while(node2)\r
-               {\r
-                       std::string key="";\r
-                       std::string sizestr="-1";\r
-                       int size=-1;\r
-\r
-                       TiXmlHandle hnd2(node2);\r
-\r
-                       txt=hnd2.FirstChild("Key").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               key=SanitizeSingleString(txt->ValueStr());\r
-                       }\r
-\r
-                       txt=hnd2.FirstChild("Size").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               sizestr=SanitizeSingleString(txt->ValueStr());\r
-                               StringFunctions::Convert(sizestr,size);\r
-                       }\r
-\r
-                       if(key!="" && size>0)\r
-                       {\r
-                               m_fileattachments.push_back(fileattachment(key,size));\r
-                       }\r
-\r
-                       node2=node2->NextSibling("File");\r
-               }\r
-\r
-               return true;\r
-       }\r
-       else\r
-       {\r
-               return false;\r
-       }\r
-       */\r
 }\r
index 9132427..95d3c5e 100644 (file)
@@ -80,16 +80,9 @@ std::string TrustListXML::GetTrustListTrustComment(const long index)
 std::string TrustListXML::GetXML()\r
 {\r
        Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;\r
-       //TiXmlDocument td;\r
-       //TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
-       Poco::XML::Element *root=doc->createElement("TrustList");\r
-       //TiXmlElement *tid;\r
-       //TiXmlPrinter tp;\r
+       Poco::AutoPtr<Poco::XML::Element> root=doc->createElement("TrustList");\r
 \r
        doc->appendChild(root);\r
-       //td.LinkEndChild(tdec);\r
-       //tid=new TiXmlElement("TrustList");\r
-       //td.LinkEndChild(tid);\r
 \r
        for(std::vector<trust>::iterator i=m_trust.begin(); i!=m_trust.end(); i++)\r
        {\r
@@ -97,36 +90,27 @@ std::string TrustListXML::GetXML()
                std::string trustlisttrust;\r
                StringFunctions::Convert((*i).m_messagetrust,messagetrust);\r
                StringFunctions::Convert((*i).m_trustlisttrust,trustlisttrust);\r
-               Poco::XML::Element *tr=doc->createElement("Trust");\r
-               //TiXmlElement *tr=new TiXmlElement("Trust");\r
+               Poco::AutoPtr<Poco::XML::Element> tr=doc->createElement("Trust");\r
                root->appendChild(tr);\r
-               //tid->LinkEndChild(tr);\r
                tr->appendChild(XMLCreateCDATAElement(doc,"Identity",(*i).m_identity));\r
-               //tr->LinkEndChild(XMLCreateCDATAElement("Identity",(*i).m_identity));\r
                if((*i).m_messagetrust>=0)\r
                {\r
                        tr->appendChild(XMLCreateTextElement(doc,"MessageTrustLevel",messagetrust));\r
-                       //tr->LinkEndChild(XMLCreateTextElement("MessageTrustLevel",messagetrust));\r
                }\r
                if((*i).m_trustlisttrust>=0)\r
                {\r
                        tr->appendChild(XMLCreateTextElement(doc,"TrustListTrustLevel",trustlisttrust));\r
-                       //tr->LinkEndChild(XMLCreateTextElement("TrustListTrustLevel",trustlisttrust));\r
                }\r
                if((*i).m_messagetrustcomment!="")\r
                {\r
                        tr->appendChild(XMLCreateTextElement(doc,"MessageTrustComment",(*i).m_messagetrustcomment));\r
-                       //tr->LinkEndChild(XMLCreateCDATAElement("MessageTrustComment",(*i).m_messagetrustcomment));\r
                }\r
                if((*i).m_trustlisttrustcomment!="")\r
                {\r
                        tr->appendChild(XMLCreateTextElement(doc,"TrustListTrustComment",(*i).m_trustlisttrustcomment));\r
-                       //tr->LinkEndChild(XMLCreateCDATAElement("TrustListTrustComment",(*i).m_trustlisttrustcomment));\r
                }\r
        }\r
 \r
-       //td.Accept(&tp);\r
-       //return std::string(tp.CStr());\r
        return GenerateXML(doc);\r
 }\r
 \r
@@ -228,93 +212,4 @@ const bool TrustListXML::ParseXML(const std::string &xml)
        }\r
 \r
        return parsed;\r
-\r
-       /*\r
-       TiXmlDocument td;\r
-       td.Parse(xml.c_str());\r
-\r
-       if(!td.Error())\r
-       {\r
-               std::string identity;\r
-               std::string messagetruststr;\r
-               std::string trustlisttruststr;\r
-               std::string messagetrustcomment="";\r
-               std::string trustlisttrustcomment="";\r
-               long messagetrust;\r
-               long trustlisttrust;\r
-               TiXmlText *txt;\r
-               TiXmlHandle hnd(&td);\r
-               TiXmlNode *node;\r
-               std::vector<std::string> m_foundkeys;\r
-\r
-               Initialize();\r
-\r
-               node=hnd.FirstChild("TrustList").FirstChild("Trust").ToElement();\r
-               while(node)\r
-               {\r
-                       identity="";\r
-                       messagetrust=-1;\r
-                       trustlisttrust=-1;\r
-                       messagetrustcomment="";\r
-                       trustlisttrustcomment="";\r
-\r
-                       TiXmlHandle hnd2(node);\r
-                       txt=hnd2.FirstChild("Identity").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               identity=SanitizeSingleString(txt->ValueStr());\r
-                       }\r
-                       txt=hnd2.FirstChild("MessageTrustLevel").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               messagetruststr=SanitizeSingleString(txt->ValueStr());\r
-                               if(messagetruststr!="")\r
-                               {\r
-                                       StringFunctions::Convert(messagetruststr,messagetrust);\r
-                               }\r
-                       }\r
-                       txt=hnd2.FirstChild("TrustListTrustLevel").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               trustlisttruststr=SanitizeSingleString(txt->ValueStr());\r
-                               if(trustlisttruststr!="")\r
-                               {\r
-                                       StringFunctions::Convert(trustlisttruststr,trustlisttrust);\r
-                               }\r
-                       }\r
-                       txt=hnd2.FirstChild("MessageTrustComment").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               messagetrustcomment=txt->ValueStr();\r
-                       }\r
-                       txt=hnd2.FirstChild("TrustListTrustComment").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               trustlisttrustcomment=txt->ValueStr();\r
-                       }\r
-\r
-                       if(identity!="" && messagetrust>=-1 && messagetrust<=100 && trustlisttrust>=-1 && trustlisttrust<=100)\r
-                       {\r
-                               // check so we don't add the same identity multiple times from a trust list\r
-                               if(std::find(m_foundkeys.begin(),m_foundkeys.end(),identity)==m_foundkeys.end())\r
-                               {\r
-                                       m_foundkeys.push_back(identity);\r
-                                       m_trust.push_back(trust(identity,messagetrust,trustlisttrust,messagetrustcomment,trustlisttrustcomment));\r
-                               }\r
-                       }\r
-                       else\r
-                       {\r
-                               m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"TrustListXML::ParseXML malformed Trust in TrustList.xml");\r
-                       }\r
-                       \r
-                       node=node->NextSibling("Trust");\r
-               }\r
-               return true;\r
-\r
-       }\r
-       else\r
-       {\r
-               return false;\r
-       }\r
-       */\r
 }\r
index ceaad4f..ecc4cf5 100644 (file)
@@ -68,18 +68,21 @@ void HTTPThread::run()
 \r
        Poco::Net::ServerSocket sock(m_listenport);\r
        Poco::Net::HTTPServerParams* pParams = new Poco::Net::HTTPServerParams;\r
-       pParams->setMaxQueued(10);\r
+       pParams->setMaxQueued(30);\r
        pParams->setMaxThreads(5);\r
        Poco::Net::HTTPServer srv(new FMSHTTPRequestHandlerFactory,sock,pParams);\r
 \r
        srv.start();\r
+       m_log->trace("Started HTTPServer");\r
 \r
        do\r
        {\r
                Poco::Thread::sleep(1000);\r
        }while(!IsCancelled());\r
 \r
+       m_log->trace("Trying to stop HTTPServer");\r
        srv.stop();\r
+       m_log->trace("Stopped HTTPServer");\r
 \r
        m_log->debug("HTTPThread::run thread exiting.");\r
 \r
index aff7623..521c4ca 100644 (file)
@@ -101,24 +101,15 @@ const bool IdentityExportXML::GetSingleUse(const long index)
 std::string IdentityExportXML::GetXML()\r
 {\r
        Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;\r
-       Poco::XML::Element *root=doc->createElement("IdentityExport");\r
-       Poco::XML::Element *el=NULL;\r
-       //TiXmlDocument td;\r
-       //TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
-       //TiXmlElement *tid;\r
-       //TiXmlPrinter tp;\r
+       Poco::AutoPtr<Poco::XML::Element> root=doc->createElement("IdentityExport");\r
+       Poco::AutoPtr<Poco::XML::Element> el=NULL;\r
 \r
        doc->appendChild(root);\r
-       //td.LinkEndChild(tdec);\r
-       //tid=new TiXmlElement("IdentityExport");\r
-       //td.LinkEndChild(tid);\r
 \r
        for(std::vector<identity>::iterator i=m_identities.begin(); i!=m_identities.end(); i++)\r
        {\r
                el=doc->createElement("Identity");\r
-               //TiXmlElement *tr=new TiXmlElement("Identity");\r
                root->appendChild(el);\r
-               //tid->LinkEndChild(tr);\r
 \r
                el->appendChild(XMLCreateCDATAElement(doc,"Name",(*i).m_name));\r
                el->appendChild(XMLCreateTextElement(doc,"PublicKey",(*i).m_publickey));\r
@@ -127,23 +118,9 @@ std::string IdentityExportXML::GetXML()
                el->appendChild(XMLCreateBooleanElement(doc,"PublishTrustList",(*i).m_publishtrustlist));\r
                el->appendChild(XMLCreateBooleanElement(doc,"PublishBoardList",(*i).m_publishboardlist));\r
                el->appendChild(XMLCreateBooleanElement(doc,"PublishFreesite",(*i).m_publishfreesite));\r
-\r
-               //tr->LinkEndChild(XMLCreateCDATAElement("Name",(*i).m_name));\r
-               //tr->LinkEndChild(XMLCreateTextElement("PublicKey",(*i).m_publickey));\r
-               //tr->LinkEndChild(XMLCreateTextElement("PrivateKey",(*i).m_privatekey));\r
-               //tr->LinkEndChild(XMLCreateBooleanElement("SingleUse",(*i).m_singleuse));\r
-               //tr->LinkEndChild(XMLCreateBooleanElement("PublishTrustList",(*i).m_publishtrustlist));\r
-               //tr->LinkEndChild(XMLCreateBooleanElement("PublishBoardList",(*i).m_publishboardlist));\r
-               //tr->LinkEndChild(XMLCreateBooleanElement("PublishFreesite",(*i).m_publishfreesite));\r
        }\r
 \r
-       //td.Accept(&tp);\r
-       //return std::string(tp.CStr());\r
-\r
-       std::string xml;\r
-       xml=GenerateXML(doc);\r
-\r
-       return xml;\r
+       return GenerateXML(doc);\r
 }\r
 \r
 void IdentityExportXML::Initialize()\r
@@ -221,71 +198,4 @@ const bool IdentityExportXML::ParseXML(const std::string &xml)
        }\r
 \r
        return parsed;\r
-\r
-       //TiXmlDocument td;\r
-       //td.Parse(xml.c_str());\r
-/*\r
-       if(!td.Error())\r
-       {\r
-               std::string name;\r
-               std::string publickey;\r
-               std::string privatekey;\r
-               bool singleuse=false;\r
-               bool publishtrustlist=false;\r
-               bool publishboardlist=false;\r
-               bool publishfreesite=false;\r
-               TiXmlText *txt;\r
-               TiXmlHandle hnd(&td);\r
-               TiXmlNode *node;\r
-\r
-               Initialize();\r
-\r
-               node=hnd.FirstChild("IdentityExport").FirstChild("Identity").ToElement();\r
-               while(node)\r
-               {\r
-                       name="";\r
-                       publickey="";\r
-                       privatekey="";\r
-                       singleuse=false;\r
-                       publishtrustlist=false;\r
-                       publishboardlist=false;\r
-                       publishfreesite=false;\r
-\r
-                       TiXmlHandle hnd2(node);\r
-                       txt=hnd2.FirstChild("Name").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               name=txt->ValueStr();\r
-                       }\r
-                       txt=hnd2.FirstChild("PublicKey").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               publickey=txt->ValueStr();\r
-                       }\r
-                       txt=hnd2.FirstChild("PrivateKey").FirstChild().ToText();\r
-                       if(txt)\r
-                       {\r
-                               privatekey=txt->ValueStr();\r
-                       }\r
-\r
-                       singleuse=XMLGetBooleanElement(node->ToElement(),"SingleUse");\r
-                       publishtrustlist=XMLGetBooleanElement(node->ToElement(),"PublishTrustList");\r
-                       publishboardlist=XMLGetBooleanElement(node->ToElement(),"PublishBoardList");\r
-                       publishfreesite=XMLGetBooleanElement(node->ToElement(),"PublishFreesite");\r
-\r
-                       if(name!="" && publickey!="" && privatekey!="")\r
-                       {\r
-                               m_identities.push_back(identity(name,publickey,privatekey,singleuse,publishtrustlist,publishboardlist,publishfreesite));\r
-                       }\r
-                       \r
-                       node=node->NextSibling("Identity");\r
-               }\r
-               return true;\r
-\r
-       }\r
-       else\r
-       {\r
-               return false;\r
-       }\r
-*/\r
 }\r
index 165b22d..8a65914 100644 (file)
@@ -27,6 +27,9 @@ const std::string CreateIdentityPage::GeneratePage(const std::string &method, co
                st.Bind(1,Poco::DateTimeFormatter::format(date,"%Y-%m-%d %H:%M:%S"));\r
                st.Step();\r
 \r
+               // insert all identities not in trust list already\r
+               m_db->Execute("INSERT INTO tblIdentityTrust(LocalIdentityID,IdentityID) SELECT LocalIdentityID,IdentityID FROM tblLocalIdentity,tblIdentity WHERE LocalIdentityID || '_' || IdentityID NOT IN (SELECT LocalIdentityID || '_' || IdentityID FROM tblIdentityTrust);");\r
+\r
                content+="<h2>Created Identity</h2>";\r
        }\r
        else\r
index 37d8dc6..b295f45 100644 (file)
@@ -30,11 +30,41 @@ const std::string HomePage::GeneratePage(const std::string &method, const std::m
        content+="<b>FMS version ";\r
        content+=FMS_VERSION;\r
        content+="</b><br>";\r
-       content+="Check for new versions at the <a href=\"http://"+fcphost+":"+fproxyport+"/USK@0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fms/58/\">FMS Freesite</a><br>";\r
+\r
+       bool showgenericupdate=true;\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT Major, Minor, Release, PageKey FROM tblFMSVersion ORDER BY Major DESC, Minor DESC, Release DESC;");\r
+       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
+               std::string freesite="";\r
+               st.ResultText(0,major);\r
+               st.ResultText(1,minor);\r
+               st.ResultText(2,release);\r
+               st.ResultText(3,freesite);\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
+                       showgenericupdate=false;\r
+               }\r
+\r
+       }\r
+\r
+       if(showgenericupdate)\r
+       {\r
+               content+="Check for new versions at the <a href=\"http://"+fcphost+":"+fproxyport+"/USK@0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fms/60/\">FMS Freesite</a><br>";\r
+       }\r
+\r
        content+="Use these pages to administer your FMS installation.";\r
        content+="</p>";\r
 \r
-       SQLite3DB::Statement st=m_db->Prepare("SELECT COUNT(*) FROM tblMessageInserts WHERE Inserted='false';");\r
+       st=m_db->Prepare("SELECT COUNT(*) FROM tblMessageInserts WHERE Inserted='false';");\r
        st.Step();\r
        if(st.RowReturned())\r
        {\r
index 0516c1d..64ca979 100644 (file)
@@ -64,9 +64,11 @@ const bool IPAddressACL::Add(const std::string &aclentry)
 const std::string IPAddressACL::CreateMask(const int maskbits)\r
 {\r
        int bitsleft=maskbits;\r
-       int parts[4]={255,255,255,255};\r
+       //int parts[4]={255,255,255,255};\r
+       int parts[4]={0,0,0,0};\r
        std::ostringstream ipstr;\r
 \r
+       /*\r
        for(int i=3; i>=0; i--)\r
        {\r
                for(int b=0; b<8 && bitsleft>0; b++)\r
@@ -75,6 +77,15 @@ const std::string IPAddressACL::CreateMask(const int maskbits)
                        bitsleft--;\r
                }\r
        }\r
+       */\r
+       for(int i=0; i<4; i++)\r
+       {\r
+               for(int b=7; b>=0 && bitsleft>0; b--)\r
+               {\r
+                       parts[i]+=pow((float)2,b);\r
+                       bitsleft--;\r
+               }\r
+       }\r
 \r
        ipstr << parts[0] << "." << parts[1] << "." << parts[2] << "." << parts[3];\r
 \r
@@ -86,7 +97,7 @@ const bool IPAddressACL::IsAllowed(const Poco::Net::IPAddress &addr)
        bool found=false;\r
        bool rval=m_allowbydefault;\r
 \r
-       for(std::vector<entry>::iterator i=m_entries.begin(); i!=m_entries.end() && found==false; i++)\r
+       for(std::vector<entry>::reverse_iterator i=m_entries.rbegin(); i!=m_entries.rend() && found==false; i++)\r
        {\r
                Poco::Net::IPAddress ip1=addr;\r
                Poco::Net::IPAddress ip2=(*i).m_addr;\r
index 2d646f0..e9fc7ce 100644 (file)
@@ -55,6 +55,29 @@ void SetupDefaultOptions()
        upd.Step();\r
        upd.Reset();\r
 \r
+       st.Bind(0,"FMSVersionKey");\r
+       st.Bind(1,"USK@0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fmsversion/");\r
+       st.Step();\r
+       st.Reset();\r
+       upd.Bind(0,"Program");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"The USK key which contains information about the latest version of FMS.");\r
+       upd.Bind(4,"FMSVersionKey");\r
+       upd.Step();\r
+       upd.Reset();\r
+\r
+       st.Bind(0,"FMSVersionEdition");\r
+       st.Bind(1,"0");\r
+       st.Step();\r
+       upd.Bind(0,"Program");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"The latest found edition of the FMS version USK.");\r
+       upd.Bind(4,"FMSVersionEdition");\r
+       upd.Step();\r
+       upd.Reset();\r
+\r
        // StartNNTP\r
        st.Bind(0,"StartNNTP");\r
        st.Bind(1,"true");\r
index 72c04c2..c9eaf33 100644 (file)
@@ -39,9 +39,13 @@ void ThreadedExecutor::CleanupCompleted()
 \r
 void ThreadedExecutor::Join()\r
 {\r
+       CleanupCompleted();\r
        for(std::vector<CancelableThread *>::iterator i=m_threads.begin(); i!=m_threads.end(); i++)\r
        {\r
-               (*i)->join();\r
+               if((*i)->isRunning())\r
+               {\r
+                       (*i)->join();\r
+               }\r
        }\r
        CleanupCompleted();\r
 }\r