version 0.3.33
[fms.git] / src / http / pages / peertrustpage.cpp
1 #include "../../../include/http/pages/peertrustpage.h"\r
2 #include "../../../include/stringfunctions.h"\r
3 #include "../../../include/global.h"\r
4 \r
5 #ifdef XMEM\r
6         #include <xmem.h>\r
7 #endif\r
8 \r
9 const std::string PeerTrustPage::BuildQueryString(const long startrow, const std::string &namesearch, const std::string &sortby, const std::string &sortorder, const int localidentityid)\r
10 {\r
11         std::string returnval="";\r
12         std::string tempval="";\r
13         \r
14         if(startrow>=0)\r
15         {\r
16                 StringFunctions::Convert(startrow,tempval);\r
17                 returnval+="startrow="+tempval;\r
18         }\r
19 \r
20         if(namesearch!="")\r
21         {\r
22                 if(returnval!="")\r
23                 {\r
24                         returnval+="&";\r
25                 }\r
26                 returnval+="namesearch="+StringFunctions::UriEncode(namesearch);\r
27         }\r
28 \r
29         if(sortby!="")\r
30         {\r
31                 if(returnval!="")\r
32                 {\r
33                         returnval+="&";\r
34                 }\r
35                 returnval+="sortby="+sortby;\r
36         }\r
37 \r
38         if(sortorder!="")\r
39         {\r
40                 if(returnval!="")\r
41                 {\r
42                         returnval+="&";\r
43                 }\r
44                 returnval+="sortorder="+sortorder;\r
45         }\r
46 \r
47         if(localidentityid>=0)\r
48         {\r
49                 std::string localidentityidstr="";\r
50                 StringFunctions::Convert(localidentityid,localidentityidstr);\r
51                 if(returnval!="")\r
52                 {\r
53                         returnval+="&";\r
54                 }\r
55                 returnval+="localidentityid="+localidentityidstr;\r
56         }\r
57 \r
58         return returnval;\r
59 \r
60 }\r
61 \r
62 const std::string PeerTrustPage::CreateLocalIdentityDropDown(const std::string &name, const int selectedlocalidentityid)\r
63 {\r
64         std::string result="";\r
65         \r
66         result+="<select name=\""+name+"\">";\r
67         \r
68         SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID,Name,PublicKey FROM tblLocalIdentity WHERE PublicKey IS NOT NULL ORDER BY Name COLLATE NOCASE;");\r
69         st.Step();\r
70 \r
71         while(st.RowReturned())\r
72         {\r
73                 int localidentityid=-1;\r
74                 std::string localidentityidstr="";\r
75                 std::string name="";\r
76                 std::string publickey="";\r
77 \r
78                 st.ResultInt(0,localidentityid);\r
79                 st.ResultText(1,name);\r
80                 st.ResultText(2,publickey);\r
81 \r
82                 StringFunctions::Convert(localidentityid,localidentityidstr);\r
83 \r
84                 result+="<option value=\""+localidentityidstr+"\"";\r
85                 if(localidentityid==selectedlocalidentityid)\r
86                 {\r
87                         result+=" SELECTED";\r
88                 }\r
89                 result+=">"+SanitizeOutput(CreateShortIdentityName(name,publickey))+"</option>";\r
90                 st.Step();\r
91         }\r
92 \r
93         result+="</select>";\r
94 \r
95         return result;\r
96 }\r
97 \r
98 const std::string PeerTrustPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
99 {\r
100         int count=0;\r
101         std::string countstr;\r
102         std::string content="";\r
103         int identitycount=0;            // total number of ids we know\r
104         int rowsperpage=25;                     // how many ids to show per page\r
105         std::string rowsperpagestr;\r
106         int startrow=0;\r
107         std::string startrowstr="0";\r
108         std::string namesearch="";\r
109         std::string sql;\r
110         std::string sortby="";\r
111         std::string sortorder="";\r
112         std::string localidentityidstr="";\r
113         int localidentityid=-1;\r
114 \r
115         StringFunctions::Convert(rowsperpage,rowsperpagestr);\r
116 \r
117         // get localidentityid from querystring or load one from the database\r
118         if(queryvars.find("localidentityid")!=queryvars.end())\r
119         {\r
120                 localidentityidstr=(*queryvars.find("localidentityid")).second;\r
121                 StringFunctions::Convert(localidentityidstr,localidentityid);\r
122                 // insert the ID into the temporary table so we remember the identity if we load the page later\r
123                 m_db->Execute("DELETE FROM tmpLocalIdentityPeerTrustPage;");\r
124                 SQLite3DB::Statement st=m_db->Prepare("INSERT INTO tmpLocalIdentityPeerTrustPage(LocalIdentityID) VALUES(?);");\r
125                 st.Bind(0,localidentityid);\r
126                 st.Step();\r
127         }\r
128         else\r
129         {\r
130                 // try to get the localidentityid if it exists in the temp table, otherwise load the first identity in the database\r
131                 SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID FROM tmpLocalIdentityPeerTrustPage;");\r
132                 st.Step();\r
133                 if(st.RowReturned())\r
134                 {\r
135                         st.ResultInt(0,localidentityid);\r
136                         StringFunctions::Convert(localidentityid,localidentityidstr);\r
137                 }\r
138                 else\r
139                 {\r
140                         st=m_db->Prepare("SELECT LocalIdentityID FROM tblLocalIdentity;");\r
141                         st.Step();\r
142                         if(st.RowReturned())\r
143                         {\r
144                                 st.ResultInt(0,localidentityid);\r
145                                 StringFunctions::Convert(localidentityid,localidentityidstr);\r
146                         }\r
147                         st.Finalize();\r
148                 }\r
149         }\r
150 \r
151         if(localidentityid!=-1 && queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="update" && ValidateFormPassword(queryvars))\r
152         {\r
153                 std::vector<std::string> identityids;\r
154                 std::vector<std::string> oldlmt;\r
155                 std::vector<std::string> lmt;\r
156                 std::vector<std::string> oldltlt;\r
157                 std::vector<std::string> ltlt;\r
158                 std::vector<std::string> oldmtc;\r
159                 std::vector<std::string> mtc;\r
160                 std::vector<std::string> oldtltc;\r
161                 std::vector<std::string> tltc;\r
162                 int localmessagetrust=0;\r
163                 int localtrustlisttrust=0;\r
164                 int identityid=-1;\r
165 \r
166                 CreateArgArray(queryvars,"identityid",identityids);\r
167                 CreateArgArray(queryvars,"oldlocalmessagetrust",oldlmt);\r
168                 CreateArgArray(queryvars,"localmessagetrust",lmt);\r
169                 CreateArgArray(queryvars,"oldlocaltrustlisttrust",oldltlt);\r
170                 CreateArgArray(queryvars,"localtrustlisttrust",ltlt);\r
171                 CreateArgArray(queryvars,"oldmessagetrustcomment",oldmtc);\r
172                 CreateArgArray(queryvars,"messagetrustcomment",mtc);\r
173                 CreateArgArray(queryvars,"oldtrustlisttrustcomment",oldtltc);\r
174                 CreateArgArray(queryvars,"trustlisttrustcomment",tltc);\r
175 \r
176                 SQLite3DB::Statement ins=m_db->Prepare("INSERT INTO tblIdentityTrust(LocalIdentityID,IdentityID) VALUES(?,?);");\r
177                 SQLite3DB::Statement update=m_db->Prepare("UPDATE tblIdentityTrust SET LocalMessageTrust=?, LocalTrustListTrust=?, MessageTrustComment=?, TrustListTrustComment=? WHERE LocalIdentityID=? AND IdentityID=?;");\r
178 \r
179                 for(int i=0; i<identityids.size(); i++)\r
180                 {\r
181                         if(oldlmt[i]!=lmt[i] || oldltlt[i]!=ltlt[i] || oldmtc[i]!=mtc[i] || oldtltc[i]!=tltc[i])\r
182                         {\r
183                                 StringFunctions::Convert(lmt[i],localmessagetrust);\r
184                                 StringFunctions::Convert(ltlt[i],localtrustlisttrust);\r
185                                 StringFunctions::Convert(identityids[i],identityid);\r
186 \r
187                                 ins.Bind(0,localidentityid);\r
188                                 ins.Bind(1,identityid);\r
189                                 ins.Step();\r
190                                 ins.Reset();\r
191 \r
192                                 if(lmt[i]!="")\r
193                                 {\r
194                                         update.Bind(0,localmessagetrust);\r
195                                 }\r
196                                 else\r
197                                 {\r
198                                         update.Bind(0);\r
199                                 }\r
200                                 if(ltlt[i]!="")\r
201                                 {\r
202                                         update.Bind(1,localtrustlisttrust);\r
203                                 }\r
204                                 else\r
205                                 {\r
206                                         update.Bind(1);\r
207                                 }\r
208                                 update.Bind(2,mtc[i]);\r
209                                 update.Bind(3,tltc[i]);\r
210                                 update.Bind(4,localidentityid);\r
211                                 update.Bind(5,identityid);\r
212                                 update.Step();\r
213                                 update.Reset();\r
214                         }\r
215                 }\r
216 \r
217         }\r
218 \r
219         // if startrow is specified\r
220         if(queryvars.find("startrow")!=queryvars.end())\r
221         {\r
222                 startrowstr=(*queryvars.find("startrow")).second;\r
223                 // convert back and forth, just in case a number wasn't passed in startrow\r
224                 StringFunctions::Convert(startrowstr,startrow);\r
225                 if(startrow<0)\r
226                 {\r
227                         startrow=0;\r
228                 }\r
229                 StringFunctions::Convert(startrow,startrowstr);\r
230         }\r
231 \r
232         // sort by\r
233         if(queryvars.find("sortby")!=queryvars.end())\r
234         {\r
235                 sortby=(*queryvars.find("sortby")).second;\r
236                 if(sortby!="Name" && sortby!="tblIdentityTrust.LocalMessageTrust" && sortby!="PeerMessageTrust" && sortby!="tblIdentityTrust.LocalTrustListTrust" && sortby!="PeerTrustListTrust" && sortby!="MessageCount")\r
237                 {\r
238                         sortby="Name";\r
239                 }\r
240         }\r
241         else\r
242         {\r
243                 sortby="Name";\r
244         }\r
245 \r
246         // sort order\r
247         if(queryvars.find("sortorder")!=queryvars.end())\r
248         {\r
249                 sortorder=(*queryvars.find("sortorder")).second;\r
250                 if(sortorder!="ASC" && sortorder!="DESC")\r
251                 {\r
252                         sortorder="ASC";\r
253                 }\r
254         }\r
255         else\r
256         {\r
257                 sortorder="ASC";\r
258         }\r
259 \r
260         // if we are searching by name\r
261         if(queryvars.find("namesearch")!=queryvars.end())\r
262         {\r
263                 namesearch=(*queryvars.find("namesearch")).second;\r
264         }\r
265 \r
266         content+="<h2>Peer Trust</h2>";\r
267         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.  Trust is recalculated once an hour from received trust lists.  You must have at least 1 identity created and have received the SSK keypair for it from Freenet before setting trust.<br>";\r
268         content+="* - This identity is not publishing a trust list<br>";\r
269 \r
270         // search drop down\r
271         content+="<div style=\"text-align:center;margin-bottom:5px;\">";\r
272         content+="<form name=\"frmsearch\" method=\"POST\" action=\""+m_pagename+"?"+BuildQueryString(0,"","","",localidentityid)+"\">";\r
273         content+="<input type=\"text\" name=\"namesearch\" value=\""+SanitizeOutput(namesearch)+"\">";\r
274         content+="<input type=\"submit\" value=\"Search\">";\r
275         content+="</form>";\r
276         content+="</div>";\r
277 \r
278         content+="<div style=\"text-align:center;\">";\r
279         content+="<form name=\"frmlocalidentity\" method=\"POST\" action=\""+m_pagename+"?"+BuildQueryString(startrow,namesearch,sortby,sortorder,-1)+"\">";\r
280         content+="Load Trust List of ";\r
281         content+=CreateLocalIdentityDropDown("localidentityid",localidentityid);\r
282         content+="<input type=\"submit\" value=\"Load List\">";\r
283         content+="</form>";\r
284         content+="</div>";\r
285 \r
286         content+="<form name=\"frmtrust\" method=\"POST\">";\r
287         content+=CreateFormPassword();\r
288         content+="<input type=\"hidden\" name=\"formaction\" value=\"update\">";\r
289         content+="<input type=\"hidden\" name=\"localidentityid\" value=\""+localidentityidstr+"\">";\r
290         content+="<input type=\"hidden\" name=\"startrow\" value=\""+startrowstr+"\">";\r
291         if(namesearch!="")\r
292         {\r
293                 content+="<input type=\"hidden\" name=\"namesearch\" value=\""+SanitizeOutput(namesearch)+"\">";\r
294         }\r
295         content+="<table class=\"small90\">";\r
296         content+="<tr><th><a href=\""+m_pagename+"?"+BuildQueryString(startrow,namesearch,"Name",ReverseSort("Name",sortby,sortorder),localidentityid)+"\">Name</a></th>";\r
297         content+="<th><a href=\""+m_pagename+"?"+BuildQueryString(startrow,namesearch,"tblIdentityTrust.LocalMessageTrust",ReverseSort("tblIdentityTrust.LocalMessageTrust",sortby,sortorder),localidentityid)+"\">Local Message Trust</a></th>";\r
298         content+="<th>Message Comment</th>";\r
299         content+="<th><a href=\""+m_pagename+"?"+BuildQueryString(startrow,namesearch,"PeerMessageTrust",ReverseSort("PeerMessageTrust",sortby,sortorder),localidentityid)+"\">Peer Message Trust</a></th>";\r
300         content+="<th><a href=\""+m_pagename+"?"+BuildQueryString(startrow,namesearch,"tblIdentityTrust.LocalTrustListTrust",ReverseSort("tblIdentityTrust.LocalTrustListTrust",sortby,sortorder),localidentityid)+"\">Local Trust List Trust</a></th>";\r
301         content+="<th>Trust Comment</th>";\r
302         content+="<th><a href=\""+m_pagename+"?"+BuildQueryString(startrow,namesearch,"PeerTrustListTrust",ReverseSort("PeerTrustListTrust",sortby,sortorder),localidentityid)+"\">Peer Trust List Trust</a></th>";\r
303         content+="<th><a href=\""+m_pagename+"?"+BuildQueryString(startrow,namesearch,"MessageCount",ReverseSort("MessageCount",sortby,sortorder),localidentityid)+"\">Message Count</a></th>";\r
304         content+="</tr>\r\n";\r
305         \r
306         // get count of identities we are showing\r
307         sql="SELECT COUNT(*) FROM tblIdentity LEFT JOIN tblIdentityTrust ON tblIdentity.IdentityID=tblIdentityTrust.IdentityID ";\r
308         sql+="WHERE tblIdentityTrust.LocalIdentityID=? AND tblIdentity.Hidden='false'";\r
309         if(namesearch!="")\r
310         {\r
311                 sql+=" AND (Name LIKE '%' || ? || '%' OR PublicKey LIKE '%' || ? || '%')";\r
312         }\r
313         sql+=";";\r
314         SQLite3DB::Statement st=m_db->Prepare(sql);\r
315         st.Bind(0,localidentityid);\r
316         if(namesearch!="")\r
317         {\r
318                 st.Bind(1,namesearch);\r
319                 st.Bind(2,namesearch);\r
320         }\r
321         st.Step();\r
322         st.ResultInt(0,identitycount);\r
323         st.Finalize();\r
324 \r
325         sql="SELECT tblIdentity.IdentityID,Name,tblIdentityTrust.LocalMessageTrust,PeerMessageTrust,tblIdentityTrust.LocalTrustListTrust,PeerTrustListTrust,PublicKey,tblIdentityTrust.MessageTrustComment,tblIdentityTrust.TrustListTrustComment,COUNT(MessageID) AS 'MessageCount',tblIdentity.PublishTrustList ";\r
326         sql+="FROM tblIdentity LEFT JOIN tblIdentityTrust ON tblIdentity.IdentityID=tblIdentityTrust.IdentityID LEFT JOIN tblMessage ON tblIdentity.IdentityID=tblMessage.IdentityID ";\r
327         sql+="WHERE tblIdentityTrust.LocalIdentityID=? AND tblIdentity.Hidden='false'";\r
328         if(namesearch!="")\r
329         {\r
330                 sql+=" AND (Name LIKE  '%' || ? || '%' OR PublicKey LIKE '%' || ? || '%')";\r
331         }\r
332         sql+=" GROUP BY tblIdentity.IdentityID";\r
333         sql+=" ORDER BY";\r
334         if(sortby=="Name")\r
335         {\r
336                 sql+=" Name COLLATE NOCASE";\r
337         }\r
338         else\r
339         {\r
340                 sql+=" "+sortby;\r
341         }\r
342         if(sortorder!="")\r
343         {\r
344                 sql+=" "+sortorder;\r
345         }\r
346         sql+=" LIMIT "+startrowstr+","+rowsperpagestr+";";\r
347         st=m_db->Prepare(sql);\r
348         st.Bind(0,localidentityid);\r
349         if(namesearch!="")\r
350         {\r
351                 st.Bind(1,namesearch);\r
352                 st.Bind(2,namesearch);\r
353         }\r
354         st.Step();\r
355 \r
356         while(st.RowReturned())\r
357         {\r
358                 std::string identityid;\r
359                 std::string name;\r
360                 std::string localmessagetrust;\r
361                 std::string peermessagetrust;\r
362                 std::string localtrustlisttrust;\r
363                 std::string peertrustlisttrust;\r
364                 std::string publickey;\r
365                 std::string messagetrustcomment="";\r
366                 std::string trustlisttrustcomment="";\r
367                 std::string messagecountstr="";\r
368                 std::string publishtrustlist="";\r
369 \r
370                 StringFunctions::Convert(count,countstr);\r
371 \r
372                 st.ResultText(0,identityid);\r
373                 st.ResultText(1,name);\r
374                 st.ResultText(2,localmessagetrust);\r
375                 st.ResultText(3,peermessagetrust);\r
376                 st.ResultText(4,localtrustlisttrust);\r
377                 st.ResultText(5,peertrustlisttrust);\r
378                 st.ResultText(6,publickey);\r
379                 st.ResultText(7,messagetrustcomment);\r
380                 st.ResultText(8,trustlisttrustcomment);\r
381                 st.ResultText(9,messagecountstr);\r
382                 st.ResultText(10,publishtrustlist);\r
383 \r
384                 content+="<tr>";\r
385                 content+="<td title=\""+publickey+"\">";\r
386                 content+="<input type=\"hidden\" name=\"identityid["+countstr+"]\" value=\""+identityid+"\">";\r
387                 content+="<a href=\"peerdetails.htm?identityid="+identityid+"\">";\r
388                 if(name!="")\r
389                 {\r
390                         content+=SanitizeOutput(CreateShortIdentityName(name,publickey));\r
391                 }\r
392                 else\r
393                 {\r
394                         content+="[Unknown Name]";\r
395                 }\r
396                 content+="</a>";\r
397                 content+="</td>";\r
398                 content+="<td "+GetClassString(localmessagetrust)+">";\r
399                 content+="<input type=\"hidden\" name=\"oldlocalmessagetrust["+countstr+"]\" value=\""+localmessagetrust+"\">";\r
400                 content+="<input type=\"text\" name=\"localmessagetrust["+countstr+"]\" value=\""+localmessagetrust+"\" size=\"2\" maxlength=\"3\" class=\"small90\"></td>";\r
401                 content+="<td "+GetClassString(localmessagetrust)+">";\r
402                 content+="<input type=\"hidden\" name=\"oldmessagetrustcomment["+countstr+"]\" value=\""+SanitizeOutput(messagetrustcomment)+"\">";\r
403                 content+="<input type=\"text\" name=\"messagetrustcomment["+countstr+"]\" value=\""+SanitizeOutput(messagetrustcomment)+"\" maxlength=\"50\" class=\"small90\">";\r
404                 content+="</td>";               \r
405                 content+="<td "+GetClassString(peermessagetrust)+">";\r
406                 content+=peermessagetrust+"</td>";\r
407                 content+="<td "+GetClassString(localtrustlisttrust)+">";\r
408                 content+="<input type=\"hidden\" name=\"oldlocaltrustlisttrust["+countstr+"]\" value=\""+localtrustlisttrust+"\">";\r
409                 content+="<input type=\"text\" name=\"localtrustlisttrust["+countstr+"]\" value=\""+localtrustlisttrust+"\" size=\"2\" maxlength=\"3\" class=\"small90\">";\r
410                 if(publishtrustlist=="false")\r
411                 {\r
412                         content+="*";\r
413                 }\r
414                 content+="</td>";\r
415                 content+="<td "+GetClassString(localtrustlisttrust)+">";\r
416                 content+="<input type=\"hidden\" name=\"oldtrustlisttrustcomment["+countstr+"]\" value=\""+SanitizeOutput(trustlisttrustcomment)+"\">";\r
417                 content+="<input type=\"text\" name=\"trustlisttrustcomment["+countstr+"]\" value=\""+SanitizeOutput(trustlisttrustcomment)+"\" maxlength=\"50\" class=\"small90\">";\r
418                 content+="</td>";\r
419                 content+="<td "+GetClassString(peertrustlisttrust)+">";\r
420                 content+=peertrustlisttrust+"</td>";\r
421                 content+="<td>"+messagecountstr+"</td>";\r
422                 content+="</tr>\r\n";\r
423                 st.Step();\r
424                 count++;\r
425         }\r
426         \r
427         if(startrow>0 || startrow+rowsperpage<identitycount)\r
428         {\r
429                 std::string tempstr;\r
430                 int cols=0;\r
431 \r
432                 content+="<tr>";\r
433                 if(startrow>0)\r
434                 {\r
435                         StringFunctions::Convert(startrow-rowsperpage,tempstr);\r
436                         content+="<td colspan=\"3\" align=\"left\"><a href=\""+m_pagename+"?"+BuildQueryString(startrow-rowsperpage,namesearch,sortby,sortorder,localidentityid)+"\"><-- Previous Page</a></td>";\r
437                         cols+=3;\r
438                 }\r
439                 if(startrow+rowsperpage<identitycount)\r
440                 {\r
441                         while(cols<5)\r
442                         {\r
443                                 content+="<td></td>";\r
444                                 cols++;\r
445                         }\r
446                         content+="<td colspan=\"3\" align=\"right\"><a href=\""+m_pagename+"?"+BuildQueryString(startrow+rowsperpage,namesearch,sortby,sortorder,localidentityid)+"\">Next Page --></a></td>";\r
447                 }\r
448                 content+="</tr>";\r
449         }\r
450 \r
451         content+="<tr><td colspan=\"8\"><center><input type=\"submit\" value=\"Update Trust\"></center></td></tr>";\r
452         content+="</table>";\r
453         content+="</form>";\r
454 \r
455         return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
456 }\r
457 \r
458 const std::string PeerTrustPage::GetClassString(const std::string &trustlevel)\r
459 {\r
460         int tempint=0;\r
461         std::string tempstr;\r
462 \r
463         StringFunctions::Convert(trustlevel,tempint);\r
464         tempint/=10;\r
465         StringFunctions::Convert(tempint,tempstr);\r
466 \r
467         if(trustlevel!="")\r
468         {\r
469                 return "class=\"trust"+tempstr+"\"";\r
470         }\r
471         else\r
472         {\r
473                 return "";\r
474         }\r
475 }\r
476 \r
477 const std::string PeerTrustPage::ReverseSort(const std::string &sortname, const std::string &currentsortby, const std::string &currentsortorder)\r
478 {\r
479         if(sortname==currentsortby)\r
480         {\r
481                 if(currentsortorder=="ASC")\r
482                 {\r
483                         return "DESC";\r
484                 }\r
485                 else\r
486                 {\r
487                         return "ASC";\r
488                 }\r
489         }\r
490         else\r
491         {\r
492                 return currentsortorder;\r
493         }\r
494 }\r