version 0.2.22
authorSomeDude <SomeDude@NuBL7aaJ6Cn4fB7GXFb9Zfi8w1FhPyW3oKgU9TweZMw>
Sun, 15 Jun 2008 11:14:00 +0000 (13:14 +0200)
committerDavid ‘Bombe’ Roden <bombe@freenetproject.org>
Sun, 15 Jun 2008 11:14:00 +0000 (13:14 +0200)
12 files changed:
CMakeLists.txt
include/global.h
include/http/pages/confirmpage.h [new file with mode: 0644]
include/http/pages/optionspage.h
src/global.cpp
src/http/httpthread.cpp
src/http/ipagehandler.cpp
src/http/pages/confirmpage.cpp [new file with mode: 0644]
src/http/pages/localidentitiespage.cpp
src/http/pages/optionspage.cpp
src/http/pages/peermaintenancepage.cpp
src/http/pages/peertrustpage.cpp

index dad91d6..cfb7d40 100644 (file)
@@ -67,6 +67,7 @@ src/http/ipagehandler.cpp
 src/http/pages/addpeerpage.cpp\r
 src/http/pages/announceidentitypage.cpp\r
 src/http/pages/boardspage.cpp\r
+src/http/pages/confirmpage.cpp\r
 src/http/pages/controlboardpage.cpp\r
 src/http/pages/createidentitypage.cpp\r
 src/http/pages/execquerypage.cpp\r
index 047c917..529ef3b 100644 (file)
@@ -5,7 +5,7 @@
 #include <vector>\r
 #include "pthreadwrapper/thread.h"\r
 \r
-#define FMS_VERSION    "0.2.21"\r
+#define FMS_VERSION    "0.2.22"\r
 \r
 // opens database and creates tables and initial inserts if necessary\r
 void SetupDB();\r
@@ -19,6 +19,7 @@ void ConvertDB0107To0108();
 void ConvertDB0108To0109();\r
 void ConvertDB0109To0110();\r
 void ConvertDB0110To0111();\r
+void ConvertDB0111To0112();\r
 // inserts default options into the database\r
 void SetupDefaultOptions();\r
 // opens logfile and sets it up\r
diff --git a/include/http/pages/confirmpage.h b/include/http/pages/confirmpage.h
new file mode 100644 (file)
index 0000000..10ee226
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef _confirmpage_\r
+#define _confirmpage_\r
+\r
+#include "../ipagehandler.h"\r
+\r
+class ConfirmPage:public IPageHandler\r
+{\r
+public:\r
+       ConfirmPage(const std::string &templatestr):IPageHandler(templatestr)           {}\r
+\r
+private:\r
+       const bool WillHandleURI(const std::string &uri);\r
+       const std::string GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars);\r
+       \r
+};\r
+\r
+#endif // _confirmpage_\r
index 6ca15db..414875d 100644 (file)
@@ -12,6 +12,7 @@ public:
 private:\r
        const bool WillHandleURI(const std::string &uri);\r
        const std::string GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars);\r
+       const std::string CreateDropDown(const std::string &name, const std::vector<std::string> &items, const std::string &selecteditem);\r
 };\r
 \r
 #endif // _optionspage_\r
index cfd458c..872dfb7 100644 (file)
@@ -126,18 +126,27 @@ void SetupDB()
                        major=1;\r
                        minor=11;\r
                }\r
+               if(major==1 && minor==11)\r
+               {\r
+                       ConvertDB0111To0112();\r
+                       major=1;\r
+                       minor=12;\r
+               }\r
        }\r
        else\r
        {\r
-               db->Execute("INSERT INTO tblDBVersion(Major,Minor) VALUES(1,11);");\r
+               db->Execute("INSERT INTO tblDBVersion(Major,Minor) VALUES(1,12);");\r
        }\r
 \r
