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