UtlBoolean SipLine::matchesIdentity(const Url& identity) const { UtlBoolean bMatch = false ; // First, try identify if (identity.isUserHostPortEqual(mIdentity, SIP_PORT)) { bMatch = true ; } else { if (identity.isUserHostPortEqual(mCanonicalUrl, SIP_PORT)) { bMatch = true ; } } // Finally, try aliases for (size_t i=0; !bMatch && i<mAliases.entries(); i++) { UtlString* pAlias = (UtlString*) mAliases.at(i) ; assert(pAlias != NULL) ; if (pAlias != NULL) { Url aliasUrl(pAlias->data()) ; if (identity.isUserHostPortEqual(aliasUrl, SIP_PORT)) { bMatch = true ; } } } return bMatch; }
UtlBoolean SipLine::matchesUserId(const char* szUserId) const { UtlString matchUserId(szUserId) ; UtlString lineUserId ; UtlString host ; UtlBoolean bMatch = false ; // First, try identify mIdentity.getUserId(lineUserId); mIdentity.getHostAddress(host) ; // if host is empty, assume invalid line if (!host.isNull() && matchUserId.compareTo(lineUserId) == 0) // Case sensitive { bMatch = true ; } else { // Next, try preferred contact lineUserId.remove(0) ; mPreferredContactUri.getUserId(lineUserId) ; host.remove(0); mPreferredContactUri.getHostAddress(host) ; // if host is empty, assume invalid line if (!host.isNull() && matchUserId.compareTo(lineUserId) == 0) // Case sensitive { bMatch = true ; } } // Finally, try aliases for (size_t i=0; !bMatch && i<mAliases.entries(); i++) { UtlString* pAlias = (UtlString*) mAliases.at(i) ; assert(pAlias != NULL) ; if (pAlias != NULL) { Url aliasUrl(pAlias->data()) ; lineUserId.remove(0) ; aliasUrl.getUserId(lineUserId) ; host.remove(0); aliasUrl.getHostAddress(host) ; // if host is empty, assume invalid line if (!host.isNull() && matchUserId.compareTo(lineUserId) == 0) // Case sensitive { bMatch = true ; } } } return bMatch; }
// Constructor SipRegistrar::SipRegistrar(OsConfigDb* configDb) : OsServerTask("SipRegistrar", NULL, SIPUA_DEFAULT_SERVER_OSMSG_QUEUE_SIZE), mConfigDb(configDb), mSipUserAgent(NULL), mRedirectServer(NULL), mRedirectMsgQ(NULL), // Create the SipRegistrarServer object so it will be available immediately, // but don't start the associated thread until the registrar is operational. mRegistrarServer(new SipRegistrarServer(*this)), mRegistrarMsgQ(NULL), mRegisterEventServer(NULL), mRegistrarPersist(NULL), mpRegDb(NULL), mpSubscribeDb(NULL), mpEntityDb(NULL) { Os::Logger::instance().log(FAC_SIP, PRI_DEBUG, "SipRegistrar::SipRegistrar constructed."); // Some phones insist (incorrectly) on putting the proxy port number on urls; // we get it from the configuration so that we can ignore it. mProxyNormalPort = mConfigDb->getPort("SIP_REGISTRAR_PROXY_PORT"); if (mProxyNormalPort == PORT_DEFAULT) { mProxyNormalPort = SIP_PORT; } // Domain Name mConfigDb->get("SIP_REGISTRAR_DOMAIN_NAME", mDefaultDomain); if ( mDefaultDomain.isNull() ) { OsSocket::getHostIp(&mDefaultDomain); Os::Logger::instance().log(FAC_SIP, PRI_CRIT, "SIP_REGISTRAR_DOMAIN_NAME not configured using IP '%s'", mDefaultDomain.data() ); } // get the url parts for the domain Url defaultDomainUrl(mDefaultDomain); mDefaultDomainPort = defaultDomainUrl.getHostPort(); defaultDomainUrl.getHostAddress(mDefaultDomainHost); // make sure that the unspecified domain name is also valid addValidDomain(mDefaultDomainHost, mDefaultDomainPort); // read the domain configuration OsConfigDb domainConfig; domainConfig.loadFromFile(SipXecsService::domainConfigPath()); // Domain Aliases // (other domain names that this registrar accepts as valid in the request URI) UtlString domainAliases; domainConfig.get(SipXecsService::DomainDbKey::SIP_DOMAIN_ALIASES, domainAliases); if (!domainAliases.isNull()) { Os::Logger::instance().log(FAC_SIP, PRI_DEBUG, "SipRegistrar::SipRegistrar " "SIP_DOMAIN_ALIASES : %s", domainAliases.data()); } else { Os::Logger::instance().log(FAC_SIP, PRI_ERR, "SipRegistrar::SipRegistrar " "SIP_DOMAIN_ALIASES not found."); } UtlString aliasString; int aliasIndex = 0; while(NameValueTokenizer::getSubField(domainAliases.data(), aliasIndex, ", \t", &aliasString)) { Url aliasUrl(aliasString); UtlString hostAlias; aliasUrl.getHostAddress(hostAlias); int port = aliasUrl.getHostPort(); addValidDomain(hostAlias,port); aliasIndex++; } mongo::ConnectionString mongoConn = MongoDB::ConnectionInfo::connectionStringFromFile(); mpRegDb = new RegDB(MongoDB::ConnectionInfo(mongoConn, RegDB::NS)); mpSubscribeDb = new SubscribeDB(MongoDB::ConnectionInfo(mongoConn, SubscribeDB::NS)); mpEntityDb = new EntityDB(MongoDB::ConnectionInfo(mongoConn, EntityDB::NS)); mConfigDb->get("SIP_REGISTRAR_BIND_IP", mBindIp); if ((mBindIp.isNull()) || !OsSocket::isIp4Address(mBindIp)) { mBindIp = "0.0.0.0"; } }
// Constructor SipRegistrar::SipRegistrar(OsConfigDb* configDb) : OsServerTask("SipRegistrar", NULL, SIPUA_DEFAULT_SERVER_OSMSG_QUEUE_SIZE), mConfigDb(configDb), mRegistrationDB(RegistrationDB::getInstance()), // implicitly loads database mHttpServer(NULL), mXmlRpcDispatch(NULL), mReplicationConfigured(false), mSipUserAgent(NULL), mRedirectServer(NULL), mRedirectMsgQ(NULL), // Create the SipRegistrarServer object so it will be available immediately, // but don't start the associated thread until the registrar is operational. mRegistrarServer(new SipRegistrarServer(*this)), mRegistrarMsgQ(NULL), mRegistrarInitialSync(NULL), mRegistrarSync(NULL), mRegisterEventServer(NULL), mRegistrarTest(NULL), mRegistrarPersist(NULL) { OsSysLog::add(FAC_SIP, PRI_DEBUG, "SipRegistrar::SipRegistrar constructed."); mHttpPort = mConfigDb->getPort("SIP_REGISTRAR_XMLRPC_PORT"); if (PORT_NONE == mHttpPort) { OsSysLog::add(FAC_SIP, PRI_NOTICE, "SipRegistrar::SipRegistrar" " SIP_REGISTRAR_XMLRPC_PORT == PORT_NONE :" " peer synchronization disabled" ); } else // HTTP/RPC port is configured { if (PORT_DEFAULT == mHttpPort) { mHttpPort = SIP_REGISTRAR_DEFAULT_XMLRPC_PORT; } configurePeers(); } // Some phones insist (incorrectly) on putting the proxy port number on urls; // we get it from the configuration so that we can ignore it. mProxyNormalPort = mConfigDb->getPort("SIP_REGISTRAR_PROXY_PORT"); if (mProxyNormalPort == PORT_DEFAULT) { mProxyNormalPort = SIP_PORT; } // Domain Name mConfigDb->get("SIP_REGISTRAR_DOMAIN_NAME", mDefaultDomain); if ( mDefaultDomain.isNull() ) { OsSocket::getHostIp(&mDefaultDomain); OsSysLog::add(FAC_SIP, PRI_CRIT, "SIP_REGISTRAR_DOMAIN_NAME not configured using IP '%s'", mDefaultDomain.data() ); } // get the url parts for the domain Url defaultDomainUrl(mDefaultDomain); mDefaultDomainPort = defaultDomainUrl.getHostPort(); defaultDomainUrl.getHostAddress(mDefaultDomainHost); // make sure that the unspecified domain name is also valid addValidDomain(mDefaultDomainHost, mDefaultDomainPort); // read the domain configuration OsConfigDb domainConfig; domainConfig.loadFromFile(SipXecsService::domainConfigPath()); // Domain Aliases // (other domain names that this registrar accepts as valid in the request URI) UtlString domainAliases; domainConfig.get(SipXecsService::DomainDbKey::SIP_DOMAIN_ALIASES, domainAliases); if (!domainAliases.isNull()) { OsSysLog::add(FAC_SIP, PRI_DEBUG, "SipRegistrar::SipRegistrar " "SIP_DOMAIN_ALIASES : %s", domainAliases.data()); } else { OsSysLog::add(FAC_SIP, PRI_ERR, "SipRegistrar::SipRegistrar " "SIP_DOMAIN_ALIASES not found."); } UtlString aliasString; int aliasIndex = 0; while(NameValueTokenizer::getSubField(domainAliases.data(), aliasIndex, ", \t", &aliasString)) { Url aliasUrl(aliasString); UtlString hostAlias; aliasUrl.getHostAddress(hostAlias); int port = aliasUrl.getHostPort(); addValidDomain(hostAlias,port); aliasIndex++; } mConfigDb->get("SIP_REGISTRAR_BIND_IP", mBindIp); if ((mBindIp.isNull()) || !OsSocket::isIp4Address(mBindIp)) { mBindIp = "0.0.0.0"; } }