-       db->Execute("UPDATE tblDBVersion SET Major=1, Minor=11;");\r
+       db->Execute("UPDATE tblDBVersion SET Major=1, Minor=12;");\r
 \r
        db->Execute("CREATE TABLE IF NOT EXISTS tblOption(\\r
                                Option                          TEXT UNIQUE,\\r
                                OptionValue                     TEXT NOT NULL,\\r
-                               OptionDescription       TEXT\\r
+                               OptionDescription       TEXT,\\r
+                               Section                         TEXT,\\r
+                               SortOrder                       INTEGER,\\r
+                               ValidValues                     TEXT\\r
                                );");\r
 \r
        db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentity(\\r
@@ -210,7 +219,8 @@ void SetupDB()
                                LocalTrustListTrust             INTEGER CHECK(LocalTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
                                PeerTrustListTrust              INTEGER CHECK(PeerTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
                                AddedMethod                             TEXT,\\r
-                               Hidden                                  BOOL CHECK(Hidden IN('true','false')) DEFAULT 'false'\\r
+                               Hidden                                  BOOL CHECK(Hidden IN('true','false')) DEFAULT 'false',\\r
+                               PurgeDate                               DATETIME\\r
                                );");\r
 \r
        db->Execute("CREATE TABLE IF NOT EXISTS tblIdentityRequests(\\r
@@ -395,6 +405,11 @@ void SetupDB()
                                Date                            DATETIME\\r
                                );");\r
 \r
+       // A temporary table that will hold a local identity id of the last identity who was loaded in the trust list page\r
+       db->Execute("CREATE TEMPORARY TABLE IF NOT EXISTS tmpLocalIdentityPeerTrustPage(\\r
+                               LocalIdentityID         INTEGER\\r
+                               );");\r
+\r
        // low / high / message count for each board\r
        db->Execute("CREATE VIEW IF NOT EXISTS vwBoardStats AS \\r
                                SELECT tblBoard.BoardID AS 'BoardID', IFNULL(MIN(MessageID),0) AS 'LowMessageID', IFNULL(MAX(MessageID),0) AS 'HighMessageID', COUNT(MessageID) AS 'MessageCount' \\r
@@ -739,6 +754,23 @@ void ConvertDB0110To0111()
        db->Execute("UPDATE tblDBVersion SET Major=1, Minor=11;");\r
 }\r
 \r
+void ConvertDB0111To0112()\r
+{\r
+       /*\r
+               Add Section, SortOrder, ValidValues to tblOption\r
+               Add PurgeDate to tblIdentity\r
+       */\r
+       SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
+\r
+       db->Execute("ALTER TABLE tblOption ADD COLUMN Section TEXT;");\r
+       db->Execute("ALTER TABLE tblOption ADD COLUMN SortOrder INTEGER;");\r
+       db->Execute("ALTER TABLE tblOption ADD COLUMN ValidValues TEXT;");\r
+\r
+       db->Execute("ALTER TABLE tblIdentity ADD COLUMN PurgeDate DATETIME;");\r
+\r
+       db->Execute("UPDATE tblDBVersion SET Major=1, Minor=12;");\r
+}\r
+\r
 void SetupDefaultOptions()\r
 {\r
        // OptionValue should always be inserted as a string, even if the option really isn't a string - just to keep the field data type consistent\r
@@ -746,6 +778,8 @@ void SetupDefaultOptions()
        std::ostringstream tempstr;     // must set tempstr to "" between db inserts\r
        SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
        SQLite3DB::Statement st=db->Prepare("INSERT INTO tblOption(Option,OptionValue,OptionDescription) VALUES(?,?,?);");\r
+       SQLite3DB::Statement upd=db->Prepare("UPDATE tblOption SET Section=?, SortOrder=?, ValidValues=? WHERE Option=?;");\r
+       int order=0;\r
 \r
        // LogLevel\r
        tempstr.str("");\r
@@ -755,6 +789,49 @@ void SetupDefaultOptions()
        st.Bind(2,"The maximum logging level that will be written to file.  0=Fatal Errors, 1=Errors, 2=Warnings, 3=Informational Messages, 4=Debug Messages.  Higher levels will include all messages from the previous levels.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Program");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2,"0|0 - Fatal Errors|1|1 - Errors|2|2 - Warnings|3|3 - Informational Messages|4|4 - Debug Messages");\r
+       upd.Bind(3,"LogLevel");\r
+       upd.Step();\r
+       upd.Reset();\r
+\r
+       st.Bind(0,"VacuumOnStartup");\r
+       st.Bind(1,"false");\r
+       st.Bind(2,"VACUUM the database every time FMS starts.  This will defragment the free space in the database and create a smaller database file.  Vacuuming the database can be CPU and disk intensive.");\r
+       st.Step();\r
+       st.Reset();\r
+       upd.Bind(0,"Program");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2,"true|true|false|false");\r
+       upd.Bind(3,"VacuumOnStartup");\r
+       upd.Step();\r
+       upd.Reset();\r
+\r
+       st.Bind(0,"MessageBase");\r
+       st.Bind(1,"fms");\r
+       st.Bind(2,"A unique string shared by all clients who want to communicate with each other.  This should not be changed unless you want to create your own separate communications network.");\r
+       st.Step();\r
+       st.Reset();\r
+       upd.Bind(0,"Program");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MessageBase");\r
+       upd.Step();\r
+       upd.Reset();\r
+\r
+       // StartNNTP\r
+       st.Bind(0,"StartNNTP");\r
+       st.Bind(1,"true");\r
+       st.Bind(2,"Start NNTP server.");\r
+       st.Step();\r
+       st.Reset();\r
+       upd.Bind(0,"NNTP Server");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2,"true|true|false|false");\r
+       upd.Bind(3,"StartNNTP");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        // NNTPListenPort\r
        st.Bind(0,"NNTPListenPort");\r
