version 0.2.2
[fms.git] / src / http / pages / peertrustpage.cpp
1 #include "../../../include/http/pages/peertrustpage.h"\r
2 #include "../../../include/stringfunctions.h"\r
3 \r
4 #ifdef XMEM\r
5         #include <xmem.h>\r
6 #endif\r
7 \r
8 const std::string PeerTrustPage::BuildQueryString(const long startrow, const std::string &namesearch, const std::string &sortby, const std::string &sortorder)\r
9 {\r
10         std::string returnval="";\r
11         std::string tempval="";\r
12         \r
13         if(startrow>=0)\r
14         {\r
15                 StringFunctions::Convert(startrow,tempval);\r
16                 returnval+="startrow="+tempval;\r
17         }\r
18 \r
19         if(namesearch!="")\r
20         {\r
21                 if(returnval!="")\r
22                 {\r
23                         returnval+="&";\r
24                 }\r
25                 returnval+="namesearch="+namesearch;\r
26         }\r
27 \r
28         if(sortby!="")\r
29         {\r
30                 if(returnval!="")\r
31                 {\r
32                         returnval+="&";\r
33                 }\r
34                 returnval+="sortby="+sortby;\r
35         }\r
36 \r
37         if(sortorder!="")\r
38         {\r
39                 if(returnval!="")\r
40                 {\r
41                         returnval+="&";\r
42                 }\r
43                 returnval+="sortorder="+sortorder;\r
44         }\r
45 \r
46         return returnval;\r
47 \r
48 }\r
49 \r
50 const std::string PeerTrustPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
51 {\r
52         int count=0;\r
53         std::string countstr;\r
54         std::string content="";\r
55         int identitycount=0;            // total number of ids we know\r
56         int rowsperpage=25;                     // how many ids to show per page\r
57         std::string rowsperpagestr;\r
58         int startrow=0;\r
59         std::string startrowstr="0";\r
60         std::string namesearch="";\r
61         std::string sql;\r
62         std::string sortby="";\r
63         std::string sortorder="";\r
64 \r
65         StringFunctions::Convert(rowsperpage,rowsperpagestr);\r
66 \r
67         if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="update")\r
68         {\r
69                 std::vector<std::string> identityids;\r
70                 std::vector<std::string> oldlmt;\r
71                 std::vector<std::string> lmt;\r
72                 std::vector<std::string> oldltlt;\r
73                 std::vector<std::string> ltlt;\r
74                 std::vector<std::string> oldmtc;\r
75                 std::vector<std::string> mtc;\r
76                 std::vector<std::string> oldtltc;\r
77                 std::vector<std::string> tltc;\r
78                 int localmessagetrust=0;\r
79                 int localtrustlisttrust=0;\r
80                 int identityid;\r
81 \r
82                 CreateArgArray(queryvars,"identityid",identityids);\r
83                 CreateArgArray(queryvars,"oldlocalmessagetrust",oldlmt);\r
84                 CreateArgArray(queryvars,"localmessagetrust",lmt);\r
85                 CreateArgArray(queryvars,"oldlocaltrustlisttrust",oldltlt);\r
86                 CreateArgArray(queryvars,"localtrustlisttrust",ltlt);\r
87                 CreateArgArray(queryvars,"oldmessagetrustcomment",oldmtc);\r
88                 CreateArgArray(queryvars,"messagetrustcomment",mtc);\r
89                 CreateArgArray(queryvars,"oldtrustlisttrustcomment",oldtltc);\r
90                 CreateArgArray(queryvars,"trustlisttrustcomment",tltc);\r
91                 \r
92                 SQLite3DB::Statement update=m_db->Prepare("UPDATE tblIdentity SET LocalMessageTrust=?, LocalTrustListTrust=?, MessageTrustComment=?, TrustListTrustComment=? WHERE IdentityID=?;");\r
93 \r
94                 for(int i=0; i<identityids.size(); i++)\r
95                 {\r
96                         if(oldlmt[i]!=lmt[i] || oldltlt[i]!=ltlt[i] || oldmtc[i]!=mtc[i] || oldtltc[i]!=tltc[i])\r
97                         {\r
98                                 StringFunctions::Convert(lmt[i],localmessagetrust);\r
99                                 StringFunctions::Convert(ltlt[i],localtrustlisttrust);\r
100                                 StringFunctions::Convert(identityids[i],identityid);\r
101 \r
102                                 if(lmt[i]!="")\r
103                                 {\r
104                                         update.Bind(0,localmessagetrust);\r
105                                 }\r
106                                 else\r
107                                 {\r
108                                         update.Bind(0);\r
109                                 }\r
110                                 if(ltlt[i]!="")\r
111                                 {\r
112                                         update.Bind(1,localtrustlisttrust);\r
113                                 }\r
114                                 else\r
115                                 {\r
116                                         update.Bind(1);\r
117                                 }\r
118                                 update.Bind(2,mtc[i]);\r
119                                 update.Bind(3,tltc[i]);\r
120                                 update.Bind(4,identityid);\r
121                                 update.Step();\r
122                                 update.Reset();\r
123                         }\r
124                 }\r
125 \r
126         }\r
127 \r
128         // if startrow is specified\r
129         if(queryvars.find("startrow")!=queryvars.end())\r
130         {\r
131                 startrowstr=(*queryvars.find("startrow")).second;\r
132                 // convert back and forth, just in case a number wasn't passed in startrow\r
133                 StringFunctions::Convert(startrowstr,startrow);\r
134                 if(startrow<0)\r
135                 {\r
136                         startrow=0;\r
137                 }\r
138                 StringFunctions::Convert(startrow,startrowstr);\r
139         }\r
140 \r
141         // sort by\r
142         if(queryvars.find("sortby")!=queryvars.end())\r
143         {\r
144                 sortby=(*queryvars.find("sortby")).second;\r
145         }\r
146         else\r
147         {\r
148                 sortby="Name";\r
149         }\r
150 \r
151         // sort order\r
152         if(queryvars.find("sortorder")!=queryvars.end())\r
153         {\r
154                 sortorder=(*queryvars.find("sortorder")).second;\r
155         }\r
156         else\r
157         {\r
158                 sortorder="ASC";\r
159         }\r
160 \r
161         // if we are searching by name\r
162         if(queryvars.find("namesearch")!=queryvars.end())\r
163         {\r
164                 namesearch=(*queryvars.find("namesearch")).second;\r
165         }\r
166 \r
167         content+="<h2>Peer Trust</h2>";\r
168         content+="Message Trust is how much you trust the identity to post good messages. Trust List Trust is how much weight you want the trust list of that identity to have when calculating the total. The local trust levels are set by you, and the peer trust levels are calculated by a weighted average using other identities' trust lists.";\r
169         content+="<div style=\"text-align:center;\">";\r
170         content+="<form name=\"frmsearch\" method=\"POST\" action=\"peertrust.htm\">";\r
171         content+="<input type=\"text\" name=\"namesearch\" value=\""+SanitizeOutput(namesearch)+"\">";\r
172         content+="<input type=\"submit\" value=\"Search\">";\r
173         content+="</form>";\r
174         content+="</div>";\r
175         content+="<form name=\"frmtrust\" method=\"POST\">";\r
176         content+="<input type=\"hidden\" name=\"formaction\" value=\"update\">";\r
177         content+="<input type=\"hidden\" name=\"startrow\" value=\""+startrowstr+"\">";\r
178         if(namesearch!="")\r
179         {\r
180                 content+="<input type=\"hidden\" name=\"namesearch\" value=\""+SanitizeOutput(namesearch)+"\">";\r
181         }\r
182         content+="<table>";\r
183         content+="<tr><th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"Name",ReverseSort("Name",sortby,sortorder))+"\">Name</a></th>";\r
184         content+="<th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"LocalMessageTrust",ReverseSort("LocalMessageTrust",sortby,sortorder))+"\">Local Message Trust</a></th>";\r
185         content+="<th>Message Comment</th>";\r
186         content+="<th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"PeerMessageTrust",ReverseSort("PeerMessageTrust",sortby,sortorder))+"\">Peer Message Trust</a></th>";\r
187         content+="<th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"LocalTrustListTrust",ReverseSort("LocalTrustListTrust",sortby,sortorder))+"\">Local Trust List Trust</a></th>";\r
188         content+="<th>Trust Comment</th>";\r
189         content+="<th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"PeerTrustListTrust",ReverseSort("PeerTrustListTrust",sortby,sortorder))+"\">Peer Trust List Trust</a></th></tr>";\r
190         \r
191         // get count of identities we are showing\r
192         sql="SELECT COUNT(*) FROM tblIdentity";\r
193         if(namesearch!="")\r
194         {\r
195                 sql+=" WHERE Name LIKE '%' || ? || '%'";\r
196         }\r
197         sql+=";";\r
198         SQLite3DB::Statement st=m_db->Prepare(sql);\r
199         if(namesearch!="")\r
200         {\r
201                 st.Bind(0,namesearch);\r
202         }\r
203         st.Step();\r
204         st.ResultInt(0,identitycount);\r
205         st.Finalize();\r
206 \r
207         sql="SELECT IdentityID,Name,LocalMessageTrust,PeerMessageTrust,LocalTrustListTrust,PeerTrustListTrust,PublicKey,MessageTrustComment,TrustListTrustComment FROM tblIdentity";\r
208         if(namesearch!="")\r
209         {\r
210                 sql+=" WHERE Name LIKE  '%' || ? || '%'";\r
211         }\r
212         sql+=" ORDER BY";\r
213         if(sortby=="Name")\r
214         {\r
215                 sql+=" Name COLLATE NOCASE";\r
216         }\r
217         else\r
218         {\r
219                 sql+=" "+sortby;\r
220         }\r
221         if(sortorder!="")\r
222         {\r
223                 sql+=" "+sortorder;\r
224         }\r
225         sql+=" LIMIT "+startrowstr+","+rowsperpagestr+";";\r
226         st=m_db->Prepare(sql);\r
227         if(namesearch!="")\r
228         {\r
229                 st.Bind(0,namesearch);\r
230         }\r
231         st.Step();\r
232 \r
233         while(st.RowReturned())\r
234         {\r
235                 std::string identityid;\r
236                 std::string name;\r
237                 std::string localmessagetrust;\r
238                 std::string peermessagetrust;\r
239                 std::string localtrustlisttrust;\r
240                 std::string peertrustlisttrust;\r
241                 std::string publickey;\r
242                 std::string keypart="";\r
243                 std::string messagetrustcomment="";\r
244                 std::string trustlisttrustcomment="";\r
245 \r
246                 StringFunctions::Convert(count,countstr);\r
247 \r
248                 st.ResultText(0,identityid);\r
249                 st.ResultText(1,name);\r
250                 st.ResultText(2,localmessagetrust);\r
251                 st.ResultText(3,peermessagetrust);\r
252                 st.ResultText(4,localtrustlisttrust);\r
253                 st.ResultText(5,peertrustlisttrust);\r
254                 st.ResultText(6,publickey);\r
255                 st.ResultText(7,messagetrustcomment);\r
256                 st.ResultText(8,trustlisttrustcomment);\r
257 \r
258                 if(publickey.size()>8)\r
259                 {\r
260                         keypart=publickey.substr(3,5);\r
261                 }\r
262 \r
263                 content+="<tr>";\r
264                 content+="<td title=\""+publickey+"\">";\r
265                 content+="<input type=\"hidden\" name=\"identityid["+countstr+"]\" value=\""+identityid+"\">";\r
266                 content+="<a href=\"peerdetails.htm?identityid="+identityid+"\">";\r
267                 if(name!="")\r
268                 {\r
269                         content+=SanitizeOutput(name+keypart)+"...";\r
270                 }\r
271                 else\r
272                 {\r
273                         content+="[Unknown Name]";\r
274                 }\r
275                 content+="</a>";\r
276                 content+="</td>";\r
277                 content+="<td "+GetClassString(localmessagetrust)+">";\r
278                 content+="<input type=\"hidden\" name=\"oldlocalmessagetrust["+countstr+"]\" value=\""+localmessagetrust+"\">";\r
279                 content+="<input type=\"text\" name=\"localmessagetrust["+countstr+"]\" value=\""+localmessagetrust+"\" size=\"2\" maxlength=\"3\"></td>";\r
280                 content+="<td "+GetClassString(localmessagetrust)+">";\r
281                 content+="<input type=\"hidden\" name=\"oldmessagetrustcomment["+countstr+"]\" value=\""+SanitizeOutput(messagetrustcomment)+"\">";\r
282                 content+="<input type=\"text\" name=\"messagetrustcomment["+countstr+"]\" value=\""+SanitizeOutput(messagetrustcomment)+"\" maxlength=\"50\">";\r
283                 content+="</td>";               \r
284                 content+="<td "+GetClassString(peermessagetrust)+">";\r
285                 content+=peermessagetrust+"</td>";\r
286                 content+="<td "+GetClassString(localtrustlisttrust)+">";\r
287                 content+="<input type=\"hidden\" name=\"oldlocaltrustlisttrust["+countstr+"]\" value=\""+localtrustlisttrust+"\">";\r
288                 content+="<input type=\"text\" name=\"localtrustlisttrust["+countstr+"]\" value=\""+localtrustlisttrust+"\" size=\"2\" maxlength=\"3\"></td>";\r
289                 content+="<td "+GetClassString(localtrustlisttrust)+">";\r
290                 content+="<input type=\"hidden\" name=\"oldtrustlisttrustcomment["+countstr+"]\" value=\""+SanitizeOutput(trustlisttrustcomment)+"\">";\r
291                 content+="<input type=\"text\" name=\"trustlisttrustcomment["+countstr+"]\" value=\""+SanitizeOutput(trustlisttrustcomment)+"\" maxlength=\"50\">";\r
292                 content+="</td>";\r
293                 content+="<td "+GetClassString(peertrustlisttrust)+">";\r
294                 content+=peertrustlisttrust+"</td>";\r
295                 content+="</tr>";\r
296                 st.Step();\r
297                 count++;\r
298         }\r
299         \r
300         if(startrow>0 || startrow+rowsperpage<identitycount)\r
301         {\r
302                 std::string tempstr;\r
303                 int cols=0;\r
304 \r
305                 content+="<tr>";\r
306                 if(startrow>0)\r
307                 {\r
308                         StringFunctions::Convert(startrow-rowsperpage,tempstr);\r
309                         content+="<td colspan=\"3\" align=\"left\"><a href=\"peertrust.htm?"+BuildQueryString(startrow-rowsperpage,namesearch,sortby,sortorder)+"\"><-- Previous Page</a></td>";\r
310                         cols+=3;\r
311                 }\r
312                 if(startrow+rowsperpage<identitycount)\r
313                 {\r
314                         while(cols<4)\r
315                         {\r
316                                 content+="<td></td>";\r
317                                 cols++;\r
318                         }\r
319                         content+="<td colspan=\"3\" align=\"right\"><a href=\"peertrust.htm?"+BuildQueryString(startrow+rowsperpage,namesearch,sortby,sortorder)+"\">Next Page --></a></td>";\r
320                 }\r
321                 content+="</tr>";\r
322         }\r
323 \r
324         content+="<tr><td colspan=\"5\"><center><input type=\"submit\" value=\"Update Trust\"></center></td></tr>";\r
325         content+="</table>";\r
326         content+="</form>";\r
327 \r
328         return "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"+StringFunctions::Replace(m_template,"[CONTENT]",content);\r
329 }\r
330 \r
331 const std::string PeerTrustPage::GetClassString(const std::string &trustlevel)\r
332 {\r
333         int tempint=0;\r
334         std::string tempstr;\r
335 \r
336         StringFunctions::Convert(trustlevel,tempint);\r
337         tempint/=10;\r
338         StringFunctions::Convert(tempint,tempstr);\r
339 \r
340         if(trustlevel!="")\r
341         {\r
342                 return "class=\"trust"+tempstr+"\"";\r
343         }\r
344         else\r
345         {\r
346                 return "";\r
347         }\r
348 }\r
349 \r
350 const std::string PeerTrustPage::ReverseSort(const std::string &sortname, const std::string &currentsortby, const std::string &currentsortorder)\r
351 {\r
352         if(sortname==currentsortby)\r
353         {\r
354                 if(currentsortorder=="ASC")\r
355                 {\r
356                         return "DESC";\r
357                 }\r
358                 else\r
359                 {\r
360                         return "ASC";\r
361                 }\r
362         }\r
363         else\r
364         {\r
365                 return currentsortorder;\r
366         }\r
367 }\r
368 \r
369 const bool PeerTrustPage::WillHandleURI(const std::string &uri)\r
370 {\r
371         if(uri.find("peertrust.")!=std::string::npos)\r
372         {\r
373                 return true;\r
374         }\r
375         else\r
376         {\r
377                 return false;\r
378         }\r
379 }\r