38bddbf116b605bb160ab7df4cafd9a4d066547a
[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::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
9 {\r
10         int count=0;\r
11         std::string countstr;\r
12         std::string content="";\r
13         int identitycount=0;            // total number of ids we know\r
14         int rowsperpage=25;                     // how many ids to show per page\r
15         std::string rowsperpagestr;\r
16         int startrow=0;\r
17         std::string startrowstr="0";\r
18         std::string namesearch="";\r
19         std::string sql;\r
20 \r
21         StringFunctions::Convert(rowsperpage,rowsperpagestr);\r
22 \r
23         if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="update")\r
24         {\r
25                 std::vector<std::string> identityids;\r
26                 std::vector<std::string> oldlmt;\r
27                 std::vector<std::string> lmt;\r
28                 std::vector<std::string> oldltlt;\r
29                 std::vector<std::string> ltlt;\r
30                 int localmessagetrust=0;\r
31                 int localtrustlisttrust=0;\r
32                 int identityid;\r
33 \r
34                 CreateArgArray(queryvars,"identityid",identityids);\r
35                 CreateArgArray(queryvars,"oldlocalmessagetrust",oldlmt);\r
36                 CreateArgArray(queryvars,"localmessagetrust",lmt);\r
37                 CreateArgArray(queryvars,"oldlocaltrustlisttrust",oldltlt);\r
38                 CreateArgArray(queryvars,"localtrustlisttrust",ltlt);\r
39                 \r
40                 SQLite3DB::Statement update=m_db->Prepare("UPDATE tblIdentity SET LocalMessageTrust=?, LocalTrustListTrust=? WHERE IdentityID=?;");\r
41 \r
42                 for(int i=0; i<identityids.size(); i++)\r
43                 {\r
44                         if(oldlmt[i]!=lmt[i] || oldltlt[i]!=ltlt[i])\r
45                         {\r
46                                 StringFunctions::Convert(lmt[i],localmessagetrust);\r
47                                 StringFunctions::Convert(ltlt[i],localtrustlisttrust);\r
48                                 StringFunctions::Convert(identityids[i],identityid);\r
49 \r
50                                 update.Bind(0,localmessagetrust);\r
51                                 update.Bind(1,localtrustlisttrust);\r
52                                 update.Bind(2,identityid);\r
53                                 update.Step();\r
54                                 update.Reset();\r
55                         }\r
56                 }\r
57 \r
58         }\r
59 \r
60         // if startrow is specified\r
61         if(queryvars.find("startrow")!=queryvars.end())\r
62         {\r
63                 startrowstr=(*queryvars.find("startrow")).second;\r
64                 // convert back and forth, just in case a number wasn't passed in startrow\r
65                 StringFunctions::Convert(startrowstr,startrow);\r
66                 if(startrow<0)\r
67                 {\r
68                         startrow=0;\r
69                 }\r
70                 StringFunctions::Convert(startrow,startrowstr);\r
71         }\r
72 \r
73         // if we are searching by name\r
74         if(queryvars.find("namesearch")!=queryvars.end())\r
75         {\r
76                 namesearch=(*queryvars.find("namesearch")).second;\r
77         }\r
78 \r
79         content+="<h2>Peer Trust</h2>";\r
80         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
81         content+="<div style=\"text-align:center;\">";\r
82         content+="<form name=\"frmsearch\" method=\"POST\" action=\"peertrust.htm\">";\r
83         content+="<input type=\"text\" name=\"namesearch\">";\r
84         content+="<input type=\"submit\" value=\"Search\">";\r
85         content+="</form>";\r
86         content+="</div>";\r
87         content+="<form name=\"frmtrust\" method=\"POST\">";\r
88         content+="<input type=\"hidden\" name=\"formaction\" value=\"update\">";\r
89         content+="<input type=\"hidden\" name=\"startrow\" value=\""+startrowstr+"\">";\r
90         content+="<table>";\r
91         content+="<tr><th>Name</th><th>Local Message Trust</th><th>Peer Message Trust</th><th>Local Trust List Trust</th><th>Peer Trust List Trust</th></tr>";\r
92         \r
93         // get count of identities we are showing\r
94         sql="SELECT COUNT(*) FROM tblIdentity";\r
95         if(namesearch!="")\r
96         {\r
97                 sql+=" WHERE Name LIKE '%' || ? || '%'";\r
98         }\r
99         sql+=";";\r
100         SQLite3DB::Statement st=m_db->Prepare(sql);\r
101         if(namesearch!="")\r
102         {\r
103                 st.Bind(0,namesearch);\r
104         }\r
105         st.Step();\r
106         st.ResultInt(0,identitycount);\r
107         st.Finalize();\r
108 \r
109         sql="SELECT IdentityID,Name,LocalMessageTrust,PeerMessageTrust,LocalTrustListTrust,PeerTrustListTrust,PublicKey FROM tblIdentity";\r
110         if(namesearch!="")\r
111         {\r
112                 sql+=" WHERE Name LIKE  '%' || ? || '%'";\r
113         }\r
114         sql+=" ORDER BY Name COLLATE NOCASE LIMIT "+startrowstr+","+rowsperpagestr+";";\r
115         st=m_db->Prepare(sql);\r
116         if(namesearch!="")\r
117         {\r
118                 st.Bind(0,namesearch);\r
119         }\r
120         st.Step();\r
121 \r
122         while(st.RowReturned())\r
123         {\r
124                 std::string identityid;\r
125                 std::string name;\r
126                 std::string localmessagetrust;\r
127                 std::string peermessagetrust;\r
128                 std::string localtrustlisttrust;\r
129                 std::string peertrustlisttrust;\r
130                 std::string publickey;\r
131                 std::string keypart="";\r
132 \r
133                 StringFunctions::Convert(count,countstr);\r
134 \r
135                 st.ResultText(0,identityid);\r
136                 st.ResultText(1,name);\r
137                 st.ResultText(2,localmessagetrust);\r
138                 st.ResultText(3,peermessagetrust);\r
139                 st.ResultText(4,localtrustlisttrust);\r
140                 st.ResultText(5,peertrustlisttrust);\r
141                 st.ResultText(6,publickey);\r
142 \r
143                 if(publickey.size()>8)\r
144                 {\r
145                         keypart=publickey.substr(3,5);\r
146                 }\r
147 \r
148                 content+="<tr>";\r
149                 content+="<td title=\""+publickey+"\">";\r
150                 content+="<input type=\"hidden\" name=\"identityid["+countstr+"]\" value=\""+identityid+"\">";\r
151                 content+="<a href=\"peerdetails.htm?identityid="+identityid+"\">";\r
152                 if(name!="")\r
153                 {\r
154                         content+=SanitizeOutput(name+keypart)+"...";\r
155                 }\r
156                 else\r
157                 {\r
158                         content+="[Unknown Name]";\r
159                 }\r
160                 content+="</a>";\r
161                 content+="</td>";\r
162                 content+="<td "+GetClassString(localmessagetrust)+">";\r
163                 content+="<input type=\"hidden\" name=\"oldlocalmessagetrust["+countstr+"]\" value=\""+localmessagetrust+"\">";\r
164                 content+="<input type=\"text\" name=\"localmessagetrust["+countstr+"]\" value=\""+localmessagetrust+"\" size=\"2\" maxlength=\"3\"></td>";\r
165                 content+="<td "+GetClassString(peermessagetrust)+">";\r
166                 content+=peermessagetrust+"</td>";\r
167                 content+="<td "+GetClassString(localtrustlisttrust)+">";\r
168                 content+="<input type=\"hidden\" name=\"oldlocaltrustlisttrust["+countstr+"]\" value=\""+localtrustlisttrust+"\">";\r
169                 content+="<input type=\"text\" name=\"localtrustlisttrust["+countstr+"]\" value=\""+localtrustlisttrust+"\" size=\"2\" maxlength=\"3\"></td>";\r
170                 content+="<td "+GetClassString(peertrustlisttrust)+">";\r
171                 content+=peertrustlisttrust+"</td>";\r
172                 content+="</tr>";\r
173                 st.Step();\r
174                 count++;\r
175         }\r
176         \r
177         if(startrow>0 || startrow+rowsperpage<identitycount)\r
178         {\r
179                 std::string tempstr;\r
180                 int cols=0;\r
181 \r
182                 content+="<tr>";\r
183                 if(startrow>0)\r
184                 {\r
185                         StringFunctions::Convert(startrow-rowsperpage,tempstr);\r
186                         content+="<td colspan=\"2\" align=\"left\"><a href=\"peertrust.htm?startrow="+tempstr+"&namesearch="+namesearch+"\"><-- Previous Page</a></td>";\r
187                         cols+=2;\r
188                 }\r
189                 if(startrow+rowsperpage<identitycount)\r
190                 {\r
191                         StringFunctions::Convert(startrow+rowsperpage,tempstr);\r
192                         while(cols<3)\r
193                         {\r
194                                 content+="<td></td>";\r
195                                 cols++;\r
196                         }\r
197                         content+="<td colspan=\"2\" align=\"right\"><a href=\"peertrust.htm?startrow="+tempstr+"&namesearch="+namesearch+"\">Next Page --></a></td>";\r
198                 }\r
199                 content+="</tr>";\r
200         }\r
201 \r
202         content+="<tr><td colspan=\"5\"><input type=\"submit\" value=\"Update Trust\"></td></tr>";\r
203         content+="</table>";\r
204         content+="</form>";\r
205 \r
206         return "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"+StringFunctions::Replace(m_template,"[CONTENT]",content);\r
207 }\r
208 \r
209 const std::string PeerTrustPage::GetClassString(const std::string &trustlevel)\r
210 {\r
211         int tempint=0;\r
212         std::string tempstr;\r
213 \r
214         StringFunctions::Convert(trustlevel,tempint);\r
215         tempint/=10;\r
216         StringFunctions::Convert(tempint,tempstr);\r
217 \r
218         if(trustlevel!="")\r
219         {\r
220                 return "class=\"trust"+tempstr+"\"";\r
221         }\r
222         else\r
223         {\r
224                 return "";\r
225         }\r
226 }\r
227 \r
228 const bool PeerTrustPage::WillHandleURI(const std::string &uri)\r
229 {\r
230         if(uri.find("peertrust.")!=std::string::npos)\r
231         {\r
232                 return true;\r
233         }\r
234         else\r
235         {\r
236                 return false;\r
237         }\r
238 }\r