@@ -762,6 +839,12 @@ void SetupDefaultOptions()
        st.Bind(2,"The port that the NNTP service will listen for incoming connections.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"NNTP Server");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"NNTPListenPort");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        // NNTPBindAddresses\r
        st.Bind(0,"NNTPBindAddresses");\r
@@ -769,37 +852,60 @@ void SetupDefaultOptions()
        st.Bind(2,"A comma separated list of valid IPv4 or IPv6 addresses/hostnames that the NNTP service will try to bind to.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"NNTP Server");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"NNTPBindAddresses");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"NNTPAllowPost");\r
        st.Bind(1,"true");\r
        st.Bind(2,"Allow posting messages from NNTP.  Setting to false will make the newsgroups read only.");\r
        st.Step();\r
        st.Reset();\r
-\r
-       // StartNNTP\r
-       st.Bind(0,"StartNNTP");\r
-       st.Bind(1,"true");\r
-       st.Bind(2,"Start NNTP server.");\r
-       st.Step();\r
-       st.Reset();\r
+       upd.Bind(0,"NNTP Server");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2,"true|true|false|false");\r
+       upd.Bind(3,"NNTPAllowPost");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"StartHTTP");\r
        st.Bind(1,"true");\r
        st.Bind(2,"Start HTTP server.  WARNING: If you turn this off, you won't be able to access the administration pages.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"HTTP Server");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2,"true|true|false|false");\r
+       upd.Bind(3,"StartHTTP");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"HTTPListenPort");\r
        st.Bind(1,"8080");\r
        st.Bind(2,"Port HTTP server will listen on.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"HTTP Server");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"HTTPListenPort");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"HTTPAccessControl");\r
        st.Bind(1,"-0.0.0.0/0,+127.0.0.1");\r
        st.Bind(2,"Comma separated list of addresses and/or subnet masks that are allowed access to the administration pages.  Default is localhost only. + allows a host, - denies a host.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"HTTP Server");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"HTTPAccessControl");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        // StartFreenetUpdater\r
        st.Bind(0,"StartFreenetUpdater");\r
@@ -807,6 +913,12 @@ void SetupDefaultOptions()
        st.Bind(2,"Set to true to start the Freenet Updater thread and connect to Freenet.  Set to false to prevent communication with Freenet.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Freenet Connection");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2,"true|true|false|false");\r
+       upd.Bind(3,"StartFreenetUpdater");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        // FCPHost\r
        st.Bind(0,"FCPHost");\r
@@ -814,6 +926,12 @@ void SetupDefaultOptions()
        st.Bind(2,"Host name or address of Freenet node.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Freenet Connection");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"FCPHost");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        // FCPPort\r
        st.Bind(0,"FCPPort");\r
