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