00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
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 "CAXMLBI.hpp"
00043 #include "CAXMLPriceCert.hpp"
00044
00045 #include "tre/regex.h"
00046
00047
00048 #define REGEXP_BUFF_SIZE 4096
00049
00050 #define TARGET_MIX 1
00051 #define TARGET_HTTP_PROXY 2
00052 #define TARGET_SOCKS_PROXY 3
00053
00054
00055 #define DEFAULT_TARGET_PORT 6544
00056 #define DEFAULT_CONFIG_FILE "default.xml"
00057 #define MIN_INFOSERVICES 1
00058
00059
00060 #define WITH_SUBTREE true
00061 #define WITHOUT_SUBTREE (!(WITHSUBTREE))
00062
00063
00064
00065 #define OPTIONS_NODE_GENERAL "General"
00066
00067 #define OPTIONS_NODE_MIX_TYPE "MixType"
00068 #define OPTIONS_NODE_MIX_NAME "MixName"
00069 #define OPTIONS_NODE_MIX_ID "MixID"
00070 #define OPTIONS_NODE_DYNAMIC_MIX "Dynamic"
00071 #define OPTIONS_NODE_MIN_CASCADE_LENGTH "MinCascadeLength"
00072 #define OPTIONS_NODE_CASCADE_NAME "CascadeName"
00073 #define OPTIONS_NODE_USER_ID "UserID"
00074 #define OPTIONS_NODE_FD_NR "NrOfFileDescriptors"
00075 #define OPTIONS_NODE_DAEMON "Daemon"
00076 #define OPTIONS_NODE_MAX_USERS "MaxUsers"
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
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
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
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_ACCOUNT "PayAccountNumber"
00185 #define OPTIONS_ATTRIBUTE_LOG_PAYLOAD "logPayload"
00186
00187 #define MIXINFO_NODE_PARENT "Mix"
00188 #define MIXINFO_NODE_MIX_NAME "Name"
00189 #define MIXINFO_NODE_SOFTWARE "Software"
00190 #define MIXINFO_NODE_VERSION "Version"
00191
00192 #define MIXINFO_ATTRIBUTE_MIX_ID "id"
00193
00194 #define LOG_NODE_NOT_FOUND(Nodename) \
00195 CAMsg::printMsg(LOG_CRIT,"No \"%s\" node found in configuration file!\n", (Nodename))
00196
00197 #define LOG_NODE_EMPTY_OR_INVALID(Nodename) \
00198 CAMsg::printMsg(LOG_CRIT,"Node \"%s\" is empty or has invalid content!\n", (Nodename))
00199
00200 #define LOG_NODE_WRONG_PARENT(Parentname, Childname) \
00201 CAMsg::printMsg(LOG_CRIT,"\"%s\" is the wrong parent for Node \"%s\"\n", (Parentname), (Childname))
00202
00203
00204 #define ASSERT_PARENT_NODE_NAME(Parentname, NameToMatch, Childname) \
00205 if(!equals((Parentname), (NameToMatch) )) \
00206 { \
00207 char *parentName = XMLString::transcode(Parentname); \
00208 LOG_NODE_WRONG_PARENT(parentName, Childname); \
00209 XMLString::release(&parentName); \
00210 return E_UNKNOWN; \
00211 }
00212
00213 #define ASSERT_GENERAL_OPTIONS_PARENT(Parentname, Childname) \
00214 ASSERT_PARENT_NODE_NAME(Parentname, OPTIONS_NODE_GENERAL, Childname)
00215
00216 #define ASSERT_CERTIFICATES_OPTIONS_PARENT(Parentname, Childname) \
00217 ASSERT_PARENT_NODE_NAME(Parentname, OPTIONS_NODE_CERTIFICATE_LIST, Childname)
00218
00219 #define ASSERT_ACCOUNTING_OPTIONS_PARENT(Parentname, Childname) \
00220 ASSERT_PARENT_NODE_NAME(Parentname, OPTIONS_NODE_ACCOUNTING, Childname)
00221
00222 #define ASSERT_NETWORK_OPTIONS_PARENT(Parentname, Childname) \
00223 ASSERT_PARENT_NODE_NAME(Parentname, OPTIONS_NODE_NETWORK, Childname)
00224
00225 #define ASSERT_CRIME_DETECTION_OPTIONS_PARENT(Parentname, Childname) \
00226 ASSERT_PARENT_NODE_NAME(Parentname, OPTIONS_NODE_CRIME_DETECTION, Childname)
00227
00228 struct t_TargetInterface
00229 {
00230 UINT32 target_type;
00231 NetworkType net_type;
00232 CASocketAddr* addr;
00233 };
00234
00235 typedef struct t_TargetInterface TargetInterface;
00236
00237 THREAD_RETURN threadReConfigure(void *param);
00238
00239 class CACmdLnOptions;
00240 typedef SINT32 (CACmdLnOptions::*optionSetter_pt)(DOMElement *);
00241
00242 class CACmdLnOptions
00243 {
00244 public:
00245 CACmdLnOptions();
00246 ~CACmdLnOptions();
00247 SINT32 cleanup();
00248 void clean();
00249 SINT32 parse(int argc,const char** arg);
00250 SINT32 initLogging();
00251 bool getDaemon();
00252
00253
00254 SINT32 getMixId(UINT8* id,UINT32 len);
00255
00256
00257
00258
00259
00260
00261
00262 UINT16 getSOCKSServerPort();
00263
00264
00265 SINT32 createSockets(bool a_bPrintMessages, CASocket** a_sockets, UINT32 a_socketsLen);
00266 UINT32 getListenerInterfaceCount(){return m_cnListenerInterfaces;}
00267 CAListenerInterface* getListenerInterface(UINT32 nr)
00268 {
00269 if(nr>0&&nr<=m_cnListenerInterfaces&&m_arListenerInterfaces[nr-1]!=NULL)
00270 return new CAListenerInterface(*m_arListenerInterfaces[nr-1]);
00271 return NULL;
00272 };
00273
00274
00275 UINT16 getMixPort();
00276 SINT32 getMixHost(UINT8* host,UINT32 len);
00277
00278
00279 UINT32 getTargetInterfaceCount(){return m_cnTargets;}
00280
00293 SINT32 getTargetInterface(TargetInterface& oTargetInterface, UINT32 nr)
00294 {
00295 if(nr>0&&nr<=m_cnTargets)
00296 {
00297 oTargetInterface.net_type=m_arTargetInterfaces[nr-1].net_type;
00298 oTargetInterface.target_type=m_arTargetInterfaces[nr-1].target_type;
00299 oTargetInterface.addr=m_arTargetInterfaces[nr-1].addr->clone();
00300 return E_SUCCESS;
00301 }
00302 else
00303 return E_UNKNOWN;
00304 };
00305
00306 #ifndef ONLY_LOCAL_PROXY
00307
00308 UINT32 getVisibleAddressesCount(){return m_cnVisibleAddresses;}
00309
00318 SINT32 getVisibleAddress(UINT8* strAddressBuff, UINT32 len,UINT32 nr);
00319
00320 UINT16 getSOCKSPort();
00321 SINT32 getSOCKSHost(UINT8* host,UINT32 len);
00322 CAListenerInterface** getInfoServices(UINT32& r_size);
00323 #endif //ONLY_LOCAL_PROXY
00324
00325 SINT32 getMaxOpenFiles()
00326 {
00327 return m_nrOfOpenFiles;
00328 }
00329
00330
00331 #ifndef ONLY_LOCAL_PROXY
00332
00333 CAMultiSignature* getMultiSigner(){ return m_pMultiSignature; }
00334
00335
00336
00337
00338
00339
00343
00344
00345
00346
00347
00348
00349
00350
00354
00355
00356
00357
00358
00359
00360
00361
00362 SINT32 getOperatorSubjectKeyIdentifier(UINT8 *buffer, UINT32 *length);
00363 #ifdef PAYMENT
00364 CAXMLPriceCert* getPriceCertificate() const
00365 {
00366 if(m_pPriceCertificate != NULL)
00367 {
00368 return m_pPriceCertificate;
00369 }
00370 return NULL;
00371 }
00372 #endif
00373
00374 #ifdef COUNTRY_STATS
00375 SINT32 getCountryStatsDBConnectionLoginData(char** db_host,char**db_user,char**db_passwd);
00376 #endif
00377 bool hasPrevMixTestCertificate()
00378 {
00379 return m_pPrevMixCertificate!=NULL;
00380 }
00381
00382 CACertificate* getPrevMixTestCertificate()
00383 {
00384 if(m_pPrevMixCertificate!=NULL)
00385 return m_pPrevMixCertificate->clone();
00386 return NULL;
00387 }
00388
00389 SINT32 setPrevMixTestCertificate(CACertificate* cert)
00390 {
00391 if(cert != NULL)
00392 {
00393 m_pPrevMixCertificate = cert->clone();
00394 return E_SUCCESS;
00395 }
00396 return E_UNKNOWN;
00397 }
00398
00399 bool hasNextMixTestCertificate()
00400 {
00401 return m_pNextMixCertificate!=NULL;
00402 }
00403
00404 CACertificate* getNextMixTestCertificate()
00405 {
00406 if(m_pNextMixCertificate!=NULL)
00407 return m_pNextMixCertificate->clone();
00408 return NULL;
00409 }
00410
00411 SINT32 setNextMixTestCertificate(CACertificate* cert)
00412 {
00413 if(cert != NULL)
00414 {
00415 m_pNextMixCertificate = cert->clone();
00416 return E_SUCCESS;
00417 }
00418 return E_UNKNOWN;
00419 }
00420 CACertStore* getTrustedCertificateStore()
00421 {
00422 return m_pTrustedRootCertificates;
00423 }
00424
00426 bool isEncryptedLogEnabled()
00427 {
00428 return m_bIsEncryptedLogEnabled;
00429 }
00430 bool isSyslogEnabled()
00431 {
00432 return m_bSyslog;
00433 }
00434
00436 SINT32 enableEncryptedLog(bool b)
00437 {
00438 m_bIsEncryptedLogEnabled=b;
00439 return E_SUCCESS;
00440 }
00441
00443 CACertificate* getLogEncryptionKey()
00444 {
00445 if(m_pLogEncryptionCertificate!=NULL)
00446 return m_pLogEncryptionCertificate->clone();
00447 return NULL;
00448 }
00449
00450 DOMElement* getCascadeXML()
00451 {
00452 return m_pCascadeXML;
00453 }
00454
00455 SINT32 getCascadeName(UINT8* name,UINT32 len) const;
00456
00457
00458 SINT32 setCascadeName(const UINT8* name)
00459 {
00460 delete[] m_strCascadeName;
00461 m_strCascadeName = new UINT8[strlen((const char*)name)+1];
00462 strcpy((char*)m_strCascadeName,(const char*)name);
00463 return E_SUCCESS;
00464 }
00465
00466 SINT32 reread(CAMix* pMix);
00467
00468
00469 SINT32 getEncryptedLogDir(UINT8* name,UINT32 len);
00470
00472
00473 SINT32 getMixXml(XERCES_CPP_NAMESPACE::DOMDocument* & docMixInfo);
00474
00475 UINT32 getNumberOfTermsAndConditionsTemplates();
00476 XERCES_CPP_NAMESPACE::DOMDocument **getAllTermsAndConditionsTemplates();
00477 XERCES_CPP_NAMESPACE::DOMElement *getTermsAndConditions();
00478
00479 UINT32 getKeepAliveSendInterval()
00480 {
00481 return m_u32KeepAliveSendInterval;
00482 }
00483
00484 UINT32 getKeepAliveRecvInterval()
00485 {
00486 return m_u32KeepAliveRecvInterval;
00487 }
00488 bool isInfoServiceEnabled()
00489 {
00490 return (m_addrInfoServicesSize>0);
00491 }
00492 #endif //ONLY_LOCAL_PROXY
00493 bool getCompressLogs()
00494 {
00495 return m_bCompressedLogs;
00496 }
00497 SINT32 getLogDir(UINT8* name,UINT32 len);
00498 SINT32 setLogDir(const UINT8* name,UINT32 len);
00499 SINT64 getMaxLogFileSize()
00500 {
00501 return m_maxLogFileSize;
00502 }
00503
00504 UINT32 getMaxLogFiles()
00505 {
00506 return m_maxLogFiles;
00507 }
00508
00509 SINT32 getUser(UINT8* user,UINT32 len);
00510 SINT32 getPidFile(UINT8* pidfile,UINT32 len);
00511
00512 #ifdef SERVER_MONITORING
00513 char *getMonitoringListenerHost();
00514 UINT16 getMonitoringListenerPort();
00515 #endif
00516
00517 bool isLocalProxy();
00518 bool isFirstMix();
00519 bool isMiddleMix();
00520 bool isLastMix();
00521
00522
00523 bool isSock5sSupported()
00524 {
00525 return m_bSocksSupport;
00526 }
00527
00528
00529 bool getAutoReconnect()
00530 {
00531 return m_bAutoReconnect;
00532 }
00533
00534 #ifdef LOG_CRIME
00535 regex_t* getCrimeRegExpsURL(UINT32* len)
00536 {
00537 *len=m_nCrimeRegExpsURL;
00538 return m_arCrimeRegExpsURL;
00539 }
00540
00541 regex_t* getCrimeRegExpsPayload(UINT32* len)
00542 {
00543 *len=m_nCrimeRegExpsPayload;
00544 return m_arCrimeRegExpsPayload;
00545 }
00546
00547 UINT64* getCrimeSurveillanceAccounts()
00548 {
00549 return m_surveillanceAccounts;
00550 }
00551
00552 UINT32 getNrOfCrimeSurveillanceAccounts()
00553 {
00554 return m_nrOfSurveillanceAccounts;
00555 }
00556
00557
00558 CASocketAddrINet* getCrimeSurveillanceIPs()
00559 {
00560 return m_surveillanceIPs;
00561 }
00562
00563 UINT32 getNrOfCrimeSurveillanceIPs()
00564 {
00565 return m_nrOfSurveillanceIPs;
00566 }
00567
00568 bool isPayloadLogged()
00569 {
00570 return m_logPayload;
00571 }
00572 #endif
00573
00574 #if defined(DELAY_CHANNELS)||defined(DELAY_USERS)
00575 UINT32 getDelayChannelUnlimitTraffic()
00576 {
00577 return m_u32DelayChannelUnlimitTraffic;
00578 }
00579 UINT32 getDelayChannelBucketGrow()
00580 {
00581 return m_u32DelayChannelBucketGrow;
00582 }
00583 UINT32 getDelayChannelBucketGrowIntervall()
00584 {
00585 return m_u32DelayChannelBucketGrowIntervall;
00586 }
00587 #endif
00588
00589 #if defined(DELAY_CHANNELS_LATENCY)
00590
00591 UINT32 getDelayChannelLatency()
00592 {
00593 return m_u32DelayChannelLatency;
00594 }
00595 #endif
00596
00597
00598 #ifdef PAYMENT
00599
00600 SINT32 getDatabaseHost(UINT8 * host, UINT32 len);
00601 UINT16 getDatabasePort();
00602 SINT32 getDatabaseName(UINT8 * name, UINT32 len);
00603 SINT32 getDatabaseUsername(UINT8 * user, UINT32 len);
00604 SINT32 getDatabasePassword(UINT8 * pass, UINT32 len);
00605 SINT32 getAiID(UINT8 * id, UINT32 len);
00606 CAXMLBI* getBI();
00607 UINT32 getPaymentHardLimit();
00608 UINT32 getPaymentSoftLimit();
00609 UINT32 getPrepaidInterval();
00610 UINT32 getPaymentSettleInterval();
00611 #endif
00612
00613 #ifdef DATA_RETENTION_LOG
00614 SINT32 getDataRetentionLogDir(UINT8* strLogDir,UINT32 len);
00615 SINT32 getDataRetentionPublicEncryptionKey(CAASymCipher** pKey)
00616 {
00617 *pKey=m_pDataRetentionPublicEncryptionKey;
00618 return E_SUCCESS;
00619 }
00620 #endif
00621
00622 #ifndef ONLY_LOCAL_PROXY
00623
00624
00625 SINT32 setNextMix(XERCES_CPP_NAMESPACE::DOMDocument* pDoc);
00626 SINT32 setPrevMix(XERCES_CPP_NAMESPACE::DOMDocument* pDoc);
00627 bool acceptReconfiguration() { return m_bAcceptReconfiguration; }
00628
00629 friend THREAD_RETURN threadReConfigure(void *param);
00630
00632 static SINT32 createMixOnCDConfiguration(const UINT8* strFileName);
00633 static SINT32 saveToFile(XERCES_CPP_NAMESPACE::DOMDocument* a_doc, const UINT8* a_strFileName);
00634 UINT32 getMaxNrOfUsers()
00635 {
00636 return m_maxNrOfUsers;
00637 }
00638
00639 #ifdef DYNAMIC_MIX
00640
00641
00642 SINT32 createDefaultConfiguration();
00643 SINT32 addListenerInterface(DOM_Element a_elem);
00644 SINT32 resetNetworkConfiguration();
00645 SINT32 getRandomInfoService(CASocketAddrINet *&r_address);
00646 bool isDynamic() { return m_bDynamic; }
00647 SINT32 changeMixType(CAMix::tMixType a_newMixType);
00648 SINT32 resetNextMix();
00649 SINT32 resetPrevMix();
00650 SINT32 setCascadeProposal(UINT8* a_strCascadeProposal, UINT32 a_len)
00651 {
00652 if(m_strLastCascadeProposal != NULL)
00653 {
00654 delete m_strLastCascadeProposal;
00655 m_strLastCascadeProposal = NULL;
00656 }
00657 if(a_strCascadeProposal == NULL)
00658 return E_SUCCESS;
00659 m_strLastCascadeProposal = new UINT8[ a_len + 1 ];
00660 memcpy(m_strLastCascadeProposal, a_strCascadeProposal, a_len+1);
00661 return E_SUCCESS;
00662 }
00663 SINT32 getLastCascadeProposal(UINT8* r_strCascadeProposal, UINT32 r_len)
00664 {
00665 if(m_strLastCascadeProposal == NULL)
00666 {
00667 return E_UNKNOWN;
00668 }
00669 if(r_len >= strlen((char*)m_strLastCascadeProposal))
00670 {
00671 r_len = strlen((char*)m_strLastCascadeProposal);
00672 memcpy(r_strCascadeProposal, m_strLastCascadeProposal, r_len + 1);
00673 return E_SUCCESS;
00674 }
00675 return E_UNKNOWN;
00676 }
00677 #endif // DYNAMIC_MIX
00678 XERCES_CPP_NAMESPACE::DOMDocument **m_termsAndConditionsTemplates;
00679 UINT32 m_nrOfTermsAndConditionsTemplates;
00680 bool verifyMixCertificates() {return m_bVerifyMixCerts;}
00681 private:
00682 #ifdef DYNAMIC_MIX
00683 UINT8* m_strLastCascadeProposal;
00684 UINT32 getRandom(UINT32 a_max);
00685 SINT32 checkInfoServices(UINT32 *r_runningInfoServices);
00686 SINT32 checkMixId();
00687 SINT32 checkListenerInterfaces();
00688 SINT32 checkCertificates();
00689 #endif //DYNAMIC_MIX
00690 bool m_bDynamic;
00691 SINT32 parseInfoServices(DOMElement* a_infoServiceNode);
00692
00693 static SINT32 buildDefaultConfig(XERCES_CPP_NAMESPACE::DOMDocument* a_doc,bool bForLastMix);
00694 #endif //only_LOCAL_PROXY
00695 UINT8* m_strConfigFile;
00696 bool m_bDaemon;
00697 UINT16 m_iSOCKSServerPort;
00698 UINT16 m_iTargetPort;
00699 char* m_strTargetHost;
00700 char* m_strSOCKSHost;
00701 UINT16 m_iSOCKSPort;
00702 #ifndef ONLY_LOCAL_PROXY
00703 bool m_bIsRunReConfigure;
00704 CAMutex* m_pcsReConfigure;
00705 CAThread m_threadReConfigure;
00706 CAListenerInterface** m_addrInfoServices;
00707 UINT32 m_addrInfoServicesSize;
00708
00709
00710
00711 CAMultiSignature* m_pMultiSignature;
00712
00713
00714 #ifdef PAYMENT
00715 CAXMLPriceCert* m_pPriceCertificate;
00716 #endif
00717
00718 CACertificate* m_OpCert;
00719
00720
00721 DOMNodeList* m_opCertList;
00722
00723
00724 bool m_bVerifyMixCerts;
00725 CACertStore* m_pTrustedRootCertificates;
00726
00727 CACertificate* m_pPrevMixCertificate;
00728 CACertificate* m_pNextMixCertificate;
00729 CACertificate* m_pLogEncryptionCertificate;
00730
00731 UINT32 m_maxNrOfUsers;
00732
00733
00734 DOMElement* m_pCascadeXML;
00735 bool m_bAcceptReconfiguration;
00736 XERCES_CPP_NAMESPACE::DOMDocument* m_docMixInfo;
00737 XERCES_CPP_NAMESPACE::DOMDocument* m_docMixXml;
00738 XERCES_CPP_NAMESPACE::DOMDocument* m_docOpTnCs;
00739
00740 UINT32 m_u32KeepAliveSendInterval;
00741 UINT32 m_u32KeepAliveRecvInterval;
00742
00743 bool m_perfTestEnabled;
00744 #endif //ONLY_LOCAL_PROXY
00745
00746 bool m_bLocalProxy,m_bFirstMix,m_bMiddleMix,m_bLastMix;
00747 bool m_bAutoReconnect;
00748 UINT8* m_strCascadeName;
00749 char* m_strLogDir;
00750 char* m_strLogLevel;
00751 SINT64 m_maxLogFileSize;
00752 UINT32 m_maxLogFiles;
00753 char* m_strEncryptedLogDir;
00754 bool m_bCompressedLogs;
00755 bool m_bSocksSupport;
00756 bool m_bSyslog;
00757 bool m_bLogConsole;
00758 char* m_strUser;
00759 char* m_strPidFile;
00760 SINT32 m_nrOfOpenFiles;
00761
00762
00763 char* m_strMixID;
00764 char* m_strMixName;
00765
00766 bool m_bIsEncryptedLogEnabled;
00767
00768 TargetInterface* m_arTargetInterfaces;
00769 UINT32 m_cnTargets;
00770 CAListenerInterface** m_arListenerInterfaces;
00771 UINT32 m_cnListenerInterfaces;
00772 UINT8** m_arStrVisibleAddresses;
00773 UINT32 m_cnVisibleAddresses;
00774
00775
00776 #ifdef LOG_CRIME
00777 bool m_logPayload;
00778 regex_t* m_arCrimeRegExpsURL;
00779 UINT32 m_nCrimeRegExpsURL;
00780 regex_t* m_arCrimeRegExpsPayload;
00781 UINT32 m_nCrimeRegExpsPayload;
00782 UINT32 m_nrOfSurveillanceIPs;
00783 CASocketAddrINet* m_surveillanceIPs;
00784 UINT64* m_surveillanceAccounts;
00785 UINT32 m_nrOfSurveillanceAccounts;
00786 #endif
00787
00788 #ifdef DATA_RETENTION_LOG
00789 UINT8* m_strDataRetentionLogDir;
00790 CAASymCipher* m_pDataRetentionPublicEncryptionKey;
00791 #endif
00792
00793 #if defined (DELAY_CHANNELS) ||defined(DELAY_USERS)
00794 UINT32 m_u32DelayChannelUnlimitTraffic;
00795 UINT32 m_u32DelayChannelBucketGrow;
00796 UINT32 m_u32DelayChannelBucketGrowIntervall;
00797 #endif
00798
00799 #if defined (DELAY_CHANNELS_LATENCY)
00800 UINT32 m_u32DelayChannelLatency;
00801 #endif
00802
00803 #ifdef PAYMENT
00804
00805
00806 private:
00807 CAXMLBI * m_pBI;
00808 UINT8 * m_strDatabaseHost;
00809 UINT8 * m_strDatabaseName;
00810 UINT8 * m_strDatabaseUser;
00811 UINT8 * m_strDatabasePassword;
00812 UINT8* m_strAiID;
00813 UINT16 m_iDatabasePort;
00814 UINT32 m_iPaymentHardLimit;
00815 UINT32 m_iPaymentSoftLimit;
00816 UINT32 m_iPrepaidInterval;
00817 UINT32 m_iPaymentSettleInterval;
00818
00819
00820 #endif
00821 optionSetter_pt *mainOptionSetters;
00822 optionSetter_pt *generalOptionSetters;
00823 optionSetter_pt *certificateOptionSetters;
00824 optionSetter_pt *accountingOptionSetters;
00825 optionSetter_pt *networkOptionSetters;
00826 optionSetter_pt *termsAndConditionsOptionSetters;
00827 optionSetter_pt *crimeDetectionOptionSetters;
00828
00829 #ifdef SERVER_MONITORING
00830 private:
00831 char *m_strMonitoringListenerHost;
00832 UINT16 m_iMonitoringListenerPort;
00833 #endif
00834
00835 private:
00836 SINT32 setNewValues(CACmdLnOptions& newOptions);
00837 #ifndef ONLY_LOCAL_PROXY
00838 SINT32 readXmlConfiguration(XERCES_CPP_NAMESPACE::DOMDocument* & docConfig,const UINT8* const configFileName);
00839 SINT32 readXmlConfiguration(XERCES_CPP_NAMESPACE::DOMDocument* & docConfig,const UINT8* const buf, UINT32 len);
00840 SINT32 processXmlConfiguration(XERCES_CPP_NAMESPACE::DOMDocument* docConfig);
00841 SINT32 clearVisibleAddresses();
00842 SINT32 addVisibleAddresses(DOMNode* nodeProxy);
00843 #ifdef COUNTRY_STATS
00844 char* m_dbCountryStatsHost;
00845 char* m_dbCountryStatsUser;
00846 char* m_dbCountryStatsPasswd;
00847 #endif //COUNTRY_STATS
00848 #endif //ONLY_LOCAL_PROXY
00849 SINT32 clearTargetInterfaces();
00850 SINT32 clearListenerInterfaces();
00851
00852
00853
00854
00855
00856 #define MAIN_OPTION_SETTERS_NR 8
00857 SINT32 setGeneralOptions(DOMElement* elemRoot);
00858 SINT32 setMixDescription(DOMElement* elemRoot);
00859 SINT32 setCertificateOptions(DOMElement* elemRoot);
00860 SINT32 setAccountingOptions(DOMElement *elemRoot);
00861 SINT32 setNetworkOptions(DOMElement *elemRoot);
00862 SINT32 setRessourceOptions(DOMElement *elemRoot);
00863 SINT32 setTermsAndConditions(DOMElement *elemRoot);
00864 SINT32 setCrimeDetectionOptions(DOMElement *elemRoot);
00865
00866
00867 #define GENERAL_OPTIONS_NR 11
00868 SINT32 setMixType(DOMElement* elemGeneral);
00869 SINT32 setMixName(DOMElement* elemGeneral);
00870 SINT32 setMixID(DOMElement* elemGeneral);
00871 SINT32 setDynamicMix(DOMElement* elemGeneral);
00872 SINT32 setMinCascadeLength(DOMElement* elemGeneral);
00873 SINT32 setCascadeNameFromOptions(DOMElement* elemGeneral);
00874 SINT32 setUserID(DOMElement* elemGeneral);
00875 SINT32 setNrOfFileDescriptors(DOMElement* elemGeneral);
00876 SINT32 setDaemonMode(DOMElement* elemGeneral);
00877 SINT32 setMaxUsers(DOMElement* elemGeneral);
00878 SINT32 setLoggingOptions(DOMElement* elemGeneral);
00879
00880
00881 #define MAX_CERTIFICATE_OPTIONS_NR 6
00882 UINT32 m_nCertificateOptionsSetters;
00883 SINT32 setOwnCertificate(DOMElement *elemCertificates);
00884 SINT32 setOwnOperatorCertificate(DOMElement *elemCertificates);
00885 SINT32 setMixCertificateVerification(DOMElement *elemCertificates);
00886 SINT32 setNextMixCertificate(DOMElement *elemCertificates);
00887 SINT32 setPrevMixCertificate(DOMElement *elemCertificates);
00888 SINT32 setTrustedRootCertificates(DOMElement *elemCertificates);
00889
00890
00891 #define ACCOUNTING_OPTIONS_NR 7
00892 SINT32 setPriceCertificate(DOMElement *elemAccounting);
00893 SINT32 setPaymentInstance(DOMElement *elemAccounting);
00894 SINT32 setAccountingSoftLimit(DOMElement *elemAccounting);
00895 SINT32 setAccountingHardLimit(DOMElement *elemAccounting);
00896 SINT32 setPrepaidInterval(DOMElement *elemAccounting);
00897 SINT32 setSettleInterval(DOMElement *elemAccounting);
00898 SINT32 setAccountingDatabase(DOMElement *elemAccounting);
00899
00900
00901 #define NETWORK_OPTIONS_NR 5
00902 SINT32 setInfoServices(DOMElement *elemNetwork);
00903 SINT32 setListenerInterfaces(DOMElement *elemNetwork);
00904 SINT32 setTargetInterfaces(DOMElement *elemNetwork);
00905 SINT32 setServerMonitoring(DOMElement *elemNetwork);
00906 SINT32 setKeepAliveTraffic(DOMElement *elemNetwork);
00907
00908
00909 #define TERMS_AND_CONDITIONS_OPTIONS_NR 2
00910 SINT32 setTermsAndConditionsTemplates(DOMElement *elemTnCs);
00911 SINT32 setTermsAndConditionsList(DOMElement *elemTnCs);
00912
00913
00914 #define CRIME_DETECTION_OPTIONS_NR 4
00915 SINT32 setCrimeURLRegExp(DOMElement *elemCrimeDetection);
00916 SINT32 setCrimePayloadRegExp(DOMElement *elemCrimeDetection);
00917 SINT32 setCrimeSurveillanceIP(DOMElement *elemCrimeDetection);
00918 SINT32 setCrimeSurveillanceAccounts(DOMElement *elemCrimeDetection);
00919
00920 SINT32 appendMixInfo_internal(DOMNode* a_node, bool with_subtree);
00921 inline SINT32 addMixIdToMixInfo();
00922
00923 SINT32 invokeOptionSetters(const optionSetter_pt *optionsSetters, DOMElement* target, SINT32 optionsSettersLength);
00924
00925 void initMainOptionSetters();
00926 void initGeneralOptionSetters();
00927 void initMixDescriptionSetters();
00928 void initCertificateOptionSetters();
00929 void initAccountingOptionSetters();
00930 void initNetworkOptionSetters();
00931 void initTermsAndConditionsOptionSetters();
00932 void initCrimeDetectionOptionSetters();
00933 };
00934
00935 SINT32 setRegExpressions(DOMElement *rootElement, const char* const childElementName,
00936 regex_t **regExContainer, UINT32* regExNr);
00937
00938 #endif
00939