@@ -821,144 +939,264 @@ void SetupDefaultOptions()
        st.Bind(2,"The port that Freenet is listening for FCP connections on.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Freenet Connection");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"FCPPort");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"FProxyPort");\r
        st.Bind(1,"8888");\r
        st.Bind(2,"The port that Freenet is listening for http connections on.");\r
        st.Step();\r
        st.Reset();\r
-\r
-       st.Bind(0,"MessageBase");\r
-       st.Bind(1,"fms");\r
-       st.Bind(2,"A unique string shared by all clients who want to communicate with each other.  This should not be changed unless you want to create your own separate communications network.");\r
-       st.Step();\r
-       st.Reset();\r
+       upd.Bind(0,"Freenet Connection");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"FProxyPort");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MaxIdentityRequests");\r
        st.Bind(1,"5");\r
        st.Bind(2,"Maximum number of concurrent requests for new Identity xml files");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Requests");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MaxIdentityRequests");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MaxIdentityIntroductionRequests");\r
        st.Bind(1,"5");\r
        st.Bind(2,"Maximum number of concurrent identities requesting IdentityIntroduction xml files.  Each identity may have multiple requests pending.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Requests");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MaxIdentityIntroductionRequests");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MaxIntroductionPuzzleRequests");\r
        st.Bind(1,"5");\r
        st.Bind(2,"Maximum number of concurrent requests for new IntroductionPuzzle xml files");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Requests");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MaxIntroductionPuzzleRequests");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MaxTrustListRequests");\r
        st.Bind(1,"5");\r
        st.Bind(2,"Maximum number of concurrent requests for new Trust Lists");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Requests");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MaxTrustListRequests");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MaxMessageListRequests");\r
        st.Bind(1,"5");\r
        st.Bind(2,"Maximum number of concurrent requests for new Message Lists");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Requests");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MaxMessageListRequests");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MaxMessageRequests");\r
        st.Bind(1,"20");\r
        st.Bind(2,"Maximum number of concurrent requests for new Messages");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Requests");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MaxMessageRequests");\r
+       upd.Step();\r
+       upd.Reset();\r
+\r
+       st.Bind(0,"MaxBoardListRequests");\r
+       st.Bind(1,"5");\r
+       st.Bind(2,"The maximum number of concurrent requests for new Board Lists.  Set to 0 to disable.");\r
+       st.Step();\r
+       st.Reset();\r
+       upd.Bind(0,"Requests");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MaxBoardListRequests");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MinLocalMessageTrust");\r
        st.Bind(1,"50");\r
        st.Bind(2,"Specifies a local message trust level that a peer must have before its messages will be downloaded.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Trust");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MinLocalMessageTrust");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MinPeerMessageTrust");\r
        st.Bind(1,"30");\r
        st.Bind(2,"Specifies a peer message trust level that a peer must have before its messages will be downloaded.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Trust");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MinPeerMessageTrust");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MinLocalTrustListTrust");\r
        st.Bind(1,"50");\r
        st.Bind(2,"Specifies a local trust list trust level that a peer must have before its trust list will be included in the weighted average.  Any peers below this number will be excluded from the results.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Trust");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MinLocalTrustListTrust");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MinPeerTrustListTrust");\r
        st.Bind(1,"30");\r
        st.Bind(2,"Specifies a peer trust list trust level that a peer must have before its trust list will be included in the weighted average.  Any peers below this number will be excluded from the results.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Trust");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MinPeerTrustListTrust");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"LocalTrustOverridesPeerTrust");\r
        st.Bind(1,"false");\r
        st.Bind(2,"Set to true if you want your local trust levels to override the peer levels when determining which identities you will poll.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Trust");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2,"true|true|false|false");\r
+       upd.Bind(3,"LocalTrustOverridesPeerTrust");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MessageDownloadMaxDaysBackward");\r
        st.Bind(1,"5");\r
        st.Bind(2,"The maximum number of days backward that messages will be downloaded from each identity");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Messages");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MessageDownloadMaxDaysBackward");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MessageListDaysBackward");\r
        st.Bind(1,"5");\r
        st.Bind(2,"The number of days backward that messages you have inserted will appear in your MessageLists");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Messages");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MessageListDaysBackward");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MaxPeerMessagesPerDay");\r
        st.Bind(1,"200");\r
        st.Bind(2,"The maximum number of messages you will download from each peer on a given day.");\r
        st.Step();\r
        st.Reset();\r
