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
10 const std::string LocalIdentitiesPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)
\r
13 std::string countstr;
\r
14 std::string content="";
\r
16 content+="<h2>Local Identities</h2>";
\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
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
32 content+="</td></tr></table>";
\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
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
40 SQLite3DB::Statement st2=m_db->Prepare("SELECT IdentityID FROM tblIdentity WHERE PublicKey=?;");
\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
45 while(st.RowReturned())
\r
47 StringFunctions::Convert(count,countstr);
\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
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
69 st2.Bind(0,publickey);
\r
71 if(st2.RowReturned())
\r
73 st2.ResultText(0,identityidstr);
\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
81 content+="<a href=\"peerdetails.htm?identityid="+identityidstr+"\">";
\r
83 content+=SanitizeOutput(CreateShortIdentityName(name,publickey));
\r
84 if(identityidstr!="")
\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
96 trustst.Bind(0,publickey);
\r
98 if(trustst.RowReturned())
\r
100 std::string numlists="";
\r
101 trustst.ResultText(0,numlists);
\r
102 content+="<td>Yes ("+numlists+")</td>";
\r
106 content+="<td>No</td>";
\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
113 content+="<tr><td></td><td colspan=\"7\" class=\"smaller\">"+publickey+"</td></tr>";
\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
123 return StringFunctions::Replace(m_template,"[CONTENT]",content);
\r
126 void LocalIdentitiesPage::HandleDelete(const std::map<std::string,std::string> &queryvars)
\r
129 std::vector<std::string> ids;
\r
130 CreateArgArray(queryvars,"chkidentityid",ids);
\r
132 SQLite3DB::Statement del=m_db->Prepare("DELETE FROM tblLocalIdentity WHERE LocalIdentityID=?;");
\r
133 for(int i=0; i<ids.size(); i++)
\r
137 StringFunctions::Convert(ids[i],id);
\r
145 const std::string LocalIdentitiesPage::HandleExport()
\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
150 while(exp.RowReturned())
\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
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
169 exp.ResultText(4,tempval);
\r
170 if(tempval=="true")
\r
172 publishtrustlist=true;
\r
174 exp.ResultText(5,tempval);
\r
175 if(tempval=="true")
\r
177 publishboardlist=true;
\r
179 exp.ResultText(6,tempval);
\r
180 if(tempval=="true")
\r
182 publishfreesite=true;
\r
185 xml.AddIdentity(name,publickey,privatekey,singleuse,publishtrustlist,publishboardlist,publishfreesite);
\r
189 return xml.GetXML();
\r
192 void LocalIdentitiesPage::HandleImport(const std::map<std::string,std::string> &queryvars)
\r
194 if(queryvars.find("file")!=queryvars.end())
\r
196 IdentityExportXML xml;
\r
197 if(xml.ParseXML((*queryvars.find("file")).second))
\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
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
214 imp.Bind(3,tempval);
\r
215 if(xml.GetPublishTrustList(i))
\r
223 imp.Bind(4,tempval);
\r
224 if(xml.GetPublishBoardList(i))
\r
232 imp.Bind(5,tempval);
\r
233 if(xml.GetPublishFreesite(i))
\r
241 imp.Bind(6,tempval);
\r
249 void LocalIdentitiesPage::handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response)
\r
251 m_log->trace("LocalIdentitiesPages::handleRequest from "+request.clientAddress().toString());
\r
253 std::map<std::string,std::string> vars;
\r
254 CreateQueryVarMap(request,vars);
\r
256 std::string formaction="";
\r
257 if(vars.find("formaction")!=vars.end() && ValidateFormPassword(vars))
\r
259 formaction=(*vars.find("formaction")).second;
\r
260 if(formaction=="update")
\r
262 HandleUpdate(vars);
\r
264 else if(formaction=="delete")
\r
266 HandleDelete(vars);
\r
268 else if(formaction=="export")
\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
277 else if(formaction=="import")
\r
279 HandleImport(vars);
\r
283 response.setChunkedTransferEncoding(true);
\r
284 response.setContentType("text/html");
\r
286 std::ostream &ostr = response.send();
\r
287 ostr << GeneratePage(request.getMethod(),vars);
\r
290 void LocalIdentitiesPage::HandleUpdate(const std::map<std::string,std::string> &queryvars)
\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
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
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
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
332 const bool LocalIdentitiesPage::WillHandleURI(const std::string &uri)
\r
334 if(uri.find("localidentities.")!=std::string::npos)
\r