version 0.3.2
[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         Poco::AutoPtr<Poco::XML::Element> root=doc->createElement("TrustList");\r
84 \r
85         doc->appendChild(root);\r
86 \r
87         for(std::vector<trust>::iterator i=m_trust.begin(); i!=m_trust.end(); i++)\r
88         {\r
89                 std::string messagetrust;\r
90                 std::string trustlisttrust;\r
91                 StringFunctions::Convert((*i).m_messagetrust,messagetrust);\r
92                 StringFunctions::Convert((*i).m_trustlisttrust,trustlisttrust);\r
93                 Poco::AutoPtr<Poco::XML::Element> tr=doc->createElement("Trust");\r
94                 root->appendChild(tr);\r
95                 tr->appendChild(XMLCreateCDATAElement(doc,"Identity",(*i).m_identity));\r
96                 if((*i).m_messagetrust>=0)\r
97                 {\r
98                         tr->appendChild(XMLCreateTextElement(doc,"MessageTrustLevel",messagetrust));\r
99                 }\r
100                 if((*i).m_trustlisttrust>=0)\r
101                 {\r
102                         tr->appendChild(XMLCreateTextElement(doc,"TrustListTrustLevel",trustlisttrust));\r
103                 }\r
104                 if((*i).m_messagetrustcomment!="")\r
105                 {\r
106                         tr->appendChild(XMLCreateTextElement(doc,"MessageTrustComment",(*i).m_messagetrustcomment));\r
107                 }\r
108                 if((*i).m_trustlisttrustcomment!="")\r
109                 {\r
110                         tr->appendChild(XMLCreateTextElement(doc,"TrustListTrustComment",(*i).m_trustlisttrustcomment));\r
111                 }\r
112         }\r
113 \r
114         return GenerateXML(doc);\r
115 }\r
116 \r
117 void TrustListXML::Initialize()\r
118 {\r
119         m_trust.clear();\r
120 }\r
121 \r
122 const bool TrustListXML::ParseXML(const std::string &xml)\r
123 {\r
124 \r
125         bool parsed=false;\r
126         Poco::XML::DOMParser dp;\r
127 \r
128         Initialize();\r
129 \r
130         try\r
131         {\r
132                 Poco::AutoPtr<Poco::XML::Document> doc=dp.parseString(FixCDATA(xml));\r
133                 Poco::XML::Element *root=XMLGetFirstChild(doc,"TrustList");\r
134                 Poco::XML::Element *trustel=NULL;\r
135                 Poco::XML::Element *txt=NULL;\r
136 \r
137                 std::vector<std::string> foundkeys;\r
138 \r
139                 trustel=XMLGetFirstChild(root,"Trust");\r
140                 while(trustel)\r
141                 {\r
142                         std::string identity="";\r
143                         int messagetrust=-1;\r
144                         int trustlisttrust=-1;\r
145                         std::string messagetrustcomment="";\r
146                         std::string trustlisttrustcomment="";\r
147 \r
148                         txt=XMLGetFirstChild(trustel,"Identity");\r
149                         if(txt)\r
150                         {\r
151                                 if(txt->firstChild())\r
152                                 {\r
153                                         identity=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
154                                 }\r
155                         }\r
156                         txt=XMLGetFirstChild(trustel,"MessageTrustLevel");\r
157                         if(txt)\r
158                         {\r
159                                 if(txt->firstChild())\r
160                                 {\r
161                                         std::string mtl=txt->firstChild()->getNodeValue();\r
162                                         StringFunctions::Convert(mtl,messagetrust);\r
163                                 }\r
164                         }\r
165                         txt=XMLGetFirstChild(trustel,"TrustListTrustLevel");\r
166                         if(txt)\r
167                         {\r
168                                 if(txt->firstChild())\r
169                                 {\r
170                                         std::string tltl=txt->firstChild()->getNodeValue();\r
171                                         StringFunctions::Convert(tltl,trustlisttrust);\r
172                                 }\r
173                         }\r
174                         txt=XMLGetFirstChild(trustel,"MessageTrustComment");\r
175                         if(txt)\r
176                         {\r
177                                 if(txt->firstChild())\r
178                                 {\r
179                                         messagetrustcomment=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
180                                 }\r
181                         }\r
182                         txt=XMLGetFirstChild(trustel,"TrustListTrustComment");\r
183                         if(txt)\r
184                         {\r
185                                 if(txt->firstChild())\r
186                                 {\r
187                                         trustlisttrustcomment=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
188                                 }\r
189                         }\r
190 \r
191                         if(identity!="" && messagetrust>=-1 && messagetrust<=100 && trustlisttrust>=-1 && trustlisttrust<=100)\r
192                         {\r
193                                 // check so we don't add the same identity multiple times from a trust list\r
194                                 if(std::find(foundkeys.begin(),foundkeys.end(),identity)==foundkeys.end())\r
195                                 {\r
196                                         foundkeys.push_back(identity);\r
197                                         m_trust.push_back(trust(identity,messagetrust,trustlisttrust,messagetrustcomment,trustlisttrustcomment));\r
198                                 }\r
199                         }\r
200                         else\r
201                         {\r
202                                 m_log->error("TrustListXML::ParseXML malformed Trust in TrustList.xml");\r
203                         }\r
204 \r
205                         trustel=XMLGetNextSibling(trustel,"Trust");\r
206                 }\r
207 \r
208                 parsed=true;\r
209         }\r
210         catch(...)\r
211         {\r
212         }\r
213 \r
214         return parsed;\r
215 }\r