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 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
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. 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
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