version 0.3.13
[fms.git] / src / http / pages / localidentitiespage.cpp
1 #include "../../../include/http/pages/localidentitiespage.h"\r
2 #include "../../../include/stringfunctions.h"\r
3 #include "../../../include/http/identityexportxml.h"\r
4 #include "../../../include/global.h"\r
5 \r
6 #ifdef XMEM\r
7         #include <xmem.h>\r
8 #endif\r
9 \r
10 const std::string LocalIdentitiesPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
11 {\r
12         int count;\r
13         std::string countstr;\r
14         std::string content="";\r
15 \r
16         content+="<h2>Local Identities</h2>";\r
17 \r
18         content+="<table><tr><th>Export Identities</th><th>Import Identities</th></tr>";\r
19         content+="<tr><td>";\r
20         content+="<form name=\"frmexport\" method=\"POST\">";\r
21         content+=CreateFormPassword();\r
22         content+="<input type=\"hidden\" name=\"formaction\" value=\"export\">";\r
23         content+="<input type=\"submit\" value=\"Export Identities\">";\r
24         content+="</form>";\r
25         content+="</td><td>";\r
26         content+="<form name=\"frmimport\" method=\"POST\" enctype=\"multipart/form-data\">";\r
27         content+=CreateFormPassword();\r
28         content+="<input type=\"hidden\" name=\"formaction\" value=\"import\">";\r
29         content+="<input type=\"file\" name=\"file\">";\r
30         content+="<input type=\"submit\" value=\"Import Identities\">";\r
31         content+="</form>";\r
32         content+="</td></tr></table>";\r
33 \r
34         content+="<hr>";\r
35 \r
36         content+="<table><tr><th>Name</th><th>Single Use</th><th>Publish Trust List</th><th>Publish Board List</th><th>Publish Freesite</th><th>Min Message Delay</th><th>Max Message Delay</th><th>Announced? *</th></tr>";\r
37 \r
38         SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID,tblLocalIdentity.Name,tblLocalIdentity.PublicKey,tbLLocalIdentity.PublishTrustList,tblLocalIdentity.SingleUse,tblLocalIdentity.PublishBoardList,tblIdentity.IdentityID,tblLocalIdentity.PublishFreesite,tblLocalIdentity.MinMessageDelay,tblLocalIdentity.MaxMessageDelay FROM tblLocalIdentity LEFT JOIN tblIdentity ON tblLocalIdentity.PublicKey=tblIdentity.PublicKey ORDER BY tblLocalIdentity.Name;");\r
39         st.Step();\r
40 \r
41         SQLite3DB::Statement trustst=m_db->Prepare("SELECT COUNT(*) FROM tblPeerTrust LEFT JOIN tblIdentity ON tblPeerTrust.TargetIdentityID=tblIdentity.IdentityID WHERE tblIdentity.PublicKey=? GROUP BY tblPeerTrust.TargetIdentityID;");\r
42 \r
43         count=0;\r
44         while(st.RowReturned())\r
45         {\r
46                 StringFunctions::Convert(count,countstr);\r
47                 std::string id="";\r
48                 std::string name="";\r
49                 std::string publickey="";\r
50                 std::string publishtrustlist="";\r
51                 std::string singleuse="";\r
52                 std::string publishboardlist="";\r
53                 std::string publishfreesite="";\r
54                 std::string minmessagedelay="0";\r
55                 std::string maxmessagedelay="0";\r
56 \r
57                 st.ResultText(0,id);\r
58                 st.ResultText(1,name);\r
59                 st.ResultText(2,publickey);\r
60                 st.ResultText(3,publishtrustlist);\r
61                 st.ResultText(4,singleuse);\r
62                 st.ResultText(5,publishboardlist);\r
63                 st.ResultText(7,publishfreesite);\r
64                 st.ResultText(8,minmessagedelay);\r
65                 st.ResultText(9,maxmessagedelay);\r
66 \r
67                 content+="<tr>";\r
68                 content+="<td title=\""+publickey+"\"><form name=\"frmupdate\""+countstr+"\" method=\"POST\"><input type=\"hidden\" name=\"formaction\" value=\"update\">"+CreateFormPassword()+"<input type=\"hidden\" name=\"chkidentityid["+countstr+"]\" value=\""+id+"\">"+SanitizeOutput(CreateShortIdentityName(name,publickey))+"</td>";\r
69                 content+="<td>"+CreateTrueFalseDropDown("singleuse["+countstr+"]",singleuse)+"</td>";\r
70                 content+="<td>"+CreateTrueFalseDropDown("publishtrustlist["+countstr+"]",publishtrustlist)+"</td>";\r
71                 content+="<td>"+CreateTrueFalseDropDown("publishboardlist["+countstr+"]",publishboardlist)+"</td>";\r
72                 content+="<td>"+CreateTrueFalseDropDown("publishfreesite["+countstr+"]",publishfreesite)+"</td>";\r
73                 content+="<td><input type=\"text\" size=\"2\" name=\"mindelay["+countstr+"]\" value=\""+minmessagedelay+"\"></td>";\r
74                 content+="<td><input type=\"text\" size=\"2\" name=\"maxdelay["+countstr+"]\" value=\""+maxmessagedelay+"\"></td>";\r
75                 \r
76                 trustst.Bind(0,publickey);\r
77                 trustst.Step();\r
78                 if(trustst.RowReturned())\r
79                 {\r
80                         std::string numlists="";\r
81                         trustst.ResultText(0,numlists);\r
82                         content+="<td>Yes ("+numlists+")</td>";\r
83                 }\r
84                 else\r
85                 {\r
86                         content+="<td>No</td>";\r
87                 }\r
88                 trustst.Reset();\r
89 \r
90                 content+="<td><input type=\"submit\" value=\"Update\"></form></td>";\r
91                 content+="<td><form name=\"frmdel\""+countstr+"\" method=\"POST\" action=\"confirm.htm\">"+CreateFormPassword()+"<input type=\"hidden\" name=\"formaction\" value=\"delete\"><input type=\"hidden\" name=\"chkidentityid["+countstr+"]\" value=\""+id+"\"><input type=\"hidden\" name=\"targetpage\" value=\"localidentities.htm\"><input type=\"hidden\" name=\"confirmdescription\" value=\"Are you sure you want to delete "+SanitizeOutput(CreateShortIdentityName(name,publickey))+"?\"><input type=\"submit\" value=\"Delete\"></form></td>";\r
92                 content+="</tr>";\r
93                 content+="<tr><td></td><td colspan=\"7\" class=\"smaller\">"+publickey+"</td></tr>";\r
94                 st.Step();\r
95                 count++;\r
96         }\r
97 \r
98         content+="</table>";\r
99         content+="<p class=\"paragraph\">* An identity is considered successfully announced when you have downloaded a trust list from someone that contains the identity.  The number in parenthesis is how many trust lists that identity appears in.</p>";\r
100         content+="<p class=\"paragraph\">Single Use Identities will automatically be deleted 7 days after creation.</p>";\r
101         content+="<p class=\"paragraph\">Messages that each identity sends may be delayed by a random number of minutes between min and max.  Set both to 0 to send messages as soon as possible.</p>";\r
102 \r
103         return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
104 }\r
105 \r
106 void LocalIdentitiesPage::HandleDelete(const std::map<std::string,std::string> &queryvars)\r
107 {\r
108         int id=0;\r
109         std::vector<std::string> ids;\r
110         CreateArgArray(queryvars,"chkidentityid",ids);\r
111 \r
112         SQLite3DB::Statement del=m_db->Prepare("DELETE FROM tblLocalIdentity WHERE LocalIdentityID=?;");\r
113         for(int i=0; i<ids.size(); i++)\r
114         {\r
115                 if(ids[i]!="")\r
116                 {\r
117                         StringFunctions::Convert(ids[i],id);\r
118                         del.Bind(0,id);\r
119                         del.Step();\r
120                         del.Reset();\r
121                 }\r
122         }\r
123 }\r
124 \r
125 const std::string LocalIdentitiesPage::HandleExport()\r
126 {\r
127         IdentityExportXML xml;\r
128         SQLite3DB::Statement exp=m_db->Prepare("SELECT Name,PublicKey,PrivateKey,SingleUse,PublishTrustList,PublishBoardList,PublishFreesite FROM tblLocalIdentity WHERE PublicKey IS NOT NULL AND PrivateKey IS NOT NULL;");\r
129         exp.Step();\r
130         while(exp.RowReturned())\r
131         {\r
132                 std::string name="";\r
133                 std::string publickey="";\r
134                 std::string privatekey="";\r
135                 std::string tempval="";\r
136                 bool singleuse=false;\r
137                 bool publishtrustlist=false;\r
138                 bool publishboardlist=false;\r
139                 bool publishfreesite=false;\r
140 \r
141                 exp.ResultText(0,name);\r
142                 exp.ResultText(1,publickey);\r
143                 exp.ResultText(2,privatekey);\r
144                 exp.ResultText(3,tempval);\r
145                 if(tempval=="true")\r
146                 {\r
147                         singleuse=true;\r
148                 }\r
149                 exp.ResultText(4,tempval);\r
150                 if(tempval=="true")\r
151                 {\r
152                         publishtrustlist=true;\r
153                 }\r
154                 exp.ResultText(5,tempval);\r
155                 if(tempval=="true")\r
156                 {\r
157                         publishboardlist=true;\r
158                 }\r
159                 exp.ResultText(6,tempval);\r
160                 if(tempval=="true")\r
161                 {\r
162                         publishfreesite=true;\r
163                 }\r
164 \r
165                 xml.AddIdentity(name,publickey,privatekey,singleuse,publishtrustlist,publishboardlist,publishfreesite);\r
166 \r
167                 exp.Step();\r
168         }\r
169         return xml.GetXML();\r
170 }\r
171 \r
172 void LocalIdentitiesPage::HandleImport(const std::map<std::string,std::string> &queryvars)\r
173 {\r
174         if(queryvars.find("file")!=queryvars.end())\r
175         {\r
176                 IdentityExportXML xml;\r
177                 if(xml.ParseXML((*queryvars.find("file")).second))\r
178                 {\r
179                         SQLite3DB::Statement imp=m_db->Prepare("INSERT INTO tblLocalIdentity(Name,PublicKey,PrivateKey,SingleUse,PublishTrustList,PublishBoardList,PublishFreesite) VALUES(?,?,?,?,?,?,?);");\r
180                         for(int i=0; i<xml.GetCount(); i++)\r
181                         {\r
182                                 std::string tempval="false";\r
183                                 imp.Bind(0,xml.GetName(i));\r
184                                 imp.Bind(1,xml.GetPublicKey(i));\r
185                                 imp.Bind(2,xml.GetPrivateKey(i));\r
186                                 if(xml.GetSingleUse(i))\r
187                                 {\r
188                                         tempval="true";\r
189                                 }\r
190                                 else\r
191                                 {\r
192                                         tempval="false";\r
193                                 }\r
194                                 imp.Bind(3,tempval);\r
195                                 if(xml.GetPublishTrustList(i))\r
196                                 {\r
197                                         tempval="true";\r
198                                 }\r
199                                 else\r
200                                 {\r
201                                         tempval="false";\r
202                                 }\r
203                                 imp.Bind(4,tempval);\r
204                                 if(xml.GetPublishBoardList(i))\r
205                                 {\r
206                                         tempval="true";\r
207                                 }\r
208                                 else\r
209                                 {\r
210                                         tempval="false";\r
211                                 }\r
212                                 imp.Bind(5,tempval);\r
213                                 if(xml.GetPublishFreesite(i))\r
214                                 {\r
215                                         tempval="true";\r
216                                 }\r
217                                 else\r
218                                 {\r
219                                         tempval="false";\r
220                                 }\r
221                                 imp.Bind(6,tempval);\r
222                                 imp.Step();\r
223                                 imp.Reset();\r
224                         }\r
225                 }\r
226         }\r
227 }\r
228 \r
229 void LocalIdentitiesPage::handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response)\r
230 {\r
231         m_log->trace("LocalIdentitiesPages::handleRequest from "+request.clientAddress().toString());\r
232 \r
233         std::map<std::string,std::string> vars;\r
234         CreateQueryVarMap(request,vars);\r
235 \r
236         std::string formaction="";\r
237         if(vars.find("formaction")!=vars.end() && ValidateFormPassword(vars))\r
238         {\r
239                 formaction=(*vars.find("formaction")).second;\r
240                 if(formaction=="update")\r
241                 {\r
242                         HandleUpdate(vars);\r
243                 }\r
244                 else if(formaction=="delete")\r
245                 {\r
246                         HandleDelete(vars);\r
247                 }\r
248                 else if(formaction=="export")\r
249                 {\r
250                         response.setChunkedTransferEncoding(true);\r
251                         response.setContentType("application/xml");\r
252                         response.set("Content-Disposition","attachment; filename=identities.xml");\r
253                         std::ostream &out=response.send();\r
254                         out << HandleExport();\r
255                         return;\r
256                 }\r
257                 else if(formaction=="import")\r
258                 {\r
259                         HandleImport(vars);\r
260                 }\r
261         }\r
262 \r
263         response.setChunkedTransferEncoding(true);\r
264         response.setContentType("text/html");\r
265 \r
266         std::ostream &ostr = response.send();\r
267         ostr << GeneratePage(request.getMethod(),vars);\r
268 }\r
269 \r
270 void LocalIdentitiesPage::HandleUpdate(const std::map<std::string,std::string> &queryvars)\r
271 {\r
272         int id;\r
273         std::vector<std::string> ids;\r
274         std::vector<std::string> singleuse;\r
275         std::vector<std::string> publishtrustlist;\r
276         std::vector<std::string> publishboardlist;\r
277         std::vector<std::string> publishfreesite;\r
278         std::vector<std::string> mindelay;\r
279         std::vector<std::string> maxdelay;\r
280 \r
281         CreateArgArray(queryvars,"chkidentityid",ids);\r
282         CreateArgArray(queryvars,"singleuse",singleuse);\r
283         CreateArgArray(queryvars,"publishtrustlist",publishtrustlist);\r
284         CreateArgArray(queryvars,"publishboardlist",publishboardlist);\r
285         CreateArgArray(queryvars,"publishfreesite",publishfreesite);\r
286         CreateArgArray(queryvars,"mindelay",mindelay);\r
287         CreateArgArray(queryvars,"maxdelay",maxdelay);\r
288 \r
289         SQLite3DB::Statement update=m_db->Prepare("UPDATE tblLocalIdentity SET SingleUse=?, PublishTrustList=?, PublishBoardList=?, PublishFreesite=?, MinMessageDelay=?, MaxMessageDelay=? WHERE LocalIdentityID=?;");\r
290         for(int i=0; i<ids.size(); i++)\r
291         {\r
292                 if(ids[i]!="")\r
293                 {\r
294                         int minmessagedelay=0;\r
295                         int maxmessagedelay=0;\r
296                         StringFunctions::Convert(ids[i],id);\r
297                         StringFunctions::Convert(mindelay[i],minmessagedelay);\r
298                         StringFunctions::Convert(maxdelay[i],maxmessagedelay);\r
299                         update.Bind(0,singleuse[i]);\r
300                         update.Bind(1,publishtrustlist[i]);\r
301                         update.Bind(2,publishboardlist[i]);\r
302                         update.Bind(3,publishfreesite[i]);\r
303                         update.Bind(4,minmessagedelay);\r
304                         update.Bind(5,maxmessagedelay);\r
305                         update.Bind(6,id);\r
306                         update.Step();\r
307                         update.Reset();\r
308                 }\r
309         }\r
310 }\r
311 \r
312 const bool LocalIdentitiesPage::WillHandleURI(const std::string &uri)\r
313 {\r
314         if(uri.find("localidentities.")!=std::string::npos)\r
315         {\r
316                 return true;\r
317         }\r
318         else\r
319         {\r
320                 return false;\r
321         }\r
322 }\r