version 0.2.12
[fms.git] / src / global.cpp
1 #include "../include/global.h"\r
2 #include "../include/datetime.h"\r
3 #include "../include/logfile.h"\r
4 #include "../include/option.h"\r
5 #include "../include/stringfunctions.h"\r
6 #include "../include/db/sqlite3db.h"\r
7 #include "../include/freenet/freenetmasterthread.h"\r
8 #include "../include/nntp/nntplistener.h"\r
9 #include "../include/http/httpthread.h"\r
10 #include "../include/threadcontroller.h"\r
11 \r
12 #ifdef _WIN32\r
13         #include <winsock2.h>\r
14 #endif\r
15 \r
16 #ifdef XMEM\r
17         #include <xmem.h>\r
18 #endif\r
19 \r
20 bool wantshutdown=false;\r
21 \r
22 std::string CreateShortIdentityName(const std::string &name, const std::string &publickey)\r
23 {\r
24         std::string result="";\r
25         std::vector<std::string> keyparts;\r
26 \r
27         StringFunctions::SplitMultiple(publickey,"@,",keyparts);\r
28 \r
29         result+=name;\r
30         if(keyparts.size()>1 && keyparts[1].size()>8)\r
31         {\r
32                 result+="@"+keyparts[1].substr(0,4)+"...";\r
33         }\r
34 \r
35         return result;\r
36 }\r
37 \r
38 void SetupDB()\r
39 {\r
40 \r
41         DateTime date;\r
42         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
43 \r
44         db->Open("fms.db3");\r
45         db->SetBusyTimeout(10000);              // set timeout to 10 seconds\r
46         //db->Execute("VACUUM;");               // not needed every startup\r
47 \r
48         db->Execute("CREATE TABLE IF NOT EXISTS tblDBVersion(\\r
49                                 Major                           INTEGER,\\r
50                                 Minor                           INTEGER\\r
51                                 );");\r
52 \r
53         SQLite3DB::Statement st=db->Prepare("SELECT Major,Minor FROM tblDBVersion;");\r
54         st.Step();\r
55         if(st.RowReturned())\r
56         {\r
57                 int major;\r
58                 int minor;\r
59                 st.ResultInt(0,major);\r
60                 st.ResultInt(1,minor);\r
61                 st.Finalize();\r
62                 if(major==1 && minor==0)\r
63                 {\r
64                         ConvertDB0100To0101();\r
65                         major=1;\r
66                         minor=1;\r
67                 }\r
68                 if(major==1 && (minor==1 || minor==2))\r
69                 {\r
70                         ConvertDB0101To0103();\r
71                         major=1;\r
72                         minor=3;\r
73                 }\r
74                 if(major==1 && minor==3)\r
75                 {\r
76                         ConvertDB0103To0104();\r
77                         major=1;\r
78                         minor=4;\r
79                 }\r
80                 if(major==1 && minor==4)\r
81                 {\r
82                         ConvertDB0104To0105();\r
83                         major=1;\r
84                         minor=5;\r
85                 }\r
86                 if(major==1 && minor==5)\r
87                 {\r
88                         ConvertDB0105To0106();\r
89                         major=1;\r
90                         minor=6;\r
91                 }\r
92                 if(major==1 && minor==6)\r
93                 {\r
94                         ConvertDB0106To0107();\r
95                         major=1;\r
96                         minor=7;\r
97                 }\r
98                 if(major==1 && minor==7)\r
99                 {\r
100                         ConvertDB0107To0108();\r
101                         major=1;\r
102                         minor=8;\r
103                 }\r
104                 if(major==1 && minor==8)\r
105                 {\r
106                         ConvertDB0108To0109();\r
107                         major=1;\r
108                         minor=9;\r
109                 }\r
110                 if(major==1 && minor==9)\r
111                 {\r
112                         ConvertDB0109To0110();\r
113                         major=1;\r
114                         minor=10;\r
115                 }\r
116         }\r
117         else\r
118         {\r
119                 db->Execute("INSERT INTO tblDBVersion(Major,Minor) VALUES(1,10);");\r
120         }\r
121 \r
122         db->Execute("UPDATE tblDBVersion SET Major=1, Minor=10;");\r
123 \r
124         db->Execute("CREATE TABLE IF NOT EXISTS tblOption(\\r
125                                 Option                          TEXT UNIQUE,\\r
126                                 OptionValue                     TEXT NOT NULL,\\r
127                                 OptionDescription       TEXT\\r
128                                 );");\r
129 \r
130         db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentity(\\r
131                                 LocalIdentityID                 INTEGER PRIMARY KEY,\\r
132                                 Name                                    TEXT,\\r
133                                 PublicKey                               TEXT UNIQUE,\\r
134                                 PrivateKey                              TEXT UNIQUE,\\r
135                                 SingleUse                               BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
136                                 PublishTrustList                BOOL CHECK(PublishTrustList IN('true','false')) DEFAULT 'false',\\r
137                                 PublishBoardList                BOOL CHECK(PublishBoardList IN('true','false')) DEFAULT 'false',\\r
138                                 PublishFreesite                 BOOL CHECK(PublishFreesite IN('true','false')) DEFAULT 'false',\\r
139                                 FreesiteEdition                 INTEGER,\\r
140                                 InsertingIdentity               BOOL CHECK(InsertingIdentity IN('true','false')) DEFAULT 'false',\\r
141                                 LastInsertedIdentity    DATETIME,\\r
142                                 InsertingPuzzle                 BOOL CHECK(InsertingPuzzle IN('true','false')) DEFAULT 'false',\\r
143                                 LastInsertedPuzzle              DATETIME,\\r
144                                 InsertingTrustList              BOOL CHECK(InsertingTrustList IN('true','false')) DEFAULT 'false',\\r
145                                 LastInsertedTrustList   DATETIME,\\r
146                                 InsertingBoardList              BOOL CHECK(InsertingBoardList IN('true','false')) DEFAULT 'false',\\r
147                                 LastInsertedBoardList   DATETIME,\\r
148                                 InsertingMessageList    BOOL CHECK(InsertingMessageList IN('true','false')) DEFAULT 'false',\\r
149                                 LastInsertedMessageList DATETIME,\\r
150                                 LastInsertedFreesite    DATETIME,\\r
151                                 DateCreated                             DATETIME\\r
152                                 );");\r
153 \r
154         db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentityInserts(\\r
155                                 LocalIdentityID         INTEGER,\\r
156                                 Day                                     DATE,\\r
157                                 InsertIndex                     INTEGER\\r
158                                 );");\r
159 \r
160         db->Execute("CREATE TABLE IF NOT EXISTS tblTrustListInserts(\\r
161                                 LocalIdentityID         INTEGER,\\r
162                                 Day                                     DATE,\\r
163                                 InsertIndex                     INTEGER\\r
164                                 );");\r
165 \r
166         db->Execute("CREATE TABLE IF NOT EXISTS tblTrustListRequests(\\r
167                                 IdentityID                      INTEGER,\\r
168                                 Day                                     DATE,\\r
169                                 RequestIndex            INTEGER,\\r
170                                 Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
171                                 );");\r
172 \r
173         db->Execute("CREATE TABLE IF NOT EXISTS tblIntroductionPuzzleInserts(\\r
174                                 UUID                            TEXT UNIQUE,\\r
175                                 LocalIdentityID         INTEGER,\\r
176                                 Day                                     DATE,\\r
177                                 InsertIndex                     INTEGER,\\r
178                                 Type                            TEXT,\\r
179                                 MimeType                        TEXT,\\r
180                                 PuzzleData                      TEXT,\\r
181                                 PuzzleSolution          TEXT,\\r
182                                 FoundSolution           BOOL CHECK(FoundSolution IN('true','false')) DEFAULT 'false'\\r
183                                 );");\r
184 \r
185         db->Execute("CREATE TABLE IF NOT EXISTS tblIdentity(\\r
186                                 IdentityID                              INTEGER PRIMARY KEY,\\r
187                                 PublicKey                               TEXT UNIQUE,\\r
188                                 Name                                    TEXT,\\r
189                                 SingleUse                               BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
190                                 PublishTrustList                BOOL CHECK(PublishTrustList IN('true','false')) DEFAULT 'false',\\r
191                                 PublishBoardList                BOOL CHECK(PublishBoardList IN('true','false')) DEFAULT 'false',\\r
192                                 FreesiteEdition                 INTEGER,\\r
193                                 DateAdded                               DATETIME,\\r
194                                 LastSeen                                DATETIME,\\r
195                                 LocalMessageTrust               INTEGER CHECK(LocalMessageTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
196                                 PeerMessageTrust                INTEGER CHECK(PeerMessageTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
197                                 LocalTrustListTrust             INTEGER CHECK(LocalTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
198                                 PeerTrustListTrust              INTEGER CHECK(PeerTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
199                                 AddedMethod                             TEXT,\\r
200                                 MessageTrustComment             TEXT,\\r
201                                 TrustListTrustComment   TEXT,\\r
202                                 Hidden                                  BOOL CHECK(Hidden IN('true','false')) DEFAULT 'false'\\r
203                                 );");\r
204 \r
205         db->Execute("CREATE TABLE IF NOT EXISTS tblIdentityRequests(\\r
206                                 IdentityID                      INTEGER,\\r
207                                 Day                                     DATE,\\r
208                                 RequestIndex            INTEGER,\\r
209                                 Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
210                                 );");\r
211 \r
212         db->Execute("CREATE TABLE IF NOT EXISTS tblIntroductionPuzzleRequests(\\r
213                                 IdentityID                      INTEGER,\\r
214                                 Day                                     DATE,\\r
215                                 RequestIndex            INTEGER,\\r
216                                 Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false',\\r
217                                 UUID                            TEXT UNIQUE,\\r
218                                 Type                            TEXT,\\r
219                                 MimeType                        TEXT,\\r
220                                 PuzzleData                      TEXT\\r
221                                 );");\r
222 \r
223         db->Execute("CREATE TABLE IF NOT EXISTS tblIdentityIntroductionInserts(\\r
224                                 LocalIdentityID         INTEGER,\\r
225                                 Day                                     DATE,\\r
226                                 UUID                            TEXT UNIQUE,\\r
227                                 Solution                        TEXT,\\r
228                                 Inserted                        BOOL CHECK(Inserted IN('true','false')) DEFAULT 'false'\\r
229                                 );");\r
230 \r
231         db->Execute("CREATE TABLE IF NOT EXISTS tblIdentityTrust(\\r
232                                 LocalIdentityID                 INTEGER,\\r
233                                 IdentityID                              INTEGER,\\r
234                                 LocalMessageTrust               INTEGER CHECK(LocalMessageTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
235                                 MessageTrustComment             TEXT,\\r
236                                 LocalTrustListTrust             INTEGER CHECK(LocalTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
237                                 TrustListTrustComment   TEXT\\r
238                                 );");\r
239 \r
240         db->Execute("CREATE UNIQUE INDEX IF NOT EXISTS idxIdentityTrust_IDs ON tblIdentityTrust(LocalIdentityID,IdentityID);");\r
241 \r
242         db->Execute("CREATE TRIGGER IF NOT EXISTS trgInsertOnIdentityTrust AFTER INSERT ON tblIdentityTrust \\r
243                                 FOR EACH ROW \\r
244                                 BEGIN \\r
245                                         UPDATE tblIdentity SET LocalMessageTrust=(SELECT MAX(LocalMessageTrust) FROM tblIdentityTrust WHERE tblIdentityTrust.IdentityID=new.IdentityID GROUP BY tblIdentityTrust.IdentityID), LocalTrustListTrust=(SELECT MAX(LocalTrustListTrust) FROM tblIdentityTrust WHERE tblIdentityTrust.IdentityID=new.IdentityID GROUP BY tblIdentityTrust.IdentityID) WHERE tblIdentity.IdentityID=new.IdentityID; \\r
246                                 END;");\r
247 \r
248         db->Execute("CREATE TRIGGER IF NOT EXISTS trgUpdateOnIdentityTrust AFTER UPDATE OF LocalMessageTrust,LocalTrustListTrust ON tblIdentityTrust \\r
249                                 FOR EACH ROW \\r
250                                 BEGIN \\r
251                                         UPDATE tblIdentity SET LocalMessageTrust=(SELECT MAX(LocalMessageTrust) FROM tblIdentityTrust WHERE tblIdentityTrust.IdentityID=new.IdentityID GROUP BY tblIdentityTrust.IdentityID), LocalTrustListTrust=(SELECT MAX(LocalTrustListTrust) FROM tblIdentityTrust WHERE tblIdentityTrust.IdentityID=new.IdentityID GROUP BY tblIdentityTrust.IdentityID) WHERE tblIdentity.IdentityID=new.IdentityID; \\r
252                                 END;");\r
253 \r
254         db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteOnIdentityTrust AFTER DELETE ON tblIdentityTrust \\r
255                                 FOR EACH ROW \\r
256                                 BEGIN \\r
257                                         UPDATE tblIdentity SET LocalMessageTrust=(SELECT MAX(LocalMessageTrust) FROM tblIdentityTrust WHERE tblIdentityTrust.IdentityID=old.IdentityID GROUP BY tblIdentityTrust.IdentityID), LocalTrustListTrust=(SELECT MAX(LocalTrustListTrust) FROM tblIdentityTrust WHERE tblIdentityTrust.IdentityID=old.IdentityID GROUP BY tblIdentityTrust.IdentityID) WHERE tblIdentity.IdentityID=old.IdentityID; \\r
258                                 END;");\r
259 \r
260         db->Execute("CREATE TABLE IF NOT EXISTS tblPeerTrust(\\r
261                                 IdentityID                              INTEGER,\\r
262                                 TargetIdentityID                INTEGER,\\r
263                                 MessageTrust                    INTEGER CHECK(MessageTrust BETWEEN 0 AND 100),\\r
264                                 TrustListTrust                  INTEGER CHECK(TrustListTrust BETWEEN 0 AND 100),\\r
265                                 MessageTrustComment             TEXT,\\r
266                                 TrustListTrustComment   TEXT\\r
267                                 );");\r
268 \r
269         db->Execute("CREATE INDEX IF NOT EXISTS idxPeerTrust_IdentityID ON tblPeerTrust (IdentityID);");\r
270         db->Execute("CREATE INDEX IF NOT EXISTS idxPeerTrust_TargetIdentityID ON tblPeerTrust (TargetIdentityID);");\r
271 \r
272         db->Execute("CREATE TABLE IF NOT EXISTS tblBoard(\\r
273                                 BoardID                                 INTEGER PRIMARY KEY,\\r
274                                 BoardName                               TEXT UNIQUE,\\r
275                                 BoardDescription                TEXT,\\r
276                                 DateAdded                               DATETIME,\\r
277                                 SaveReceivedMessages    BOOL CHECK(SaveReceivedMessages IN('true','false')) DEFAULT 'true',\\r
278                                 AddedMethod                             TEXT\\r
279                                 );");\r
280 \r
281         db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded,AddedMethod) VALUES('fms','Freenet Message System','2007-12-01 12:00:00','Initial Board');");\r
282         db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded,AddedMethod) VALUES('freenet','Discussion about Freenet','2007-12-01 12:00:00','Initialt Board');");\r
283         db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded,AddedMethod) VALUES('public','Public discussion','2007-12-01 12:00:00','Initial Board');");\r
284         db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded,AddedMethod) VALUES('test','Test board','2007-12-01 12:00:00','Initial Board');");\r
285 \r
286         db->Execute("CREATE TABLE IF NOT EXISTS tblMessage(\\r
287                                 MessageID                       INTEGER PRIMARY KEY,\\r
288                                 IdentityID                      INTEGER,\\r
289                                 FromName                        TEXT,\\r
290                                 MessageDate                     DATE,\\r
291                                 MessageTime                     TIME,\\r
292                                 Subject                         TEXT,\\r
293                                 MessageUUID                     TEXT UNIQUE,\\r
294                                 ReplyBoardID            INTEGER,\\r
295                                 Body                            TEXT,\\r
296                                 MessageIndex            INTEGER\\r
297                                 );");\r
298 \r
299         db->Execute("CREATE INDEX IF NOT EXISTS idxMessage_IdentityID ON tblMessage (IdentityID);");\r
300 \r
301         db->Execute("CREATE TABLE IF NOT EXISTS tblMessageReplyTo(\\r
302                                 MessageID                       INTEGER,\\r
303                                 ReplyToMessageUUID      TEXT,\\r
304                                 ReplyOrder                      INTEGER\\r
305                                 );");\r
306 \r
307         db->Execute("CREATE INDEX IF NOT EXISTS idxMessageReplyTo_MessageID ON tblMessageReplyTo (MessageID);");\r
308 \r
309         db->Execute("CREATE TABLE IF NOT EXISTS tblMessageBoard(\\r
310                                 MessageID                       INTEGER,\\r
311                                 BoardID                         INTEGER\\r
312                                 );");\r
313 \r
314         db->Execute("CREATE INDEX IF NOT EXISTS idxMessageBoard_MessageID ON tblMessageBoard (MessageID);");\r
315         db->Execute("CREATE INDEX IF NOT EXISTS idxMessageBoard_BoardID ON tblMessageBoard (BoardID);");\r
316 \r
317         db->Execute("CREATE TABLE IF NOT EXISTS tblMessageListRequests(\\r
318                                 IdentityID                      INTEGER,\\r
319                                 Day                                     DATE,\\r
320                                 RequestIndex            INTEGER,\\r
321                                 Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
322                                 );");\r
323 \r
324         db->Execute("CREATE TABLE IF NOT EXISTS tblMessageRequests(\\r
325                                 IdentityID                      INTEGER,\\r
326                                 Day                                     DATE,\\r
327                                 RequestIndex            INTEGER,\\r
328                                 FromMessageList         BOOL CHECK(FromMessageList IN('true','false')) DEFAULT 'false',\\r
329                                 Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
330                                 );");\r
331 \r
332         db->Execute("CREATE UNIQUE INDEX IF NOT EXISTS idxMessageRequest ON tblMessageRequests(IdentityID,Day,RequestIndex);");\r
333 \r
334         db->Execute("CREATE TABLE IF NOT EXISTS tblMessageInserts(\\r
335                                 LocalIdentityID         INTEGER,\\r
336                                 Day                                     DATE,\\r
337                                 InsertIndex                     INTEGER,\\r
338                                 MessageUUID                     TEXT UNIQUE,\\r
339                                 MessageXML                      TEXT,\\r
340                                 Inserted                        BOOL CHECK(Inserted IN('true','false')) DEFAULT 'false'\\r
341                                 );");\r
342 \r
343         db->Execute("CREATE TABLE IF NOT EXISTS tblFileInserts(\\r
344                                 FileInsertID            INTEGER PRIMARY KEY,\\r
345                                 MessageUUID                     TEXT,\\r
346                                 FileName                        TEXT,\\r
347                                 Key                                     TEXT,\\r
348                                 Size                            INTEGER,\\r
349                                 MimeType                        TEXT,\\r
350                                 Data                            BLOB\\r
351                                 );");\r
352 \r
353         db->Execute("CREATE TABLE IF NOT EXISTS tblMessageListInserts(\\r
354                                 LocalIdentityID         INTEGER,\\r
355                                 Day                                     DATE,\\r
356                                 InsertIndex                     INTEGER,\\r
357                                 Inserted                        BOOL CHECK(Inserted IN('true','false')) DEFAULT 'false'\\r
358                                 );");\r
359 \r
360         db->Execute("CREATE TABLE IF NOT EXISTS tblAdministrationBoard(\\r
361                                 BoardID                                         INTEGER UNIQUE,\\r
362                                 ModifyLocalMessageTrust         INTEGER,\\r
363                                 ModifyLocalTrustListTrust       INTEGER\\r
364                                 );");\r
365 \r
366         db->Execute("CREATE TABLE IF NOT EXISTS tblBoardListInserts(\\r
367                                 LocalIdentityID         INTEGER,\\r
368                                 Day                                     DATE,\\r
369                                 InsertIndex                     INTEGER,\\r
370                                 Inserted                        BOOL CHECK(Inserted IN('true','false')) DEFAULT 'false'\\r
371                                 );");\r
372 \r
373         db->Execute("CREATE TABLE IF NOT EXISTS tblBoardListRequests(\\r
374                                 IdentityID                      INTEGER,\\r
375                                 Day                                     DATE,\\r
376                                 RequestIndex            INTEGER,\\r
377                                 Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
378                                 );");   \r
379 \r
380         // MessageInserter will insert a record into this temp table which the MessageListInserter will query for and insert a MessageList when needed\r
381         db->Execute("CREATE TEMPORARY TABLE IF NOT EXISTS tmpMessageListInsert(\\r
382                                 LocalIdentityID         INTEGER,\\r
383                                 Date                            DATETIME\\r
384                                 );");\r
385 \r
386         // low / high / message count for each board\r
387         db->Execute("CREATE VIEW IF NOT EXISTS vwBoardStats AS \\r
388                                 SELECT tblBoard.BoardID AS 'BoardID', IFNULL(MIN(MessageID),0) AS 'LowMessageID', IFNULL(MAX(MessageID),0) AS 'HighMessageID', COUNT(MessageID) AS 'MessageCount' \\r
389                                 FROM tblBoard LEFT JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID \\r
390                                 WHERE MessageID>=0 OR MessageID IS NULL \\r
391                                 GROUP BY tblBoard.BoardID;");\r
392 \r
393         // calculates peer trust\r
394         // do the (MessageTrust+1)*LocalTrustListTrust/(MessageTrust+1)/100.0 - so if MessageTrust or TrustListTrust is NULL, the calc will be NULL and it won't be included at all in the average\r
395         // need the +1 so that when the values are 0 the result is not 0\r
396         db->Execute("DROP VIEW IF EXISTS vwCalculatedPeerTrust;");\r
397         db->Execute("CREATE VIEW IF NOT EXISTS vwCalculatedPeerTrust AS \\r
398                                 SELECT TargetIdentityID, \\r
399                                 ROUND(SUM(MessageTrust*(LocalTrustListTrust/100.0))/SUM(((MessageTrust+1)*LocalTrustListTrust/(MessageTrust+1))/100.0),0) AS 'PeerMessageTrust', \\r
400                                 ROUND(SUM(TrustListTrust*(LocalTrustListTrust/100.0))/SUM(((TrustListTrust+1)*LocalTrustListTrust/(TrustListTrust+1))/100.0),0) AS 'PeerTrustListTrust' \\r
401                                 FROM tblPeerTrust INNER JOIN tblIdentity ON tblPeerTrust.IdentityID=tblIdentity.IdentityID \\r
402                                 WHERE LocalTrustListTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalTrustListTrust') \\r
403                                 AND ( PeerTrustListTrust IS NULL OR PeerTrustListTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerTrustListTrust') ) \\r
404                                 GROUP BY TargetIdentityID;");\r
405 \r
406         /*\r
407                 These peer trust calculations are too CPU intensive to be triggers - they were called every time a new trust list was processed\r
408                 All trust levels will now be recalculated every hour in the PeriodicDBMaintenance class\r
409         */\r
410         // drop existing triggers\r
411         db->Execute("DROP TRIGGER IF EXISTS trgDeleteOntblPeerTrust;");\r
412         db->Execute("DROP TRIGGER IF EXISTS trgInsertOntblPeerTrust;");\r
413         db->Execute("DROP TRIGGER IF EXISTS trgUpdateOntblPeerTrust;");\r
414         db->Execute("DROP TRIGGER IF EXISTS trgUpdateLocalTrustLevels;");\r
415 /*\r
416         // update PeerTrustLevel when deleting a record from tblPeerTrust\r
417         db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteOntblPeerTrust AFTER DELETE ON tblPeerTrust \\r
418                                 FOR EACH ROW \\r
419                                 BEGIN \\r
420                                         UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=old.TargetIdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=old.TargetIdentityID) WHERE IdentityID=old.TargetIdentityID;\\r
421                                 END;");\r
422 \r
423         // update PeerTrustLevel when inserting a record into tblPeerTrust\r
424         db->Execute("CREATE TRIGGER IF NOT EXISTS trgInsertOntblPeerTrust AFTER INSERT ON tblPeerTrust \\r
425                                 FOR EACH ROW \\r
426                                 BEGIN \\r
427                                         UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=new.TargetIdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=new.TargetIdentityID) WHERE IdentityID=new.TargetIdentityID;\\r
428                                 END;");\r
429 \r
430         // update PeerTrustLevel when updating a record in tblPeerTrust\r
431         db->Execute("CREATE TRIGGER IF NOT EXISTS trgUpdateOntblPeerTrust AFTER UPDATE ON tblPeerTrust \\r
432                                 FOR EACH ROW \\r
433                                 BEGIN \\r
434                                         UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=old.TargetIdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=old.TargetIdentityID) WHERE IdentityID=old.TargetIdentityID;\\r
435                                         UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=new.TargetIdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=new.TargetIdentityID) WHERE IdentityID=new.TargetIdentityID;\\r
436                                 END;");\r
437 \r
438         // recalculate all Peer TrustLevels when updating Local TrustLevels on tblIdentity - doesn't really need to be all, but rather all identities the updated identity has a trust level for.  It's easier to update everyone for now.\r
439         db->Execute("CREATE TRIGGER IF NOT EXISTS trgUpdateLocalTrustLevels AFTER UPDATE OF LocalMessageTrust,LocalTrustListTrust ON tblIdentity \\r
440                                 FOR EACH ROW \\r
441                                 BEGIN \\r
442                                         UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=IdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=IdentityID);\\r
443                                 END;");\r
444 */\r
445 \r
446         db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteMessage AFTER DELETE ON tblMessage \\r
447                                 FOR EACH ROW \\r
448                                 BEGIN \\r
449                                         DELETE FROM tblMessageBoard WHERE tblMessageBoard.MessageID=old.MessageID;\\r
450                                         DELETE FROM tblMessageReplyTo WHERE tblMessageReplyTo.MessageID=old.MessageID;\\r
451                                 END;");\r
452 \r
453         db->Execute("DROP TRIGGER IF EXISTS trgDeleteIdentity;");\r
454         db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteIdentity AFTER DELETE ON tblIdentity \\r
455                                 FOR EACH ROW \\r
456                                 BEGIN \\r
457                                         DELETE FROM tblIdentityRequests WHERE IdentityID=old.IdentityID;\\r
458                                         DELETE FROM tblIntroductionPuzzleRequests WHERE IdentityID=old.IdentityID;\\r
459                                         DELETE FROM tblMessageListRequests WHERE IdentityID=old.IdentityID;\\r
460                                         DELETE FROM tblMessageRequests WHERE IdentityID=old.IdentityID;\\r
461                                         DELETE FROM tblPeerTrust WHERE IdentityID=old.IdentityID;\\r
462                                         DELETE FROM tblTrustListRequests WHERE IdentityID=old.IdentityID;\\r
463                                         DELETE FROM tblIdentityTrust WHERE IdentityID=old.IdentityID;\\r
464                                 END;");\r
465 \r
466         db->Execute("DROP TRIGGER IF EXISTS trgDeleteLocalIdentity;");\r
467         db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteLocalIdentity AFTER DELETE ON tblLocalIdentity \\r
468                                 FOR EACH ROW \\r
469                                 BEGIN \\r
470                                         DELETE FROM tblIdentityIntroductionInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
471                                         DELETE FROM tblIntroductionPuzzleInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
472                                         DELETE FROM tblLocalIdentityInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
473                                         DELETE FROM tblMessageInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
474                                         DELETE FROM tblMessageListInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
475                                         DELETE FROM tblTrustListInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
476                                         DELETE FROM tblIdentityTrust WHERE LocalIdentityID=old.LocalIdentityID;\\r
477                                 END;");\r
478 \r
479         db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteBoard AFTER DELETE ON tblBoard \\r
480                                 FOR EACH ROW \\r
481                                 BEGIN \\r
482                                         DELETE FROM tblMessageBoard WHERE BoardID=old.BoardID;\\r
483                                 END;");\r
484 \r
485         // delete introduction puzzles that were half-way inserted\r
486         db->Execute("DELETE FROM tblIntroductionPuzzleInserts WHERE Day IS NULL AND InsertIndex IS NULL;");\r
487 \r
488         // delete stale introduction puzzles (2 or more days old)\r
489         date.SetToGMTime();\r
490         date.Add(0,0,0,-2);\r
491         db->Execute("DELETE FROM tblIntroductionPuzzleInserts WHERE Day<='"+date.Format("%Y-%m-%d")+"';");\r
492         db->Execute("DELETE FROM tblIntroductionPuzzleRequests WHERE Day<='"+date.Format("%Y-%m-%d")+"';");\r
493 \r
494         date.SetToGMTime();\r
495         // insert SomeDude's public key\r
496         db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,LocalTrustListTrust,AddedMethod) VALUES('SSK@NuBL7aaJ6Cn4fB7GXFb9Zfi8w1FhPyW3oKgU9TweZMw,iXez4j3qCpd596TxXiJgZyTq9o-CElEuJxm~jNNZAuA,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"',50,'Initial Identity');");\r
497         // insert Shadow Panther's public key\r
498         db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@~mimyB1kmH4f7Cgsd2wM2Qv2NxrZHRMM6IY8~7EWRVQ,fxTKkR0TYhgMYb-vEGAv55sMOxCGD2xhE4ZxWHxdPz4,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
499         // insert garfield's public key\r
500         db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@T8l1IEGU4-PoASFzgc2GYhIgRzUvZsKdoQWeuLHuTmM,QLxAPfkGis8l5NafNpSCdbxzXhBlu9WL8svcqJw9Mpo,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
501         // insert alek's public key\r
502         db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@lTjeI6V0lQsktXqaqJ6Iwk4TdsHduQI54rdUpHfhGbg,0oTYfrxxx8OmdU1~60gqpf3781qzEicM4Sz97mJsBM4,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
503         // insert Luke771's public key\r
504         db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@mdXK~ZVlfTZhF1SLBrvZ--i0vOsOpa~w9wv~~psQ-04,gXonsXKc7aexKSO8Gt8Fwre4Qgmmbt2WueO7VzxNKkk,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
505         // insert falafel's public key\r
506         db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@IxVqeqM0LyYdTmYAf5z49SJZUxr7NtQkOqVYG0hvITw,RM2wnMn5zAufCMt5upkkgq25B1elfBAxc7htapIWg1c,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
507         // insert cptn_insano's public key\r
508         db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@bloE1LJ~qzSYUkU2nt7sB9kq060D4HTQC66pk5Q8NpA,DOOASUnp0kj6tOdhZJ-h5Tk7Ka50FSrUgsH7tCG1usU,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
509         // insert Flink's public key\r
510         db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,AddedMethod) VALUES('SSK@q2TtkNBOuuniyJ56~8NSopCs3ttwe5KlB31ugZtWmXA,6~PzIupS8YK7L6oFNpXGKJmHT2kBMDfwTg73nHdNur8,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"','Initial Identity');");\r
511 \r
512         // TODO remove sometime after 0.1.17\r
513         FixCapitalBoardNames();\r
514 \r
515         // run analyze - may speed up some queries\r
516         db->Execute("ANALYZE;");\r
517 \r
518 }\r
519 \r
520 void ConvertDB0100To0101()\r
521 {\r
522         // added unique constraint to public and private key\r
523         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
524         db->Execute("CREATE TEMPORARY TABLE tblLocalIdentityTemp AS SELECT * FROM tblLocalIdentity;");\r
525         db->Execute("DROP TABLE IF EXISTS tblLocalIdentity;");\r
526         db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentity(\\r
527                                 LocalIdentityID                 INTEGER PRIMARY KEY,\\r
528                                 Name                                    TEXT,\\r
529                                 PublicKey                               TEXT UNIQUE,\\r
530                                 PrivateKey                              TEXT UNIQUE,\\r
531                                 SingleUse                               BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
532                                 PublishTrustList                BOOL CHECK(PublishTrustList IN('true','false')) DEFAULT 'false',\\r
533                                 PublishBoardList                BOOL CHECK(PublishBoardList IN('true','false')) DEFAULT 'false',\\r
534                                 InsertingIdentity               BOOL CHECK(InsertingIdentity IN('true','false')) DEFAULT 'false',\\r
535                                 LastInsertedIdentity    DATETIME,\\r
536                                 InsertingPuzzle                 BOOL CHECK(InsertingPuzzle IN('true','false')) DEFAULT 'false',\\r
537                                 LastInsertedPuzzle              DATETIME,\\r
538                                 InsertingTrustList              BOOL CHECK(InsertingTrustList IN('true','false')) DEFAULT 'false',\\r
539                                 LastInsertedTrustList   DATETIME,\\r
540                                 InsertingBoardList              BOOL CHECK(InsertingBoardList IN('true','false')) DEFAULT 'false',\\r
541                                 LastInsertedBoardList   DATETIME,\\r
542                                 InsertingMessageList    BOOL CHECK(InsertingMessageList IN('true','false')) DEFAULT 'false',\\r
543                                 LastInsertedMessageList DATETIME\\r
544                                 );");\r
545         db->Execute("INSERT INTO tblLocalIdentity SELECT * FROM tblLocalIdentityTemp;");\r
546         db->Execute("DROP TABLE IF EXISTS tblLocalIdentityTemp;");\r
547         db->Execute("UPDATE tblDBVersion SET Major=1, Minor=1;");\r
548 }\r
549 \r
550 void ConvertDB0101To0103()\r
551 {\r
552         // remove default 50 from trust fields and set default to NULL\r
553         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
554         db->Execute("CREATE TEMPORARY TABLE tblIdentityTemp AS SELECT * FROM tblIdentity;");\r
555         db->Execute("DROP TABLE IF EXISTS tblIdentity;");\r
556         db->Execute("CREATE TABLE IF NOT EXISTS tblIdentity(\\r
557                                 IdentityID                      INTEGER PRIMARY KEY,\\r
558                                 PublicKey                       TEXT UNIQUE,\\r
559                                 Name                            TEXT,\\r
560                                 SingleUse                       BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
561                                 PublishTrustList        BOOL CHECK(PublishTrustList IN('true','false')) DEFAULT 'false',\\r
562                                 PublishBoardList        BOOL CHECK(PublishBoardList IN('true','false')) DEFAULT 'false',\\r
563                                 DateAdded                       DATETIME,\\r
564                                 LastSeen                        DATETIME,\\r
565                                 LocalMessageTrust       INTEGER CHECK(LocalMessageTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
566                                 PeerMessageTrust        INTEGER CHECK(PeerMessageTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
567                                 LocalTrustListTrust     INTEGER CHECK(LocalTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
568                                 PeerTrustListTrust      INTEGER CHECK(PeerTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL\\r
569                                 );");\r
570         db->Execute("INSERT INTO tblIdentity SELECT * FROM tblIdentityTemp;");\r
571         db->Execute("DROP TABLE IF EXISTS tblIdentityTemp;");\r
572 \r
573         // add SaveReceivedMessages field to tblBoard\r
574         db->Execute("ALTER TABLE tblBoard ADD COLUMN SaveReceivedMessages       BOOL CHECK(SaveReceivedMessages IN('true','false')) DEFAULT 'true';");\r
575 \r
576         db->Execute("UPDATE tblDBVersion SET Major=1, Minor=3;");\r
577 }\r
578 \r
579 void ConvertDB0103To0104()\r
580 {\r
581         // add MessageIndex to tblMessage\r
582         DateTime date;\r
583         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
584         db->Execute("ALTER TABLE tblMessage ADD COLUMN MessageIndex     INTEGER;");\r
585         db->Execute("CREATE UNIQUE INDEX IF NOT EXISTS idxMessageRequest ON tblMessageRequests(IdentityID,Day,RequestIndex);");\r
586         db->Execute("ALTER TABLE tblLocalIdentity ADD COLUMN DateCreated DATETIME;");\r
587         date.SetToGMTime();\r
588         db->Execute("UPDATE tblLocalIdentity SET DateCreated='"+date.Format("%Y-%m-%d %H:%M:%S")+"' WHERE DateCreated IS NULL;");\r
589         db->Execute("UPDATE tblDBVersion SET Major=1, Minor=4;");\r
590 }\r
591 \r
592 void ConvertDB0104To0105()\r
593 {\r
594         // add AddedMethod, MessageTrustComment, TrustListTrustComment to tblIdentity\r
595         // add MessageTrustComment,TrustListTrustComment to tblPeerTrust\r
596         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
597         db->Execute("ALTER TABLE tblIdentity ADD COLUMN AddedMethod TEXT;");\r
598         db->Execute("ALTER TABLE tblIdentity ADD COLUMN MessageTrustComment TEXT;");\r
599         db->Execute("ALTER TABLE tblIdentity ADD COLUMN TrustListTrustComment TEXT;");\r
600         db->Execute("ALTER TABLE tblPeerTrust ADD COLUMN MessageTrustComment TEXT;");\r
601         db->Execute("ALTER TABLE tblPeerTrust ADD COLUMN TrustListTrustComment TEXT;");\r
602         db->Execute("UPDATE tblDBVersion SET Major=1, Minor=5;");\r
603 }\r
604 \r
605 void ConvertDB0105To0106()\r
606 {\r
607         // add Publish Freesite\r
608         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
609         db->Execute("ALTER TABLE tblLocalIdentity ADD COLUMN PublishFreesite BOOL CHECK(PublishFreesite IN('true','false')) DEFAULT 'false';");\r
610         db->Execute("ALTER TABLE tblLocalIdentity ADD COLUMN LastInsertedFreesite DATETIME;");\r
611         db->Execute("UPDATE tblDBVersion SET Major=1, Minor=6;");\r
612 }\r
613 \r
614 void ConvertDB0106To0107()\r
615 {\r
616         // add AddedMethod to tblBoard\r
617         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
618         db->Execute("ALTER TABLE tblBoard ADD COLUMN AddedMethod TEXT;");\r
619         db->Execute("ALTER TABLE tblIdentity ADD COLUMN Hidden BOOL CHECK(Hidden IN('true','false')) DEFAULT 'false';");\r
620         db->Execute("UPDATE tblIdentity SET Hidden='false' WHERE Hidden IS NULL;");\r
621         db->Execute("UPDATE tblDBVersion SET Major=1, Minor=7;");\r
622 }\r
623 \r
624 void ConvertDB0107To0108()\r
625 {\r
626         // add FreesiteEdition to tblLocalIdentity and tblIdentity\r
627         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
628         db->Execute("ALTER TABLE tblLocalIdentity ADD COLUMN FreesiteEdition INTEGER;");\r
629         db->Execute("ALTER TABLE tblIdentity ADD COLUMN FreesiteEdition INTEGER;");\r
630         db->Execute("UPDATE tblDBVersion SET Major=1, Minor=8;");\r
631 }\r
632 \r
633 void ConvertDB0108To0109()\r
634 {\r
635         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
636         db->Execute("CREATE TABLE IF NOT EXISTS tblFileInserts(\\r
637                         FileInsertID            INTEGER PRIMARY KEY,\\r
638                         MessageUUID                     TEXT,\\r
639                         FileName                        TEXT,\\r
640                         Key                                     TEXT,\\r
641                         Size                            INTEGER,\\r
642                         Data                            BLOB\\r
643                         );");\r
644         db->Execute("UPDATE tblDBVersion SET Major=1, Minor=9;");\r
645 }\r
646 \r
647 void ConvertDB0109To0110()\r
648 {\r
649         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
650         db->Execute("ALTER TABLE tblFileInserts ADD COLUMN MimeType TEXT;");\r
651         db->Execute("UPDATE tblDBVersion SET Major=1, Minor=10;");\r
652 }\r
653 \r
654 void SetupDefaultOptions()\r
655 {\r
656         // 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
657 \r
658         std::ostringstream tempstr;     // must set tempstr to "" between db inserts\r
659         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
660         SQLite3DB::Statement st=db->Prepare("INSERT INTO tblOption(Option,OptionValue,OptionDescription) VALUES(?,?,?);");\r
661 \r
662         // LogLevel\r
663         tempstr.str("");\r
664         tempstr << LogFile::LOGLEVEL_DEBUG;\r
665         st.Bind(0,"LogLevel");\r
666         st.Bind(1,tempstr.str());\r
667         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
668         st.Step();\r
669         st.Reset();\r
670 \r
671         // NNTPListenPort\r
672         st.Bind(0,"NNTPListenPort");\r
673         st.Bind(1,"1119");\r
674         st.Bind(2,"The port that the NNTP service will listen for incoming connections.");\r
675         st.Step();\r
676         st.Reset();\r
677 \r
678         // NNTPBindAddresses\r
679         st.Bind(0,"NNTPBindAddresses");\r
680         st.Bind(1,"localhost");\r
681         st.Bind(2,"A comma separated list of valid IPv4 or IPv6 addresses/hostnames that the NNTP service will try to bind to.");\r
682         st.Step();\r
683         st.Reset();\r
684 \r
685         st.Bind(0,"NNTPAllowPost");\r
686         st.Bind(1,"true");\r
687         st.Bind(2,"Allow posting messages from NNTP.  Setting to false will make the newsgroups read only.");\r
688         st.Step();\r
689         st.Reset();\r
690 \r
691         // StartNNTP\r
692         st.Bind(0,"StartNNTP");\r
693         st.Bind(1,"true");\r
694         st.Bind(2,"Start NNTP server.");\r
695         st.Step();\r
696         st.Reset();\r
697 \r
698         st.Bind(0,"StartHTTP");\r
699         st.Bind(1,"true");\r
700         st.Bind(2,"Start HTTP server.  WARNING: If you turn this off, you won't be able to access the administration pages.");\r
701         st.Step();\r
702         st.Reset();\r
703 \r
704         st.Bind(0,"HTTPListenPort");\r
705         st.Bind(1,"8080");\r
706         st.Bind(2,"Port HTTP server will listen on.");\r
707         st.Step();\r
708         st.Reset();\r
709 \r
710         st.Bind(0,"HTTPAccessControl");\r
711         st.Bind(1,"-0.0.0.0/0,+127.0.0.1");\r
712         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
713         st.Step();\r
714         st.Reset();\r
715 \r
716         // StartFreenetUpdater\r
717         st.Bind(0,"StartFreenetUpdater");\r
718         st.Bind(1,"true");\r
719         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
720         st.Step();\r
721         st.Reset();\r
722 \r
723         // FCPHost\r
724         st.Bind(0,"FCPHost");\r
725         st.Bind(1,"127.0.0.1");\r
726         st.Bind(2,"Host name or address of Freenet node.");\r
727         st.Step();\r
728         st.Reset();\r
729 \r
730         // FCPPort\r
731         st.Bind(0,"FCPPort");\r
732         st.Bind(1,"9481");\r
733         st.Bind(2,"The port that Freenet is listening for FCP connections on.");\r
734         st.Step();\r
735         st.Reset();\r
736 \r
737         st.Bind(0,"FProxyPort");\r
738         st.Bind(1,"8888");\r
739         st.Bind(2,"The port that Freenet is listening for http connections on.");\r
740         st.Step();\r
741         st.Reset();\r
742 \r
743         st.Bind(0,"MessageBase");\r
744         st.Bind(1,"fms");\r
745         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
746         st.Step();\r
747         st.Reset();\r
748 \r
749         st.Bind(0,"MaxIdentityRequests");\r
750         st.Bind(1,"5");\r
751         st.Bind(2,"Maximum number of concurrent requests for new Identity xml files");\r
752         st.Step();\r
753         st.Reset();\r
754 \r
755         st.Bind(0,"MaxIdentityIntroductionRequests");\r
756         st.Bind(1,"5");\r
757         st.Bind(2,"Maximum number of concurrent identities requesting IdentityIntroduction xml files.  Each identity may have multiple requests pending.");\r
758         st.Step();\r
759         st.Reset();\r
760 \r
761         st.Bind(0,"MaxIntroductionPuzzleRequests");\r
762         st.Bind(1,"5");\r
763         st.Bind(2,"Maximum number of concurrent requests for new IntroductionPuzzle xml files");\r
764         st.Step();\r
765         st.Reset();\r
766 \r
767         st.Bind(0,"MaxTrustListRequests");\r
768         st.Bind(1,"5");\r
769         st.Bind(2,"Maximum number of concurrent requests for new Trust Lists");\r
770         st.Step();\r
771         st.Reset();\r
772 \r
773         st.Bind(0,"MaxMessageListRequests");\r
774         st.Bind(1,"5");\r
775         st.Bind(2,"Maximum number of concurrent requests for new Message Lists");\r
776         st.Step();\r
777         st.Reset();\r
778 \r
779         st.Bind(0,"MaxMessageRequests");\r
780         st.Bind(1,"20");\r
781         st.Bind(2,"Maximum number of concurrent requests for new Messages");\r
782         st.Step();\r
783         st.Reset();\r
784 \r
785         st.Bind(0,"MinLocalMessageTrust");\r
786         st.Bind(1,"50");\r
787         st.Bind(2,"Specifies a local message trust level that a peer must have before its messages will be downloaded.");\r
788         st.Step();\r
789         st.Reset();\r
790 \r
791         st.Bind(0,"MinPeerMessageTrust");\r
792         st.Bind(1,"30");\r
793         st.Bind(2,"Specifies a peer message trust level that a peer must have before its messages will be downloaded.");\r
794         st.Step();\r
795         st.Reset();\r
796 \r
797         st.Bind(0,"MinLocalTrustListTrust");\r
798         st.Bind(1,"50");\r
799         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
800         st.Step();\r
801         st.Reset();\r
802 \r
803         st.Bind(0,"MinPeerTrustListTrust");\r
804         st.Bind(1,"30");\r
805         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
806         st.Step();\r
807         st.Reset();\r
808 \r
809         st.Bind(0,"MessageDownloadMaxDaysBackward");\r
810         st.Bind(1,"5");\r
811         st.Bind(2,"The maximum number of days backward that messages will be downloaded from each identity");\r
812         st.Step();\r
813         st.Reset();\r
814 \r
815         st.Bind(0,"MessageListDaysBackward");\r
816         st.Bind(1,"5");\r
817         st.Bind(2,"The number of days backward that messages you have inserted will appear in your MessageLists");\r
818         st.Step();\r
819         st.Reset();\r
820 \r
821         st.Bind(0,"MaxPeerMessagesPerDay");\r
822         st.Bind(1,"200");\r
823         st.Bind(2,"The maximum number of messages you will download from each peer on a given day.");\r
824         st.Step();\r
825         st.Reset();\r
826 \r
827         st.Bind(0,"MaxBoardListRequests");\r
828         st.Bind(1,"5");\r
829         st.Bind(2,"The maximum number of concurrent requests for new Board Lists.  Set to 0 to disable.");\r
830         st.Step();\r
831         st.Reset();\r
832 \r
833         st.Bind(0,"MaxBoardsPerMessage");\r
834         st.Bind(1,"8");\r
835         st.Bind(2,"The maximum number of boards a received message may be sent to.  Boards over this limit will be ignored.");\r
836         st.Step();\r
837         st.Reset();\r
838 \r
839         st.Bind(0,"SaveMessagesFromNewBoards");\r
840         st.Bind(1,"true");\r
841         st.Bind(2,"Set to true to automatically save messages posted to new boards.  Set to false to ignore messages to new boards.");\r
842         st.Step();\r
843         st.Reset();\r
844 \r
845         st.Bind(0,"ChangeMessageTrustOnReply");\r
846         st.Bind(1,"0");\r
847         st.Bind(2,"How much the local message trust level of an identity should change when you reply to one of their messages.");\r
848         st.Step();\r
849         st.Reset();\r
850 \r
851         st.Bind(0,"AddNewPostFromIdentities");\r
852         st.Bind(1,"false");\r
853         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
854         st.Step();\r
855         st.Reset();\r
856 \r
857         st.Bind(0,"DeleteMessagesOlderThan");\r
858         st.Bind(1,"180");\r
859         st.Bind(2,"Automatically delete messages older than this many days.");\r
860         st.Step();\r
861         st.Reset();\r
862 \r
863 }\r
864 \r
865 void SetupLogFile()\r
866 {\r
867         DateTime date;\r
868         std::string configval;\r
869         int loglevel;\r
870 \r
871         date.SetToGMTime();\r
872 \r
873         LogFile::Instance()->SetFileName("fms-"+date.Format("%Y-%m-%d")+".log");\r
874         LogFile::Instance()->OpenFile();\r
875         LogFile::Instance()->SetWriteNewLine(true);\r
876         LogFile::Instance()->SetWriteDate(true);\r
877         LogFile::Instance()->SetWriteLogLevel(true);\r
878 \r
879         if(Option::Instance()->Get("LogLevel",configval)==false)\r
880         {\r
881                 configval="4";\r
882                 Option::Instance()->Set("LogLevel",configval);\r
883         }\r
884         if(StringFunctions::Convert(configval,loglevel)==false)\r
885         {\r
886                 loglevel=LogFile::LOGLEVEL_DEBUG;\r
887                 Option::Instance()->Set("LogLevel",loglevel);\r
888         }\r
889         LogFile::Instance()->SetLogLevel((LogFile::LogLevel)loglevel);\r
890 }\r
891 \r
892 void SetupNetwork()\r
893 {\r
894 #ifdef _WIN32\r
895         WSAData wsadata;\r
896         WSAStartup(MAKEWORD(2,2),&wsadata);\r
897 #endif\r
898 }\r
899 \r
900 void Shutdown()\r
901 {\r
902         ThreadController::Instance()->ShutdownThreads();\r
903 \r
904         ShutdownNetwork();\r
905 \r
906         LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_INFO,"FMS shutdown");\r
907         LogFile::Instance()->WriteNewLine();\r
908 }\r
909 \r
910 void ShutdownNetwork()\r
911 {\r
912 #ifdef _WIN32\r
913         WSACleanup();\r
914 #endif\r
915 }\r
916 \r
917 void SigHandler(int signum)\r
918 {\r
919         Shutdown();\r
920         exit(0);\r
921 }\r
922 \r
923 void FixCapitalBoardNames()\r
924 {\r
925         SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
926 \r
927         SQLite3DB::Statement st=db->Prepare("SELECT BoardID,BoardName FROM tblBoard WHERE BoardID NOT IN (SELECT BoardID FROM tblAdministrationBoard);");\r
928         SQLite3DB::Statement st2=db->Prepare("SELECT BoardID FROM tblBoard WHERE BoardName=?;");\r
929         SQLite3DB::Statement del=db->Prepare("DELETE FROM tblBoard WHERE BoardID=?;");\r
930         SQLite3DB::Statement upd=db->Prepare("UPDATE tblBoard SET BoardName=? WHERE BoardID=?;");\r
931         SQLite3DB::Statement upd2=db->Prepare("UPDATE tblMessage SET ReplyBoardID=? WHERE ReplyBoardID=?;");\r
932         SQLite3DB::Statement upd3=db->Prepare("UPDATE tblMessageBoard SET BoardID=? WHERE BoardID=?;");\r
933 \r
934         st.Step();\r
935         while(st.RowReturned())\r
936         {\r
937                 int boardid=0;\r
938                 int newboardid=0;\r
939                 std::string name="";\r
940                 std::string lowername="";\r
941 \r
942                 st.ResultInt(0,boardid);\r
943                 st.ResultText(1,name);\r
944 \r
945                 lowername=name;\r
946                 StringFunctions::LowerCase(lowername,lowername);\r
947        \r
948                 if(name!=lowername)\r
949                 {\r
950                         st2.Bind(0,lowername);\r
951                         st2.Step();\r
952 \r
953                         if(st2.RowReturned())\r
954                         {\r
955                                 st2.ResultInt(0,newboardid);\r
956 \r
957                                 upd2.Bind(0,newboardid);\r
958                                 upd2.Bind(1,boardid);\r
959                                 upd2.Step();\r
960                                 upd2.Reset();\r
961 \r
962                                 upd3.Bind(0,newboardid);\r
963                                 upd3.Bind(1,boardid);\r
964                                 upd3.Step();\r
965                                 upd3.Reset();\r
966 \r
967                                 del.Bind(0,boardid);\r
968                                 del.Step();\r
969                                 del.Reset();\r
970                         }\r
971                         else\r
972                         {\r
973                                 upd.Bind(0,lowername);\r
974                                 upd.Bind(1,boardid);\r
975                                 upd.Step();\r
976                                 upd.Reset();\r
977                         }\r
978 \r
979                         st2.Reset();\r
980                 }\r
981        \r
982                 st.Step();\r
983         }\r
984 \r
985 }\r