Mixe for Privacy and Anonymity in the Internet
CAListenerInterface.cpp
Go to the documentation of this file.
00001 /*
00002 Copyright (c) 2000, The JAP-Team 
00003 All rights reserved.
00004 Redistribution and use in source and binary forms, with or without modification, 
00005 are permitted provided that the following conditions are met:
00006 
00007   - Redistributions of source code must retain the above copyright notice, 
00008     this list of conditions and the following disclaimer.
00009 
00010   - Redistributions in binary form must reproduce the above copyright notice, 
00011     this list of conditions and the following disclaimer in the documentation and/or 
00012     other materials provided with the distribution.
00013 
00014   - Neither the name of the University of Technology Dresden, Germany nor the names of its contributors 
00015     may be used to endorse or promote products derived from this software without specific 
00016     prior written permission. 
00017 
00018   
00019 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS 
00020 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
00021 AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
00022 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00023 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
00024 OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 
00025 IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
00026 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
00027 */
00028 #include "StdAfx.h"
00029 #include "CAListenerInterface.hpp"
00030 #include "CAUtil.hpp"
00031 #include "CAMsg.hpp"
00032 #include "CASocketAddrINet.hpp"
00033 #ifdef HAVE_UNIX_DOMAIN_PROTOCOL
00034   #include "CASocketAddrUnix.hpp"
00035 #endif
00036 
00037 #ifndef ONLY_LOCAL_PROXY
00038 const char* CAListenerInterface::XML_ELEMENT_CONTAINER_NAME = "ListenerInterfaces";
00039 const char* CAListenerInterface::XML_ELEMENT_NAME = "ListenerInterface";
00040 #endif
00041 
00042 CAListenerInterface::CAListenerInterface(void)
00043   {
00044     m_bHidden=false;
00045     m_bVirtual=false;
00046     m_strHostname=NULL;
00047     m_pAddr=NULL;
00048     m_Type=UNKNOWN_NETWORKTYPE;
00049   }
00050 
00051 CAListenerInterface::~CAListenerInterface(void)
00052   {
00053     delete m_pAddr;
00054     m_pAddr = NULL;
00055     delete[] m_strHostname;
00056     m_strHostname = NULL;
00057   }
00058 
00059 CAListenerInterface* CAListenerInterface::getInstance(NetworkType type,const UINT8* file)
00060   {
00061     #ifdef HAVE_UNIX_DOMAIN_PROTOCOL
00062       if( (type!=RAW_UNIX&&type!=SSL_UNIX)||
00063           file==NULL)
00064         return NULL;
00065       CAListenerInterface* pListener=new CAListenerInterface();
00066       pListener->m_Type=type;
00067       pListener->m_pAddr=new CASocketAddrUnix();
00068       ((CASocketAddrUnix*)pListener->m_pAddr)->setPath((const char*)file);
00069       return pListener;
00070     #else
00071       return NULL;
00072     #endif
00073   }
00074 
00075 CAListenerInterface* CAListenerInterface::getInstance(NetworkType type,const UINT8* hostnameOrIP,UINT16 port)
00076   {
00077     if( (type!=RAW_TCP&&type!=SSL_TCP))
00078       return NULL;
00079     CAListenerInterface* pListener=new CAListenerInterface();
00080     pListener->m_Type=type;
00081     pListener->m_pAddr=new CASocketAddrINet();
00082     if(((CASocketAddrINet*)pListener->m_pAddr)->setAddr(hostnameOrIP,port)!=E_SUCCESS)
00083       {
00084         delete pListener;
00085         pListener=NULL;
00086       }
00087     return pListener;
00088   }
00089 
00090 #ifndef ONLY_LOCAL_PROXY
00091 CAListenerInterface** CAListenerInterface::getInstance(DOMElement* a_elemListenerInterfaces, 
00092                             UINT32& r_length)
00093 {
00094   CAListenerInterface** interfaces = NULL;
00095   if(a_elemListenerInterfaces!=NULL)
00096   {
00097     DOMNodeList* nlListenerInterfaces =
00098       getElementsByTagName(a_elemListenerInterfaces,CAListenerInterface::XML_ELEMENT_NAME);
00099     r_length=nlListenerInterfaces->getLength();
00100     if(r_length>0)
00101     {
00102       interfaces=new CAListenerInterface*[r_length];
00103       UINT32 aktInterface=0;
00104       for(UINT32 i=0;i<r_length;i++)
00105       {
00106         DOMNode* elemListenerInterface;
00107         elemListenerInterface=nlListenerInterfaces->item(i);
00108         CAListenerInterface* pListener=CAListenerInterface::getInstance(elemListenerInterface);
00109         if(pListener!=NULL)
00110         {
00111           interfaces[aktInterface++]=pListener;
00112         }
00113       }
00114       r_length=aktInterface;
00115     }
00116   } 
00117   else
00118   {
00119     r_length = 0;
00120     interfaces=NULL;
00121   }
00122       
00123   return interfaces;
00124 }
00125 
00126 
00127 SINT32  CAListenerInterface::toDOMElement(DOMElement* & elemListenerInterface,XERCES_CPP_NAMESPACE::DOMDocument* ownerDoc) const
00128   {
00129     elemListenerInterface=createDOMElement(ownerDoc,"ListenerInterface");
00130     DOMElement* elem=createDOMElement(ownerDoc,"Type");
00131     elemListenerInterface->appendChild(elem);
00132     setDOMElementValue(elem,(UINT8*)"RAW/TCP");
00133     elem=createDOMElement(ownerDoc,"Port");
00134     elemListenerInterface->appendChild(elem);
00135     UINT32 port=((CASocketAddrINet*)m_pAddr)->getPort();
00136     setDOMElementValue(elem,port);
00137     elem=createDOMElement(ownerDoc,"Host");
00138     elemListenerInterface->appendChild(elem);
00139     UINT8 ip[50];
00140     if(m_strHostname!=NULL)
00141       setDOMElementValue(elem,m_strHostname);
00142     else 
00143       {
00144         ((CASocketAddrINet*)m_pAddr)->getIPAsStr(ip,50);
00145         setDOMElementValue(elem,ip);
00146       }
00147     elem=createDOMElement(ownerDoc,"IP");
00148     elemListenerInterface->appendChild(elem);
00149     ((CASocketAddrINet*)m_pAddr)->getIPAsStr(ip,50);
00150     setDOMElementValue(elem,ip);
00151     return E_SUCCESS;
00152   }
00153 
00154 CAListenerInterface* CAListenerInterface::getInstance(const DOMNode* elemListenerInterface)
00155   {
00156     if( elemListenerInterface==NULL||
00157         elemListenerInterface->getNodeType()!=DOMNode::ELEMENT_NODE)//||
00159       return NULL;
00160     CAListenerInterface* pListener=new CAListenerInterface();
00161     getDOMElementAttribute(elemListenerInterface,"hidden",pListener->m_bHidden);
00162     getDOMElementAttribute(elemListenerInterface,"virtual",pListener->m_bVirtual);
00163     DOMNode* elemType=NULL;
00164     getDOMChildByName(elemListenerInterface,"NetworkProtocol",elemType,false);
00165     if (elemType == NULL)
00166     {
00167       getDOMChildByName(elemListenerInterface,"Type",elemType,false);
00168     }
00169     UINT32 tmpLen = 255;
00170     UINT8 tmpBuff[255];
00171     if (elemType != NULL)
00172     {
00173       if(getDOMElementValue(elemType,tmpBuff,&tmpLen)!=E_SUCCESS)
00174         goto ERR;
00175       strtrim(tmpBuff);
00176       if(strcmp((char*)tmpBuff,"RAW/TCP")==0)
00177         pListener->m_Type=RAW_TCP;
00178       else if(strcmp((char*)tmpBuff,"RAW/UNIX")==0)
00179         pListener->m_Type=RAW_UNIX;
00180       else if(strcmp((char*)tmpBuff,"SSL/TCP")==0)
00181         pListener->m_Type=SSL_TCP;
00182       else if(strcmp((char*)tmpBuff,"SSL/UNIX")==0)
00183         pListener->m_Type=SSL_UNIX;
00184       else if (strcmp((char*)tmpBuff,"HTTP/TCP")==0)
00185       {
00186         pListener->m_Type=HTTP_TCP;
00187       }
00188       else
00189         goto ERR;
00190     }
00191     else
00192     {
00193       // infoservice old style <= config version 0.61
00194       pListener->m_Type=HTTP_TCP;
00195     }
00196     if(pListener->m_Type==SSL_TCP||pListener->m_Type==RAW_TCP
00197        ||pListener->m_Type==HTTP_TCP)
00198       { 
00199         DOMNode* elemIP=NULL;
00200         DOMElement* elemPort=NULL;
00201         DOMNode* elemHost=NULL;
00202         getDOMChildByName(elemListenerInterface,"Port",elemPort,false);
00203         UINT32 port;
00204         if(getDOMElementValue(elemPort,&port)!=E_SUCCESS)
00205           goto ERR;
00206         pListener->m_pAddr=new CASocketAddrINet;
00207         getDOMChildByName(elemListenerInterface,"IP",elemIP,false);
00208         if(elemIP!=NULL)
00209           {
00210             UINT8 buffIP[50];
00211             UINT32 buffIPLen=50;
00212             if(getDOMElementValue(elemIP,buffIP,&buffIPLen)!=E_SUCCESS)
00213               goto ERR;
00214             if(((CASocketAddrINet*)pListener->m_pAddr)->setAddr(buffIP,(UINT16)port)!=E_SUCCESS)
00215               goto ERR;
00216           }
00217         getDOMChildByName(elemListenerInterface,"Host",elemHost,false);
00218         tmpLen=255;                   
00219         if(getDOMElementValue(elemHost,tmpBuff,&tmpLen)==E_SUCCESS)
00220           {
00221             tmpBuff[tmpLen]=0;
00222             if(elemIP==NULL&&((CASocketAddrINet*)pListener->m_pAddr)->setAddr(tmpBuff,(UINT16)port)!=E_SUCCESS)
00223               goto ERR;
00224             pListener->m_strHostname=new UINT8[tmpLen+1];
00225             memcpy(pListener->m_strHostname,tmpBuff,tmpLen);
00226             pListener->m_strHostname[tmpLen]=0;
00227           }
00228         else if(elemIP==NULL)
00229           goto ERR;
00230       }
00231     else
00232       #ifdef HAVE_UNIX_DOMAIN_PROTOCOL
00233         {
00234           DOMElement* elemFile=NULL;
00235           getDOMChildByName(elemListenerInterface,"File",elemFile,false);
00236           tmpLen=255;
00237           if(getDOMElementValue(elemFile,tmpBuff,&tmpLen)!=E_SUCCESS)
00238             goto ERR;
00239           tmpBuff[tmpLen]=0;
00240           strtrim(tmpBuff);
00241           pListener->m_pAddr=new CASocketAddrUnix;
00242           if(((CASocketAddrUnix*)pListener->m_pAddr)->setPath((char*)tmpBuff)!=E_SUCCESS)
00243             goto ERR;
00244           pListener->m_strHostname=NULL;
00245         }
00246       #else
00247         goto ERR;
00248       #endif
00249     return pListener;
00250 ERR:
00251     delete pListener;
00252     pListener = NULL;
00253     return NULL;
00254 }
00255 #endif //ONLY_LOCAL_PROXY