Mixe for Privacy and Anonymity in the Internet
CAXMLBI.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 #if !defined(ONLY_LOCAL_PROXY) && defined (PAYMENT)
00030 #include "CAXMLBI.hpp"
00031 #include "CAMsg.hpp"
00032 
00033 const char* const CAXMLBI::ms_pXmlElemName="PaymentInstance";
00034 
00035 CAXMLBI::CAXMLBI() : CAAbstractXMLEncodable()
00036   {
00037     m_pVeryfire = NULL;
00038     m_pBiID = NULL;
00039     m_pHostName = NULL;
00040     m_pCert = NULL;
00041   }
00042 
00043 CAXMLBI* CAXMLBI::getInstance(const UINT8 * biID, const UINT8 * hostName, const int portNumber, CACertificate * pCert)
00044   {
00045     if(biID==NULL||hostName==NULL)
00046       {
00047         return NULL;
00048       }
00049     CAXMLBI* pBI = new CAXMLBI();   
00050     if(pCert!=NULL)
00051       {
00052         pBI->m_pCert = pCert->clone();
00053       }
00054     pBI->m_pBiID = new UINT8[strlen((char*)biID)+1];
00055     strcpy((char*)pBI->m_pBiID, (char*)biID);
00056     memset(pBI->m_pBiID, 0, (strlen((char*)biID)+1));
00057     pBI->m_pHostName = new UINT8[strlen((char*)hostName)+1];
00058     strcpy((char*)pBI->m_pHostName, (char*)hostName);
00059     pBI->m_iPortNumber = portNumber;
00060     pBI->m_pVeryfire = NULL;
00061     return pBI;
00062   }
00063 
00064 CAXMLBI* CAXMLBI::getInstance(DOMElement* elemRoot)
00065   {
00066     if (elemRoot == NULL)
00067       {
00068         return NULL;
00069       }
00070     CAXMLBI* pPI = new CAXMLBI();
00071     if(pPI->setValues(elemRoot)!=E_SUCCESS)
00072       {
00073         delete pPI;
00074         return NULL;
00075       }
00076     return pPI;
00077   }
00078 
00079 CAXMLBI::~CAXMLBI()
00080   {
00081     delete m_pCert;
00082     m_pCert = NULL;
00083     
00084     delete m_pVeryfire;
00085     m_pVeryfire = NULL;
00086 
00087     delete[] m_pBiID;
00088     m_pBiID = NULL;
00089     
00090     delete m_pHostName;
00091     m_pHostName = NULL;
00092   }
00093 
00094 SINT32 CAXMLBI::setValues(DOMElement* elemRoot)
00095   {
00096     DOMElement* elem=NULL;
00097     UINT8 strGeneral[256];
00098     UINT32 strGeneralLen = 255;
00099     
00100     if(!equals(elemRoot->getTagName(),CAXMLBI::getXMLElementName()))
00101     {
00102       return E_UNKNOWN;
00103     }
00104     
00105     //Parse ID
00106     if(getDOMElementAttribute(elemRoot, "id", strGeneral, &strGeneralLen)==E_SUCCESS)
00107       {
00108         m_pBiID = new UINT8[strGeneralLen+1];
00109         memset(m_pBiID, 0, (strGeneralLen+1));
00110         memcpy(m_pBiID,strGeneral,strGeneralLen);
00111       }
00112     else 
00113       {
00114         return E_UNKNOWN;
00115       }
00116     
00117     //Parse PI Certificate
00118     DOMElement* elemCert=NULL;
00119     getDOMChildByName(elemRoot, "Certificate", elem, false);
00120     getDOMChildByName(elem, "X509Certificate", elemCert, false);
00121     CACertificate *pPICert = CACertificate::decode(elemCert, CERT_X509CERTIFICATE, NULL);
00122     if (pPICert != NULL)
00123     {
00124       m_pCert = pPICert;
00125     }
00126     else
00127     {
00128       CAMsg::printMsg(LOG_CRIT,"No certificate for payment instance available!\n");
00129       return E_UNKNOWN;
00130     }
00131       
00132     //Parse PI Host
00133     DOMElement* elemNet=NULL;
00134     DOMElement* elemListeners=NULL;
00135     DOMElement* elemListener=NULL;
00136     DOMElement* elemHost=NULL;
00137     DOMElement* elemPort=NULL;
00138     getDOMChildByName(elemRoot, "Network", elemNet, false);
00139     getDOMChildByName(elemNet, "ListenerInterfaces", elemListeners, false);
00140     getDOMChildByName(elemListeners, "ListenerInterface", elemListener, false);
00141     getDOMChildByName(elemListener, "Host", elemHost, false);
00142     getDOMChildByName(elemListener, "Port", elemPort, false);
00143     strGeneralLen=255;
00144     //Parse PI Host and Port
00145     if( getDOMElementValue(elemHost, strGeneral, &strGeneralLen)!=E_SUCCESS||
00146         getDOMElementValue(elemPort, &m_iPortNumber)!=E_SUCCESS)
00147       {
00148         delete [] m_pBiID;
00149         m_pBiID=NULL;
00150         delete m_pCert;
00151         m_pCert=NULL;
00152         return E_UNKNOWN;
00153       }
00154     m_pHostName = new UINT8[strGeneralLen+1];
00155     strcpy((char*)m_pHostName, (char*)strGeneral);
00156     return E_SUCCESS;
00157   }
00158   
00159 SINT32 CAXMLBI::toXmlElement(XERCES_CPP_NAMESPACE::DOMDocument *a_doc, DOMElement* & elemRoot)
00160   {
00161     elemRoot = createDOMElement(a_doc,getXMLElementName());
00162     setDOMElementAttribute(elemRoot, "id", m_pBiID);
00163     
00164     //Set network settings
00165     DOMElement* elemNet = createDOMElement(a_doc,"Network");
00166     elemRoot->appendChild(elemNet);
00167     DOMElement* elemListeners = createDOMElement(a_doc,"ListenerInterfaces");
00168     elemNet->appendChild(elemListeners);  
00169     DOMElement* elemListener = createDOMElement(a_doc,"ListenerInterface");
00170     elemListeners->appendChild(elemListener);
00171     //Set Hostname
00172     DOMElement* elemHost = createDOMElement(a_doc,"Host");
00173     elemListener->appendChild(elemHost);
00174     setDOMElementValue(elemHost, m_pHostName);
00175     //Set Port
00176     DOMElement* elemPort = createDOMElement(a_doc,"Port");
00177     elemListener->appendChild(elemPort);
00178     setDOMElementValue(elemPort, m_iPortNumber);
00179     //Set Cert
00180     if(m_pCert!=NULL)
00181     {
00182       DOMElement* elemCert = createDOMElement(a_doc,"Certificate");
00183       elemRoot->appendChild(elemCert);
00184       
00185       DOMElement* tmpElem=NULL;
00186       m_pCert->encode(tmpElem, a_doc);
00187       elemCert->appendChild(tmpElem);
00188     }
00189     
00190     return E_SUCCESS;
00191   }
00192 #endif //ONLY_LOCAL_PROXY