-\r
-       st.Bind(0,"MaxBoardListRequests");\r
-       st.Bind(1,"5");\r
-       st.Bind(2,"The maximum number of concurrent requests for new Board Lists.  Set to 0 to disable.");\r
-       st.Step();\r
-       st.Reset();\r
+       upd.Bind(0,"Messages");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MaxPeerMessagesPerDay");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"MaxBoardsPerMessage");\r
        st.Bind(1,"8");\r
        st.Bind(2,"The maximum number of boards a received message may be sent to.  Boards over this limit will be ignored.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Messages");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"MaxBoardsPerMessage");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"SaveMessagesFromNewBoards");\r
        st.Bind(1,"true");\r
        st.Bind(2,"Set to true to automatically save messages posted to new boards.  Set to false to ignore messages to new boards.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Messages");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2,"true|true|false|false");\r
+       upd.Bind(3,"SaveMessagesFromNewBoards");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"ChangeMessageTrustOnReply");\r
        st.Bind(1,"0");\r
        st.Bind(2,"How much the local message trust level of an identity should change when you reply to one of their messages.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Messages");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"ChangeMessageTrustOnReply");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"AddNewPostFromIdentities");\r
        st.Bind(1,"false");\r
        st.Bind(2,"Set to true to automatically create new identities when you send a message using a new name.  If you set this to false, posting messages will fail until you manually create the identity.");\r
        st.Step();\r
        st.Reset();\r
+       upd.Bind(0,"Messages");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2,"true|true|false|false");\r
+       upd.Bind(3,"AddNewPostFromIdentities");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
        st.Bind(0,"DeleteMessagesOlderThan");\r
        st.Bind(1,"180");\r
        st.Bind(2,"Automatically delete messages older than this many days.");\r
        st.Step();\r
        st.Reset();\r
-\r
-       st.Bind(0,"VacuumOnStartup");\r
-       st.Bind(1,"false");\r
-       st.Bind(2,"VACUUM the database every time FMS starts.  This will defragment the free space in the database and create a smaller database file.  Vacuuming the database can be CPU and disk intensive.");\r
-       st.Step();\r
-       st.Reset();\r
+       upd.Bind(0,"Messages");\r
+       upd.Bind(1,order++);\r
+       upd.Bind(2);\r
+       upd.Bind(3,"DeleteMessagesOlderThan");\r
+       upd.Step();\r
+       upd.Reset();\r
 \r
 }\r
 \r
index 4760f80..55f82b9 100644 (file)
@@ -15,6 +15,7 @@
 #include "../../include/http/pages/execquerypage.h"\r
 #include "../../include/http/pages/boardspage.h"\r
 #include "../../include/http/pages/insertedfilespage.h"\r
+#include "../../include/http/pages/confirmpage.h"\r
 \r
 #include <iostream>\r
 \r
@@ -65,6 +66,7 @@ HTTPThread::HTTPThread()
        m_pagehandlers.push_back(new ExecQueryPage(templatestr));\r
        m_pagehandlers.push_back(new BoardsPage(templatestr));\r
        m_pagehandlers.push_back(new InsertedFilesPage(templatestr));\r
+       m_pagehandlers.push_back(new ConfirmPage(templatestr));\r
        // homepage must be last - catch all page handler\r
        m_pagehandlers.push_back(new HomePage(templatestr));\r
 \r
