Mixe for Privacy and Anonymity in the Internet
CACmdLnOptions.hpp
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 
00029 #ifndef __CACMDLNOPTIONS__
00030 #define __CACMDLNOPTIONS__
00031 #include "CASocketAddrINet.hpp"
00032 #ifdef HAVE_UNIX_DOMAIN_PROTOCOL
00033   #include "CASocketAddrUnix.hpp"
00034 #endif
00035 #include "CASignature.hpp"
00036 #include "CASocket.hpp"
00037 #include "CAMultiSignature.hpp"
00038 #include "CACertificate.hpp"
00039 #include "CAThread.hpp"
00040 #include "CAMix.hpp"
00041 #include "CAListenerInterface.hpp"
00042 #include "CATargetInterface.hpp"
00043 #include "CAXMLBI.hpp"
00044 #include "CAXMLPriceCert.hpp"
00045 //#ifdef LOG_CRIME
00046   #include "tre/regex.h"
00047 //#endif
00048 
00049 #define REGEXP_BUFF_SIZE 4096
00050 
00051 
00052 // LERNGRUPPE moved this define from CACmdLnOptions.cpp
00053 #define DEFAULT_TARGET_PORT 6544
00054 #define DEFAULT_CONFIG_FILE "default.xml"
00055 #define MIN_INFOSERVICES 1
00056 // END LERNGRUPPE
00057 
00058 #define WITH_SUBTREE true
00059 #define WITHOUT_SUBTREE (!(WITHSUBTREE))
00060 
00061 
00062 /* General Option definitions */
00063 #define OPTIONS_NODE_GENERAL "General"
00064 
00065 #define OPTIONS_NODE_MIX_TYPE "MixType"
00066 #define OPTIONS_NODE_MIX_NAME "MixName"
00067 #define OPTIONS_NODE_MIX_ID "MixID"
00068 #define OPTIONS_NODE_DYNAMIC_MIX "Dynamic"
00069 #define OPTIONS_NODE_MIN_CASCADE_LENGTH "MinCascadeLength"
00070 #define OPTIONS_NODE_CASCADE_NAME "CascadeName"
00071 #define OPTIONS_NODE_USER_ID "UserID"
00072 #define OPTIONS_NODE_FD_NR "NrOfFileDescriptors"
00073 #define OPTIONS_NODE_DAEMON "Daemon"
00074 #define OPTIONS_NODE_MAX_USERS "MaxUsers"
00075 #define OPTIONS_NODE_PAYMENT_REMINDER "PaymentReminderProbability"
00076 #define OPTIONS_NODE_LOGGING "Logging"
00077 #define OPTIONS_NODE_LOGGING_CONSOLE "Console"
00078 #define OPTIONS_NODE_LOGGING_FILE "File"
00079 #define OPTIONS_ATTRIBUTE_LOGGING_MAXFILESIZE "MaxFileSize"
00080 #define OPTIONS_ATTRIBUTE_LOGGING_MAXFILES "MaxFiles"
00081 #define LOGGING_MAXFILES_DEFAULT 10
00082 #define OPTIONS_NODE_SYSLOG "Syslog"
00083 #define OPTIONS_NODE_ENCRYPTED_LOG "EncryptedLog"
00084 #define OPTIONS_NODE_LOGGING_KEYINFO "KeyInfo"
00085 #define OPTIONS_NODE_DESCRIPTION "Description"
00086 #define OPTIONS_ATTRIBUTE_NAME_FOR_CASCADE "forCascade"
00087 
00088 /* values for the operator OPTIONS_NODE_MIX_NAME */
00089 #define OPTIONS_VALUE_OPERATOR_NAME "Operator"
00090 #define OPTIONS_VALUE_MIX_NAME "Mix"
00091 #define OPTIONS_VALUE_NAMETYPE_DEFAULT OPTIONS_VALUE_MIX_NAME
00092 
00093 /* Certificate Option definitions */
00094 #define OPTIONS_NODE_CERTIFICATE_LIST "Certificates"
00095 
00096 #define OPTIONS_NODE_OWN_CERTIFICATE "OwnCertificate"
00097 #define OPTIONS_NODE_OWN_OPERATOR_CERTIFICATE "OperatorOwnCertificate"
00098 #define OPTIONS_NODE_NEXT_MIX_CERTIFICATE "NextMixCertificate"
00099 #define OPTIONS_NODE_NEXT_OPERATOR_CERTIFICATE "NextOperatorCertificate"
00100 #define OPTIONS_NODE_PREV_MIX_CERTIFICATE "PrevMixCertificate"
00101 #define OPTIONS_NODE_PREV_OPERATOR_CERTIFICATE "PrevOperatorCertificate"
00102 #define OPTIONS_NODE_TRUSTED_ROOT_CERTIFICATES "TrustedRootCertificates"
00103 #define OPTIONS_NODE_MIX_CERTIFICATE_VERIFICATION "MixCertificateVerification"
00104 #define OPTIONS_NODE_X509DATA "X509Data"
00105 #define OPTIONS_NODE_X509_CERTIFICATE "X509Certificate"
00106 #define OPTIONS_NODE_X509_PKCS12 "X509PKCS12"
00107 #define OPTIONS_NODE_SIGNATURE "Signature"
00108 
00109 
00110 /* Accounting Option definitions */
00111 #define OPTIONS_NODE_ACCOUNTING "Accounting"
00112 
00113 #define OPTIONS_NODE_PRICE_CERTIFICATE "PriceCertificate"
00114 #define OPTIONS_NODE_PAYMENT_INSTANCE CAXMLBI::getXMLElementName()
00115 #define OPTIONS_NODE_AI_SOFT_LIMIT "SoftLimit"
00116 #define OPTIONS_NODE_AI_HARD_LIMIT "HardLimit"
00117 #define OPTIONS_NODE_SETTLE_IVAL "SettleInterval"
00118 #define OPTIONS_NODE_PREPAID_IVAL "PrepaidInterval"
00119 #define OPTIONS_NODE_PREPAID_IVAL_KB "PrepaidIntervalKbytes"
00120 #define OPTIONS_NODE_AI_DB "Database"
00121 #define OPTIONS_NODE_AI_DB_HOST "Host"
00122 #define OPTIONS_NODE_AI_DB_PORT "Port"
00123 #define OPTIONS_NODE_AI_DB_NAME "DBName"
00124 #define OPTIONS_NODE_AI_DB_USER "Username"
00125 #define OPTIONS_NODE_AI_DB_PASSW "Password"
00126 
00127 #define OPTIONS_DEFAULT_PREPAID_IVAL 3000000 //3 MB as safe default if not explicitly set in config file
00128 
00129 #define OPTIONS_NODE_NETWORK "Network"
00130 
00131 #define OPTIONS_NODE_INFOSERVICE_LIST "InfoServices"
00132 #define OPTIONS_NODE_INFOSERVICE "InfoService"
00133 #define OPTIONS_NODE_ALLOW_AUTO_CONF "AllowAutoConfiguration"
00134 #define OPTIONS_NODE_LISTENER_INTERFACES CAListenerInterface::XML_ELEMENT_CONTAINER_NAME
00135 #define OPTIONS_NODE_NEXT_MIX "NextMix"
00136 #define OPTIONS_NODE_NETWORK_PROTOCOL "NetworkProtocol"
00137 #define OPTIONS_NODE_IP "IP"
00138 #define OPTIONS_NODE_PROXY_LIST "Proxies"
00139 #define OPTIONS_NODE_PROXY "Proxy"
00140 #define OPTIONS_NODE_PROXY_TYPE "ProxyType"
00141 #define OPTIONS_NODE_SERVER_MONITORING "ServerMonitoring"
00142 #define OPTIONS_NODE_VISIBLE_ADDRESS_LIST "VisibleAddresses"
00143 #define OPTIONS_NODE_VISIBLE_ADDRESS "VisibleAddress"
00144 #define OPTIONS_NODE_LISTENER_INTERFACE_LIST CAListenerInterface::XML_ELEMENT_CONTAINER_NAME
00145 #define OPTIONS_NODE_LISTENER_INTERFACE CAListenerInterface::XML_ELEMENT_NAME
00146 #define OPTIONS_NODE_KEEP_ALIVE "KeepAlive"
00147 #define OPTIONS_NODE_KEEP_ALIVE_SEND_IVAL "SendInterval"
00148 #define OPTIONS_NODE_KEEP_ALIVE_RECV_IVAL "ReceiveInterval"
00149 #define OPTIONS_NODE_IP "IP"
00150 #define OPTIONS_NODE_HOST "Host"
00151 #define OPTIONS_NODE_PORT "Port"
00152 #define OPTIONS_NODE_FILE "File"
00153 
00154 #define OPTIONS_NODE_RESSOURCES "Ressources"
00155 
00156 #define OPTIONS_NODE_UNLIMIT_TRAFFIC "UnlimitTraffic"
00157 #define OPTIONS_NODE_BYTES_PER_IVAL "BytesPerIntervall"
00158 #define OPTIONS_NODE_DELAY_IVAL "Intervall"
00159 #define OPTIONS_NODE_LATENCY "Latency"
00160 
00161 #define OPTIONS_NODE_TNCS_OPTS "TermsAndConditionsOptions"
00162 #define OPTIONS_NODE_TNCS_TEMPLATES "Templates"
00163 #define OPTIONS_NODE_TNCS_TEMPLATE "Template"
00164 #define OPTIONS_NODE_TNCS "TermsAndConditions"
00165 #define OPTIONS_NODE_TNCS_TRANSLATION "TCTranslation"
00166 #define OPTIONS_NODE_TNCS_TRANSLATION_IMPORTS "TCTranslationImports"
00167 #define OPTIONS_NODE_TNCS_OPERATOR "Operator"
00168 #define OPTIONS_ATTRIBUTE_TNC_DATE "date"
00169 #define OPTIONS_ATTRIBUTE_TNC_SERIAL "serial"
00170 #define OPTIONS_ATTRIBUTE_TNC_VERSION "version"
00171 #define OPTIONS_ATTRIBUTE_TNC_LOCALE "locale"
00172 #define OPTIONS_ATTRIBUTE_TNC_TEMPLATE_TYPE "type"
00173 #define OPTIONS_ATTRIBUTE_TNC_ID "id"
00174 #define OPTIONS_ATTRIBUTE_TNC_TEMPLATE_REFID "referenceId"
00175 #define OPTIONS_ATTRIBUTE_TNC_DEFAULT_LANG_DEFINED "default"
00176 #define OPTIONS_ATTRIBUTE_TNC_DEFAULT_LANG "defaultLang"
00177 
00178 #define OPTIONS_NODE_CRIME_DETECTION "CrimeDetection"
00179 
00180 #define OPTIONS_NODE_CRIME_REGEXP_URL "RegExpURL"
00181 #define OPTIONS_NODE_CRIME_REGEXP_PAYLOAD "RegExpPayload"
00182 #define OPTIONS_NODE_CRIME_SURVEILLANCE_IP "SurveillanceIP"
00183 #define OPTIONS_NODE_CRIME_SURVEILLANCE_ACCOUNT "PayAccountNumber"
00184 #define OPTIONS_ATTRIBUTE_LOG_PAYLOAD "logPayload"
00185 
00186 #define MIXINFO_NODE_PARENT "Mix"
00187 #define MIXINFO_NODE_MIX_NAME "Name"
00188 #define MIXINFO_NODE_SOFTWARE "Software"
00189 #define MIXINFO_NODE_VERSION "Version"
00190 
00191 #define MIXINFO_NODE_PAYMENTREMINDER "PaymentReminderProbability"
00192 
00193 #define MIXINFO_ATTRIBUTE_MIX_ID "id"
00194 
00195 #define LOG_NODE_NOT_FOUND(Nodename) \
00196   CAMsg::printMsg(LOG_CRIT,"No \"%s\" node found in configuration file!\n", (Nodename))
00197 
00198 #define LOG_NODE_EMPTY_OR_INVALID(Nodename) \
00199   CAMsg::printMsg(LOG_CRIT,"Node \"%s\" is empty or has invalid content!\n", (Nodename))
00200 
00201 #define LOG_NODE_WRONG_PARENT(Parentname, Childname) \
00202   CAMsg::printMsg(LOG_CRIT,"\"%s\" is the wrong parent for Node \"%s\"\n", (Parentname), (Childname))
00203 
00204 
00205 #define ASSERT_PARENT_NODE_NAME(Parentname, NameToMatch, Childname)   \
00206   if(!equals((Parentname), (NameToMatch) ))       \
00207   {                         \
00208     char *parentName = XMLString::transcode(Parentname); \
00209     LOG_NODE_WRONG_PARENT(parentName, Childname); \
00210     XMLString::release(&parentName);        \
00211     return E_UNKNOWN;               \
00212   }
00213 
00214 #define ASSERT_GENERAL_OPTIONS_PARENT(Parentname, Childname) \
00215   ASSERT_PARENT_NODE_NAME(Parentname, OPTIONS_NODE_GENERAL, Childname)
00216 
00217 #define ASSERT_CERTIFICATES_OPTIONS_PARENT(Parentname, Childname) \
00218   ASSERT_PARENT_NODE_NAME(Parentname, OPTIONS_NODE_CERTIFICATE_LIST, Childname)
00219 
00220 #define ASSERT_ACCOUNTING_OPTIONS_PARENT(Parentname, Childname) \
00221   ASSERT_PARENT_NODE_NAME(Parentname, OPTIONS_NODE_ACCOUNTING, Childname)
00222 
00223 #define ASSERT_NETWORK_OPTIONS_PARENT(Parentname, Childname) \
00224   ASSERT_PARENT_NODE_NAME(Parentname, OPTIONS_NODE_NETWORK, Childname)
00225 
00226 #define ASSERT_CRIME_DETECTION_OPTIONS_PARENT(Parentname, Childname) \
00227   ASSERT_PARENT_NODE_NAME(Parentname, OPTIONS_NODE_CRIME_DETECTION, Childname)
00228 
00229 THREAD_RETURN threadReConfigure(void *param);
00230 
00231 class CACmdLnOptions;
00232 typedef SINT32 (CACmdLnOptions::*optionSetter_pt)(DOMElement *);
00233 
00234 class CACmdLnOptions
00235 {
00236   public:
00237     CACmdLnOptions();
00238     ~CACmdLnOptions();
00239     SINT32 cleanup();
00240     void clean();
00241     SINT32 parse(int argc,const char** arg);
00242     SINT32 initLogging();
00243     bool getDaemon();
00244     //bool getProxySupport();
00245 
00246     SINT32 getMixId(UINT8* id,UINT32 len);
00247 
00248 
00249 //      UINT16 getServerPort();
00250     /*For IP (Host) AND Unix Domain Sockets*/
00251 //      SINT32 getServerHost(UINT8* path,UINT32 len);
00252 
00253 //      SINT32 getServerRTTPort();
00254     UINT16 getSOCKSServerPort();
00255 
00256 
00257     SINT32 createSockets(bool a_bPrintMessages, CASocket** a_sockets, UINT32 a_socketsLen);
00258     UINT32 getListenerInterfaceCount(){return m_cnListenerInterfaces;}
00259     CAListenerInterface* getListenerInterface(UINT32 nr)
00260     {
00261       if(nr>0&&nr<=m_cnListenerInterfaces&&m_arListenerInterfaces[nr-1]!=NULL)
00262         return new CAListenerInterface(*m_arListenerInterfaces[nr-1]);
00263       return NULL;
00264     };
00265 
00266     //this is only for the local proxy
00267     UINT16 getMixPort();
00268     SINT32 getMixHost(UINT8* host,UINT32 len);
00269 
00270     //if we have more than one Target (currently only Caches are possible...)
00271     UINT32 getTargetInterfaceCount(){return m_cnTargets;}
00272 
00285     SINT32 getTargetInterface(CATargetInterface& oTargetInterface, UINT32 nr)
00286     {
00287       if(nr>0&&nr<=m_cnTargets)
00288       {
00289         return m_arTargetInterfaces[nr-1].cloneInto(oTargetInterface);
00290       }
00291       else
00292         return E_UNKNOWN;
00293     };
00294 
00295 #ifndef ONLY_LOCAL_PROXY
00296     //for last Mixes: number of outside visible addresses
00297     UINT32 getVisibleAddressesCount(){return m_cnVisibleAddresses;}
00298 
00307     SINT32 getVisibleAddress(UINT8* strAddressBuff, UINT32 len,UINT32 nr);
00308 
00309     UINT16 getSOCKSPort();
00310     SINT32 getSOCKSHost(UINT8* host,UINT32 len);
00311     CAListenerInterface** getInfoServices(UINT32& r_size);
00312 #endif //ONLY_LOCAL_PROXY
00313 
00314     SINT32 getMaxOpenFiles()
00315     {
00316       return m_nrOfOpenFiles;
00317     }
00318 
00319 
00320 #ifndef ONLY_LOCAL_PROXY
00321     //TODO maybe clone MultiSignature object!
00322     CAMultiSignature* getMultiSigner(){ return m_pMultiSignature; }
00323     /*CASignature* getSignKey()
00324     {
00325       if(m_pSignKey!=NULL)
00326         return m_pSignKey->clone();
00327       return NULL;
00328     }*/
00332     /*CACertificate* getOwnCertificate() const
00333     {
00334       if(m_pOwnCertificate!=NULL)
00335       {
00336         return m_pOwnCertificate->clone();
00337       }
00338       return NULL;
00339     }*/
00343     /*CACertificate* getOpCertificate() const
00344     {
00345       if( m_OpCert != NULL )
00346       {
00347         return m_OpCert->clone();
00348       }
00349       return NULL;
00350     }*/
00351     SINT32 getOperatorSubjectKeyIdentifier(UINT8 *buffer, UINT32 *length);
00352 #ifdef PAYMENT
00353     CAXMLPriceCert* getPriceCertificate() const
00354     {
00355       if(m_pPriceCertificate != NULL)
00356       {
00357         return m_pPriceCertificate;
00358       }
00359       return NULL;
00360     }
00361 #endif
00362 
00363 #ifdef COUNTRY_STATS
00364     SINT32 getCountryStatsDBConnectionLoginData(char** db_host,char**db_user,char**db_passwd);
00365 #endif
00366     bool hasPrevMixTestCertificate()
00367     {
00368       return m_pPrevMixCertificate!=NULL;
00369     }
00370 
00371     CACertificate* getPrevMixTestCertificate()
00372     {
00373       if(m_pPrevMixCertificate!=NULL)
00374         return m_pPrevMixCertificate->clone();
00375       return NULL;
00376     }
00377 
00378     SINT32 setPrevMixTestCertificate(CACertificate* cert)
00379     {
00380       if(cert != NULL)
00381       {
00382         m_pPrevMixCertificate = cert->clone();
00383         return E_SUCCESS;
00384       }
00385             return E_UNKNOWN;
00386         }
00387 
00388     bool hasNextMixTestCertificate()
00389     {
00390       return m_pNextMixCertificate!=NULL;
00391     }
00392 
00393     CACertificate* getNextMixTestCertificate()
00394     {
00395       if(m_pNextMixCertificate!=NULL)
00396         return m_pNextMixCertificate->clone();
00397       return NULL;
00398     }
00399         
00400         SINT32 setNextMixTestCertificate(CACertificate* cert)
00401         {
00402             if(cert != NULL)
00403             {
00404                 m_pNextMixCertificate = cert->clone();
00405                 return E_SUCCESS;
00406             }
00407             return E_UNKNOWN;
00408         }
00409         CACertStore* getTrustedCertificateStore()
00410         {
00411             return m_pTrustedRootCertificates;
00412         }
00413 
00415     bool isEncryptedLogEnabled()
00416     {
00417       return m_bIsEncryptedLogEnabled;
00418     }
00419     bool isSyslogEnabled()
00420     {
00421       return m_bSyslog;
00422     }
00423 
00425     SINT32 enableEncryptedLog(bool b)
00426     {
00427       m_bIsEncryptedLogEnabled=b;
00428       return E_SUCCESS;
00429     }
00430 
00432     CACertificate* getLogEncryptionKey()
00433     {
00434       if(m_pLogEncryptionCertificate!=NULL)
00435         return m_pLogEncryptionCertificate->clone();
00436       return NULL;
00437     }
00438 
00439     DOMElement* getCascadeXML()
00440     {
00441       return m_pCascadeXML;
00442     }
00443 
00444     SINT32 getCascadeName(UINT8* name,UINT32 len) const;
00445 
00446     // added by ronin <ronin2@web.de>
00447     SINT32 setCascadeName(const UINT8* name)
00448     {
00449       delete[] m_strCascadeName;
00450       m_strCascadeName = new UINT8[strlen((const char*)name)+1];
00451       strcpy((char*)m_strCascadeName,(const char*)name);
00452       return E_SUCCESS;
00453     }
00454 
00455     SINT32 reread(CAMix* pMix);
00456 
00457 
00458     SINT32 getEncryptedLogDir(UINT8* name,UINT32 len);
00459 
00461     //SINT32 getMixXml(UINT8* strxml,UINT32* len);
00462     SINT32 getMixXml(XERCES_CPP_NAMESPACE::DOMDocument* & docMixInfo);
00463 
00464     UINT32 getNumberOfTermsAndConditionsTemplates();
00465     XERCES_CPP_NAMESPACE::DOMDocument **getAllTermsAndConditionsTemplates();
00466     XERCES_CPP_NAMESPACE::DOMElement *getTermsAndConditions();
00467 
00468     UINT32 getKeepAliveSendInterval()
00469     {
00470       return m_u32KeepAliveSendInterval;
00471     }
00472 
00473     UINT32 getKeepAliveRecvInterval()
00474     {
00475       return m_u32KeepAliveRecvInterval;
00476     }
00477     bool isInfoServiceEnabled()
00478     {
00479       return (m_addrInfoServicesSize>0);
00480     }
00481 #endif //ONLY_LOCAL_PROXY
00482     bool getCompressLogs()
00483     {
00484       return m_bCompressedLogs;
00485     }
00486     SINT32 getLogDir(UINT8* name,UINT32 len);
00487     SINT32 setLogDir(const UINT8* name,UINT32 len);
00488     SINT64 getMaxLogFileSize()
00489     {
00490       return m_maxLogFileSize;
00491     }
00492 
00493     UINT32 getMaxLogFiles()
00494     {
00495       return m_maxLogFiles;
00496     }
00497 
00498     SINT32 getUser(UINT8* user,UINT32 len);
00499     SINT32 getPidFile(UINT8* pidfile,UINT32 len);
00500 
00501 #ifdef SERVER_MONITORING
00502     char *getMonitoringListenerHost();
00503     UINT16 getMonitoringListenerPort();
00504 #endif /* SERVER_MONITORING */
00505 
00506     bool isLocalProxy();
00507     bool isFirstMix();
00508     bool isMiddleMix();
00509     bool isLastMix();
00510 
00511 
00512     bool isSock5sSupported()
00513     {
00514       return m_bSocksSupport;
00515     }
00516 
00517 
00518     bool getAutoReconnect()
00519     {
00520       return m_bAutoReconnect;
00521     }
00522 
00523 #ifdef LOG_CRIME
00524     regex_t* getCrimeRegExpsURL(UINT32* len)
00525     {
00526       *len=m_nCrimeRegExpsURL;
00527       return m_arCrimeRegExpsURL;
00528     }
00529 
00530     regex_t* getCrimeRegExpsPayload(UINT32* len)
00531     {
00532       *len=m_nCrimeRegExpsPayload;
00533       return m_arCrimeRegExpsPayload;
00534     }
00535 
00536     UINT64* getCrimeSurveillanceAccounts()
00537     {
00538       return m_surveillanceAccounts;
00539     }
00540 
00541     UINT32 getNrOfCrimeSurveillanceAccounts()
00542     {
00543       return m_nrOfSurveillanceAccounts;
00544     }
00545     
00546     
00547     CASocketAddrINet* getCrimeSurveillanceIPs()
00548     {
00549       return m_surveillanceIPs;
00550     }
00551 
00552     UINT32 getNrOfCrimeSurveillanceIPs()
00553     {
00554       return m_nrOfSurveillanceIPs;
00555     }
00556 
00557     bool isPayloadLogged()
00558     {
00559       return m_logPayload;
00560     }
00561 #endif
00562 
00563 #if defined(DELAY_CHANNELS)||defined(DELAY_USERS)
00564     UINT32 getDelayChannelUnlimitTraffic()
00565     {
00566       return m_u32DelayChannelUnlimitTraffic;
00567     }
00568     UINT32 getDelayChannelBucketGrow()
00569     {
00570       return m_u32DelayChannelBucketGrow;
00571     }
00572     UINT32 getDelayChannelBucketGrowIntervall()
00573     {
00574       return m_u32DelayChannelBucketGrowIntervall;
00575     }
00576 #endif
00577 
00578 #if defined(DELAY_CHANNELS_LATENCY)
00579 
00580     UINT32 getDelayChannelLatency()
00581     {
00582       return m_u32DelayChannelLatency;
00583     }
00584 #endif
00585 
00586 
00587 #ifdef PAYMENT
00588     // accounting database
00589     SINT32 getDatabaseHost(UINT8 * host, UINT32 len);
00590     UINT16 getDatabasePort();
00591     SINT32 getDatabaseName(UINT8 * name, UINT32 len);
00592     SINT32 getDatabaseUsername(UINT8 * user, UINT32 len);
00593     SINT32 getDatabasePassword(UINT8 * pass, UINT32 len);
00594     SINT32 getAiID(UINT8 * id, UINT32 len);
00595     CAXMLBI* getBI();
00596     UINT32 getPaymentHardLimit();
00597     UINT32 getPaymentSoftLimit();
00598     UINT32 getPrepaidInterval();
00599     UINT32 getPaymentSettleInterval();
00600 #endif
00601 
00602 #ifdef DATA_RETENTION_LOG
00603     SINT32 getDataRetentionLogDir(UINT8* strLogDir,UINT32 len);
00604     SINT32 getDataRetentionPublicEncryptionKey(CAASymCipher** pKey)
00605     {
00606       *pKey=m_pDataRetentionPublicEncryptionKey;
00607       return E_SUCCESS;
00608     }
00609 #endif
00610 
00611 #ifdef EXPORT_ASYM_PRIVATE_KEY
00612     SINT32 getEncryptionKeyImportFile(const UINT8* strFile,UINT32 len)
00613       {
00614         if(m_strImportKeyFile==NULL)
00615           return E_UNKNOWN;
00616         if(len<=(UINT32)strlen((char*)m_strImportKeyFile))
00617           {
00618             return E_SPACE;
00619           }
00620         strcpy((char*)strFile,(char*)m_strImportKeyFile);
00621         return E_SUCCESS;
00622       }
00623     SINT32 getEncryptionKeyExportFile(const UINT8* strFile,UINT32 len)
00624       {
00625         if(m_strExportKeyFile==NULL)
00626           return E_UNKNOWN;
00627         if(len<=(UINT32)strlen((char*)m_strExportKeyFile))
00628           {
00629             return E_SPACE;
00630           }
00631         strcpy((char*)strFile,(char*)m_strExportKeyFile);
00632         return E_SUCCESS;
00633       }
00634     bool isImportKey()
00635       {
00636         return m_strImportKeyFile!=NULL;
00637       }
00638     bool isExportKey()
00639       {
00640         return m_strExportKeyFile!=NULL;
00641       }
00642 #endif
00643 
00644 
00645 #ifndef ONLY_LOCAL_PROXY
00646     // added by ronin <ronin2@web.de>
00647     // needed for autoconfiguration
00648     SINT32 setNextMix(XERCES_CPP_NAMESPACE::DOMDocument* pDoc);
00649     SINT32 setPrevMix(XERCES_CPP_NAMESPACE::DOMDocument* pDoc);
00650     bool acceptReconfiguration() { return m_bAcceptReconfiguration; }
00651 
00652     friend THREAD_RETURN threadReConfigure(void *param);
00653 
00655     static SINT32 createMixOnCDConfiguration(const UINT8* strFileName);
00656     static SINT32 saveToFile(XERCES_CPP_NAMESPACE::DOMDocument* a_doc, const UINT8* a_strFileName);
00657     UINT32 getMaxNrOfUsers()
00658     {
00659       return m_maxNrOfUsers;
00660     }
00661 
00662 #ifdef DYNAMIC_MIX
00663     /* LERNGRUPPE (refactoring + new) */
00664     //SINT32 createMixOnCDConfiguration(const UINT8* strFileName);
00665     SINT32 createDefaultConfiguration();
00666     SINT32 addListenerInterface(DOM_Element a_elem);
00667     SINT32 resetNetworkConfiguration();
00668     SINT32 getRandomInfoService(CASocketAddrINet *&r_address);
00669     bool isDynamic() { return m_bDynamic; }
00670     SINT32 changeMixType(CAMix::tMixType a_newMixType);
00671     SINT32 resetNextMix();
00672     SINT32 resetPrevMix();
00673     SINT32 setCascadeProposal(UINT8* a_strCascadeProposal, UINT32 a_len)
00674     {
00675       if(m_strLastCascadeProposal != NULL)
00676       {
00677         delete m_strLastCascadeProposal;
00678         m_strLastCascadeProposal = NULL;
00679       }
00680       if(a_strCascadeProposal == NULL)
00681         return E_SUCCESS;
00682       m_strLastCascadeProposal = new UINT8[ a_len + 1 ];
00683       memcpy(m_strLastCascadeProposal, a_strCascadeProposal, a_len+1);
00684       return E_SUCCESS;
00685     }
00686     SINT32 getLastCascadeProposal(UINT8* r_strCascadeProposal, UINT32 r_len)
00687     {
00688       if(m_strLastCascadeProposal == NULL)
00689       {
00690         return E_UNKNOWN;
00691       }
00692       if(r_len >= strlen((char*)m_strLastCascadeProposal))
00693       {
00694         r_len = strlen((char*)m_strLastCascadeProposal);
00695         memcpy(r_strCascadeProposal, m_strLastCascadeProposal, r_len + 1);
00696         return E_SUCCESS;
00697       }
00698       return E_UNKNOWN;
00699     }
00700 #endif // DYNAMIC_MIX
00701     XERCES_CPP_NAMESPACE::DOMDocument **m_termsAndConditionsTemplates;
00702     UINT32 m_nrOfTermsAndConditionsTemplates;
00703         bool verifyMixCertificates() {return m_bVerifyMixCerts;}
00704   private:
00705 #ifdef DYNAMIC_MIX
00706     UINT8* m_strLastCascadeProposal;
00707     UINT32 getRandom(UINT32 a_max);
00708     SINT32 checkInfoServices(UINT32 *r_runningInfoServices);
00709     SINT32 checkMixId();
00710     SINT32 checkListenerInterfaces();
00711     SINT32 checkCertificates();
00712 #endif //DYNAMIC_MIX
00713     bool m_bDynamic;
00714     SINT32 parseInfoServices(DOMElement* a_infoServiceNode);
00715     /* END LERNGRUPPE */
00716     static SINT32 buildDefaultConfig(XERCES_CPP_NAMESPACE::DOMDocument* a_doc,bool bForLastMix);
00717 #endif //only_LOCAL_PROXY
00718     UINT8*  m_strConfigFile; //the filename of the config file
00719     bool    m_bDaemon;
00720     UINT16  m_iSOCKSServerPort;
00721     UINT16  m_iTargetPort; //only for the local proxy...
00722     char*   m_strTargetHost; //only for the local proxy...
00723     char*   m_strSOCKSHost;
00724     UINT16  m_iSOCKSPort;
00725 #ifndef ONLY_LOCAL_PROXY
00726     bool    m_bIsRunReConfigure; //true, if an async reconfigure is under way
00727     CAMutex* m_pcsReConfigure; //Ensures that reconfigure is running only once at the same time;
00728     CAThread m_threadReConfigure; //Thread, that does the actual reconfigure work
00729     CAListenerInterface** m_addrInfoServices;
00730     UINT32 m_addrInfoServicesSize;
00731 
00732     //CASignature*    m_pSignKey;
00733     //CACertificate*    m_pOwnCertificate;
00734     CAMultiSignature*   m_pMultiSignature;
00735     //CACertificate**   m_ownCerts;
00736     //UINT32        m_ownCertsLength;
00737 #ifdef PAYMENT
00738     CAXMLPriceCert*   m_pPriceCertificate;
00739 #endif
00740 
00741     CACertificate*    m_OpCert;
00742     //CACertificate**   m_opCerts;
00743     //UINT32        m_opCertsLength;
00744     DOMNodeList*    m_opCertList;
00745 
00746     /* for mix certificate verification */
00747     bool        m_bVerifyMixCerts;
00748     CACertStore*    m_pTrustedRootCertificates;
00749 
00750     CACertificate*  m_pPrevMixCertificate;
00751     CACertificate*  m_pNextMixCertificate;
00752     CACertificate*  m_pLogEncryptionCertificate;
00753 
00754     UINT32  m_maxNrOfUsers;
00755     
00756     SINT32  m_PaymentReminderProbability;
00757 
00758     // added by ronin <ronin2@web.de>
00759     DOMElement* m_pCascadeXML;
00760     bool m_bAcceptReconfiguration;
00761     XERCES_CPP_NAMESPACE::DOMDocument* m_docMixInfo;
00762     XERCES_CPP_NAMESPACE::DOMDocument* m_docMixXml;
00763     XERCES_CPP_NAMESPACE::DOMDocument* m_docOpTnCs;
00764 
00765     UINT32 m_u32KeepAliveSendInterval;
00766     UINT32 m_u32KeepAliveRecvInterval;
00767 
00768     bool m_perfTestEnabled;
00769 #endif //ONLY_LOCAL_PROXY
00770 
00771     bool    m_bLocalProxy,m_bFirstMix,m_bMiddleMix,m_bLastMix;
00772     bool    m_bAutoReconnect; //auto reconnect if connection to first mix lost ??
00773     UINT8*  m_strCascadeName;
00774     char*   m_strLogDir;
00775     char*     m_strLogLevel;
00776     SINT64  m_maxLogFileSize;
00777     UINT32  m_maxLogFiles; //how many log files can be created before starting again with the first one
00778     char*   m_strEncryptedLogDir;
00779     bool    m_bCompressedLogs;
00780     bool    m_bSocksSupport;
00781     bool    m_bSyslog;
00782     bool    m_bLogConsole;
00783     char*   m_strUser;
00784     char*   m_strPidFile;
00785     SINT32  m_nrOfOpenFiles; //How many open files (sockets) should we use
00786 
00787     //char*   m_strMixXml;
00788     char*   m_strMixID;
00789     char*   m_strMixName;
00790 
00791     bool m_bIsEncryptedLogEnabled;
00792 
00793     CATargetInterface*    m_arTargetInterfaces;
00794     UINT32                m_cnTargets;
00795     CAListenerInterface** m_arListenerInterfaces;
00796     UINT32                m_cnListenerInterfaces;
00797     UINT8**               m_arStrVisibleAddresses;
00798     UINT32                m_cnVisibleAddresses;
00799 
00800 
00801 #ifdef LOG_CRIME
00802     bool m_logPayload;
00803     regex_t* m_arCrimeRegExpsURL;
00804     UINT32 m_nCrimeRegExpsURL;
00805     regex_t* m_arCrimeRegExpsPayload;
00806     UINT32 m_nCrimeRegExpsPayload;
00807     UINT32 m_nrOfSurveillanceIPs;
00808     CASocketAddrINet* m_surveillanceIPs;
00809     UINT64* m_surveillanceAccounts;
00810     UINT32 m_nrOfSurveillanceAccounts;
00811     /* Crime Logging Options */
00812     #define CRIME_DETECTION_OPTIONS_NR 4
00813     optionSetter_pt *crimeDetectionOptionSetters;
00814     SINT32 setCrimeURLRegExp(DOMElement *elemCrimeDetection);
00815     SINT32 setCrimePayloadRegExp(DOMElement *elemCrimeDetection);
00816     SINT32 setCrimeSurveillanceIP(DOMElement *elemCrimeDetection);
00817     SINT32 setCrimeSurveillanceAccounts(DOMElement *elemCrimeDetection);
00818     void initCrimeDetectionOptionSetters();
00819     SINT32 setCrimeDetectionOptions(DOMElement *elemRoot);
00820 #endif
00821 
00822 #ifdef DATA_RETENTION_LOG
00823     UINT8*        m_strDataRetentionLogDir;
00824     CAASymCipher* m_pDataRetentionPublicEncryptionKey;
00825 #endif
00826 
00827 #ifdef EXPORT_ASYM_PRIVATE_KEY
00828     UINT8* m_strImportKeyFile;
00829     UINT8* m_strExportKeyFile;
00830 #endif
00831 
00832 
00833 #if defined (DELAY_CHANNELS) ||defined(DELAY_USERS)
00834     UINT32 m_u32DelayChannelUnlimitTraffic;
00835     UINT32 m_u32DelayChannelBucketGrow;
00836     UINT32 m_u32DelayChannelBucketGrowIntervall;
00837 #endif
00838 
00839 #if defined (DELAY_CHANNELS_LATENCY)
00840     UINT32 m_u32DelayChannelLatency;
00841 #endif
00842 
00843 #ifdef PAYMENT
00844     // added by Bastian Voigt:
00845     // getter functions for the payment config options
00846   private:
00847     CAXMLBI * m_pBI;
00848     UINT8 * m_strDatabaseHost;
00849     UINT8 * m_strDatabaseName;
00850     UINT8 * m_strDatabaseUser;
00851     UINT8 * m_strDatabasePassword;
00852     UINT8* m_strAiID;
00853     UINT16 m_iDatabasePort;
00854     UINT32 m_iPaymentHardLimit;
00855     UINT32 m_iPaymentSoftLimit;
00856     UINT32 m_iPrepaidInterval;
00857     UINT32 m_iPaymentSettleInterval;
00858     optionSetter_pt *accountingOptionSetters;
00859 #endif
00860     optionSetter_pt *mainOptionSetters;
00861     optionSetter_pt *generalOptionSetters;
00862     optionSetter_pt *certificateOptionSetters;
00863     optionSetter_pt *networkOptionSetters;
00864     optionSetter_pt *termsAndConditionsOptionSetters;
00865 
00866 #ifdef SERVER_MONITORING
00867   private:
00868     char *m_strMonitoringListenerHost;
00869     UINT16 m_iMonitoringListenerPort;
00870 #endif
00871 
00872   private:
00873     SINT32 setNewValues(CACmdLnOptions& newOptions);
00874 #ifndef ONLY_LOCAL_PROXY
00875     SINT32 readXmlConfiguration(XERCES_CPP_NAMESPACE::DOMDocument* & docConfig,const UINT8* const configFileName);
00876     SINT32 readXmlConfiguration(XERCES_CPP_NAMESPACE::DOMDocument* & docConfig,const UINT8* const buf, UINT32 len);
00877     SINT32 processXmlConfiguration(XERCES_CPP_NAMESPACE::DOMDocument* docConfig);
00878     SINT32 clearVisibleAddresses();
00879     SINT32 addVisibleAddresses(DOMNode* nodeProxy);
00880 #ifdef COUNTRY_STATS
00881     char* m_dbCountryStatsHost;
00882     char* m_dbCountryStatsUser;
00883     char* m_dbCountryStatsPasswd;
00884 #endif //COUNTRY_STATS
00885 #endif //ONLY_LOCAL_PROXY
00886     SINT32 clearTargetInterfaces();
00887     SINT32 clearListenerInterfaces();
00888 
00889 
00890 
00891     /* NR of all Option types, i.e. General, Certificates, Networking, etc. (excluding *mainOptionSetters)
00892      * these options are all direct children of <MixConfiguration>*/
00893 #define MAIN_OPTION_SETTERS_NR 8
00894     SINT32 setGeneralOptions(DOMElement* elemRoot);
00895     SINT32 setMixDescription(DOMElement* elemRoot); /* mix decription for the mix info */
00896     SINT32 setCertificateOptions(DOMElement* elemRoot);
00897     SINT32 setNetworkOptions(DOMElement *elemRoot);
00898     SINT32 setRessourceOptions(DOMElement *elemRoot);
00899     SINT32 setTermsAndConditions(DOMElement *elemRoot);
00900 
00901     /* General Options */
00902 #define GENERAL_OPTIONS_NR 12
00903     SINT32 setMixType(DOMElement* elemGeneral);
00904     SINT32 setMixName(DOMElement* elemGeneral);
00905     SINT32 setMixID(DOMElement* elemGeneral);
00906     SINT32 setDynamicMix(DOMElement* elemGeneral);
00907     SINT32 setMinCascadeLength(DOMElement* elemGeneral);
00908     SINT32 setCascadeNameFromOptions(DOMElement* elemGeneral);
00909     SINT32 setUserID(DOMElement* elemGeneral);
00910     SINT32 setNrOfFileDescriptors(DOMElement* elemGeneral);
00911     SINT32 setDaemonMode(DOMElement* elemGeneral);
00912     SINT32 setMaxUsers(DOMElement* elemGeneral);
00913     SINT32 setLoggingOptions(DOMElement* elemGeneral);
00914     SINT32 setPaymentReminder(DOMElement* elemGeneral);
00915 
00916     /* Certificate Options */
00917 #define MAX_CERTIFICATE_OPTIONS_NR 6
00918     UINT32 m_nCertificateOptionsSetters;
00919     SINT32 setOwnCertificate(DOMElement *elemCertificates);
00920     SINT32 setOwnOperatorCertificate(DOMElement *elemCertificates);
00921     SINT32 setMixCertificateVerification(DOMElement *elemCertificates);
00922     SINT32 setNextMixCertificate(DOMElement *elemCertificates);
00923     SINT32 setPrevMixCertificate(DOMElement *elemCertificates);
00924     SINT32 setTrustedRootCertificates(DOMElement *elemCertificates);
00925 
00926 #ifdef PAYMENT
00927     /* Payment Options */
00928 #define ACCOUNTING_OPTIONS_NR 7
00929     SINT32 setPriceCertificate(DOMElement *elemAccounting);
00930     SINT32 setPaymentInstance(DOMElement *elemAccounting);
00931     SINT32 setAccountingSoftLimit(DOMElement *elemAccounting);
00932     SINT32 setAccountingHardLimit(DOMElement *elemAccounting);
00933     SINT32 setPrepaidInterval(DOMElement *elemAccounting);
00934     SINT32 setSettleInterval(DOMElement *elemAccounting);
00935     SINT32 setAccountingDatabase(DOMElement *elemAccounting);
00936     void initAccountingOptionSetters();
00937     SINT32 setAccountingOptions(DOMElement *elemRoot);
00938 #endif
00939     /* Network Options */
00940 #define NETWORK_OPTIONS_NR 5
00941     SINT32 setInfoServices(DOMElement *elemNetwork);
00942     SINT32 setListenerInterfaces(DOMElement *elemNetwork);
00943     SINT32 setTargetInterfaces(DOMElement *elemNetwork);
00944     SINT32 setServerMonitoring(DOMElement *elemNetwork);
00945     SINT32 setKeepAliveTraffic(DOMElement *elemNetwork);
00946 
00947     /* Terms & Conditions options */
00948 #define TERMS_AND_CONDITIONS_OPTIONS_NR 2
00949     SINT32 setTermsAndConditionsTemplates(DOMElement *elemTnCs);
00950     SINT32 setTermsAndConditionsList(DOMElement *elemTnCs);
00951 
00952 
00953     SINT32 appendMixInfo_internal(DOMNode* a_node, bool with_subtree);
00954     inline SINT32 addMixIdToMixInfo();
00955 
00956     SINT32 invokeOptionSetters(const optionSetter_pt *optionsSetters, DOMElement* target, SINT32 optionsSettersLength);
00957 
00958     void initMainOptionSetters();
00959     void initGeneralOptionSetters();
00960     void initMixDescriptionSetters();
00961     void initCertificateOptionSetters();
00962     void initNetworkOptionSetters();
00963     void initTermsAndConditionsOptionSetters();
00964 };
00965 
00966 SINT32 setRegExpressions(DOMElement *rootElement, const char* const childElementName,
00967     regex_t **regExContainer, UINT32* regExNr);
00968 
00969 #endif
00970