2acca4d1f98af4622388fefa3308badb06f56352
[fms.git] / src / identitytestglobal.cpp
1 #include "../include/identitytestglobal.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 \r
9 #ifdef _WIN32\r
10         #include <winsock2.h>\r
11 #endif\r
12 \r
13 #ifdef XMEM\r
14         #include <xmem.h>\r
15 #endif\r
16 \r
17 void SetupDB()\r
18 {\r
19 \r
20         SQLite3DB::DB *db=SQLite3DB::DB::instance();\r
21 \r
22         db->Open("fms.db3");\r
23         db->SetBusyTimeout(10000);              // set timeout to 10 seconds\r
24         db->Execute("VACUUM;");\r
25 \r
26         db->Execute("CREATE TABLE IF NOT EXISTS tblOption(\\r
27                                 Option                          TEXT UNIQUE,\\r
28                                 OptionValue                     TEXT NOT NULL,\\r
29                                 OptionDescription       TEXT\\r
30                                 );");\r
31 \r
32         db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentity(\\r
33                                 LocalIdentityID                 INTEGER PRIMARY KEY,\\r
34                                 Name                                    TEXT,\\r
35                                 PublicKey                               TEXT,\\r
36                                 PrivateKey                              TEXT,\\r
37                                 SingleUse                               BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
38                                 InsertingIdentity               BOOL CHECK(InsertingIdentity IN('true','false')) DEFAULT 'false',\\r
39                                 LastInsertedIdentity    DATETIME,\\r
40                                 InsertingPuzzle                 BOOL CHECK(InsertingPuzzle IN('true','false')) DEFAULT 'false',\\r
41                                 LastInsertedPuzzle              DATETIME,\\r
42                                 InsertingTrustList              BOOL CHECK(InsertingTrustList IN('true','false')) DEFAULT 'false',\\r
43                                 LastInsertedTrustList   DATETIME\\r
44                                 );");\r
45 \r
46         db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentityInserts(\\r
47                                 LocalIdentityID         INTEGER,\\r
48                                 Day                                     DATE,\\r
49                                 InsertIndex                     INTEGER\\r
50                                 );");\r
51 \r
52         db->Execute("CREATE TABLE IF NOT EXISTS tblIntroductionPuzzleInserts(\\r
53                                 UUID                            TEXT UNIQUE,\\r
54                                 LocalIdentityID         INTEGER,\\r
55                                 Day                                     DATE,\\r
56                                 InsertIndex                     INTEGER,\\r
57                                 Type                            TEXT,\\r
58                                 MimeType                        TEXT,\\r
59                                 PuzzleData                      TEXT,\\r
60                                 PuzzleSolution          TEXT,\\r
61                                 FoundSolution           BOOL CHECK(FoundSolution IN('true','false')) DEFAULT 'false'\\r
62                                 );");\r
63 \r
64         db->Execute("CREATE TABLE IF NOT EXISTS tblIdentity(\\r
65                                 IdentityID                      INTEGER PRIMARY KEY,\\r
66                                 PublicKey                       TEXT,\\r
67                                 Name                            TEXT,\\r
68                                 SingleUse                       BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
69                                 DateAdded                       DATETIME,\\r
70                                 LastSeen                        DATETIME,\\r
71                                 LocalMessageTrust       INTEGER CHECK(LocalMessageTrust BETWEEN 0 AND 100) DEFAULT 50,\\r
72                                 PeerMessageTrust        INTEGER CHECK(PeerMessageTrust BETWEEN 0 AND 100) DEFAULT 50,\\r
73                                 LocalTrustListTrust     INTEGER CHECK(LocalTrustListTrust BETWEEN 0 AND 100) DEFAULT 50,\\r
74                                 PeerTrustListTrust      INTEGER CHECK(PeerTrustListTrust BETWEEN 0 AND 100) DEFAULT 50\\r
75                                 );");\r
76 \r
77         db->Execute("CREATE TABLE IF NOT EXISTS tblIdentityRequests(\\r
78                                 IdentityID                      INTEGER PRIMARY KEY,\\r
79                                 Day                                     DATE,\\r
80                                 RequestIndex            INTEGER,\\r
81                                 Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
82                                 );");\r
83 \r
84         db->Execute("CREATE TABLE IF NOT EXISTS tblIntroductionPuzzleRequests(\\r
85                                 IdentityID                      INTEGER,\\r
86                                 Day                                     DATE,\\r
87                                 RequestIndex            INTEGER,\\r
88                                 Found                           BOOL CHECK(Found IN('true','false')) DEFAULT 'false',\\r
89                                 UUID                            TEXT UNIQUE,\\r
90                                 Type                            TEXT,\\r
91                                 MimeType                        TEXT,\\r
92                                 PuzzleData                      TEXT\\r
93                                 );");\r
94 \r
95         db->Execute("CREATE TABLE IF NOT EXISTS tblIdentityIntroductionInserts(\\r
96                                 LocalIdentityID         INTEGER,\\r
97                                 Day                                     DATE,\\r
98                                 UUID                            TEXT UNIQUE,\\r
99                                 Solution                        TEXT,\\r
100                                 Inserted                        BOOL CHECK(Inserted IN('true','false')) DEFAULT 'false'\\r
101                                 );");\r
102 \r
103 }\r
104 \r
105 void SetupDefaultOptions()\r
106 {\r
107         // 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
108 \r
109         std::ostringstream tempstr;     // must set tempstr to "" between db inserts\r
110         SQLite3DB::DB *db=SQLite3DB::DB::instance();\r
111         SQLite3DB::Statement st=db->Prepare("INSERT INTO tblOption(Option,OptionValue,OptionDescription) VALUES(?,?,?);");\r
112 \r
113         // LogLevel\r
114         tempstr.str("");\r
115         tempstr << LogFile::LOGLEVEL_DEBUG;\r
116         st.Bind(0,"LogLevel");\r
117         st.Bind(1,tempstr.str());\r
118         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
119         st.Step();\r
120         st.Reset();\r
121 \r
122         // StartFreenetUpdater\r
123         st.Bind(0,"StartFreenetUpdater");\r
124         st.Bind(1,"true");\r
125         st.Bind(2,"Start Freenet Updater.");\r
126         st.Step();\r
127         st.Reset();\r
128 \r
129         // FCPHost\r
130         st.Bind(0,"FCPHost");\r
131         st.Bind(1,"localhost");\r
132         st.Bind(2,"Host name or address of Freenet node.");\r
133         st.Step();\r
134         st.Reset();\r
135 \r
136         // FCPPort\r
137         st.Bind(0,"FCPPort");\r
138         st.Bind(1,"9481");\r
139         st.Bind(2,"The port that Freenet is listening for FCP connections on.");\r
140         st.Step();\r
141         st.Reset();\r
142 \r
143         st.Bind(0,"MessageBase");\r
144         st.Bind(1,"fms");\r
145         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
146         st.Step();\r
147         st.Reset();\r
148 \r
149         st.Bind(0,"MaxIdentityRequests");\r
150         st.Bind(1,"5");\r
151         st.Bind(2,"Maximum number of concurrent requests for new Identity xml files");\r
152         st.Step();\r
153         st.Reset();\r
154 \r
155         st.Bind(0,"MaxIdentityIntroductionRequests");\r
156         st.Bind(1,"5");\r
157         st.Bind(2,"Maximum number of concurrent identities requesting IdentityIntroduction xml files.  Each identity may have multiple requests pending.");\r
158         st.Step();\r
159         st.Reset();\r
160 \r
161         st.Bind(0,"MaxIntroductionPuzzleRequests");\r
162         st.Bind(1,"5");\r
163         st.Bind(2,"Maximum number of concurrent requests for new IntroductionPuzzle xml files");\r
164         st.Step();\r
165         st.Reset();\r
166 \r
167 }\r
168 \r
169 void SetupLogFile()\r
170 {\r
171         DateTime date;\r
172         std::string configval;\r
173         int loglevel;\r
174 \r
175         date.SetToGMTime();\r
176 \r
177         LogFile::instance()->SetFileName("fms-"+date.Format("%Y-%m-%d")+".log");\r
178         LogFile::instance()->OpenFile();\r
179         LogFile::instance()->SetWriteNewLine(true);\r
180         LogFile::instance()->SetWriteDate(true);\r
181         LogFile::instance()->SetWriteLogLevel(true);\r
182 \r
183         if(Option::instance()->Get("LogLevel",configval)==false)\r
184         {\r
185                 configval="4";\r
186                 Option::instance()->Set("LogLevel",configval);\r
187         }\r
188         if(StringFunctions::Convert(configval,loglevel)==false)\r
189         {\r
190                 loglevel=LogFile::LOGLEVEL_DEBUG;\r
191                 Option::instance()->Set("LogLevel",loglevel);\r
192         }\r
193         LogFile::instance()->SetLogLevel((LogFile::LogLevel)loglevel);\r
194 }\r
195 \r
196 void SetupNetwork()\r
197 {\r
198 #ifdef _WIN32\r
199         WSAData wsadata;\r
200         WSAStartup(MAKEWORD(2,2),&wsadata);\r
201 #endif\r
202 }\r
203 \r
204 void ShutdownNetwork()\r
205 {\r
206 #ifdef _WIN32\r
207         WSACleanup();\r
208 #endif\r
209 }\r
210 \r
211 void ShutdownThreads(std::vector<ZThread::Thread *> &threads)\r
212 {\r
213         std::vector<ZThread::Thread *>::iterator i;\r
214         for(i=threads.begin(); i!=threads.end(); i++)\r
215         {\r
216                 if((*i)->wait(1)==false)\r
217                 {\r
218                         try\r
219                         {\r
220                                 (*i)->interrupt();\r
221                         }\r
222                         catch(...)\r
223                         {\r
224                         }\r
225                 }\r
226         }\r
227 \r
228         for(i=threads.begin(); i!=threads.end(); i++)\r
229         {\r
230                 (*i)->wait();\r
231                 delete (*i);\r
232         }\r
233 \r
234         threads.clear();\r
235 \r
236 }\r
237 \r
238 void StartThreads(std::vector<ZThread::Thread *> &threads)\r
239 {\r
240         std::string startfreenet;\r
241         std::string startnntp;\r
242 \r
243         if(Option::instance()->Get("StartFreenetUpdater",startfreenet)==false)\r
244         {\r
245                 startfreenet="true";\r
246                 Option::instance()->Set("StartFreenetUpdater","true");\r
247         }\r
248 \r
249         if(startfreenet=="true")\r
250         {\r
251                 ZThread::Thread *t=new ZThread::Thread(new FreenetMasterThread());\r
252                 threads.push_back(t);\r
253         }\r
254 \r
255 }\r