Mixe for Privacy and Anonymity in the Internet
CAListenerInterface.cpp
Go to the documentation of this file.
1 /*
2 Copyright (c) 2000, The JAP-Team
3 All rights reserved.
4 Redistribution and use in source and binary forms, with or without modification,
5 are permitted provided that the following conditions are met:
6 
7  - Redistributions of source code must retain the above copyright notice,
8  this list of conditions and the following disclaimer.
9 
10  - Redistributions in binary form must reproduce the above copyright notice,
11  this list of conditions and the following disclaimer in the documentation and/or
12  other materials provided with the distribution.
13 
14  - Neither the name of the University of Technology Dresden, Germany nor the names of its contributors
15  may be used to endorse or promote products derived from this software without specific
16  prior written permission.
17 
18 
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS
20 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
21 AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
22 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
24 OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25 IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
27 */
28 #include "StdAfx.h"
29 #include "CAListenerInterface.hpp"
30 #include "CAUtil.hpp"
31 #include "CAMsg.hpp"
32 #include "CASocketAddrINet.hpp"
33 #ifdef HAVE_UNIX_DOMAIN_PROTOCOL
34  #include "CASocketAddrUnix.hpp"
35 #endif
36 
37 #if !defined ONLY_LOCAL_PROXY || defined INCLUDE_MIDDLE_MIX
38 const char* CAListenerInterface::XML_ELEMENT_CONTAINER_NAME = "ListenerInterfaces";
39 const char* CAListenerInterface::XML_ELEMENT_NAME = "ListenerInterface";
40 #endif
41 
43  {
44  m_bHidden=false;
45  m_bVirtual=false;
46  m_strHostname=NULL;
47  m_pAddr=NULL;
49  }
50 
52  {
53  delete m_pAddr;
54  m_pAddr = NULL;
55  delete[] m_strHostname;
56  m_strHostname = NULL;
57  }
58 
60  {
61  #ifdef HAVE_UNIX_DOMAIN_PROTOCOL
62  if( (type!=RAW_UNIX&&type!=SSL_UNIX)||
63  file==NULL)
64  return NULL;
66  pListener->m_Type=type;
67  pListener->m_pAddr=new CASocketAddrUnix();
68  ((CASocketAddrUnix*)pListener->m_pAddr)->setPath((const char*)file);
69  return pListener;
70  #else
71  return NULL;
72  #endif
73  }
74 
76  {
77  if( (type!=RAW_TCP&&type!=SSL_TCP&&type!=RAW_UDP))
78  return NULL;
80  pListener->m_Type=type;
81  pListener->m_pAddr=new CASocketAddrINet();
82  if(((CASocketAddrINet*)pListener->m_pAddr)->setAddr(hostnameOrIP,port)!=E_SUCCESS)
83  {
84  delete pListener;
85  pListener=NULL;
86  }
87  return pListener;
88  }
89 
90 #if !defined ONLY_LOCAL_PROXY || defined INCLUDE_MIDDLE_MIX
91 SINT32 CAListenerInterface::toDOMElement(DOMElement* & elemListenerInterface,XERCES_CPP_NAMESPACE::DOMDocument* ownerDoc) const
92  {
93  elemListenerInterface=createDOMElement(ownerDoc,"ListenerInterface");
94  DOMElement* elem=createDOMElement(ownerDoc,"Type");
95  elemListenerInterface->appendChild(elem);
96  if(m_Type==RAW_TCP)
97  setDOMElementValue(elem,(UINT8*)"RAW/TCP");
98  else if (m_Type == RAW_UDP)
99  setDOMElementValue(elem, (UINT8*)"RAW/UDP");
100  elem=createDOMElement(ownerDoc,"Port");
101  elemListenerInterface->appendChild(elem);
102  UINT32 port=((CASocketAddrINet*)m_pAddr)->getPort();
103  setDOMElementValue(elem,port);
104  elem=createDOMElement(ownerDoc,"Host");
105  elemListenerInterface->appendChild(elem);
106  UINT8 ip[50];
107  if(m_strHostname!=NULL)
109  else
110  {
111  ((CASocketAddrINet*)m_pAddr)->getIPAsStr(ip,50);
112  setDOMElementValue(elem,ip);
113  }
114  elem=createDOMElement(ownerDoc,"IP");
115  elemListenerInterface->appendChild(elem);
116  ((CASocketAddrINet*)m_pAddr)->getIPAsStr(ip,50);
117  setDOMElementValue(elem,ip);
118  return E_SUCCESS;
119  }
120 
121 CAListenerInterface** CAListenerInterface::getInstance(DOMElement* a_elemListenerInterfaces,
122  UINT32& r_length)
123 {
124  CAListenerInterface** interfaces = NULL;
125  if(a_elemListenerInterfaces!=NULL)
126  {
127  DOMNodeList* nlListenerInterfaces =
129  r_length=nlListenerInterfaces->getLength();
130  if(r_length>0)
131  {
132  interfaces=new CAListenerInterface*[r_length];
133  UINT32 aktInterface=0;
134  for(UINT32 i=0;i<r_length;i++)
135  {
136  DOMNode* elemListenerInterface;
137  elemListenerInterface=nlListenerInterfaces->item(i);
138  CAListenerInterface* pListener=CAListenerInterface::getInstance(elemListenerInterface);
139  if(pListener!=NULL)
140  {
141  interfaces[aktInterface++]=pListener;
142  }
143  }
144  r_length=aktInterface;
145  }
146  }
147  else
148  {
149  r_length = 0;
150  interfaces=NULL;
151  }
152 
153  return interfaces;
154 }
155 
156 
157 CAListenerInterface* CAListenerInterface::getInstance(const DOMNode* elemListenerInterface)
158  {
159  if( elemListenerInterface==NULL||
160  elemListenerInterface->getNodeType()!=DOMNode::ELEMENT_NODE)//||
162  return NULL;
163  CAListenerInterface* pListener=new CAListenerInterface();
164  getDOMElementAttribute(elemListenerInterface,"hidden",pListener->m_bHidden);
165  getDOMElementAttribute(elemListenerInterface,"virtual",pListener->m_bVirtual);
166  DOMNode* elemType=NULL;
167  getDOMChildByName(elemListenerInterface,"NetworkProtocol",elemType,false);
168  if (elemType == NULL)
169  {
170  getDOMChildByName(elemListenerInterface,"Type",elemType,false);
171  }
172  UINT32 tmpLen = 255;
173  UINT8 tmpBuff[255];
174  if (elemType != NULL)
175  {
176  if(getDOMElementValue(elemType,tmpBuff,&tmpLen)!=E_SUCCESS)
177  goto ERR;
178  strtrim(tmpBuff);
179  if(strcmp((char*)tmpBuff,"RAW/TCP")==0)
180  pListener->m_Type=RAW_TCP;
181  else if(strcmp((char*)tmpBuff,"RAW/UNIX")==0)
182  pListener->m_Type=RAW_UNIX;
183  else if (strcmp((char*)tmpBuff, "RAW/UDP") == 0)
184  pListener->m_Type = RAW_UDP;
185  else if(strcmp((char*)tmpBuff,"SSL/TCP")==0)
186  pListener->m_Type=SSL_TCP;
187  else if(strcmp((char*)tmpBuff,"SSL/UNIX")==0)
188  pListener->m_Type=SSL_UNIX;
189  else if (strcmp((char*)tmpBuff,"HTTP/TCP")==0)
190  {
191  pListener->m_Type=HTTP_TCP;
192  }
193  else
194  goto ERR;
195  }
196  else
197  {
198  // infoservice old style <= config version 0.61
199  pListener->m_Type=HTTP_TCP;
200  }
201  if(pListener->m_Type==SSL_TCP||pListener->m_Type==RAW_TCP|| pListener->m_Type == RAW_UDP
202  ||pListener->m_Type==HTTP_TCP)
203  {
204  DOMNode* elemIP=NULL;
205  DOMElement* elemPort=NULL;
206  DOMNode* elemHost=NULL;
207  getDOMChildByName(elemListenerInterface,"Port",elemPort,false);
208  UINT32 port;
209  if(getDOMElementValue(elemPort,&port)!=E_SUCCESS)
210  goto ERR;
211  pListener->m_pAddr=new CASocketAddrINet;
212  getDOMChildByName(elemListenerInterface,"IP",elemIP,false);
213  if(elemIP!=NULL)
214  {
215  UINT8 buffIP[50];
216  UINT32 buffIPLen=50;
217  if(getDOMElementValue(elemIP,buffIP,&buffIPLen)!=E_SUCCESS)
218  goto ERR;
219  if(((CASocketAddrINet*)pListener->m_pAddr)->setAddr(buffIP,(UINT16)port)!=E_SUCCESS)
220  goto ERR;
221  }
222  getDOMChildByName(elemListenerInterface,"Host",elemHost,false);
223  tmpLen=255;
224  if(getDOMElementValue(elemHost,tmpBuff,&tmpLen)==E_SUCCESS)
225  {
226  tmpBuff[tmpLen]=0;
227  if(elemIP==NULL&&((CASocketAddrINet*)pListener->m_pAddr)->setAddr(tmpBuff,(UINT16)port)!=E_SUCCESS)
228  goto ERR;
229  pListener->m_strHostname=new UINT8[tmpLen+1];
230  memcpy(pListener->m_strHostname,tmpBuff,tmpLen);
231  pListener->m_strHostname[tmpLen]=0;
232  }
233  else if(elemIP==NULL)
234  goto ERR;
235  }
236  else
237  #ifdef HAVE_UNIX_DOMAIN_PROTOCOL
238  {
239  DOMElement* elemFile=NULL;
240  getDOMChildByName(elemListenerInterface,"File",elemFile,false);
241  tmpLen=255;
242  if(getDOMElementValue(elemFile,tmpBuff,&tmpLen)!=E_SUCCESS)
243  goto ERR;
244  tmpBuff[tmpLen]=0;
245  strtrim(tmpBuff);
246  pListener->m_pAddr=new CASocketAddrUnix;
247  if(((CASocketAddrUnix*)pListener->m_pAddr)->setPath((char*)tmpBuff)!=E_SUCCESS)
248  goto ERR;
249  pListener->m_strHostname=NULL;
250  }
251  #else
252  goto ERR;
253  #endif
254  return pListener;
255 ERR:
256  delete pListener;
257  pListener = NULL;
258  return NULL;
259 }
260 
261 #endif //ONLY_LOCAL_PROXY
SINT32 getDOMElementValue(const DOMNode *const pElem, UINT8 *value, UINT32 *valuelen)
Returns the content of the text node(s) under elem as null-terminated C String.
Definition: CAUtil.cpp:746
SINT32 setDOMElementValue(DOMElement *pElem, SINT32 value)
Definition: CAUtil.cpp:939
UINT32 strtrim(UINT8 *s)
Removes leading and ending whitespaces (chars<=32) from a zero terminated string.
Definition: CAUtil.cpp:49
DOMNodeList * getElementsByTagName(DOMElement *pElem, const char *const name)
Definition: CAUtil.cpp:1711
DOMElement * createDOMElement(XERCES_CPP_NAMESPACE::DOMDocument *pOwnerDoc, const char *const name)
Creates a new DOMElement with the given name which belongs to the DOMDocument owernDoc.
Definition: CAUtil.cpp:814
SINT32 getDOMChildByName(const DOMNode *pNode, const char *const name, DOMElement *&child, bool deep)
Definition: CAUtil.cpp:458
SINT32 getDOMElementAttribute(const DOMNode *const elem, const char *attrName, UINT8 *value, UINT32 *len)
Definition: CAUtil.cpp:780
unsigned short UINT16
Definition: basetypedefs.h:133
signed int SINT32
Definition: basetypedefs.h:132
unsigned char UINT8
Definition: basetypedefs.h:135
unsigned int UINT32
Definition: basetypedefs.h:131
static const char * XML_ELEMENT_CONTAINER_NAME
static const char * XML_ELEMENT_NAME
SINT32 toDOMElement(DOMElement *&elem, XERCES_CPP_NAMESPACE::DOMDocument *ownerDoc) const
static CAListenerInterface * getInstance(const DOMNode *node)
This class represents a socket address for Internet (IP) connections.
This is a class for Unix Domain Protocol Sockat Addresses.
const SINT32 E_SUCCESS
Definition: errorcodes.hpp:2
NetworkType
Definition: typedefs.hpp:30
@ RAW_TCP
Definition: typedefs.hpp:30
@ RAW_UDP
Definition: typedefs.hpp:30
@ SSL_TCP
Definition: typedefs.hpp:30
@ RAW_UNIX
Definition: typedefs.hpp:30
@ SSL_UNIX
Definition: typedefs.hpp:30
@ UNKNOWN_NETWORKTYPE
Definition: typedefs.hpp:30
@ HTTP_TCP
Definition: typedefs.hpp:30
UINT8 type
Definition: typedefs.hpp:1