version 0.3.23
[fms.git] / src / http / pages / localidentitiespage.cpp
index 8b26238..7910789 100644 (file)
        #include <xmem.h>\r
 #endif\r
 \r
-const std::string LocalIdentitiesPage::CreateTrueFalseDropDown(const std::string &name, const std::string &selected)\r
-{\r
-       std::string rval="";\r
-\r
-       rval+="<select name=\""+name+"\">";\r
-       rval+="<option value=\"true\"";\r
-       if(selected=="true")\r
-       {\r
-               rval+=" SELECTED";\r
-       }\r
-       rval+=">true</option>";\r
-       rval+="<option value=\"false\"";\r
-       if(selected=="false")\r
-       {\r
-               rval+=" SELECTED";\r
-       }\r
-       rval+=">false</option>";\r
-       rval+="</select>";\r
-\r
-       return rval;\r
-}\r
-\r
 const std::string LocalIdentitiesPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
 {\r
        int count;\r
        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
-\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
-\r
-               if((*queryvars.find("formaction")).second=="update")\r
-               {\r
-                       SQLite3DB::Statement update=m_db->Prepare("UPDATE tblLocalIdentity SET SingleUse=?, PublishTrustList=?, PublishBoardList=?, PublishFreesite=? WHERE LocalIdentityID=?;");\r
-                       for(int i=0; i<ids.size(); i++)\r
-                       {\r
-                               if(ids[i]!="")\r
-                               {\r
-                                       StringFunctions::Convert(ids[i],id);\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,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
        content+="<tr><td>";\r
        content+="<form name=\"frmexport\" method=\"POST\">";\r
+       content+=CreateFormPassword();\r
        content+="<input type=\"hidden\" name=\"formaction\" value=\"export\">";\r
        content+="<input type=\"submit\" value=\"Export Identities\">";\r
        content+="</form>";\r
        content+="</td><td>";\r
        content+="<form name=\"frmimport\" method=\"POST\" enctype=\"multipart/form-data\">";\r
+       content+=CreateFormPassword();\r
        content+="<input type=\"hidden\" name=\"formaction\" value=\"import\">";\r
        content+="<input type=\"file\" name=\"file\">";\r
        content+="<input type=\"submit\" value=\"Import Identities\">";\r
@@ -204,12 +33,11 @@ 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>Announced? *</th></tr>";\r
+       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
 \r
-       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
+       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
        st.Step();\r
+       SQLite3DB::Statement st2=m_db->Prepare("SELECT IdentityID FROM tblIdentity WHERE PublicKey=?;");\r
 \r
        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
 \r
@@ -224,6 +52,9 @@ const std::string LocalIdentitiesPage::GeneratePage(const std::string &method, c
                std::string singleuse="";\r
                std::string publishboardlist="";\r
                std::string publishfreesite="";\r
+               std::string minmessagedelay="0";\r
+               std::string maxmessagedelay="0";\r
+               std::string identityidstr="";\r
 \r
                st.ResultText(0,id);\r
                st.ResultText(1,name);\r
@@ -232,14 +63,35 @@ const std::string LocalIdentitiesPage::GeneratePage(const std::string &method, c
                st.ResultText(4,singleuse);\r
                st.ResultText(5,publishboardlist);\r
                st.ResultText(7,publishfreesite);\r
+               st.ResultText(8,minmessagedelay);\r
+               st.ResultText(9,maxmessagedelay);\r
+\r
+               st2.Bind(0,publickey);\r
+               st2.Step();\r
+               if(st2.RowReturned())\r
+               {\r
+                       st2.ResultText(0,identityidstr);\r
+               }\r
+               st2.Reset();\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 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
+               if(identityidstr!="")\r
+               {\r
+                       content+="<a href=\"peerdetails.htm?identityid="+identityidstr+"\">";\r
+               }\r
+               content+=SanitizeOutput(CreateShortIdentityName(name,publickey));\r
+               if(identityidstr!="")\r
+               {\r
+                       content+="</a>";\r
+               }\r
+               content+="</td>";\r
                content+="<td>"+CreateTrueFalseDropDown("singleuse["+countstr+"]",singleuse)+"</td>";\r
                content+="<td>"+CreateTrueFalseDropDown("publishtrustlist["+countstr+"]",publishtrustlist)+"</td>";\r
                content+="<td>"+CreateTrueFalseDropDown("publishboardlist["+countstr+"]",publishboardlist)+"</td>";\r
                content+="<td>"+CreateTrueFalseDropDown("publishfreesite["+countstr+"]",publishfreesite)+"</td>";\r
+               content+="<td><input type=\"text\" size=\"2\" name=\"mindelay["+countstr+"]\" value=\""+minmessagedelay+"\"></td>";\r
+               content+="<td><input type=\"text\" size=\"2\" name=\"maxdelay["+countstr+"]\" value=\""+maxmessagedelay+"\"></td>";\r
                \r
                trustst.Bind(0,publickey);\r
                trustst.Step();\r
@@ -255,30 +107,226 @@ 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\"><input type=\"hidden\" name=\"formaction\" value=\"delete\"><input type=\"hidden\" name=\"chkidentityid["+countstr+"]\" value=\""+id+"\"><input type=\"submit\" value=\"Delete\"></form></td>";\r
+               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
                content+="</tr>";\r
+               content+="<tr><td></td><td colspan=\"7\" class=\"smaller\">"+publickey+"</td></tr>";\r
                st.Step();\r
                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\">* 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
        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 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
-       return "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"+StringFunctions::Replace(m_template,"[CONTENT]",content);\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() && ValidateFormPassword(vars))\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