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