version 0.3.0
[fms.git] / src / http / pages / localidentitiespage.cpp
index 9aca3f3..5fa76b5 100644 (file)
@@ -13,167 +13,6 @@ const std::string LocalIdentitiesPage::GeneratePage(const std::string &method, c
        std::string countstr;\r
        std::string content="";\r
 \r
-       if(queryvars.find("formaction")!=queryvars.end())\r
-       {\r
-               int id;\r
-               std::vector<std::string> ids;\r
-               std::vector<std::string> singleuse;\r
-               std::vector<std::string> publishtrustlist;\r
-               std::vector<std::string> publishboardlist;\r
-               std::vector<std::string> publishfreesite;\r
-               std::vector<std::string> mindelay;\r
-               std::vector<std::string> maxdelay;\r
-\r
-               CreateArgArray(queryvars,"chkidentityid",ids);\r
-               CreateArgArray(queryvars,"singleuse",singleuse);\r
-               CreateArgArray(queryvars,"publishtrustlist",publishtrustlist);\r
-               CreateArgArray(queryvars,"publishboardlist",publishboardlist);\r
-               CreateArgArray(queryvars,"publishfreesite",publishfreesite);\r
-               CreateArgArray(queryvars,"mindelay",mindelay);\r
-               CreateArgArray(queryvars,"maxdelay",maxdelay);\r
-\r
-               if((*queryvars.find("formaction")).second=="update")\r
-               {\r
-                       SQLite3DB::Statement update=m_db->Prepare("UPDATE tblLocalIdentity SET SingleUse=?, PublishTrustList=?, PublishBoardList=?, PublishFreesite=?, MinMessageDelay=?, MaxMessageDelay=? WHERE LocalIdentityID=?;");\r
-                       for(int i=0; i<ids.size(); i++)\r
-                       {\r
-                               if(ids[i]!="")\r
-                               {\r
-                                       int minmessagedelay=0;\r
-                                       int maxmessagedelay=0;\r
-                                       StringFunctions::Convert(ids[i],id);\r
-                                       StringFunctions::Convert(mindelay[i],minmessagedelay);\r
-                                       StringFunctions::Convert(maxdelay[i],maxmessagedelay);\r
-                                       update.Bind(0,singleuse[i]);\r
-                                       update.Bind(1,publishtrustlist[i]);\r
-                                       update.Bind(2,publishboardlist[i]);\r
-                                       update.Bind(3,publishfreesite[i]);\r
-                                       update.Bind(4,minmessagedelay);\r
-                                       update.Bind(5,maxmessagedelay);\r
-                                       update.Bind(6,id);\r
-                                       update.Step();\r
-                                       update.Reset();\r
-                               }\r
-                       }\r
-               }\r
-               if((*queryvars.find("formaction")).second=="delete")\r
-               {\r
-                       SQLite3DB::Statement del=m_db->Prepare("DELETE FROM tblLocalIdentity WHERE LocalIdentityID=?;");\r
-                       for(int i=0; i<ids.size(); i++)\r
-                       {\r
-                               if(ids[i]!="")\r
-                               {\r
-                                       StringFunctions::Convert(ids[i],id);\r
-                                       del.Bind(0,id);\r
-                                       del.Step();\r
-                                       del.Reset();\r
-                               }\r
-                       }\r
-               }\r
-               if((*queryvars.find("formaction")).second=="export")\r
-               {\r
-                       IdentityExportXML xml;\r
-                       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
-                       exp.Step();\r
-                       while(exp.RowReturned())\r
-                       {\r
-                               std::string name="";\r
-                               std::string publickey="";\r
-                               std::string privatekey="";\r
-                               std::string tempval="";\r
-                               bool singleuse=false;\r
-                               bool publishtrustlist=false;\r
-                               bool publishboardlist=false;\r
-                               bool publishfreesite=false;\r
-\r
-                               exp.ResultText(0,name);\r
-                               exp.ResultText(1,publickey);\r
-                               exp.ResultText(2,privatekey);\r
-                               exp.ResultText(3,tempval);\r
-                               if(tempval=="true")\r
-                               {\r
-                                       singleuse=true;\r
-                               }\r
-                               exp.ResultText(4,tempval);\r
-                               if(tempval=="true")\r
-                               {\r
-                                       publishtrustlist=true;\r
-                               }\r
-                               exp.ResultText(5,tempval);\r
-                               if(tempval=="true")\r
-                               {\r
-                                       publishboardlist=true;\r
-                               }\r
-                               exp.ResultText(6,tempval);\r
-                               if(tempval=="true")\r
-                               {\r
-                                       publishfreesite=true;\r
-                               }\r
-\r
-                               xml.AddIdentity(name,publickey,privatekey,singleuse,publishtrustlist,publishboardlist,publishfreesite);\r
-\r
-                               exp.Step();\r
-                       }\r
-                       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
-               }\r
-               if((*queryvars.find("formaction")).second=="import")\r
-               {\r
-                       if(queryvars.find("file")!=queryvars.end())\r
-                       {\r
-                               IdentityExportXML xml;\r
-                               if(xml.ParseXML((*queryvars.find("file")).second))\r
-                               {\r
-                                       SQLite3DB::Statement imp=m_db->Prepare("INSERT INTO tblLocalIdentity(Name,PublicKey,PrivateKey,SingleUse,PublishTrustList,PublishBoardList,PublishFreesite) VALUES(?,?,?,?,?,?,?);");\r
-                                       for(int i=0; i<xml.GetCount(); i++)\r
-                                       {\r
-                                               std::string tempval="false";\r
-                                               imp.Bind(0,xml.GetName(i));\r
-                                               imp.Bind(1,xml.GetPublicKey(i));\r
-                                               imp.Bind(2,xml.GetPrivateKey(i));\r
-                                               if(xml.GetSingleUse(i))\r
-                                               {\r
-                                                       tempval="true";\r
-                                               }\r
-                                               else\r
-                                               {\r
-                                                       tempval="false";\r
-                                               }\r
-                                               imp.Bind(3,tempval);\r
-                                               if(xml.GetPublishTrustList(i))\r
-                                               {\r
-                                                       tempval="true";\r
-                                               }\r
-                                               else\r
-                                               {\r
-                                                       tempval="false";\r
-                                               }\r
-                                               imp.Bind(4,tempval);\r
-                                               if(xml.GetPublishBoardList(i))\r
-                                               {\r
-                                                       tempval="true";\r
-                                               }\r
-                                               else\r
-                                               {\r
-                                                       tempval="false";\r
-                                               }\r
-                                               imp.Bind(5,tempval);\r
-                                               if(xml.GetPublishFreesite(i))\r
-                                               {\r
-                                                       tempval="true";\r
-                                               }\r
-                                               else\r
-                                               {\r
-                                                       tempval="false";\r
-                                               }\r
-                                               imp.Bind(6,tempval);\r
-                                               imp.Step();\r
-                                               imp.Reset();\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
        content+="<h2>Local Identities</h2>";\r
 \r
        content+="<table><tr><th>Export Identities</th><th>Import Identities</th></tr>";\r
@@ -192,8 +31,6 @@ const std::string LocalIdentitiesPage::GeneratePage(const std::string &method, c
 \r
        content+="<hr>";\r
 \r
-//     content+="<form name=\"frmlocalidentity\" method=\"POST\">";\r
-//     content+="<input type=\"hidden\" name=\"formaction\" value=\"update\">";\r
        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
 \r
        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
@@ -226,7 +63,6 @@ const std::string LocalIdentitiesPage::GeneratePage(const std::string &method, c
                st.ResultText(9,maxmessagedelay);\r
 \r
                content+="<tr>";\r
-//             content+="<td><input type=\"checkbox\" name=\"chkidentityid["+countstr+"]\" value=\""+id+"\"></td>";\r
                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
                content+="<td>"+CreateTrueFalseDropDown("singleuse["+countstr+"]",singleuse)+"</td>";\r
                content+="<td>"+CreateTrueFalseDropDown("publishtrustlist["+countstr+"]",publishtrustlist)+"</td>";\r
@@ -249,17 +85,6 @@ const std::string LocalIdentitiesPage::GeneratePage(const std::string &method, c
                }\r
                trustst.Reset();\r
 \r
-/*\r
-               if(st.ResultNull(6))\r
-               {\r
-                       content+="<td>No</td>";\r
-               }\r
-               else\r
-               {\r
-                       content+="<td>Yes</td>";\r
-               }\r
-*/\r
-\r
                content+="<td><input type=\"submit\" value=\"Update\"></form></td>";\r
                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
                content+="</tr>";\r
@@ -268,13 +93,218 @@ const std::string LocalIdentitiesPage::GeneratePage(const std::string &method, c
                count++;\r
        }\r
 \r
-//     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
        content+="</table>";\r
        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
        content+="<p class=\"paragraph\">Single Use Identities will automatically be deleted 7 days after creation.</p>";\r
        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
 \r
-       return "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"+StringFunctions::Replace(m_template,"[CONTENT]",content);\r
+       return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
+}\r
+\r
+void LocalIdentitiesPage::HandleDelete(const std::map<std::string,std::string> &queryvars)\r
+{\r
+       int id=0;\r
+       std::vector<std::string> ids;\r
+       CreateArgArray(queryvars,"chkidentityid",ids);\r
+\r
+       SQLite3DB::Statement del=m_db->Prepare("DELETE FROM tblLocalIdentity WHERE LocalIdentityID=?;");\r
+       for(int i=0; i<ids.size(); i++)\r
+       {\r
+               if(ids[i]!="")\r
+               {\r
+                       StringFunctions::Convert(ids[i],id);\r
+                       del.Bind(0,id);\r
+                       del.Step();\r
+                       del.Reset();\r
+               }\r
+       }\r
+}\r
+\r
+const std::string LocalIdentitiesPage::HandleExport()\r
+{\r
+       IdentityExportXML xml;\r
+       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
+       exp.Step();\r
+       while(exp.RowReturned())\r
+       {\r
+               std::string name="";\r
+               std::string publickey="";\r
+               std::string privatekey="";\r
+               std::string tempval="";\r
+               bool singleuse=false;\r
+               bool publishtrustlist=false;\r
+               bool publishboardlist=false;\r
+               bool publishfreesite=false;\r
+\r
+               exp.ResultText(0,name);\r
+               exp.ResultText(1,publickey);\r
+               exp.ResultText(2,privatekey);\r
+               exp.ResultText(3,tempval);\r
+               if(tempval=="true")\r
+               {\r
+                       singleuse=true;\r
+               }\r
+               exp.ResultText(4,tempval);\r
+               if(tempval=="true")\r
+               {\r
+                       publishtrustlist=true;\r
+               }\r
+               exp.ResultText(5,tempval);\r
+               if(tempval=="true")\r
+               {\r
+                       publishboardlist=true;\r
+               }\r
+               exp.ResultText(6,tempval);\r
+               if(tempval=="true")\r
+               {\r
+                       publishfreesite=true;\r
+               }\r
+\r
+               xml.AddIdentity(name,publickey,privatekey,singleuse,publishtrustlist,publishboardlist,publishfreesite);\r
+\r
+               exp.Step();\r
+       }\r
+       return xml.GetXML();\r
+}\r
+\r
+void LocalIdentitiesPage::HandleImport(const std::map<std::string,std::string> &queryvars)\r
+{\r
+       if(queryvars.find("file")!=queryvars.end())\r
+       {\r
+               IdentityExportXML xml;\r
+               if(xml.ParseXML((*queryvars.find("file")).second))\r
+               {\r
+                       SQLite3DB::Statement imp=m_db->Prepare("INSERT INTO tblLocalIdentity(Name,PublicKey,PrivateKey,SingleUse,PublishTrustList,PublishBoardList,PublishFreesite) VALUES(?,?,?,?,?,?,?);");\r
+                       for(int i=0; i<xml.GetCount(); i++)\r
+                       {\r
+                               std::string tempval="false";\r
+                               imp.Bind(0,xml.GetName(i));\r
+                               imp.Bind(1,xml.GetPublicKey(i));\r
+                               imp.Bind(2,xml.GetPrivateKey(i));\r
+                               if(xml.GetSingleUse(i))\r
+                               {\r
+                                       tempval="true";\r
+                               }\r
+                               else\r
+                               {\r
+                                       tempval="false";\r
+                               }\r
+                               imp.Bind(3,tempval);\r
+                               if(xml.GetPublishTrustList(i))\r
+                               {\r
+                                       tempval="true";\r
+                               }\r
+                               else\r
+                               {\r
+                                       tempval="false";\r
+                               }\r
+                               imp.Bind(4,tempval);\r
+                               if(xml.GetPublishBoardList(i))\r
+                               {\r
+                                       tempval="true";\r
+                               }\r
+                               else\r
+                               {\r
+                                       tempval="false";\r
+                               }\r
+                               imp.Bind(5,tempval);\r
+                               if(xml.GetPublishFreesite(i))\r
+                               {\r
+                                       tempval="true";\r
+                               }\r
+                               else\r
+                               {\r
+                                       tempval="false";\r
+                               }\r
+                               imp.Bind(6,tempval);\r
+                               imp.Step();\r
+                               imp.Reset();\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+void LocalIdentitiesPage::handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response)\r
+{\r
+       m_log->trace("LocalIdentitiesPages::handleRequest from "+request.clientAddress().toString());\r
+\r
+       std::map<std::string,std::string> vars;\r
+       CreateQueryVarMap(request,vars);\r
+\r
+       std::string formaction="";\r
+       if(vars.find("formaction")!=vars.end())\r
+       {\r
+               formaction=(*vars.find("formaction")).second;\r
+               if(formaction=="update")\r
+               {\r
+                       HandleUpdate(vars);\r
+               }\r
+               else if(formaction=="delete")\r
+               {\r
+                       HandleDelete(vars);\r
+               }\r
+               else if(formaction=="export")\r
+               {\r
+                       response.setChunkedTransferEncoding(true);\r
+                       response.setContentType("application/xml");\r
+                       response.set("Content-Disposition","attachment; filename=identities.xml");\r
+                       std::ostream &out=response.send();\r
+                       out << HandleExport();\r
+                       return;\r
+               }\r
+               else if(formaction=="import")\r
+               {\r
+                       HandleImport(vars);\r
+               }\r
+       }\r
+\r
+       response.setChunkedTransferEncoding(true);\r
+       response.setContentType("text/html");\r
+\r
+       std::ostream &ostr = response.send();\r
+       ostr << GeneratePage(request.getMethod(),vars);\r
+}\r
+\r
+void LocalIdentitiesPage::HandleUpdate(const std::map<std::string,std::string> &queryvars)\r
+{\r
+       int id;\r
+       std::vector<std::string> ids;\r
+       std::vector<std::string> singleuse;\r
+       std::vector<std::string> publishtrustlist;\r
+       std::vector<std::string> publishboardlist;\r
+       std::vector<std::string> publishfreesite;\r
+       std::vector<std::string> mindelay;\r
+       std::vector<std::string> maxdelay;\r
+\r
+       CreateArgArray(queryvars,"chkidentityid",ids);\r
+       CreateArgArray(queryvars,"singleuse",singleuse);\r
+       CreateArgArray(queryvars,"publishtrustlist",publishtrustlist);\r
+       CreateArgArray(queryvars,"publishboardlist",publishboardlist);\r
+       CreateArgArray(queryvars,"publishfreesite",publishfreesite);\r
+       CreateArgArray(queryvars,"mindelay",mindelay);\r
+       CreateArgArray(queryvars,"maxdelay",maxdelay);\r
+\r
+       SQLite3DB::Statement update=m_db->Prepare("UPDATE tblLocalIdentity SET SingleUse=?, PublishTrustList=?, PublishBoardList=?, PublishFreesite=?, MinMessageDelay=?, MaxMessageDelay=? WHERE LocalIdentityID=?;");\r
+       for(int i=0; i<ids.size(); i++)\r
+       {\r
+               if(ids[i]!="")\r
+               {\r
+                       int minmessagedelay=0;\r
+                       int maxmessagedelay=0;\r
+                       StringFunctions::Convert(ids[i],id);\r
+                       StringFunctions::Convert(mindelay[i],minmessagedelay);\r
+                       StringFunctions::Convert(maxdelay[i],maxmessagedelay);\r
+                       update.Bind(0,singleuse[i]);\r
+                       update.Bind(1,publishtrustlist[i]);\r
+                       update.Bind(2,publishboardlist[i]);\r
+                       update.Bind(3,publishfreesite[i]);\r
+                       update.Bind(4,minmessagedelay);\r
+                       update.Bind(5,maxmessagedelay);\r
+                       update.Bind(6,id);\r
+                       update.Step();\r
+                       update.Reset();\r
+               }\r
+       }\r
 }\r
 \r
 const bool LocalIdentitiesPage::WillHandleURI(const std::string &uri)\r