void testCreators() { OsConfigDb *pDb = new OsConfigDb(); // create an empty database CPPUNIT_ASSERT_MESSAGE("verify that it looks empty", pDb->isEmpty()); CPPUNIT_ASSERT_MESSAGE("has zero entries", pDb->numEntries()==0); delete pDb; }
StatusServer* StatusServer::startStatusServer ( const UtlString workingDir, const char* configFileName ) { int httpPort = PORT_NONE; int httpsPort = PORT_NONE; int tcpPort = PORT_NONE; int udpPort = PORT_NONE; int tlsPort = PORT_NONE; UtlString bindIp; UtlString defaultMaxExpiresTime; UtlString defaultMinExpiresTime; UtlString authAlgorithm; UtlString authQop; UtlString authRealm; UtlString authScheme; UtlString domainName; UtlBoolean isCredentialDB = TRUE; // if the configuration file exists, load the name value pairs if ( sConfigDb.loadFromFile(configFileName) == OS_SUCCESS ) { Os::Logger::instance().log(FAC_SIP, PRI_DEBUG, "Found config file: %s", configFileName); } else { Os::Logger::instance().log(FAC_SIP, PRI_CRIT, "Could not read config file: %s", configFileName); fprintf(stderr, "Could not read config file: %s", configFileName); exit(1); } Os::Logger::instance().log(LOG_FACILITY, PRI_INFO, "Starting - version: %s %s\n", VERSION, PACKAGE_REVISION); sConfigDb.get("SIP_STATUS_AUTHENTICATE_ALGORITHM", authAlgorithm); sConfigDb.get("SIP_STATUS_AUTHENTICATE_QOP", authQop); sConfigDb.get("SIP_STATUS_AUTHENTICATE_REALM", authRealm); sConfigDb.get("SIP_STATUS_AUTHENTICATE_SCHEME", authScheme); sConfigDb.get("SIP_STATUS_DOMAIN_NAME", domainName); sConfigDb.get("SIP_STATUS_HTTP_PORT", httpPort); sConfigDb.get("SIP_STATUS_HTTPS_PORT", httpsPort); sConfigDb.get("SIP_STATUS_MAX_EXPIRES", defaultMaxExpiresTime); sConfigDb.get("SIP_STATUS_MIN_EXPIRES", defaultMinExpiresTime); // SIP_STATUS_UDP_PORT udpPort = sConfigDb.getPort("SIP_STATUS_UDP_PORT") ; if ( udpPort == PORT_NONE ) { udpPort = 5110; } Os::Logger::instance().log(FAC_SIP, PRI_INFO, "SIP_STATUS_UDP_PORT : %d", udpPort); // SIP_STATUS_TCP_PORT tcpPort = sConfigDb.getPort("SIP_STATUS_TCP_PORT") ; if ( tcpPort == PORT_NONE ) { tcpPort = 5110; } Os::Logger::instance().log(FAC_SIP, PRI_INFO, "SIP_STATUS_TCP_PORT : %d", tcpPort); // SIP_STATUS_TLS_PORT tlsPort = sConfigDb.getPort("SIP_STATUS_TLS_PORT") ; if ( tlsPort == PORT_NONE ) { tlsPort = 5111; } Os::Logger::instance().log(FAC_SIP, PRI_INFO, "SIP_STATUS_TLS_PORT : %d", tlsPort); // SIP_STATUS_BIND_IP sConfigDb.get("SIP_STATUS_BIND_IP", bindIp) ; if ((bindIp.isNull()) || !OsSocket::isIp4Address(bindIp)) { bindIp = "0.0.0.0"; } Os::Logger::instance().log(FAC_SIP, PRI_INFO, "SIP_STATUS_BIND_IP : %s", bindIp.data()); UtlString separatedList; // Get the HTTP server Valid IP address database OsConfigDb* pValidIpAddressDB = new OsConfigDb(); sConfigDb.get("SIP_STATUS_HTTP_VALID_IPS", separatedList); parseList ("SIP_STATUS_HTTP_VALID_IPS", separatedList, *pValidIpAddressDB); if( pValidIpAddressDB->isEmpty() ) { delete pValidIpAddressDB; pValidIpAddressDB = NULL; } // Check for default values and, if not specified, set to defaults // SIP_STATUS_AUTHENTICATE_ALGORITHM if ( authAlgorithm.isNull() ) /* MD5/MD5SESS */ { authAlgorithm.append("MD5"); } Os::Logger::instance().log(FAC_SIP, PRI_INFO, "SIP_STATUS_AUTHENTICATE_ALGORITHM : %s", authAlgorithm.data()); // SIP_STATUS_AUTHENTICATE_QOP if ( authQop.isNull() ) /* AUTH/AUTH-INT/NONE */ { authQop.append("NONE"); } Os::Logger::instance().log(FAC_SIP, PRI_INFO, "SIP_STATUS_AUTHENTICATE_QOP : %s", authQop.data()); // SIP_STATUS_DOMAIN_NAME - need this before the SIP_STATUS_AUTHENTICATE_REALM // below since we get the domain name from the socket if ( domainName.isNull() ) { OsSocket::getHostIp(&domainName); } Os::Logger::instance().log(FAC_SIP, PRI_INFO, "SIP_STATUS_DOMAIN_NAME : %s", domainName.data()); // SIP_STATUS_AUTHENTICATE_REALM if(authRealm.isNull()) { authRealm.append(domainName); } Os::Logger::instance().log(FAC_SIP, PRI_INFO, "SIP_STATUS_AUTHENTICATE_REALM : %s", authRealm.data()); // SIP_STATUS_AUTHENTICATE_SCHEME (Hidden) NONE/DIGEST if ( authScheme.compareTo("NONE" , UtlString::ignoreCase) == 0 ) { isCredentialDB = FALSE; } // SIP_STATUS_HTTPS_PORT - See if the SECURE one is set first OsStatus result; UtlString portStr; result = sConfigDb.get("SIP_STATUS_HTTPS_PORT", portStr); Os::Logger::instance().log(FAC_SIP, PRI_INFO, "startStatusServer : HTTPS port %s result %d", portStr.data(), result); // If the key is missing or not set, set it to the default HTTPS port if ( result == OS_NOT_FOUND || portStr.isNull() ) { httpsPort = HTTPS_SERVER_PORT; } Os::Logger::instance().log(FAC_SIP, PRI_INFO, "SIP_STATUS_HTTPS_PORT : %d", httpsPort ); // Only search for the non secure SIP_STATUS_HTTP_PORT // if the secure one is disabled if ( httpsPort == PORT_NONE ) { // SIP_STATUS_HTTP_PORT result = sConfigDb.get("SIP_STATUS_HTTP_PORT", portStr); Os::Logger::instance().log(FAC_SIP, PRI_INFO, "startStatusServer : HTTP port %s result %d", portStr.data(), result); // If the key is missing or not set, set it to the default HTTP port if ( result == OS_NOT_FOUND || portStr.isNull() ) { httpPort = HTTP_SERVER_PORT; } Os::Logger::instance().log( FAC_SIP, PRI_INFO, "SIP_STATUS_HTTP_PORT : %d", httpPort ); } int maxNumSrvRecords = -1; sConfigDb.get("SIP_STATUS_DNSSRV_MAX_DESTS", maxNumSrvRecords); Os::Logger::instance().log(FAC_SIP, PRI_INFO, "SIP_STATUS_DNSSRV_MAX_DESTS : %d", maxNumSrvRecords); // If explicitly set to a valid number if(maxNumSrvRecords > 0) { osPrintf("SIP_STATUS_DNSSRV_MAX_DESTS : %d\n", maxNumSrvRecords); } else { maxNumSrvRecords = 4; } int dnsSrvTimeout = -1; //seconds sConfigDb.get("SIP_STATUS_DNSSRV_TIMEOUT", dnsSrvTimeout); Os::Logger::instance().log(FAC_SIP, PRI_INFO, "SIP_STATUS_DNSSRV_TIMEOUT : %d", dnsSrvTimeout); // If explicitly set to a valid number if(dnsSrvTimeout > 0) { osPrintf("SIP_STATUS_DNSSRV_TIMEOUT : %d\n", dnsSrvTimeout); } else { dnsSrvTimeout = 4; } // SIP_STATUS_MAX_EXPIRES if ( defaultMaxExpiresTime.isNull() ) { defaultMaxExpiresTime.append("604800"); // default to 1 week } Os::Logger::instance().log(FAC_SIP, PRI_INFO, "SIP_STATUS_MAX_EXPIRES : %s", defaultMaxExpiresTime.data()); int maxExpiresTime = atoi(defaultMaxExpiresTime.data()); // SIP_STATUS_MIN_EXPIRES if ( defaultMinExpiresTime.isNull() ) { defaultMinExpiresTime.append("300"); // default to 300 seconds } Os::Logger::instance().log(FAC_SIP, PRI_INFO, "SIP_STATUS_MIN_EXPIRES : %s", defaultMinExpiresTime.data()); int webServerPort = httpPort; UtlBoolean isSecureServer = false; // Determine whether we should start the web server or not. Use the port // value as the decision point. A valid port means enable. // If isSecureServer then start the port as a secure web server. OsServerSocket* serverSocket = NULL; HttpServer* httpServer = NULL; if( portIsValid(webServerPort) ) { if ( isSecureServer ) { # ifdef HAVE_SSL serverSocket = new OsSSLServerSocket(50, webServerPort, bindIp); httpServer = new HttpServer(serverSocket, pValidIpAddressDB, false /* no persistent tcp connection */); # else /* ! HAVE_SSL */ // SSL is not configured in, so we cannot open the requested // socket. Os::Logger::instance().log(FAC_SIP, PRI_CRIT, "StatusServer::startStatusServer SSL not configured; " "cannot open secure socket %d", webServerPort); httpServer = NULL; # endif /* HAVE_SSL */ } else { serverSocket = new OsServerSocket(50, webServerPort, bindIp); httpServer = new HttpServer(serverSocket, pValidIpAddressDB ); } } // Start the SIP stack SipUserAgent* sipUserAgent = new SipUserAgent( tcpPort, udpPort, tlsPort, NULL, // public IP address (nopt used in proxy) NULL, // default user (not used in proxy) bindIp, NULL, // outbound proxy NULL, // directory server NULL, // registry server NULL, // auth realm NULL, // auth DB NULL, // auth user IDs NULL, // auth passwords NULL, // line mgr SIP_DEFAULT_RTT, // first resend timeout TRUE, // default to UA transaction SIPUA_DEFAULT_SERVER_UDP_BUFFER_SIZE, // socket layer read buffer size SIPUA_DEFAULT_SERVER_OSMSG_QUEUE_SIZE // OsServerTask message queue size ); // No need to log the message as it goes in the syslog //sipUserAgent->startMessageLog(100000); sipUserAgent->setDnsSrvTimeout(dnsSrvTimeout); sipUserAgent->setMaxSrvRecords(maxNumSrvRecords); sipUserAgent->setUserAgentHeaderProperty("sipXecs/publisher"); sipUserAgent->start(); Notifier* notifier = new Notifier(sipUserAgent); // Start the status server StatusServer* status = new StatusServer( notifier, maxExpiresTime, domainName, defaultMinExpiresTime, isCredentialDB, authAlgorithm, authQop, authRealm, workingDir, serverSocket, httpServer); status->start(); return(status); }
void testManipulators() { OsConfigDb *pDb = new OsConfigDb(); pDb->set("Key1", "Value1"); CPPUNIT_ASSERT_MESSAGE("verify that the database is not empty", !pDb->isEmpty()); CPPUNIT_ASSERT_MESSAGE("has one entry", pDb->numEntries()==1); // test the remove() method // // We put the following block in its own scope so that the UtlString // reference (stored in "value") is released as a side effect of going // out of scope. Otherwise, it will look like a memory leak. { UtlString value; pDb->remove("Key1"); CPPUNIT_ASSERT_MESSAGE("verify that it looks empty", pDb->isEmpty()); CPPUNIT_ASSERT_MESSAGE("has zero entries", pDb->numEntries()==0); pDb->set("Key1", "Value1"); // add the entry back pDb->set("Key1", "Value1b"); // change the value for an existing entry CPPUNIT_ASSERT_MESSAGE("verify that the database is not empty", !pDb->isEmpty()); CPPUNIT_ASSERT_EQUAL_MESSAGE("has one entry", 1, pDb->numEntries()); OsStatus res = pDb->get("Key1", value); CPPUNIT_ASSERT(res == OS_SUCCESS); CPPUNIT_ASSERT_MESSAGE("that contains the revised value", value.compareTo("Value1b") == 0); pDb->set("Key2", "Value2"); pDb->set("Key3", "Value3"); pDb->set("Key4", "Value4"); CPPUNIT_ASSERT_MESSAGE("check the number of entries", pDb->numEntries()==4); value.remove(0); } // test the storeToFile() method pDb->storeToFile("tmpdb"); // store the config db to the file delete pDb; // delete the database // test the loadFromFile() method // // We put the following block in its own scope so that the UtlString // reference (stored in "value") is released as a side effect of going // out of scope. Otherwise, it will look like a memory leak. { UtlString value; pDb = new OsConfigDb(); // create an empty database pDb->loadFromFile("tmpdb"); // load the data from a file } CPPUNIT_ASSERT_MESSAGE("verify the database is not empty", !pDb->isEmpty()); CPPUNIT_ASSERT_MESSAGE("has four entries", pDb->numEntries()==4); UtlString value; OsStatus res = pDb->get("Key1", value); CPPUNIT_ASSERT_MESSAGE("contains correct data", res == OS_SUCCESS && value.compareTo("Value1b") == 0); res = pDb->get("Key2", value); CPPUNIT_ASSERT_MESSAGE("contains correct data", res == OS_SUCCESS && value.compareTo("Value2") == 0); res = pDb->get("Key3", value); CPPUNIT_ASSERT_MESSAGE("contains correct data", res == OS_SUCCESS && value.compareTo("Value3") == 0); res = pDb->get("Key4", value); CPPUNIT_ASSERT_MESSAGE("contains correct data", res == OS_SUCCESS && value.compareTo("Value4") == 0); delete pDb; // delete the database value.remove(0); }
void testAccessors() { OsConfigDb *pDb = new OsConfigDb(); // the get() method is tested by testManipulators() // test the getNext() method // // We put the following block in its own scope so that the UtlString // references (stored in "name" and "value") are released as a side effect // of going out of scope. Otherwise, it will look like a memory leak. { UtlString name; UtlString value; pDb->set("Key3", "Value3"); // add several entries (not in pDb->set("Key2", "Value2"); // alphabetical or reverse alphabetical pDb->set("Key4", "Value4"); // order pDb->set("Key1", "Value1"); CPPUNIT_ASSERT_MESSAGE("verify that the database is not empty", !pDb->isEmpty()); CPPUNIT_ASSERT_MESSAGE("has four entries", pDb->numEntries()==4); OsStatus res = pDb->getNext("", name, value); // call getNext("", ...) CPPUNIT_ASSERT_MESSAGE("verify that Key1/Value1", res == OS_SUCCESS && name.compareTo("Key1") == 0 && // is returned value.compareTo("Value1") == 0); res = pDb->getNext("Key1", name, value); CPPUNIT_ASSERT_MESSAGE("call getNext(\"Key1\", ...)", res == OS_SUCCESS && // verify that Key2/Value2 name.compareTo("Key2") == 0 && // is returned value.compareTo("Value2") == 0); res = pDb->getNext("Key2", name, value); CPPUNIT_ASSERT_MESSAGE("call getNext(\"Key2\", ...)", res == OS_SUCCESS && // verify that Key3/Value3 name.compareTo("Key3") == 0 && // is returned value.compareTo("Value3") == 0); res = pDb->getNext("Key3", name, value); CPPUNIT_ASSERT_MESSAGE("call getNext(\"Key3\", ...)", res == OS_SUCCESS && name.compareTo("Key4") == 0 && value.compareTo("Value4") == 0); res = pDb->getNext("Key4", name, value); CPPUNIT_ASSERT_MESSAGE("call getNext(\"Key4\", ...)", res == OS_NO_MORE_DATA && name.compareTo("") == 0 && value.compareTo("") == 0); res = pDb->getNext("XXX", name, value); CPPUNIT_ASSERT_MESSAGE("call getNext with a key not in the database and verify", res == OS_NOT_FOUND && name.compareTo("") == 0 && // that empty strings are value.compareTo("") == 0); // returned for the next name // and value pair. delete pDb; // delete the database name.remove(0); value.remove(0); } }