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