version 0.2.0
[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                 int localmessagetrust=0;\r
75                 int localtrustlisttrust=0;\r
76                 int identityid;\r
77 \r
78                 CreateArgArray(queryvars,"identityid",identityids);\r
79                 CreateArgArray(queryvars,"oldlocalmessagetrust",oldlmt);\r
80                 CreateArgArray(queryvars,"localmessagetrust",lmt);\r
81                 CreateArgArray(queryvars,"oldlocaltrustlisttrust",oldltlt);\r
82                 CreateArgArray(queryvars,"localtrustlisttrust",ltlt);\r
83                 \r
84                 SQLite3DB::Statement update=m_db->Prepare("UPDATE tblIdentity SET LocalMessageTrust=?, LocalTrustListTrust=? WHERE IdentityID=?;");\r
85 \r
86                 for(int i=0; i<identityids.size(); i++)\r
87                 {\r
88                         if(oldlmt[i]!=lmt[i] || oldltlt[i]!=ltlt[i])\r
89                         {\r
90                                 StringFunctions::Convert(lmt[i],localmessagetrust);\r
91                                 StringFunctions::Convert(ltlt[i],localtrustlisttrust);\r
92                                 StringFunctions::Convert(identityids[i],identityid);\r
93 \r
94                                 if(lmt[i]!="")\r
95                                 {\r
96                                         update.Bind(0,localmessagetrust);\r
97                                 }\r
98                                 else\r
99                                 {\r
100                                         update.Bind(0);\r
101                                 }\r
102                                 if(ltlt[i]!="")\r
103                                 {\r
104                                         update.Bind(1,localtrustlisttrust);\r
105                                 }\r
106                                 else\r
107                                 {\r
108                                         update.Bind(1);\r
109                                 }\r
110                                 update.Bind(2,identityid);\r
111                                 update.Step();\r
112                                 update.Reset();\r
113                         }\r
114                 }\r
115 \r
116         }\r
117 \r
118         // if startrow is specified\r
119         if(queryvars.find("startrow")!=queryvars.end())\r
120         {\r
121                 startrowstr=(*queryvars.find("startrow")).second;\r
122                 // convert back and forth, just in case a number wasn't passed in startrow\r
123                 StringFunctions::Convert(startrowstr,startrow);\r
124                 if(startrow<0)\r
125                 {\r
126                         startrow=0;\r
127                 }\r
128                 StringFunctions::Convert(startrow,startrowstr);\r
129         }\r
130 \r
131         // sort by\r
132         if(queryvars.find("sortby")!=queryvars.end())\r
133         {\r
134                 sortby=(*queryvars.find("sortby")).second;\r
135         }\r
136         else\r
137         {\r
138                 sortby="Name";\r
139         }\r
140 \r
141         // sort order\r
142         if(queryvars.find("sortorder")!=queryvars.end())\r
143         {\r
144                 sortorder=(*queryvars.find("sortorder")).second;\r
145         }\r
146         else\r
147         {\r
148                 sortorder="ASC";\r
149         }\r
150 \r
151         // if we are searching by name\r
152         if(queryvars.find("namesearch")!=queryvars.end())\r
153         {\r
154                 namesearch=(*queryvars.find("namesearch")).second;\r
155         }\r
156 \r
157         content+="<h2>Peer Trust</h2>";\r
158         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
159         content+="<div style=\"text-align:center;\">";\r
160         content+="<form name=\"frmsearch\" method=\"POST\" action=\"peertrust.htm\">";\r
161         content+="<input type=\"text\" name=\"namesearch\" value=\""+SanitizeOutput(namesearch)+"\">";\r
162         content+="<input type=\"submit\" value=\"Search\">";\r
163         content+="</form>";\r
164         content+="</div>";\r
165         content+="<form name=\"frmtrust\" method=\"POST\">";\r
166         content+="<input type=\"hidden\" name=\"formaction\" value=\"update\">";\r
167         content+="<input type=\"hidden\" name=\"startrow\" value=\""+startrowstr+"\">";\r
168         if(namesearch!="")\r
169         {\r
170                 content+="<input type=\"hidden\" name=\"namesearch\" value=\""+SanitizeOutput(namesearch)+"\">";\r
171         }\r
172         content+="<table>";\r
173         content+="<tr><th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"Name",ReverseSort("Name",sortby,sortorder))+"\">Name</a></th>";\r
174         content+="<th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"LocalMessageTrust",ReverseSort("LocalMessageTrust",sortby,sortorder))+"\">Local Message Trust</a></th>";\r
175         content+="<th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"PeerMessageTrust",ReverseSort("PeerMessageTrust",sortby,sortorder))+"\">Peer Message Trust</a></th>";\r
176         content+="<th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"LocalTrustListTrust",ReverseSort("LocalTrustListTrust",sortby,sortorder))+"\">Local Trust List Trust</a></th>";\r
177         content+="<th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"PeerTrustListTrust",ReverseSort("PeerTrustListTrust",sortby,sortorder))+"\">Peer Trust List Trust</a></th></tr>";\r
178         \r
179         // get count of identities we are showing\r
180         sql="SELECT COUNT(*) FROM tblIdentity";\r
181         if(namesearch!="")\r
182         {\r
183                 sql+=" WHERE Name LIKE '%' || ? || '%'";\r
184         }\r
185         sql+=";";\r
186         SQLite3DB::Statement st=m_db->Prepare(sql);\r
187         if(namesearch!="")\r
188         {\r
189                 st.Bind(0,namesearch);\r
190         }\r
191         st.Step();\r
192         st.ResultInt(0,identitycount);\r
193         st.Finalize();\r
194 \r
195         sql="SELECT IdentityID,Name,LocalMessageTrust,PeerMessageTrust,LocalTrustListTrust,PeerTrustListTrust,PublicKey FROM tblIdentity";\r
196         if(namesearch!="")\r
197         {\r
198                 sql+=" WHERE Name LIKE  '%' || ? || '%'";\r
199         }\r
200         sql+=" ORDER BY";\r
201         if(sortby=="Name")\r
202         {\r
203                 sql+=" Name COLLATE NOCASE";\r
204         }\r
205         else\r
206         {\r
207                 sql+=" "+sortby;\r
208         }\r
209         if(sortorder!="")\r
210         {\r
211                 sql+=" "+sortorder;\r
212         }\r
213         sql+=" LIMIT "+startrowstr+","+rowsperpagestr+";";\r
214         st=m_db->Prepare(sql);\r
215         if(namesearch!="")\r
216         {\r
217                 st.Bind(0,namesearch);\r
218         }\r
219         st.Step();\r
220 \r
221         while(st.RowReturned())\r
222         {\r
223                 std::string identityid;\r
224                 std::string name;\r
225                 std::string localmessagetrust;\r
226                 std::string peermessagetrust;\r
227                 std::string localtrustlisttrust;\r
228                 std::string peertrustlisttrust;\r
229                 std::string publickey;\r
230                 std::string keypart="";\r
231 \r
232                 StringFunctions::Convert(count,countstr);\r
233 \r
234                 st.ResultText(0,identityid);\r
235                 st.ResultText(1,name);\r
236                 st.ResultText(2,localmessagetrust);\r
237                 st.ResultText(3,peermessagetrust);\r
238                 st.ResultText(4,localtrustlisttrust);\r
239                 st.ResultText(5,peertrustlisttrust);\r
240                 st.ResultText(6,publickey);\r
241 \r
242                 if(publickey.size()>8)\r
243                 {\r
244                         keypart=publickey.substr(3,5);\r
245                 }\r
246 \r
247                 content+="<tr>";\r
248                 content+="<td title=\""+publickey+"\">";\r
249                 content+="<input type=\"hidden\" name=\"identityid["+countstr+"]\" value=\""+identityid+"\">";\r
250                 content+="<a href=\"peerdetails.htm?identityid="+identityid+"\">";\r
251                 if(name!="")\r
252                 {\r
253                         content+=SanitizeOutput(name+keypart)+"...";\r
254                 }\r
255                 else\r
256                 {\r
257                         content+="[Unknown Name]";\r
258                 }\r
259                 content+="</a>";\r
260                 content+="</td>";\r
261                 content+="<td "+GetClassString(localmessagetrust)+">";\r
262                 content+="<input type=\"hidden\" name=\"oldlocalmessagetrust["+countstr+"]\" value=\""+localmessagetrust+"\">";\r
263                 content+="<input type=\"text\" name=\"localmessagetrust["+countstr+"]\" value=\""+localmessagetrust+"\" size=\"2\" maxlength=\"3\"></td>";\r
264                 content+="<td "+GetClassString(peermessagetrust)+">";\r
265                 content+=peermessagetrust+"</td>";\r
266                 content+="<td "+GetClassString(localtrustlisttrust)+">";\r
267                 content+="<input type=\"hidden\" name=\"oldlocaltrustlisttrust["+countstr+"]\" value=\""+localtrustlisttrust+"\">";\r
268                 content+="<input type=\"text\" name=\"localtrustlisttrust["+countstr+"]\" value=\""+localtrustlisttrust+"\" size=\"2\" maxlength=\"3\"></td>";\r
269                 content+="<td "+GetClassString(peertrustlisttrust)+">";\r
270                 content+=peertrustlisttrust+"</td>";\r
271                 content+="</tr>";\r
272                 st.Step();\r
273                 count++;\r
274         }\r
275         \r
276         if(startrow>0 || startrow+rowsperpage<identitycount)\r
277         {\r
278                 std::string tempstr;\r
279                 int cols=0;\r
280 \r
281                 content+="<tr>";\r
282                 if(startrow>0)\r
283                 {\r
284                         StringFunctions::Convert(startrow-rowsperpage,tempstr);\r
285                         content+="<td colspan=\"2\" align=\"left\"><a href=\"peertrust.htm?"+BuildQueryString(startrow-rowsperpage,namesearch,sortby,sortorder)+"\"><-- Previous Page</a></td>";\r
286                         cols+=2;\r
287                 }\r
288                 if(startrow+rowsperpage<identitycount)\r
289                 {\r
290                         while(cols<3)\r
291                         {\r
292                                 content+="<td></td>";\r
293                                 cols++;\r
294                         }\r
295                         content+="<td colspan=\"2\" align=\"right\"><a href=\"peertrust.htm?"+BuildQueryString(startrow+rowsperpage,namesearch,sortby,sortorder)+"\">Next Page --></a></td>";\r
296                 }\r
297                 content+="</tr>";\r
298         }\r
299 \r
300         content+="<tr><td colspan=\"5\"><center><input type=\"submit\" value=\"Update Trust\"></center></td></tr>";\r
301         content+="</table>";\r
302         content+="</form>";\r
303 \r
304         return "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"+StringFunctions::Replace(m_template,"[CONTENT]",content);\r
305 }\r
306 \r
307 const std::string PeerTrustPage::GetClassString(const std::string &trustlevel)\r
308 {\r
309         int tempint=0;\r
310         std::string tempstr;\r
311 \r
312         StringFunctions::Convert(trustlevel,tempint);\r
313         tempint/=10;\r
314         StringFunctions::Convert(tempint,tempstr);\r
315 \r
316         if(trustlevel!="")\r
317         {\r
318                 return "class=\"trust"+tempstr+"\"";\r
319         }\r
320         else\r
321         {\r
322                 return "";\r
323         }\r
324 }\r
325 \r
326 const std::string PeerTrustPage::ReverseSort(const std::string &sortname, const std::string &currentsortby, const std::string &currentsortorder)\r
327 {\r
328         if(sortname==currentsortby)\r
329         {\r
330                 if(currentsortorder=="ASC")\r
331                 {\r
332                         return "DESC";\r
333                 }\r
334                 else\r
335                 {\r
336                         return "ASC";\r
337                 }\r
338         }\r
339         else\r
340         {\r
341                 return currentsortorder;\r
342         }\r
343 }\r
344 \r
345 const bool PeerTrustPage::WillHandleURI(const std::string &uri)\r
346 {\r
347         if(uri.find("peertrust.")!=std::string::npos)\r
348         {\r
349                 return true;\r
350         }\r
351         else\r
352         {\r
353                 return false;\r
354         }\r
355 }\r