|
Mixe for Privacy and Anonymity in the Internet
|
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
1.7.6.1