710904c274b9f61ec2b6bb98c77c1613120fd007
[fms.git] / src / http / pages / announceidentitypage.cpp
1 #include "../../../include/http/pages/announceidentitypage.h"\r
2 #include "../../../include/stringfunctions.h"\r
3 #include "../../../include/datetime.h"\r
4 \r
5 #ifdef XMEM\r
6         #include <xmem.h>\r
7 #endif\r
8 \r
9 const std::string AnnounceIdentityPage::CreateLocalIdentityDropDown(const std::string &name, const std::string &selected)\r
10 {\r
11         std::string rval="";\r
12         SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID, Name, PublicKey FROM tblLocalIdentity ORDER BY Name;");\r
13         st.Step();\r
14 \r
15         rval+="<select name=\""+name+"\">";\r
16         while(st.RowReturned())\r
17         {\r
18                 std::string id;\r
19                 std::string name;\r
20                 std::string pubkey;\r
21 \r
22                 st.ResultText(0,id);\r
23                 st.ResultText(1,name);\r
24                 st.ResultText(2,pubkey);\r
25 \r
26                 rval+="<option value=\""+id+"\" title=\""+pubkey+"\">"+name+"</option>";\r
27                 st.Step();\r
28         }\r
29         rval+="</select>";\r
30         return rval;\r
31 }\r
32 \r
33 const std::string AnnounceIdentityPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
34 {\r
35         DateTime date;\r
36         std::string content;\r
37         int shown=0;\r
38         std::string countstr="";\r
39         std::string uuid;\r
40         std::string lastid="";\r
41         std::string thisid="";\r
42         std::string day="";\r
43 \r
44         if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="announce")\r
45         {\r
46                 SQLite3DB::Statement insert=m_db->Prepare("INSERT INTO tblIdentityIntroductionInserts(LocalIdentityID,Day,UUID,Solution) VALUES(?,?,?,?);");\r
47                 std::string localidentityidstr="";\r
48                 int localidentityid=0;\r
49                 std::vector<std::string> uuids;\r
50                 std::vector<std::string> days;\r
51                 std::vector<std::string> solutions;\r
52 \r
53                 if(queryvars.find("localidentityid")!=queryvars.end())\r
54                 {\r
55                         localidentityidstr=(*queryvars.find("localidentityid")).second;\r
56                         StringFunctions::Convert(localidentityidstr,localidentityid);\r
57                 }\r
58                 CreateArgArray(queryvars,"uuid",uuids);\r
59                 CreateArgArray(queryvars,"day",days);\r
60                 CreateArgArray(queryvars,"solution",solutions);\r
61 \r
62                 for(int i=0; i<solutions.size(); i++)\r
63                 {\r
64                         if(solutions[i]!="")\r
65                         {\r
66                                 insert.Bind(0,localidentityid);\r
67                                 insert.Bind(1,days[i]);\r
68                                 insert.Bind(2,uuids[i]);\r
69                                 insert.Bind(3,solutions[i]);\r
70                                 insert.Step();\r
71                                 insert.Reset();\r
72                         }\r
73                 }\r
74 \r
75         }\r
76 \r
77         content+="<h2>Announce Identity</h2>";\r
78         content+="<form name=\"frmannounce\" method=\"POST\">";\r
79         content+="<input type=\"hidden\" name=\"formaction\" value=\"announce\">";\r
80         content+="<table>";\r
81         content+="<tr><td colspan=\"4\"><center>Select Identity : ";\r
82         content+=CreateLocalIdentityDropDown("localidentityid","");\r
83         content+="</td></tr>";\r
84         content+="<tr><td colspan=\"4\"><center>Type the answers of a few puzzles</td></tr>";\r
85         content+="<tr>";\r
86 \r
87         //TODO if we are already inserting a solution for an identity - we shouldn't select any puzzles that are older than the one we are inserting\r
88 \r
89         date.SetToGMTime();\r
90         date.Add(0,0,0,-1);\r
91         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
92         st.Step();\r
93 \r
94         if(st.RowReturned()==false)\r
95         {\r
96                 content+="<td colspan=\"4\"><center>You must wait for some puzzles to be downloaded.  Check back later.</td>";\r
97         }\r
98         \r
99         while(st.RowReturned() && shown<20)\r
100         {\r
101                 st.ResultText(0,uuid);\r
102                 st.ResultText(1,day);\r
103                 st.ResultText(2,thisid);\r
104 \r
105                 if(thisid!=lastid)\r
106                 {\r
107                         StringFunctions::Convert(shown,countstr);\r
108                         if(shown>0 && shown%4==0)\r
109                         {\r
110                                 content+="</tr>\r\n<tr>";\r
111                         }\r
112                         content+="<td>";\r
113                         content+="<img src=\"showcaptcha.htm?UUID="+uuid+"\"><br>";\r
114                         content+="<input type=\"hidden\" name=\"uuid["+countstr+"]\" value=\""+uuid+"\">";\r
115                         content+="<input type=\"hidden\" name=\"day["+countstr+"]\" value=\""+day+"\">";\r
116                         content+="<input type=\"text\" name=\"solution["+countstr+"]\">";\r
117                         content+="</td>\r\n";\r
118                         thisid=lastid;\r
119                         shown++;\r
120                 }\r
121                 \r
122                 st.Step();\r
123         }\r
124 \r
125         content+="</tr><td colspan=\"4\"><center><input type=\"submit\" value=\"Announce\"></td></tr>";\r
126         content+="</table>";\r
127         content+="</form>";\r
128 \r
129         return "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"+StringFunctions::Replace(m_template,"[CONTENT]",content);\r
130 }\r
131 \r
132 const bool AnnounceIdentityPage::WillHandleURI(const std::string &uri)\r
133 {\r
134         if(uri.find("announceidentity.")!=std::string::npos)\r
135         {\r
136                 return true;\r
137         }\r
138         else\r
139         {\r
140                 return false;\r
141         }\r
142 }\r