version 0.3.24
[fms.git] / src / http / pages / announceidentitypage.cpp
1 #include "../../../include/http/pages/announceidentitypage.h"\r
2 #include "../../../include/stringfunctions.h"\r
3 #include "../../../include/global.h"\r
4 \r
5 #include <Poco/DateTime.h>\r
6 #include <Poco/DateTimeFormatter.h>\r
7 \r
8 #ifdef XMEM\r
9         #include <xmem.h>\r
10 #endif\r
11 \r
12 const std::string AnnounceIdentityPage::CreateLocalIdentityDropDown(const std::string &name, const std::string &selected)\r
13 {\r
14         std::string rval="";\r
15         SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID, Name, PublicKey FROM tblLocalIdentity ORDER BY Name;");\r
16         st.Step();\r
17 \r
18         rval+="<select name=\""+name+"\">";\r
19         while(st.RowReturned())\r
20         {\r
21                 std::string id;\r
22                 std::string name;\r
23                 std::string pubkey;\r
24 \r
25                 st.ResultText(0,id);\r
26                 st.ResultText(1,name);\r
27                 st.ResultText(2,pubkey);\r
28 \r
29                 rval+="<option value=\""+id+"\" title=\""+pubkey+"\""+(selected==id?" selected":"")+">"+SanitizeOutput(CreateShortIdentityName(name,pubkey))+"</option>";\r
30                 st.Step();\r
31         }\r
32         rval+="</select>";\r
33         return rval;\r
34 }\r
35 \r
36 const std::string AnnounceIdentityPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
37 {\r
38         Poco::DateTime date;\r
39         std::string content;\r
40         int shown=0;\r
41         std::string countstr="";\r
42         std::string uuid;\r
43         std::string lastid="";\r
44         std::string thisid="";\r
45         std::string day="";\r
46         std::string name="";\r
47         std::string pubkey="";\r
48         int requestindex=0;\r
49         bool willshow=false;\r
50         std::string localidentityidstr="";\r
51 \r
52         if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="announce" && ValidateFormPassword(queryvars))\r
53         {\r
54                 SQLite3DB::Statement insert=m_db->Prepare("INSERT INTO tblIdentityIntroductionInserts(LocalIdentityID,Day,UUID,Solution) VALUES(?,?,?,?);");\r
55                 int localidentityid=0;\r
56                 std::vector<std::string> uuids;\r
57                 std::vector<std::string> days;\r
58                 std::vector<std::string> solutions;\r
59 \r
60                 if(queryvars.find("localidentityid")!=queryvars.end())\r
61                 {\r
62                         localidentityidstr=(*queryvars.find("localidentityid")).second;\r
63                         StringFunctions::Convert(localidentityidstr,localidentityid);\r
64                 }\r
65                 CreateArgArray(queryvars,"uuid",uuids);\r
66                 CreateArgArray(queryvars,"day",days);\r
67                 CreateArgArray(queryvars,"solution",solutions);\r
68 \r
69                 for(int i=0; i<solutions.size(); i++)\r
70                 {\r
71                         if(solutions[i]!="")\r
72                         {\r
73                                 insert.Bind(0,localidentityid);\r
74                                 insert.Bind(1,days[i]);\r
75                                 insert.Bind(2,uuids[i]);\r
76                                 insert.Bind(3,solutions[i]);\r
77                                 insert.Step();\r
78                                 insert.Reset();\r
79                         }\r
80                 }\r
81 \r
82         }\r
83 \r
84         content+="<h2>Announce Identity</h2>";\r
85         content+="<form name=\"frmannounce\" method=\"POST\">";\r
86         content+=CreateFormPassword();\r
87         content+="<input type=\"hidden\" name=\"formaction\" value=\"announce\">";\r
88         content+="<table>";\r
89         content+="<tr><td colspan=\"4\"><center>Select Identity : ";\r
90         content+=CreateLocalIdentityDropDown("localidentityid",localidentityidstr);\r
91         content+="</td></tr>";\r
92         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 and you must assign trust to other identities to see yourself announced.  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
93         content+="<tr>";\r
94 \r
95         date-=Poco::Timespan(1,0,0,0,0);\r
96         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 WHERE UUID IS NOT NULL) AND UUID NOT IN (SELECT UUID FROM tblIntroductionPuzzleInserts WHERE UUID IS NOT NULL) AND Day>='"+Poco::DateTimeFormatter::format(date,"%Y-%m-%d")+"' AND Found='true' ORDER BY tblIdentity.IdentityID, Day DESC, RequestIndex DESC;");\r
97         st.Step();\r
98 \r
99         if(st.RowReturned()==false)\r
100         {\r
101                 content+="<td colspan=\"4\"><center>You must wait for some puzzles to be downloaded.  Make sure you have assigned trust to some other identities' trust lists and check back later.</td>";\r
102         }\r
103         \r
104         while(st.RowReturned() && shown<20)\r
105         {\r
106                 st.ResultText(0,uuid);\r
107                 st.ResultText(1,day);\r
108                 st.ResultText(2,thisid);\r
109                 st.ResultInt(3,requestindex);\r
110                 st.ResultText(4,name);\r
111                 st.ResultText(5,pubkey);\r
112 \r
113                 // 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
114                 // get the last index # we are inserting this day from this identity\r
115                 // 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
116                 willshow=true;\r
117                 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=? AND UUID IS NOT NULL) GROUP BY tblIdentityIntroductionInserts.Day;");\r
118                 st2.Step();\r
119                 if(st2.RowReturned()==true)\r
120                 {\r
121                         int index=0;\r
122                         st2.ResultInt(0,index);\r
123                         if(index>=requestindex)\r
124                         {\r
125                                 willshow=false;\r
126                         }\r
127                 }\r
128 \r
129                 if(willshow && thisid!=lastid)\r
130                 {\r
131                         StringFunctions::Convert(shown,countstr);\r
132                         if(shown>0 && shown%4==0)\r
133                         {\r
134                                 content+="</tr>\r\n<tr>";\r
135                         }\r
136                         content+="<td title=\"From "+SanitizeOutput(CreateShortIdentityName(name,pubkey))+"\">";\r
137                         content+="<img src=\"showcaptcha.htm?UUID="+uuid+"\"><br>";\r
138                         content+="<input type=\"hidden\" name=\"uuid["+countstr+"]\" value=\""+uuid+"\">";\r
139                         content+="<input type=\"hidden\" name=\"day["+countstr+"]\" value=\""+day+"\">";\r
140                         content+="<input type=\"text\" name=\"solution["+countstr+"]\">";\r
141                         content+="</td>\r\n";\r
142                         lastid=thisid;\r
143                         shown++;\r
144                 }\r
145                 \r
146                 st.Step();\r
147         }\r
148 \r
149         content+="</tr><td colspan=\"4\"><center><input type=\"submit\" value=\"Announce\"></td></tr>";\r
150         content+="</table>";\r
151         content+="</form>";\r
152 \r
153         return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
154 }\r
155 \r
156 const bool AnnounceIdentityPage::WillHandleURI(const std::string &uri)\r
157 {\r
158         if(uri.find("announceidentity.")!=std::string::npos)\r
159         {\r
160                 return true;\r
161         }\r
162         else\r
163         {\r
164                 return false;\r
165         }\r
166 }\r