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