version 0.2.20
[fms.git] / src / freenet / siteinserter.cpp
index f943f56..e54a28e 100644 (file)
@@ -1,4 +1,5 @@
 #include "../../include/freenet/siteinserter.h"\r
+#include "../../include/global.h"\r
 \r
 #ifdef XMEM\r
        #include <xmem.h>\r
@@ -21,6 +22,10 @@ void SiteInserter::CheckForNeededInsert()
        {\r
                DateTime date;\r
                date.SetToGMTime();\r
+               date.SetHour(0);\r
+               date.SetMinute(0);\r
+               date.SetSecond(0);\r
+               date.Normalize();\r
 \r
                SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID FROM tblLocalIdentity WHERE PublishFreesite='true' AND (LastInsertedFreesite IS NULL OR LastInsertedFreesite<?);");\r
                st.Bind(0,date.Format("%Y-%m-%d"));\r
@@ -39,8 +44,6 @@ std::string SiteInserter::GenerateIndex(const std::string &htmltemplate, const l
 {\r
        std::string content="";\r
 \r
-       content="<h2>FMS site of "+SanitizeOutput(name)+"</h2>";\r
-\r
        content+="<h3>My last few posts</h3>";\r
 \r
        SQLite3DB::Statement boardst=m_db->Prepare("SELECT tblBoard.BoardName FROM tblBoard INNER JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID WHERE tblMessageBoard.MessageID=? ORDER BY tblBoard.BoardName COLLATE NOCASE;");\r
@@ -83,6 +86,9 @@ std::string SiteInserter::GenerateIndex(const std::string &htmltemplate, const l
                content+="</div>";\r
                content+="<div class=\"postbody\">";\r
                content+=SanitizeOutput(post);\r
+               //post=SanitizeOutput(post);\r
+               //StringFunctions::Replace(post,"\r\n","<br>");\r
+               //content+=post;\r
                content+="</div>";\r
                content+="</div>";\r
 \r
@@ -112,7 +118,7 @@ std::string SiteInserter::GenerateLinks(const bool publishtrustlist, const bool
 \r
 void SiteInserter::GeneratePages(const long localidentityid, std::string &uskkey, std::map<std::string,std::string> &pages)\r
 {\r
-       SQLite3DB::Statement st=m_db->Prepare("SELECT Name, PrivateKey, PublishTrustList, PublishBoardList FROM tblLocalIdentity WHERE LocalIdentityID=?;");\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT Name, PrivateKey, PublishTrustList, PublishBoardList, FreesiteEdition FROM tblLocalIdentity WHERE LocalIdentityID=?;");\r
        st.Bind(0,localidentityid);\r
        st.Step();\r
 \r
@@ -126,14 +132,29 @@ void SiteInserter::GeneratePages(const long localidentityid, std::string &uskkey
                std::string publishboardliststr="";\r
                bool publishtrustlist=false;\r
                bool publishboardlist=false;\r
+               std::string editionstr="";\r
 \r
                st.ResultText(0,name);\r
                st.ResultText(1,key);\r
                st.ResultText(2,publishtrustliststr);\r
                st.ResultText(3,publishboardliststr);\r
+               st.ResultText(4,editionstr);\r
 \r
                publishtrustliststr=="true" ? publishtrustlist=true : publishtrustlist=false;\r
                publishboardliststr=="true" ? publishboardlist=true : publishboardlist=false;\r
+               // no edition exists - start at 0\r
+               if(editionstr=="")\r
+               {\r
+                       editionstr="0";\r
+               }\r
+               // previous edition exists - add 1\r
+               else\r
+               {\r
+                       int edition=0;\r
+                       StringFunctions::Convert(editionstr,edition);\r
+                       edition++;\r
+                       StringFunctions::Convert(edition,editionstr);\r
+               }\r
 \r
                filename=name+"-template.htm";\r
                FILE *infile=fopen(filename.c_str(),"r+b");\r
@@ -155,6 +176,7 @@ void SiteInserter::GeneratePages(const long localidentityid, std::string &uskkey
                        htmltemplate.append(data.begin(),data.end());\r
 \r
                        htmltemplate=StringFunctions::Replace(htmltemplate,"[LINKS]",GenerateLinks(publishtrustlist,publishboardlist));\r
+                       htmltemplate=StringFunctions::Replace(htmltemplate,"[IDENTITYNAME]",SanitizeOutput(name));\r
 \r
                        pages["index.htm"]=GenerateIndex(htmltemplate,localidentityid,name);\r
                        if(publishtrustlist)\r
@@ -172,7 +194,7 @@ void SiteInserter::GeneratePages(const long localidentityid, std::string &uskkey
                                key.erase(0,3);\r
                                key="USK"+key;\r
                        }\r
-                       key+=m_messagebase+"/0/";\r
+                       key+=m_messagebase+"/"+editionstr+"/";\r
                        uskkey=key;\r
 \r
                }\r
@@ -181,6 +203,66 @@ void SiteInserter::GeneratePages(const long localidentityid, std::string &uskkey
                        LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_ERROR,"SiteInserter::GeneratePages unable to open "+filename+" or site-template.htm.");\r
                }\r
 \r
+               // get extra files that the user wants to add to the Freesite\r
+               filename=name+"-files.txt";\r
+               infile=fopen(filename.c_str(),"r+b");\r
+               if(infile)\r
+               {\r
+                       std::vector<std::string> files;\r
+\r
+                       fseek(infile,0,SEEK_END);\r
+                       long len=ftell(infile);\r
+                       fseek(infile,0,SEEK_SET);\r
+\r
+                       std::vector<unsigned char> data;\r
+                       data.resize(len);\r
+                       fread(&data[0],1,data.size(),infile);\r
+                       fclose(infile);\r
+\r
+                       // split on \r and \n - on systems with \r\n line endings there will be blank entries, but we'll just skip those\r
+                       std::string filecontent(data.begin(),data.end());\r
+                       StringFunctions::SplitMultiple(filecontent,"\r\n",files);\r
+\r
+                       for(std::vector<std::string>::iterator i=files.begin(); i!=files.end(); i++)\r
+                       {\r
+                               if((*i)!="" && (*i).find("index.htm")==std::string::npos && (*i).find("trustlist.htm")==std::string::npos && (*i).find("files.htm")==std::string::npos)\r
+                               {\r
+                                       filename=(*i);\r
+                                       infile=fopen(filename.c_str(),"r+b");\r
+                                       if(infile)\r
+                                       {\r
+                                               fseek(infile,0,SEEK_END);\r
+                                               len=ftell(infile);\r
+                                               fseek(infile,0,SEEK_SET);\r
+\r
+                                               data.resize(len);\r
+                                               fread(&data[0],1,data.size(),infile);\r
+                                               fclose(infile);\r
+\r
+                                               filecontent="";\r
+                                               filecontent.append(data.begin(),data.end());\r
+\r
+                                               // strip off path from filename\r
+                                               while(filename.find_first_of("/")!=std::string::npos)\r
+                                               {\r
+                                                       filename.erase(0,filename.find_first_of("/")+1);\r
+                                               }\r
+\r
+                                               if(filecontent.size()>0)\r
+                                               {\r
+                                                       pages[filename]=filecontent;\r
+                                               }\r
+\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"SiteInserter::GeneratePages could not include user file "+(*i));\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+               }\r
+\r
        }\r
 }\r
 \r
@@ -191,8 +273,9 @@ std::string SiteInserter::GenerateTrustList(const std::string &htmltemplate, con
 \r
        date.SetToGMTime();\r
        date.Add(0,0,0,-20);\r
-       SQLite3DB::Statement st=m_db->Prepare("SELECT Name,PublicKey,LocalMessageTrust,LocalTrustListTrust,IdentityID,MessageTrustComment,TrustListTrustComment FROM tblIdentity WHERE PublicKey IS NOT NULL AND LastSeen IS NOT NULL AND LastSeen>=? ORDER BY Name COLLATE NOCASE;");\r
-       st.Bind(0,date.Format("%Y-%m-%d %H:%M:%S"));\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT Name,PublicKey,tblIdentityTrust.LocalMessageTrust,tblIdentityTrust.LocalTrustListTrust,tblIdentity.IdentityID,tblIdentityTrust.MessageTrustComment,tblIdentityTrust.TrustListTrustComment,tblIdentity.FreesiteEdition FROM tblIdentity LEFT JOIN (SELECT IdentityID,LocalMessageTrust,LocalTrustListTrust,MessageTrustComment,TrustListTrustComment FROM tblIdentityTrust WHERE LocalIdentityID=?) AS 'tblIdentityTrust' ON tblIdentity.IdentityID=tblIdentityTrust.IdentityID WHERE PublicKey IS NOT NULL AND LastSeen IS NOT NULL AND LastSeen>=? ORDER BY Name COLLATE NOCASE;");\r
+       st.Bind(0,localidentityid);\r
+       st.Bind(1,date.Format("%Y-%m-%d %H:%M:%S"));\r
        st.Step();\r
 \r
        content+="<table>";\r
@@ -209,8 +292,8 @@ std::string SiteInserter::GenerateTrustList(const std::string &htmltemplate, con
                std::string messagetrust="";\r
                std::string trustlisttrust="";\r
                std::string publickey="";\r
-               std::string keypart="";\r
                std::string uskkey="";\r
+               std::string freesiteedition="";\r
 \r
                st.ResultText(0,idname);\r
                st.ResultText(1,publickey);\r
@@ -219,22 +302,28 @@ std::string SiteInserter::GenerateTrustList(const std::string &htmltemplate, con
                st.ResultText(4,thisid);\r
                st.ResultText(5,messagetrustcomment);\r
                st.ResultText(6,trustlisttrustcomment);\r
+               st.ResultText(7,freesiteedition);\r
 \r
-               if(publickey.size()>8)\r
+               if(freesiteedition!="")\r
                {\r
-                       keypart=publickey.substr(3,5);\r
+                       if(publickey.find("SSK@")==0)\r
+                       {\r
+                               uskkey=publickey;\r
+                               uskkey.erase(0,3);\r
+                               uskkey="USK"+uskkey;\r
+                               uskkey+=m_messagebase+"/"+freesiteedition+"/";\r
+                       }\r
                }\r
 \r
-               if(publickey.find("SSK@")==0)\r
+               content+="<tr>";\r
+               if(freesiteedition!="")\r
                {\r
-                       uskkey=publickey;\r
-                       uskkey.erase(0,3);\r
-                       uskkey="USK"+uskkey;\r
-                       uskkey+=m_messagebase+"/0/";\r
+                       content+="<td><a href=\""+uskkey+"\">"+SanitizeOutput(CreateShortIdentityName(idname,publickey))+"</a></td>";\r
+               }\r
+               else\r
+               {\r
+                       content+="<td>"+SanitizeOutput(CreateShortIdentityName(idname,publickey))+"</td>";\r
                }\r
-\r
-               content+="<tr>";\r
-               content+="<td><a href=\""+uskkey+"\">"+SanitizeOutput(idname+keypart)+"...</a></td>";\r
                content+="<td "+GetClassString(messagetrust)+">"+messagetrust+"</td>";\r
                content+="<td>"+SanitizeOutput(messagetrustcomment)+"</td>";\r
                content+="<td "+GetClassString(trustlisttrust)+">"+trustlisttrust+"</td>";\r
@@ -277,13 +366,17 @@ const bool SiteInserter::HandlePutFailed(FCPMessage &message)
 \r
        RemoveFromInsertList(localidentityid);\r
 \r
+       m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"SiteInserter::HandlePutFailed failed to insert Freesite, Freenet error code : "+message["Code"]);\r
+\r
        return true;\r
 }\r
 \r
 const bool SiteInserter::HandlePutSuccessful(FCPMessage &message)\r
 {\r
        std::vector<std::string> idparts;\r
+       std::vector<std::string> uriparts;\r
        long localidentityid;\r
+       int edition=-1;\r
        DateTime now;\r
 \r
        now.SetToGMTime();\r
@@ -291,9 +384,17 @@ const bool SiteInserter::HandlePutSuccessful(FCPMessage &message)
        StringFunctions::Split(message["Identifier"],"|",idparts);\r
        StringFunctions::Convert(idparts[1],localidentityid);\r
 \r
-       SQLite3DB::Statement st=m_db->Prepare("UPDATE tblLocalIdentity SET LastInsertedFreesite=? WHERE LocalIdentityID=?;");\r
+       // edition is very last part of uri\r
+       StringFunctions::Split(message["URI"],"/",uriparts);\r
+       if(uriparts.size()>0)\r
+       {\r
+               StringFunctions::Convert(uriparts[uriparts.size()-1],edition);\r
+       }\r
+\r
+       SQLite3DB::Statement st=m_db->Prepare("UPDATE tblLocalIdentity SET LastInsertedFreesite=?, FreesiteEdition=? WHERE LocalIdentityID=?;");\r
        st.Bind(0,now.Format("%Y-%m-%d %H:%M:%S"));\r
-       st.Bind(1,localidentityid);\r
+       st.Bind(1,edition);\r
+       st.Bind(2,localidentityid);\r
        st.Step();\r
 \r
        m_log->WriteLog(LogFile::LOGLEVEL_INFO,"SiteInserter::HandlePutSuccessful successfully inserted Freesite.");\r
@@ -319,7 +420,7 @@ const std::string SiteInserter::SanitizeOutput(const std::string &input)
        return output;\r
 }\r
 \r
-void SiteInserter::StartInsert(const long &localidentityid)\r
+const bool SiteInserter::StartInsert(const long &localidentityid)\r
 {\r
        FCPMessage message;\r
        std::string localidentityidstr="";\r
@@ -363,4 +464,6 @@ void SiteInserter::StartInsert(const long &localidentityid)
 \r
        m_inserting.push_back(localidentityid);\r
 \r
+       return true;\r
+\r
 }\r