version 0.3.23
[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 class=\"small90\"><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.  You must trust other identities' trust lists for this to happen.  The number in parenthesis is how many trust lists the 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