version 0.3.18
[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         SQLite3DB::Statement st2=m_db->Prepare("SELECT IdentityID FROM tblIdentity WHERE PublicKey=?;");\r
41 \r
42         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
43 \r
44         count=0;\r
45         while(st.RowReturned())\r
46         {\r
47                 StringFunctions::Convert(count,countstr);\r
48                 std::string id="";\r
49                 std::string name="";\r
50                 std::string publickey="";\r
51                 std::string publishtrustlist="";\r
52                 std::string singleuse="";\r
53                 std::string publishboardlist="";\r
54                 std::string publishfreesite="";\r
55                 std::string minmessagedelay="0";\r
56                 std::string maxmessagedelay="0";\r
57                 std::string identityidstr="";\r
58 \r
59                 st.ResultText(0,id);\r
60                 st.ResultText(1,name);\r
61                 st.ResultText(2,publickey);\r
62                 st.ResultText(3,publishtrustlist);\r
63                 st.ResultText(4,singleuse);\r
64                 st.ResultText(5,publishboardlist);\r
65                 st.ResultText(7,publishfreesite);\r
66                 st.ResultText(8,minmessagedelay);\r
67                 st.ResultText(9,maxmessagedelay);\r
68 \r
69                 st2.Bind(0,publickey);\r
70                 st2.Step();\r
71                 if(st2.RowReturned())\r
72                 {\r
73                         st2.ResultText(0,identityidstr);\r
74                 }\r
75                 st2.Reset();\r
76 \r
77                 content+="<tr>";\r
78                 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+"\">";\r
79                 if(identityidstr!="")\r
80                 {\r
81                         content+="<a href=\"peerdetails.htm?identityid="+identityidstr+"\">";\r
82                 }\r
83                 content+=SanitizeOutput(CreateShortIdentityName(name,publickey));\r
84                 if(identityidstr!="")\r
85                 {\r
86                         content+="</a>";\r
87                 }\r
88                 content+="</td>";\r
89                 content+="<td>"+CreateTrueFalseDropDown("singleuse["+countstr+"]",singleuse)+"</td>";\r
90                 content+="<td>"+CreateTrueFalseDropDown("publishtrustlist["+countstr+"]",publishtrustlist)+"</td>";\r
91                 content+="<td>"+CreateTrueFalseDropDown("publishboardlist["+countstr+"]",publishboardlist)+"</td>";\r
92                 content+="<td>"+CreateTrueFalseDropDown("publishfreesite["+countstr+"]",publishfreesite)+"</td>";\r
93                 content+="<td><input type=\"text\" size=\"2\" name=\"mindelay["+countstr+"]\" value=\""+minmessagedelay+"\"></td>";\r
94                 content+="<td><input type=\"text\" size=\"2\" name=\"maxdelay["+countstr+"]\" value=\""+maxmessagedelay+"\"></td>";\r
95                 \r
96                 trustst.Bind(0,publickey);\r
97                 trustst.Step();\r
98                 if(trustst.RowReturned())\r
99                 {\r
100                         std::string numlists="";\r
101                         trustst.ResultText(0,numlists);\r
102                         content+="<td>Yes ("+numlists+")</td>";\r
103                 }\r
104                 else\r
105                 {\r
106                         content+="<td>No</td>";\r
107                 }\r
108                 trustst.Reset();\r
109 \r
110                 content+="<td><input type=\"submit\" value=\"Update\"></form></td>";\r
111                 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
112                 content+="</tr>";\r
113                 content+="<tr><td></td><td colspan=\"7\" class=\"smaller\">"+publickey+"</td></tr>";\r
114                 st.Step();\r
115                 count++;\r
116         }\r
117 \r
118         content+="</table>";\r
119         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
120         content+="<p class=\"paragraph\">Single Use Identities will automatically be deleted 7 days after creation.</p>";\r
121         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
122 \r
123         return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
124 }\r
125 \r
126 void LocalIdentitiesPage::HandleDelete(const std::map<std::string,std::string> &queryvars)\r
127 {\r
128         int id=0;\r
129         std::vector<std::string> ids;\r
130         CreateArgArray(queryvars,"chkidentityid",ids);\r
131 \r
132         SQLite3DB::Statement del=m_db->Prepare("DELETE FROM tblLocalIdentity WHERE LocalIdentityID=?;");\r
133         for(int i=0; i<ids.size(); i++)\r
134         {\r
135                 if(ids[i]!="")\r
136                 {\r
137                         StringFunctions::Convert(ids[i],id);\r
138                         del.Bind(0,id);\r
139                         del.Step();\r
140                         del.Reset();\r
141                 }\r
142         }\r
143 }\r
144 \r
145 const std::string LocalIdentitiesPage::HandleExport()\r
146 {\r
147         IdentityExportXML xml;\r
148         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
149         exp.Step();\r
150         while(exp.RowReturned())\r
151         {\r
152                 std::string name="";\r
153                 std::string publickey="";\r
154                 std::string privatekey="";\r
155                 std::string tempval="";\r
156                 bool singleuse=false;\r
157                 bool publishtrustlist=false;\r
158                 bool publishboardlist=false;\r
159                 bool publishfreesite=false;\r
160 \r
161                 exp.ResultText(0,name);\r
162                 exp.ResultText(1,publickey);\r
163                 exp.ResultText(2,privatekey);\r
164                 exp.ResultText(3,tempval);\r
165                 if(tempval=="true")\r
166                 {\r
167                         singleuse=true;\r
168                 }\r
169                 exp.ResultText(4,tempval);\r
170                 if(tempval=="true")\r
171                 {\r
172                         publishtrustlist=true;\r
173                 }\r
174                 exp.ResultText(5,tempval);\r
175                 if(tempval=="true")\r
176                 {\r
177                         publishboardlist=true;\r
178                 }\r
179                 exp.ResultText(6,tempval);\r
180                 if(tempval=="true")\r
181                 {\r
182                         publishfreesite=true;\r
183                 }\r
184 \r
185                 xml.AddIdentity(name,publickey,privatekey,singleuse,publishtrustlist,publishboardlist,publishfreesite);\r
186 \r
187                 exp.Step();\r
188         }\r
189         return xml.GetXML();\r
190 }\r
191 \r
192 void LocalIdentitiesPage::HandleImport(const std::map<std::string,std::string> &queryvars)\r
193 {\r
194         if(queryvars.find("file")!=queryvars.end())\r
195         {\r
196                 IdentityExportXML xml;\r
197                 if(xml.ParseXML((*queryvars.find("file")).second))\r
198                 {\r
199                         SQLite3DB::Statement imp=m_db->Prepare("INSERT INTO tblLocalIdentity(Name,PublicKey,PrivateKey,SingleUse,PublishTrustList,PublishBoardList,PublishFreesite) VALUES(?,?,?,?,?,?,?);");\r
200                         for(int i=0; i<xml.GetCount(); i++)\r
201                         {\r
202                                 std::string tempval="false";\r
203                                 imp.Bind(0,xml.GetName(i));\r
204                                 imp.Bind(1,xml.GetPublicKey(i));\r
205                                 imp.Bind(2,xml.GetPrivateKey(i));\r
206                                 if(xml.GetSingleUse(i))\r
207                                 {\r
208                                         tempval="true";\r
209                                 }\r
210                                 else\r
211                                 {\r
212                                         tempval="false";\r
213                                 }\r
214                                 imp.Bind(3,tempval);\r
215                                 if(xml.GetPublishTrustList(i))\r
216                                 {\r
217                                         tempval="true";\r
218                                 }\r
219                                 else\r
220                                 {\r
221                                         tempval="false";\r
222                                 }\r
223                                 imp.Bind(4,tempval);\r
224                                 if(xml.GetPublishBoardList(i))\r
225                                 {\r
226                                         tempval="true";\r
227                                 }\r
228                                 else\r
229                                 {\r
230                                         tempval="false";\r
231                                 }\r
232                                 imp.Bind(5,tempval);\r
233                                 if(xml.GetPublishFreesite(i))\r
234                                 {\r
235                                         tempval="true";\r
236                                 }\r
237                                 else\r
238                                 {\r
239                                         tempval="false";\r
240                                 }\r
241                                 imp.Bind(6,tempval);\r
242                                 imp.Step();\r
243                                 imp.Reset();\r
244                         }\r
245                 }\r
246         }\r
247 }\r
248 \r
249 void LocalIdentitiesPage::handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response)\r
250 {\r
251         m_log->trace("LocalIdentitiesPages::handleRequest from "+request.clientAddress().toString());\r
252 \r
253         std::map<std::string,std::string> vars;\r
254         CreateQueryVarMap(request,vars);\r
255 \r
256         std::string formaction="";\r
257         if(vars.find("formaction")!=vars.end() && ValidateFormPassword(vars))\r
258         {\r
259                 formaction=(*vars.find("formaction")).second;\r
260                 if(formaction=="update")\r
261                 {\r
262                         HandleUpdate(vars);\r
263                 }\r
264                 else if(formaction=="delete")\r
265                 {\r
266                         HandleDelete(vars);\r
267                 }\r
268                 else if(formaction=="export")\r
269                 {\r
270                         response.setChunkedTransferEncoding(true);\r
271                         response.setContentType("application/xml");\r
272                         response.set("Content-Disposition","attachment; filename=identities.xml");\r
273                         std::ostream &out=response.send();\r
274                         out << HandleExport();\r
275                         return;\r
276                 }\r
277                 else if(formaction=="import")\r
278                 {\r
279                         HandleImport(vars);\r
280                 }\r
281         }\r
282 \r
283         response.setChunkedTransferEncoding(true);\r
284         response.setContentType("text/html");\r
285 \r
286         std::ostream &ostr = response.send();\r
287         ostr << GeneratePage(request.getMethod(),vars);\r
288 }\r
289 \r
290 void LocalIdentitiesPage::HandleUpdate(const std::map<std::string,std::string> &queryvars)\r
291 {\r
292         int id;\r
293         std::vector<std::string> ids;\r
294         std::vector<std::string> singleuse;\r
295         std::vector<std::string> publishtrustlist;\r
296         std::vector<std::string> publishboardlist;\r
297         std::vector<std::string> publishfreesite;\r
298         std::vector<std::string> mindelay;\r
299         std::vector<std::string> maxdelay;\r
300 \r
301         CreateArgArray(queryvars,"chkidentityid",ids);\r
302         CreateArgArray(queryvars,"singleuse",singleuse);\r
303         CreateArgArray(queryvars,"publishtrustlist",publishtrustlist);\r
304         CreateArgArray(queryvars,"publishboardlist",publishboardlist);\r
305         CreateArgArray(queryvars,"publishfreesite",publishfreesite);\r
306         CreateArgArray(queryvars,"mindelay",mindelay);\r
307         CreateArgArray(queryvars,"maxdelay",maxdelay);\r
308 \r
309         SQLite3DB::Statement update=m_db->Prepare("UPDATE tblLocalIdentity SET SingleUse=?, PublishTrustList=?, PublishBoardList=?, PublishFreesite=?, MinMessageDelay=?, MaxMessageDelay=? WHERE LocalIdentityID=?;");\r
310         for(int i=0; i<ids.size(); i++)\r
311         {\r
312                 if(ids[i]!="")\r
313                 {\r
314                         int minmessagedelay=0;\r
315                         int maxmessagedelay=0;\r
316                         StringFunctions::Convert(ids[i],id);\r
317                         StringFunctions::Convert(mindelay[i],minmessagedelay);\r
318                         StringFunctions::Convert(maxdelay[i],maxmessagedelay);\r
319                         update.Bind(0,singleuse[i]);\r
320                         update.Bind(1,publishtrustlist[i]);\r
321                         update.Bind(2,publishboardlist[i]);\r
322                         update.Bind(3,publishfreesite[i]);\r
323                         update.Bind(4,minmessagedelay);\r
324                         update.Bind(5,maxmessagedelay);\r
325                         update.Bind(6,id);\r
326                         update.Step();\r
327                         update.Reset();\r
328                 }\r
329         }\r
330 }\r
331 \r
332 const bool LocalIdentitiesPage::WillHandleURI(const std::string &uri)\r
333 {\r
334         if(uri.find("localidentities.")!=std::string::npos)\r
335         {\r
336                 return true;\r
337         }\r
338         else\r
339         {\r
340                 return false;\r
341         }\r
342 }\r