version 0.3.15
[fms.git] / src / http / pages / announceidentitypage.cpp
index 460302a..f14b275 100644 (file)
@@ -1,6 +1,9 @@
 #include "../../../include/http/pages/announceidentitypage.h"\r
 #include "../../../include/stringfunctions.h"\r
-#include "../../../include/datetime.h"\r
+#include "../../../include/global.h"\r
+\r
+#include <Poco/DateTime.h>\r
+#include <Poco/DateTimeFormatter.h>\r
 \r
 #ifdef XMEM\r
        #include <xmem.h>\r
@@ -23,7 +26,7 @@ const std::string AnnounceIdentityPage::CreateLocalIdentityDropDown(const std::s
                st.ResultText(1,name);\r
                st.ResultText(2,pubkey);\r
 \r
-               rval+="<option value=\""+id+"\" title=\""+pubkey+"\">"+name+"</option>";\r
+               rval+="<option value=\""+id+"\" title=\""+pubkey+"\">"+SanitizeOutput(CreateShortIdentityName(name,pubkey))+"</option>";\r
                st.Step();\r
        }\r
        rval+="</select>";\r
@@ -32,7 +35,7 @@ const std::string AnnounceIdentityPage::CreateLocalIdentityDropDown(const std::s
 \r
 const std::string AnnounceIdentityPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
 {\r
-       DateTime date;\r
+       Poco::DateTime date;\r
        std::string content;\r
        int shown=0;\r
        std::string countstr="";\r
@@ -40,8 +43,12 @@ const std::string AnnounceIdentityPage::GeneratePage(const std::string &method,
        std::string lastid="";\r
        std::string thisid="";\r
        std::string day="";\r
+       std::string name="";\r
+       std::string pubkey="";\r
+       int requestindex=0;\r
+       bool willshow=false;\r
 \r
-       if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="announce")\r
+       if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="announce" && ValidateFormPassword(queryvars))\r
        {\r
                SQLite3DB::Statement insert=m_db->Prepare("INSERT INTO tblIdentityIntroductionInserts(LocalIdentityID,Day,UUID,Solution) VALUES(?,?,?,?);");\r
                std::string localidentityidstr="";\r
@@ -76,17 +83,17 @@ const std::string AnnounceIdentityPage::GeneratePage(const std::string &method,
 \r
        content+="<h2>Announce Identity</h2>";\r
        content+="<form name=\"frmannounce\" method=\"POST\">";\r
+       content+=CreateFormPassword();\r
        content+="<input type=\"hidden\" name=\"formaction\" value=\"announce\">";\r
        content+="<table>";\r
        content+="<tr><td colspan=\"4\"><center>Select Identity : ";\r
        content+=CreateLocalIdentityDropDown("localidentityid","");\r
        content+="</td></tr>";\r
-       content+="<tr><td colspan=\"4\"><center>Type the answers of a few puzzles</td></tr>";\r
+       content+="<tr><td colspan=\"4\"><center>Type the answers of a few of the following puzzles.  You don't need to get them all correct, but remember that they are case sensitive.  Getting announced will take some time.  DO NOT continuously solve captchas.  Solve 30 at most, wait a day, and if your identity has not been announced, repeat until it is.</td></tr>";\r
        content+="<tr>";\r
 \r
-       date.SetToGMTime();\r
-       date.Add(0,0,0,-1);\r
-       SQLite3DB::Statement st=m_db->Prepare("SELECT UUID,Day,IdentityID FROM tblIntroductionPuzzleRequests WHERE UUID NOT IN (SELECT UUID FROM tblIdentityIntroductionInserts) AND UUID NOT IN (SELECT UUID FROM tblIntroductionPuzzleInserts) AND Day>='"+date.Format("%Y-%m-%d")+"' AND Found='true' ORDER BY IdentityID, Day DESC, RequestIndex DESC;");\r
+       date-=Poco::Timespan(1,0,0,0,0);\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT UUID,Day,tblIdentity.IdentityID,RequestIndex,tblIdentity.Name,tblIdentity.PublicKey FROM tblIntroductionPuzzleRequests INNER JOIN tblIdentity ON tblIntroductionPuzzleRequests.IdentityID=tblIdentity.IdentityID WHERE UUID NOT IN (SELECT UUID FROM tblIdentityIntroductionInserts) AND UUID NOT IN (SELECT UUID FROM tblIntroductionPuzzleInserts) AND Day>='"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d")+"' AND Found='true' ORDER BY tblIdentity.IdentityID, Day DESC, RequestIndex DESC;");\r
        st.Step();\r
 \r
        if(st.RowReturned()==false)\r
@@ -99,21 +106,40 @@ const std::string AnnounceIdentityPage::GeneratePage(const std::string &method,
                st.ResultText(0,uuid);\r
                st.ResultText(1,day);\r
                st.ResultText(2,thisid);\r
+               st.ResultInt(3,requestindex);\r
+               st.ResultText(4,name);\r
+               st.ResultText(5,pubkey);\r
+\r
+               // if we are already inserting a solution for an identity - we shouldn't show any puzzles that are older than the one we are inserting\r
+               // get the last index # we are inserting this day from this identity\r
+               // if the index here is greater than the index in the st statement, we will skip this puzzle because we are already inserting a puzzle with a greater index\r
+               willshow=true;\r
+               SQLite3DB::Statement st2=m_db->Prepare("SELECT MAX(RequestIndex) FROM tblIdentityIntroductionInserts INNER JOIN tblIntroductionPuzzleRequests ON tblIdentityIntroductionInserts.UUID=tblIntroductionPuzzleRequests.UUID WHERE tblIdentityIntroductionInserts.Day=? AND tblIdentityIntroductionInserts.UUID IN (SELECT UUID FROM tblIntroductionPuzzleRequests WHERE IdentityID=? AND Day=?) GROUP BY tblIdentityIntroductionInserts.Day;");\r
+               st2.Step();\r
+               if(st2.RowReturned()==true)\r
+               {\r
+                       int index=0;\r
+                       st2.ResultInt(0,index);\r
+                       if(index>=requestindex)\r
+                       {\r
+                               willshow=false;\r
+                       }\r
+               }\r
 \r
-               if(thisid!=lastid)\r
+               if(willshow && thisid!=lastid)\r
                {\r
                        StringFunctions::Convert(shown,countstr);\r
                        if(shown>0 && shown%4==0)\r
                        {\r
                                content+="</tr>\r\n<tr>";\r
                        }\r
-                       content+="<td>";\r
+                       content+="<td title=\"From "+SanitizeOutput(CreateShortIdentityName(name,pubkey))+"\">";\r
                        content+="<img src=\"showcaptcha.htm?UUID="+uuid+"\"><br>";\r
                        content+="<input type=\"hidden\" name=\"uuid["+countstr+"]\" value=\""+uuid+"\">";\r
                        content+="<input type=\"hidden\" name=\"day["+countstr+"]\" value=\""+day+"\">";\r
                        content+="<input type=\"text\" name=\"solution["+countstr+"]\">";\r
                        content+="</td>\r\n";\r
-                       thisid=lastid;\r
+                       lastid=thisid;\r
                        shown++;\r
                }\r
                \r
@@ -124,7 +150,7 @@ const std::string AnnounceIdentityPage::GeneratePage(const std::string &method,
        content+="</table>";\r
        content+="</form>";\r
 \r
-       return "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"+StringFunctions::Replace(m_template,"[CONTENT]",content);\r
+       return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
 }\r
 \r
 const bool AnnounceIdentityPage::WillHandleURI(const std::string &uri)\r