index 6edd8ac..4874365 100644 (file)
@@ -103,7 +103,7 @@ const bool IPageHandler::Handle(shttpd_arg *arg)
                                const char *lenstr=shttpd_get_header(arg,"Content-Length");\r
                                if(lenstr)\r
                                {\r
-                                       long len;\r
+                                       long len=0;\r
                                        StringFunctions::Convert(std::string(lenstr),len);\r
                                        mystate->m_indata=new char[len+1];\r
                                        mystate->m_indata[len]='\0';\r
diff --git a/src/http/pages/confirmpage.cpp b/src/http/pages/confirmpage.cpp
new file mode 100644 (file)
index 0000000..4c64039
--- /dev/null
@@ -0,0 +1,49 @@
+#include "../../../include/http/pages/confirmpage.h"\r
+#include "../../../include/stringfunctions.h"\r
+\r
+const std::string ConfirmPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
+{\r
+       std::string content="";\r
+       std::string target="";\r
+       std::string confirmdescription="";\r
+       \r
+       if(queryvars.find("targetpage")!=queryvars.end())\r
+       {\r
+               target=(*queryvars.find("targetpage")).second;\r
+       }\r
+       if(queryvars.find("confirmdescription")!=queryvars.end())\r
+       {\r
+               confirmdescription=(*queryvars.find("confirmdescription")).second;\r
+       }\r
+       \r
+       content+="<h1>Confirm</h1>";\r
+       content+=confirmdescription+"<br>";\r
+       content+="<form name=\"confirm\" method=\"POST\" action=\""+target+"\">";\r
+       for(std::map<std::string,std::string>::const_iterator i=queryvars.begin(); i!=queryvars.end(); i++)\r
+       {\r
+               if((*i).first!="targetpage" && (*i).first!="confirmdescription")\r
+               {\r
+                       content+="<input type=\"hidden\" name=\""+(*i).first+"\" value=\""+(*i).second+"\">";   \r
+               }\r
+       }\r
+       content+="<input type=\"submit\" value=\"Continue\">";\r
+       content+="</form>";\r
+       content+="<form name=\"cancel\" method=\"POST\" action=\""+target+"\">";\r
+       content+="<input type=\"submit\" value=\"Cancel\">";\r
+       content+="</form>";\r
+\r
+       return "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"+StringFunctions::Replace(m_template,"[CONTENT]",content);\r
+}\r
+\r
+\r
+const bool ConfirmPage::WillHandleURI(const std::string &uri)\r
+{\r
+       if(uri.find("confirm.")!=std::string::npos)\r
+       {\r
+               return true;\r
+       }\r
+       else\r
+       {\r
+               return false;\r
+       }\r
+}\r
index f3a4967..9aca3f3 100644 (file)
@@ -261,7 +261,7 @@ const std::string LocalIdentitiesPage::GeneratePage(const std::string &method, c
 */\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\"><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
index 7743738..ff58489 100644 (file)
@@ -5,6 +5,35 @@
        #include <xmem.h>\r
 #endif\r
 \r
+const std::string OptionsPage::CreateDropDown(const std::string &name, const std::vector<std::string> &items, const std::string &selecteditem)\r
+{\r
+       std::string rval="";\r
+\r
+       rval+="<select name=\""+name+"\">";\r
+\r
+       std::vector<std::string>::const_iterator i=items.begin();\r
+       while(i!=items.end())\r
+       {\r
+               rval+="<option value=\""+(*i)+"\"";\r
+               if((*i)==selecteditem)\r
+               {\r
+                       rval+=" SELECTED";\r
+               }\r
+               rval+=">";\r
+               i++;\r
+               if(i!=items.end())\r
+               {\r
+                       rval+=(*i);\r
+                       i++;\r
+               }\r
+               rval+="</option>";\r
+       }\r
+\r
+       rval+="</select>";\r
+\r
+       return rval;\r
+}\r
+\r
 const std::string OptionsPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
 {\r
        std::string content="<h2 style=\"text-align:center;\">Options</h2>\r\n";\r
@@ -33,27 +62,49 @@ const std::string OptionsPage::GeneratePage(const std::string &method, const std
                }\r
        }\r
 \r
-       SQLite3DB::Statement st=m_db->Prepare("SELECT Option,OptionValue,OptionDescription FROM tblOption;");\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT Option,OptionValue,OptionDescription,Section,ValidValues FROM tblOption ORDER BY SortOrder;");\r
        st.Step();\r
 \r
        int count=0;\r
        std::string countstr;\r
+       std::string lastsection="";\r
        while(st.RowReturned())\r
        {\r
                std::string option;\r
                std::string value;\r
                std::string description;\r
+               std::string section;\r
+               std::string validvalues;\r
+               std::vector<std::string> validvaluevec;\r
 \r
                st.ResultText(0,option);\r
                st.ResultText(1,value);\r
                st.ResultText(2,description);\r
+               st.ResultText(3,section);\r
+               if(st.ResultNull(4)==false)\r
+               {\r
+                       st.ResultText(4,validvalues);\r
+                       StringFunctions::Split(validvalues,"|",validvaluevec);\r
+               }\r
+\r
+               if(section!=lastsection)\r
+               {\r
+                       content+="<tr>";\r
+                       content+="<td colspan=\"3\"><h3>"+section+"</h3></td>";\r
+                       content+="</tr>";\r
+                       lastsection=section;\r
+               }\r
 \r
                StringFunctions::Convert(count,countstr);\r
                content+="<tr>";\r
                content+="<td valign=\"top\"><input type=\"hidden\" name=\"option["+countstr+"]\" value=\""+option+"\">"+option+"</td>";\r
                content+="<td valign=\"top\"><input type=\"hidden\" name=\"oldvalue["+countstr+"]\" value=\""+value+"\">";\r
 \r
-               if(value!="true" && value!="false")\r
+               if(validvaluevec.size()>0)\r
+               {\r
+                       content+=CreateDropDown("value["+countstr+"]",validvaluevec,value);\r
+               }\r
+               else if(value!="true" && value!="false")\r
                {\r
                        content+="<input type=\"text\" name=\"value["+countstr+"]\" value=\""+value+"\"></td>";\r
                }\r
index 33d1357..5daaa01 100644 (file)
@@ -72,7 +72,7 @@ const std::string PeerMaintenancePage::GeneratePage(const std::string &method, c
                        date.SetToGMTime();\r
                        date.Add(0,0,0,-20);\r
                        st=m_db->Prepare("DELETE FROM tblIdentity WHERE IdentityID IN (SELECT tblIdentity.IdentityID FROM tblIdentity LEFT JOIN tblMessage ON tblIdentity.IdentityID=tblMessage.IdentityID WHERE tblMessage.IdentityID IS NULL AND tblIdentity.DateAdded<?);");\r
-                       st.Bind(0,date.Format("%Y-%m-%d"));\r
+                       st.Bind(0,date.Format("%Y-%m-%d %H:%M:%S"));\r
                        st.Step();\r
                }\r
        }\r
index ac6b053..0ab34f1 100644 (file)
@@ -119,16 +119,33 @@ const std::string PeerTrustPage::GeneratePage(const std::string &method, const s
        {\r
                localidentityidstr=(*queryvars.find("localidentityid")).second;\r
                StringFunctions::Convert(localidentityidstr,localidentityid);\r
+               // insert the ID into the temporary table so we remember the identity if we load the page later\r
+               m_db->Execute("DELETE FROM tmpLocalIdentityPeerTrustPage;");\r
+               SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tmpLocalIdentityPeerTrustPage(LocalIdentityID) VALUES(?);");\r
+               st.Bind(0,localidentityid);\r
+               st.Step();\r
        }\r
        else\r
        {\r
-               SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID FROM tblLocalIdentity;");\r
+               // try to get the localidentityid if it exists in the temp table, otherwise load the first identity in the database\r
+               SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID FROM tmpLocalIdentityPeerTrustPage;");\r
                st.Step();\r
                if(st.RowReturned())\r
                {\r
                        st.ResultInt(0,localidentityid);\r
                        StringFunctions::Convert(localidentityid,localidentityidstr);\r
                }\r
+               else\r
+               {\r
+                       st=m_db->Prepare("SELECT LocalIdentityID FROM tblLocalIdentity;");\r
+                       st.Step();\r
+                       if(st.RowReturned())\r
+                       {\r
+                               st.ResultInt(0,localidentityid);\r
+                               StringFunctions::Convert(localidentityid,localidentityidstr);\r
+                       }\r
+                       st.Finalize();\r
+               }\r
        }\r
 \r
        if(localidentityid!=-1 && queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="update")\r