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
--- /dev/null
+#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
--- /dev/null
+#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
#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
/**\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
/**\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
/**\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
}\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
{\r
child=child->nextSibling();\r
}\r
+ //return child.cast<Poco::XML::Element>();\r
return static_cast<Poco::XML::Element *>(child);\r
}\r
else\r
{\r
next=next->nextSibling();\r
}\r
+ //return next.cast<Poco::XML::Element>();\r
return static_cast<Poco::XML::Element *>(next);\r
}\r
else\r
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
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
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
\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
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
}\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
--- /dev/null
+#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
--- /dev/null
+#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
#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
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
{\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
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
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
}\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
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
}\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
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
}\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
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
}\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
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
}\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
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
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
}\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
\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
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
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
}\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
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
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
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
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
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
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
\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