48a19e89e2d1cc580b639ec2f0bb511b15d36750
[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         content+="<table>";\r
169         content+="<tr><th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"Name",ReverseSort("Name",sortby,sortorder))+"\">Name</a></th>";\r
170         content+="<th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"LocalMessageTrust",ReverseSort("LocalMessageTrust",sortby,sortorder))+"\">Local Message Trust</a></th>";\r
171         content+="<th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"PeerMessageTrust",ReverseSort("PeerMessageTrust",sortby,sortorder))+"\">Peer Message Trust</a></th>";\r
172         content+="<th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"LocalTrustListTrust",ReverseSort("LocalTrustListTrust",sortby,sortorder))+"\">Local Trust List Trust</a></th>";\r
173         content+="<th><a href=\"peertrust.htm?"+BuildQueryString(startrow,namesearch,"PeerTrustListTrust",ReverseSort("PeerTrustListTrust",sortby,sortorder))+"\">Peer Trust List Trust</a></th></tr>";\r
174         \r
175         // get count of identities we are showing\r
176         sql="SELECT COUNT(*) FROM tblIdentity";\r
177         if(namesearch!="")\r
178         {\r
179                 sql+=" WHERE Name LIKE '%' || ? || '%'";\r
180         }\r
181         sql+=";";\r
182         SQLite3DB::Statement st=m_db->Prepare(sql);\r
183         if(namesearch!="")\r
184         {\r
185                 st.Bind(0,namesearch);\r
186         }\r
187         st.Step();\r
188         st.ResultInt(0,identitycount);\r
189         st.Finalize();\r
190 \r
191         sql="SELECT IdentityID,Name,LocalMessageTrust,PeerMessageTrust,LocalTrustListTrust,PeerTrustListTrust,PublicKey FROM tblIdentity";\r
192         if(namesearch!="")\r
193         {\r
194                 sql+=" WHERE Name LIKE  '%' || ? || '%'";\r
195         }\r
196         sql+=" ORDER BY";\r
197         if(sortby=="Name")\r
198         {\r
199                 sql+=" Name COLLATE NOCASE";\r
200         }\r
201         else\r
202         {\r
203                 sql+=" "+sortby;\r
204         }\r
205         if(sortorder!="")\r
206         {\r
207                 sql+=" "+sortorder;\r
208         }\r
209         sql+=" LIMIT "+startrowstr+","+rowsperpagestr+";";\r
210         st=m_db->Prepare(sql);\r
211         if(namesearch!="")\r
212         {\r
213                 st.Bind(0,namesearch);\r
214         }\r
215         st.Step();\r
216 \r
217         while(st.RowReturned())\r
218         {\r
219                 std::string identityid;\r
220                 std::string name;\r
221                 std::string localmessagetrust;\r
222                 std::string peermessagetrust;\r
223                 std::string localtrustlisttrust;\r
224                 std::string peertrustlisttrust;\r
225                 std::string publickey;\r
226                 std::string keypart="";\r
227 \r
228                 StringFunctions::Convert(count,countstr);\r
229 \r
230                 st.ResultText(0,identityid);\r
231                 st.ResultText(1,name);\r
232                 st.ResultText(2,localmessagetrust);\r
233                 st.ResultText(3,peermessagetrust);\r
234                 st.ResultText(4,localtrustlisttrust);\r
235                 st.ResultText(5,peertrustlisttrust);\r
236                 st.ResultText(6,publickey);\r
237 \r
238                 if(publickey.size()>8)\r
239                 {\r
240                         keypart=publickey.substr(3,5);\r
241                 }\r
242 \r
243                 content+="<tr>";\r
244                 content+="<td title=\""+publickey+"\">";\r
245                 content+="<input type=\"hidden\" name=\"identityid["+countstr+"]\" value=\""+identityid+"\">";\r
246                 content+="<a href=\"peerdetails.htm?identityid="+identityid+"\">";\r
247                 if(name!="")\r
248                 {\r
249                         content+=SanitizeOutput(name+keypart)+"...";\r
250                 }\r
251                 else\r
252                 {\r
253                         content+="[Unknown Name]";\r
254                 }\r
255                 content+="</a>";\r
256                 content+="</td>";\r
257                 content+="<td "+GetClassString(localmessagetrust)+">";\r
258                 content+="<input type=\"hidden\" name=\"oldlocalmessagetrust["+countstr+"]\" value=\""+localmessagetrust+"\">";\r
259                 content+="<input type=\"text\" name=\"localmessagetrust["+countstr+"]\" value=\""+localmessagetrust+"\" size=\"2\" maxlength=\"3\"></td>";\r
260                 content+="<td "+GetClassString(peermessagetrust)+">";\r
261                 content+=peermessagetrust+"</td>";\r
262                 content+="<td "+GetClassString(localtrustlisttrust)+">";\r
263                 content+="<input type=\"hidden\" name=\"oldlocaltrustlisttrust["+countstr+"]\" value=\""+localtrustlisttrust+"\">";\r
264                 content+="<input type=\"text\" name=\"localtrustlisttrust["+countstr+"]\" value=\""+localtrustlisttrust+"\" size=\"2\" maxlength=\"3\"></td>";\r
265                 content+="<td "+GetClassString(peertrustlisttrust)+">";\r
266                 content+=peertrustlisttrust+"</td>";\r
267                 content+="</tr>";\r
268                 st.Step();\r
269                 count++;\r
270         }\r
271         \r
272         if(startrow>0 || startrow+rowsperpage<identitycount)\r
273         {\r
274                 std::string tempstr;\r
275                 int cols=0;\r
276 \r
277                 content+="<tr>";\r
278                 if(startrow>0)\r
279                 {\r
280                         StringFunctions::Convert(startrow-rowsperpage,tempstr);\r
281                         content+="<td colspan=\"2\" align=\"left\"><a href=\"peertrust.htm?"+BuildQueryString(startrow-rowsperpage,namesearch,sortby,sortorder)+"\"><-- Previous Page</a></td>";\r
282                         cols+=2;\r
283                 }\r
284                 if(startrow+rowsperpage<identitycount)\r
285                 {\r
286                         while(cols<3)\r
287                         {\r
288                                 content+="<td></td>";\r
289                                 cols++;\r
290                         }\r
291                         content+="<td colspan=\"2\" align=\"right\"><a href=\"peertrust.htm?"+BuildQueryString(startrow+rowsperpage,namesearch,sortby,sortorder)+"\">Next Page --></a></td>";\r
292                 }\r
293                 content+="</tr>";\r
294         }\r
295 \r
296         content+="<tr><td colspan=\"5\"><center><input type=\"submit\" value=\"Update Trust\"></center></td></tr>";\r
297         content+="</table>";\r
298         content+="</form>";\r
299 \r
300         return "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"+StringFunctions::Replace(m_template,"[CONTENT]",content);\r
301 }\r
302 \r
303 const std::string PeerTrustPage::GetClassString(const std::string &trustlevel)\r
304 {\r
305         int tempint=0;\r
306         std::string tempstr;\r
307 \r
308         StringFunctions::Convert(trustlevel,tempint);\r
309         tempint/=10;\r
310         StringFunctions::Convert(tempint,tempstr);\r
311 \r
312         if(trustlevel!="")\r
313         {\r
314                 return "class=\"trust"+tempstr+"\"";\r
315         }\r
316         else\r
317         {\r
318                 return "";\r
319         }\r
320 }\r
321 \r
322 const std::string PeerTrustPage::ReverseSort(const std::string &sortname, const std::string &currentsortby, const std::string &currentsortorder)\r
323 {\r
324         if(sortname==currentsortby)\r
325         {\r
326                 if(currentsortorder=="ASC")\r
327                 {\r
328                         return "DESC";\r
329                 }\r
330                 else\r
331                 {\r
332                         return "ASC";\r
333                 }\r
334         }\r
335         else\r
336         {\r
337                 return currentsortorder;\r
338         }\r
339 }\r
340 \r
341 const bool PeerTrustPage::WillHandleURI(const std::string &uri)\r
342 {\r
343         if(uri.find("peertrust.")!=std::string::npos)\r
344         {\r
345                 return true;\r
346         }\r
347         else\r
348         {\r
349                 return false;\r
350         }\r
351 }\r