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