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