version 0.3.0
[fms.git] / src / freenet / trustlistxml.cpp
1 #include "../../include/freenet/trustlistxml.h"\r
2 #include "../../include/stringfunctions.h"\r
3 \r
4 #include <algorithm>\r
5 \r
6 #ifdef XMEM\r
7         #include <xmem.h>\r
8 #endif\r
9 \r
10 TrustListXML::TrustListXML()\r
11 {\r
12         Initialize();\r
13 }\r
14 \r
15 void TrustListXML::AddTrust(const std::string &identity, const long messagetrust, const long trustlisttrust, const std::string &messagetrustcomment, const std::string &trustlisttrustcomment)\r
16 {\r
17         m_trust.push_back(trust(identity,messagetrust,trustlisttrust,messagetrustcomment,trustlisttrustcomment));\r
18 }\r
19 \r
20 std::string TrustListXML::GetIdentity(const long index)\r
21 {\r
22         if(index>=0 && index<m_trust.size())\r
23         {\r
24                 return m_trust[index].m_identity;\r
25         }\r
26         else\r
27         {\r
28                 return "";\r
29         }\r
30 }\r
31 \r
32 long TrustListXML::GetMessageTrust(const long index)\r
33 {\r
34         if(index>=0 && index<m_trust.size())\r
35         {\r
36                 return m_trust[index].m_messagetrust;\r
37         }\r
38         else\r
39         {\r
40                 return -1;\r
41         }       \r
42 }\r
43 \r
44 std::string TrustListXML::GetMessageTrustComment(const long index)\r
45 {\r
46         if(index>=0 && index<m_trust.size())\r
47         {\r
48                 return m_trust[index].m_messagetrustcomment;\r
49         }\r
50         else\r
51         {\r
52                 return "";\r
53         }       \r
54 }\r
55 \r
56 long TrustListXML::GetTrustListTrust(const long index)\r
57 {\r
58         if(index>=0 && index<m_trust.size())\r
59         {\r
60                 return m_trust[index].m_trustlisttrust;\r
61         }\r
62         else\r
63         {\r
64                 return -1;\r
65         }\r
66 }\r
67 \r
68 std::string TrustListXML::GetTrustListTrustComment(const long index)\r
69 {\r
70         if(index>=0 && index<m_trust.size())\r
71         {\r
72                 return m_trust[index].m_trustlisttrustcomment;\r
73         }\r
74         else\r
75         {\r
76                 return "";\r
77         }\r
78 }\r
79 \r
80 std::string TrustListXML::GetXML()\r
81 {\r
82         Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;\r
83         //TiXmlDocument td;\r
84         //TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
85         Poco::XML::Element *root=doc->createElement("TrustList");\r
86         //TiXmlElement *tid;\r
87         //TiXmlPrinter tp;\r
88 \r
89         doc->appendChild(root);\r
90         //td.LinkEndChild(tdec);\r
91         //tid=new TiXmlElement("TrustList");\r
92         //td.LinkEndChild(tid);\r
93 \r
94         for(std::vector<trust>::iterator i=m_trust.begin(); i!=m_trust.end(); i++)\r
95         {\r
96                 std::string messagetrust;\r
97                 std::string trustlisttrust;\r
98                 StringFunctions::Convert((*i).m_messagetrust,messagetrust);\r
99                 StringFunctions::Convert((*i).m_trustlisttrust,trustlisttrust);\r
100                 Poco::XML::Element *tr=doc->createElement("Trust");\r
101                 //TiXmlElement *tr=new TiXmlElement("Trust");\r
102                 root->appendChild(tr);\r
103                 //tid->LinkEndChild(tr);\r
104                 tr->appendChild(XMLCreateCDATAElement(doc,"Identity",(*i).m_identity));\r
105                 //tr->LinkEndChild(XMLCreateCDATAElement("Identity",(*i).m_identity));\r
106                 if((*i).m_messagetrust>=0)\r
107                 {\r
108                         tr->appendChild(XMLCreateTextElement(doc,"MessageTrustLevel",messagetrust));\r
109                         //tr->LinkEndChild(XMLCreateTextElement("MessageTrustLevel",messagetrust));\r
110                 }\r
111                 if((*i).m_trustlisttrust>=0)\r
112                 {\r
113                         tr->appendChild(XMLCreateTextElement(doc,"TrustListTrustLevel",trustlisttrust));\r
114                         //tr->LinkEndChild(XMLCreateTextElement("TrustListTrustLevel",trustlisttrust));\r
115                 }\r
116                 if((*i).m_messagetrustcomment!="")\r
117                 {\r
118                         tr->appendChild(XMLCreateTextElement(doc,"MessageTrustComment",(*i).m_messagetrustcomment));\r
119                         //tr->LinkEndChild(XMLCreateCDATAElement("MessageTrustComment",(*i).m_messagetrustcomment));\r
120                 }\r
121                 if((*i).m_trustlisttrustcomment!="")\r
122                 {\r
123                         tr->appendChild(XMLCreateTextElement(doc,"TrustListTrustComment",(*i).m_trustlisttrustcomment));\r
124                         //tr->LinkEndChild(XMLCreateCDATAElement("TrustListTrustComment",(*i).m_trustlisttrustcomment));\r
125                 }\r
126         }\r
127 \r
128         //td.Accept(&tp);\r
129         //return std::string(tp.CStr());\r
130         return GenerateXML(doc);\r
131 }\r
132 \r
133 void TrustListXML::Initialize()\r
134 {\r
135         m_trust.clear();\r
136 }\r
137 \r
138 const bool TrustListXML::ParseXML(const std::string &xml)\r
139 {\r
140 \r
141         bool parsed=false;\r
142         Poco::XML::DOMParser dp;\r
143 \r
144         Initialize();\r
145 \r
146         try\r
147         {\r
148                 Poco::AutoPtr<Poco::XML::Document> doc=dp.parseString(FixCDATA(xml));\r
149                 Poco::XML::Element *root=XMLGetFirstChild(doc,"TrustList");\r
150                 Poco::XML::Element *trustel=NULL;\r
151                 Poco::XML::Element *txt=NULL;\r
152 \r
153                 std::vector<std::string> foundkeys;\r
154 \r
155                 trustel=XMLGetFirstChild(root,"Trust");\r
156                 while(trustel)\r
157                 {\r
158                         std::string identity="";\r
159                         int messagetrust=-1;\r
160                         int trustlisttrust=-1;\r
161                         std::string messagetrustcomment="";\r
162                         std::string trustlisttrustcomment="";\r
163 \r
164                         txt=XMLGetFirstChild(trustel,"Identity");\r
165                         if(txt)\r
166                         {\r
167                                 if(txt->firstChild())\r
168                                 {\r
169                                         identity=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
170                                 }\r
171                         }\r
172                         txt=XMLGetFirstChild(trustel,"MessageTrustLevel");\r
173                         if(txt)\r
174                         {\r
175                                 if(txt->firstChild())\r
176                                 {\r
177                                         std::string mtl=txt->firstChild()->getNodeValue();\r
178                                         StringFunctions::Convert(mtl,messagetrust);\r
179                                 }\r
180                         }\r
181                         txt=XMLGetFirstChild(trustel,"TrustListTrustLevel");\r
182                         if(txt)\r
183                         {\r
184                                 if(txt->firstChild())\r
185                                 {\r
186                                         std::string tltl=txt->firstChild()->getNodeValue();\r
187                                         StringFunctions::Convert(tltl,trustlisttrust);\r
188                                 }\r
189                         }\r
190                         txt=XMLGetFirstChild(trustel,"MessageTrustComment");\r
191                         if(txt)\r
192                         {\r
193                                 if(txt->firstChild())\r
194                                 {\r
195                                         messagetrustcomment=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
196                                 }\r
197                         }\r
198                         txt=XMLGetFirstChild(trustel,"TrustListTrustComment");\r
199                         if(txt)\r
200                         {\r
201                                 if(txt->firstChild())\r
202                                 {\r
203                                         trustlisttrustcomment=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
204                                 }\r
205                         }\r
206 \r
207                         if(identity!="" && messagetrust>=-1 && messagetrust<=100 && trustlisttrust>=-1 && trustlisttrust<=100)\r
208                         {\r
209                                 // check so we don't add the same identity multiple times from a trust list\r
210                                 if(std::find(foundkeys.begin(),foundkeys.end(),identity)==foundkeys.end())\r
211                                 {\r
212                                         foundkeys.push_back(identity);\r
213                                         m_trust.push_back(trust(identity,messagetrust,trustlisttrust,messagetrustcomment,trustlisttrustcomment));\r
214                                 }\r
215                         }\r
216                         else\r
217                         {\r
218                                 m_log->error("TrustListXML::ParseXML malformed Trust in TrustList.xml");\r
219                         }\r
220 \r
221                         trustel=XMLGetNextSibling(root,"Trust");\r
222                 }\r
223 \r
224                 parsed=true;\r
225         }\r
226         catch(...)\r
227         {\r
228         }\r
229 \r
230         return parsed;\r
231 \r
232         /*\r
233         TiXmlDocument td;\r
234         td.Parse(xml.c_str());\r
235 \r
236         if(!td.Error())\r
237         {\r
238                 std::string identity;\r
239                 std::string messagetruststr;\r
240                 std::string trustlisttruststr;\r
241                 std::string messagetrustcomment="";\r
242                 std::string trustlisttrustcomment="";\r
243                 long messagetrust;\r
244                 long trustlisttrust;\r
245                 TiXmlText *txt;\r
246                 TiXmlHandle hnd(&td);\r
247                 TiXmlNode *node;\r
248                 std::vector<std::string> m_foundkeys;\r
249 \r
250                 Initialize();\r
251 \r
252                 node=hnd.FirstChild("TrustList").FirstChild("Trust").ToElement();\r
253                 while(node)\r
254                 {\r
255                         identity="";\r
256                         messagetrust=-1;\r
257                         trustlisttrust=-1;\r
258                         messagetrustcomment="";\r
259                         trustlisttrustcomment="";\r
260 \r
261                         TiXmlHandle hnd2(node);\r
262                         txt=hnd2.FirstChild("Identity").FirstChild().ToText();\r
263                         if(txt)\r
264                         {\r
265                                 identity=SanitizeSingleString(txt->ValueStr());\r
266                         }\r
267                         txt=hnd2.FirstChild("MessageTrustLevel").FirstChild().ToText();\r
268                         if(txt)\r
269                         {\r
270                                 messagetruststr=SanitizeSingleString(txt->ValueStr());\r
271                                 if(messagetruststr!="")\r
272                                 {\r
273                                         StringFunctions::Convert(messagetruststr,messagetrust);\r
274                                 }\r
275                         }\r
276                         txt=hnd2.FirstChild("TrustListTrustLevel").FirstChild().ToText();\r
277                         if(txt)\r
278                         {\r
279                                 trustlisttruststr=SanitizeSingleString(txt->ValueStr());\r
280                                 if(trustlisttruststr!="")\r
281                                 {\r
282                                         StringFunctions::Convert(trustlisttruststr,trustlisttrust);\r
283                                 }\r
284                         }\r
285                         txt=hnd2.FirstChild("MessageTrustComment").FirstChild().ToText();\r
286                         if(txt)\r
287                         {\r
288                                 messagetrustcomment=txt->ValueStr();\r
289                         }\r
290                         txt=hnd2.FirstChild("TrustListTrustComment").FirstChild().ToText();\r
291                         if(txt)\r
292                         {\r
293                                 trustlisttrustcomment=txt->ValueStr();\r
294                         }\r
295 \r
296                         if(identity!="" && messagetrust>=-1 && messagetrust<=100 && trustlisttrust>=-1 && trustlisttrust<=100)\r
297                         {\r
298                                 // check so we don't add the same identity multiple times from a trust list\r
299                                 if(std::find(m_foundkeys.begin(),m_foundkeys.end(),identity)==m_foundkeys.end())\r
300                                 {\r
301                                         m_foundkeys.push_back(identity);\r
302                                         m_trust.push_back(trust(identity,messagetrust,trustlisttrust,messagetrustcomment,trustlisttrustcomment));\r
303                                 }\r
304                         }\r
305                         else\r
306                         {\r
307                                 m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"TrustListXML::ParseXML malformed Trust in TrustList.xml");\r
308                         }\r
309                         \r
310                         node=node->NextSibling("Trust");\r
311                 }\r
312                 return true;\r
313 \r
314         }\r
315         else\r
316         {\r
317                 return false;\r
318         }\r
319         */\r
320 }\r