9429ede25a745e135869ebd410467d2f790761ad
[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.  Trust is recalculated once an hour from received 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 class=\"small90\">";\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>";\r
190         content+="<th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"MessageCount",ReverseSort("MessageCount",sortby,sortorder))+"\">Message Count</a></th>";\r
191         content+="</tr>\r\n";\r
192         \r
193         // get count of identities we are showing\r
194         sql="SELECT COUNT(*) FROM tblIdentity";\r
195         if(namesearch!="")\r
196         {\r
197                 sql+=" WHERE Name LIKE '%' || ? || '%' AND tblIdentity.Hidden='false'";\r
198         }\r
199         else\r
200         {\r
201                 sql+=" WHERE tblIdentity.Hidden='false'";       \r
202         }\r
203         sql+=";";\r
204         SQLite3DB::Statement st=m_db->Prepare(sql);\r
205         if(namesearch!="")\r
206         {\r
207                 st.Bind(0,namesearch);\r
208         }\r
209         st.Step();\r
210         st.ResultInt(0,identitycount);\r
211         st.Finalize();\r
212 \r
213         sql="SELECT tblIdentity.IdentityID,Name,LocalMessageTrust,PeerMessageTrust,LocalTrustListTrust,PeerTrustListTrust,PublicKey,MessageTrustComment,TrustListTrustComment,COUNT(MessageID) AS 'MessageCount' FROM tblIdentity LEFT JOIN tblMessage ON tblIdentity.IdentityID=tblMessage.IdentityID";\r
214         if(namesearch!="")\r
215         {\r
216                 sql+=" WHERE (Name LIKE  '%' || ? || '%' OR PublicKey LIKE '%' || ? || '%') AND tblIdentity.Hidden='false'";\r
217         }\r
218         else\r
219         {\r
220                 sql+=" WHERE tblIdentity.Hidden='false'";       \r
221         }\r
222         sql+=" GROUP BY tblIdentity.IdentityID";\r
223         sql+=" ORDER BY";\r
224         if(sortby=="Name")\r
225         {\r
226                 sql+=" Name COLLATE NOCASE";\r
227         }\r
228         else\r
229         {\r
230                 sql+=" "+sortby;\r
231         }\r
232         if(sortorder!="")\r
233         {\r
234                 sql+=" "+sortorder;\r
235         }\r
236         sql+=" LIMIT "+startrowstr+","+rowsperpagestr+";";\r
237         st=m_db->Prepare(sql);\r
238         if(namesearch!="")\r
239         {\r
240                 st.Bind(0,namesearch);\r
241                 st.Bind(1,namesearch);\r
242         }\r
243         st.Step();\r
244 \r
245         while(st.RowReturned())\r
246         {\r
247                 std::string identityid;\r
248                 std::string name;\r
249                 std::string localmessagetrust;\r
250                 std::string peermessagetrust;\r
251                 std::string localtrustlisttrust;\r
252                 std::string peertrustlisttrust;\r
253                 std::string publickey;\r
254                 std::string keypart="";\r
255                 std::string messagetrustcomment="";\r
256                 std::string trustlisttrustcomment="";\r
257                 std::string messagecountstr="";\r
258 \r
259                 StringFunctions::Convert(count,countstr);\r
260 \r
261                 st.ResultText(0,identityid);\r
262                 st.ResultText(1,name);\r
263                 st.ResultText(2,localmessagetrust);\r
264                 st.ResultText(3,peermessagetrust);\r
265                 st.ResultText(4,localtrustlisttrust);\r
266                 st.ResultText(5,peertrustlisttrust);\r
267                 st.ResultText(6,publickey);\r
268                 st.ResultText(7,messagetrustcomment);\r
269                 st.ResultText(8,trustlisttrustcomment);\r
270                 st.ResultText(9,messagecountstr);\r
271 \r
272                 if(publickey.size()>8)\r
273                 {\r
274                         keypart=publickey.substr(3,5);\r
275                 }\r
276 \r
277                 content+="<tr>";\r
278                 content+="<td title=\""+publickey+"\">";\r
279                 content+="<input type=\"hidden\" name=\"identityid["+countstr+"]\" value=\""+identityid+"\">";\r
280                 content+="<a href=\"peerdetails.htm?identityid="+identityid+"\">";\r
281                 if(name!="")\r
282                 {\r
283                         content+=SanitizeOutput(name+keypart)+"...";\r
284                 }\r
285                 else\r
286                 {\r
287                         content+="[Unknown Name]";\r
288                 }\r
289                 content+="</a>";\r
290                 content+="</td>";\r
291                 content+="<td "+GetClassString(localmessagetrust)+">";\r
292                 content+="<input type=\"hidden\" name=\"oldlocalmessagetrust["+countstr+"]\" value=\""+localmessagetrust+"\">";\r
293                 content+="<input type=\"text\" name=\"localmessagetrust["+countstr+"]\" value=\""+localmessagetrust+"\" size=\"2\" maxlength=\"3\" class=\"small90\"></td>";\r
294                 content+="<td "+GetClassString(localmessagetrust)+">";\r
295                 content+="<input type=\"hidden\" name=\"oldmessagetrustcomment["+countstr+"]\" value=\""+SanitizeOutput(messagetrustcomment)+"\">";\r
296                 content+="<input type=\"text\" name=\"messagetrustcomment["+countstr+"]\" value=\""+SanitizeOutput(messagetrustcomment)+"\" maxlength=\"50\" class=\"small90\">";\r
297                 content+="</td>";               \r
298                 content+="<td "+GetClassString(peermessagetrust)+">";\r
299                 content+=peermessagetrust+"</td>";\r
300                 content+="<td "+GetClassString(localtrustlisttrust)+">";\r
301                 content+="<input type=\"hidden\" name=\"oldlocaltrustlisttrust["+countstr+"]\" value=\""+localtrustlisttrust+"\">";\r
302                 content+="<input type=\"text\" name=\"localtrustlisttrust["+countstr+"]\" value=\""+localtrustlisttrust+"\" size=\"2\" maxlength=\"3\" class=\"small90\"></td>";\r
303                 content+="<td "+GetClassString(localtrustlisttrust)+">";\r
304                 content+="<input type=\"hidden\" name=\"oldtrustlisttrustcomment["+countstr+"]\" value=\""+SanitizeOutput(trustlisttrustcomment)+"\">";\r
305                 content+="<input type=\"text\" name=\"trustlisttrustcomment["+countstr+"]\" value=\""+SanitizeOutput(trustlisttrustcomment)+"\" maxlength=\"50\" class=\"small90\">";\r
306                 content+="</td>";\r
307                 content+="<td "+GetClassString(peertrustlisttrust)+">";\r
308                 content+=peertrustlisttrust+"</td>";\r
309                 content+="<td>"+messagecountstr+"</td>";\r
310                 content+="</tr>\r\n";\r
311                 st.Step();\r
312                 count++;\r
313         }\r
314         \r
315         if(startrow>0 || startrow+rowsperpage<identitycount)\r
316         {\r
317                 std::string tempstr;\r
318                 int cols=0;\r
319 \r
320                 content+="<tr>";\r
321                 if(startrow>0)\r
322                 {\r
323                         StringFunctions::Convert(startrow-rowsperpage,tempstr);\r
324                         content+="<td colspan=\"3\" align=\"left\"><a href=\"peertrust.htm?"+BuildQueryString(startrow-rowsperpage,namesearch,sortby,sortorder)+"\"><-- Previous Page</a></td>";\r
325                         cols+=3;\r
326                 }\r
327                 if(startrow+rowsperpage<identitycount)\r
328                 {\r
329                         while(cols<5)\r
330                         {\r
331                                 content+="<td></td>";\r
332                                 cols++;\r
333                         }\r
334                         content+="<td colspan=\"3\" align=\"right\"><a href=\"peertrust.htm?"+BuildQueryString(startrow+rowsperpage,namesearch,sortby,sortorder)+"\">Next Page --></a></td>";\r
335                 }\r
336                 content+="</tr>";\r
337         }\r
338 \r
339         content+="<tr><td colspan=\"5\"><center><input type=\"submit\" value=\"Update Trust\"></center></td></tr>";\r
340         content+="</table>";\r
341         content+="</form>";\r
342 \r
343         return "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"+StringFunctions::Replace(m_template,"[CONTENT]",content);\r
344 }\r
345 \r
346 const std::string PeerTrustPage::GetClassString(const std::string &trustlevel)\r
347 {\r
348         int tempint=0;\r
349         std::string tempstr;\r
350 \r
351         StringFunctions::Convert(trustlevel,tempint);\r
352         tempint/=10;\r
353         StringFunctions::Convert(tempint,tempstr);\r
354 \r
355         if(trustlevel!="")\r
356         {\r
357                 return "class=\"trust"+tempstr+"\"";\r
358         }\r
359         else\r
360         {\r
361                 return "";\r
362         }\r
363 }\r
364 \r
365 const std::string PeerTrustPage::ReverseSort(const std::string &sortname, const std::string &currentsortby, const std::string &currentsortorder)\r
366 {\r
367         if(sortname==currentsortby)\r
368         {\r
369                 if(currentsortorder=="ASC")\r
370                 {\r
371                         return "DESC";\r
372                 }\r
373                 else\r
374                 {\r
375                         return "ASC";\r
376                 }\r
377         }\r
378         else\r
379         {\r
380                 return currentsortorder;\r
381         }\r
382 }\r
383 \r
384 const bool PeerTrustPage::WillHandleURI(const std::string &uri)\r
385 {\r
386         if(uri.find("peertrust.")!=std::string::npos)\r
387         {\r
388                 return true;\r
389         }\r
390         else\r
391         {\r
392                 return false;\r
393         }\r
394 }\r