diff options
author | Henri Herscher <henri@oreka.org> | 2008-01-23 15:27:59 +0000 |
---|---|---|
committer | Henri Herscher <henri@oreka.org> | 2008-01-23 15:27:59 +0000 |
commit | 27add11974dffb1d3a6b48d140e3f8dd689c995d (patch) | |
tree | 3bf94676aa61d4b78fe0276b1c3faa7d021cf2eb | |
parent | f915e7cad47201430fdb9575ecd0a93efa0d1c2b (diff) |
Added SipIgnoredMediaAddresses config parameter. If a SIP INVITE has an RTP address that matches this csv list of CIDR ranges, it will be ignored.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@521 09dcff7a-b715-0410-9601-b79a96267cd0
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/RtpSession.cpp | 6 | ||||
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp | 31 | ||||
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/VoIpConfig.h | 2 | ||||
-rw-r--r-- | orkbasecxx/Utils.cpp | 77 | ||||
-rw-r--r-- | orkbasecxx/Utils.h | 13 | ||||
-rw-r--r-- | orkbasecxx/serializers/Serializer.cpp | 24 | ||||
-rw-r--r-- | orkbasecxx/serializers/Serializer.h | 4 |
7 files changed, 141 insertions, 16 deletions
diff --git a/orkaudio/audiocaptureplugins/voip/RtpSession.cpp b/orkaudio/audiocaptureplugins/voip/RtpSession.cpp index 9ed7360..31517d8 100644 --- a/orkaudio/audiocaptureplugins/voip/RtpSession.cpp +++ b/orkaudio/audiocaptureplugins/voip/RtpSession.cpp @@ -908,6 +908,12 @@ void RtpSessions::ReportSipInvite(SipInviteInfoRef& invite) char szFromRtpIp[16]; ACE_OS::inet_ntop(AF_INET, (void*)&invite->m_fromRtpIp, szFromRtpIp, sizeof(szFromRtpIp)); + if(DLLCONFIG.m_sipIgnoredMediaAddresses.Matches(invite->m_fromRtpIp)) + { + LOG4CXX_INFO(m_log, "INVITE disregarded by SipIgnoredMediaAddresses parameter"); + return; + } + CStdString ipAndPort = CStdString(szFromRtpIp) + "," + invite->m_fromRtpPort; std::map<CStdString, RtpSessionRef>::iterator pair; diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp index 4ab8abd..16e5574 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp +++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp @@ -95,6 +95,7 @@ void VoIpConfig::Define(Serializer* s) s->BoolValue("SipUse200OkMediaAddress", m_sipUse200OkMediaAddress); s->BoolValue("SipReportFullAddress", m_sipReportFullAddress); s->BoolValue("SipDynamicMediaAddress", m_sipDynamicMediaAddress); + s->IpRangesValue("SipIgnoredMediaAddresses", m_sipIgnoredMediaAddresses); s->BoolValue("UseMacIfNoLocalParty", m_useMacIfNoLocalParty); s->BoolValue("LocalPartyForceLocalIp", m_localPartyForceLocalIp); @@ -122,7 +123,7 @@ void VoIpConfig::Validate() } else { - throw (CStdString("VoIpConfig: invalid IP address in LanMasks:" + *it) + " please fix config.xml"); + throw (CStdString("VoIpConfig: invalid IP address in LanMasks:" + *it)); } } @@ -137,7 +138,7 @@ void VoIpConfig::Validate() } else { - throw (CStdString("VoIpConfig: invalid IP address in MediaGateways:" + *it) + " please fix config.xml"); + throw (CStdString("VoIpConfig: invalid IP address in MediaGateways:" + *it)); } } @@ -152,7 +153,7 @@ void VoIpConfig::Validate() } else { - throw (CStdString("VoIpConfig: invalid IP address in RtpTrackUsingIpAddresses:" + *it) + " please fix config.xml"); + throw (CStdString("VoIpConfig: invalid IP address in RtpTrackUsingIpAddresses:" + *it)); } } @@ -181,7 +182,7 @@ void VoIpConfig::Validate() catch (...) {notAnInt = true;} if(cidrPrefixLength < 1 || cidrPrefixLength > 32 || notAnInt) { - throw (CStdString("VoIpConfig: invalid CIDR prefix length in AllowedIpRanges:" + entry) + " please fix config.xml"); + throw (CStdString("VoIpConfig: invalid CIDR prefix length in AllowedIpRanges:" + entry)); } } else @@ -198,7 +199,7 @@ void VoIpConfig::Validate() } else { - throw (CStdString("VoIpConfig: invalid IP range in AllowedIpRanges:" + entry) + " please fix config.xml"); + throw (CStdString("VoIpConfig: invalid IP range in AllowedIpRanges:" + entry)); } } @@ -228,7 +229,7 @@ void VoIpConfig::Validate() catch (...) {notAnInt = true;} if(cidrPrefixLength < 1 || cidrPrefixLength > 32 || notAnInt) { - throw (CStdString("VoIpConfig: invalid CIDR prefix length in blockedIpRanges:" + entry) + " please fix config.xml"); + throw (CStdString("VoIpConfig: invalid CIDR prefix length in blockedIpRanges:" + entry)); } } else @@ -245,38 +246,38 @@ void VoIpConfig::Validate() } else { - throw (CStdString("VoIpConfig: invalid IP range in BlockedIpRanges:" + entry) + " please fix config.xml"); + throw (CStdString("VoIpConfig: invalid IP range in BlockedIpRanges:" + entry)); } } if(m_pcapSocketBufferSize < 0) { CStdString exception; - exception.Format("VoIpConfig: PcapSocketBufferSize must be a positive number (currently:%d) please fix config.xml", m_pcapSocketBufferSize); + exception.Format("VoIpConfig: PcapSocketBufferSize must be a positive number (currently:%d)", m_pcapSocketBufferSize); throw (exception); } if(m_rtpSessionTimeoutSec < 1) { CStdString exception; - exception.Format("VoIpConfig: RtpSessionTimeoutSec must be > 0 (currently:%d) please fix config.xml", m_rtpSessionTimeoutSec); + exception.Format("VoIpConfig: RtpSessionTimeoutSec must be > 0 (currently:%d)", m_rtpSessionTimeoutSec); throw (exception); } if(m_rtpSessionWithSignallingTimeoutSec < 1) { CStdString exception; - exception.Format("VoIpConfig: RtpSessionWithSignallingTimeoutSec must be > 0 (currently:%d) please fix config.xml", m_rtpSessionWithSignallingTimeoutSec); + exception.Format("VoIpConfig: RtpSessionWithSignallingTimeoutSec must be > 0 (currently:%d)", m_rtpSessionWithSignallingTimeoutSec); throw (exception); } if(m_rtpSessionOnHoldTimeOutSec < 1) { CStdString exception; - exception.Format("VoIpConfig: RtpSessionOnHoldTimeOutSec must be > 0 (currently:%d) please fix config.xml", m_rtpSessionOnHoldTimeOutSec); + exception.Format("VoIpConfig: RtpSessionOnHoldTimeOutSec must be > 0 (currently:%d)", m_rtpSessionOnHoldTimeOutSec); throw (exception); } if(m_rtpSessionWithSignallingInitialTimeoutSec < 1) { CStdString exception; - exception.Format("VoIpConfig: RtpSessionWithSignallingInitialTimeoutSec must be > 0 (currently:%d) please fix config.xml", m_rtpSessionWithSignallingInitialTimeoutSec); + exception.Format("VoIpConfig: RtpSessionWithSignallingInitialTimeoutSec must be > 0 (currently:%d)", m_rtpSessionWithSignallingInitialTimeoutSec); throw (exception); } if(m_sangomaRxTcpPortStart == 0) @@ -285,7 +286,7 @@ void VoIpConfig::Validate() else if(m_sangomaRxTcpPortStart > 65000 || m_sangomaRxTcpPortStart < 2000 || ((m_sangomaRxTcpPortStart%1000) != 0) ) { CStdString exception; - exception.Format("VoIpConfig: SangomaRxTcpPort must be between 2000 and 65000 and be a multiple of 1000 (currently:%d) please fix config.xml", m_sangomaRxTcpPortStart); + exception.Format("VoIpConfig: SangomaRxTcpPort must be between 2000 and 65000 and be a multiple of 1000 (currently:%d)", m_sangomaRxTcpPortStart); throw (exception); } if(m_sangomaTxTcpPortStart == 0) @@ -294,14 +295,14 @@ void VoIpConfig::Validate() else if(m_sangomaTxTcpPortStart > 65000 || m_sangomaTxTcpPortStart < 2000 || ((m_sangomaTxTcpPortStart%1000) != 0) ) { CStdString exception; - exception.Format("VoIpConfig: SangomaTxTcpPort must be between 2000 and 65000 and be a multiple of 1000 (currently:%d) please fix config.xml", m_sangomaTxTcpPortStart); + exception.Format("VoIpConfig: SangomaTxTcpPort must be between 2000 and 65000 and be a multiple of 1000 (currently:%d)", m_sangomaTxTcpPortStart); throw (exception); } if(m_sangomaRxTcpPortStart > m_sangomaTxTcpPortStart) { CStdString exception; - exception.Format("VoIpConfig: SangomaTxTcpPort should always be bigger than SangomaRxTcpPort please fix config.xml"); + exception.Format("VoIpConfig: SangomaTxTcpPort should always be bigger than SangomaRxTcpPort"); throw (exception); } else if(m_sangomaRxTcpPortStart > 0 && m_sangomaTxTcpPortStart>0) diff --git a/orkaudio/audiocaptureplugins/voip/VoIpConfig.h b/orkaudio/audiocaptureplugins/voip/VoIpConfig.h index f5e04c7..949736c 100644 --- a/orkaudio/audiocaptureplugins/voip/VoIpConfig.h +++ b/orkaudio/audiocaptureplugins/voip/VoIpConfig.h @@ -79,6 +79,8 @@ public: bool m_sipUse200OkMediaAddress; bool m_sipReportFullAddress; bool m_sipDynamicMediaAddress; + IpRanges m_sipIgnoredMediaAddresses; + bool m_useMacIfNoLocalParty; bool m_localPartyForceLocalIp; diff --git a/orkbasecxx/Utils.cpp b/orkbasecxx/Utils.cpp index 3a6bc84..272a90d 100644 --- a/orkbasecxx/Utils.cpp +++ b/orkbasecxx/Utils.cpp @@ -194,7 +194,7 @@ int FileSetOwnership(CStdString filename, CStdString owner, CStdString group) //===================================================== -// Network related stuff +// TcpAddress void TcpAddress::ToString(CStdString& string) { @@ -235,3 +235,78 @@ bool TcpAddressList::HasAddressOrAdd(struct in_addr ip, unsigned short port) return true; } +//========================= +// IpRanges + +void IpRanges::Compute() +{ + m_ipRangePrefixes.clear(); + m_ipRangeBitWidths.clear(); + std::list<CStdString>::iterator it; + + for(it = m_asciiIpRanges.begin(); it != m_asciiIpRanges.end(); it++) + { + CStdString cidrPrefixLengthString; + unsigned int cidrPrefixLength = 32; // by default, x.x.x.x/32 + CStdString cidrIpAddressString; + struct in_addr cidrIpAddress; + + CStdString entry = *it; + int slashPosition = entry.Find('/'); + if(slashPosition > 0) + { + cidrIpAddressString = entry.Left(slashPosition); + cidrPrefixLengthString = entry.Mid(slashPosition+1); + + bool notAnInt = false; + try + { + cidrPrefixLength = StringToInt(cidrPrefixLengthString); + } + catch (...) {notAnInt = true;} + if(cidrPrefixLength < 1 || cidrPrefixLength > 32 || notAnInt) + { + throw (CStdString("IpRanges: invalid CIDR prefix length" + entry)); + } + } + else + { + cidrIpAddressString = entry; + } + + if(ACE_OS::inet_aton((PCSTR)cidrIpAddressString, &cidrIpAddress)) + { + unsigned int rangeBitWidth = 32-cidrPrefixLength; + unsigned int prefix = ntohl((unsigned int)cidrIpAddress.s_addr) >> (rangeBitWidth); + m_ipRangePrefixes.push_back(prefix); + m_ipRangeBitWidths.push_back(rangeBitWidth); + } + else + { + throw (CStdString("invalid IP range:" + entry)); + } + } +} + +bool IpRanges::Matches(struct in_addr ip) +{ + bool matches = false; + std::list<unsigned int>::iterator bitWidthIt = m_ipRangeBitWidths.begin(); + std::list<unsigned int>::iterator prefixIt = m_ipRangePrefixes.begin(); + + while(prefixIt != m_ipRangePrefixes.end()) + { + unsigned int bitWidth = *bitWidthIt; + unsigned int prefix = *prefixIt; + unsigned int packetSourcePrefix = ntohl((unsigned int)ip.s_addr) >> bitWidth; + if(packetSourcePrefix == prefix) + { + matches = true; + break; + } + prefixIt++; + bitWidthIt++; + } + return matches; +} + diff --git a/orkbasecxx/Utils.h b/orkbasecxx/Utils.h index a0ef277..048d7c9 100644 --- a/orkbasecxx/Utils.h +++ b/orkbasecxx/Utils.h @@ -104,6 +104,19 @@ private: std::list<TcpAddress> m_addresses; }; +class DLL_IMPORT_EXPORT_ORKBASE IpRanges +{ +public: + bool Matches(struct in_addr ip); + void Compute(); + + std::list<CStdString> m_asciiIpRanges; +private: + std::list<unsigned int> m_ipRangePrefixes; + std::list<unsigned int> m_ipRangeBitWidths; +}; + + //===================================================== // Miscellanous stuff diff --git a/orkbasecxx/serializers/Serializer.cpp b/orkbasecxx/serializers/Serializer.cpp index b337070..3318833 100644 --- a/orkbasecxx/serializers/Serializer.cpp +++ b/orkbasecxx/serializers/Serializer.cpp @@ -134,6 +134,19 @@ void Serializer::DateValue(const char* key, time_t& value, bool required) } } +void Serializer::IpRangesValue(const char* key, IpRanges& value, bool required) +{ + if (m_deSerialize == true) + { + GetIpRanges(key, value, required); + } + else + { + AddIpRanges(key, value); + } +} + + //===================================== void Serializer::AddInt(const char* key, int value) @@ -231,6 +244,10 @@ void Serializer::AddDate(const char* key, time_t value) AddString(key, dateString); } +void Serializer::AddIpRanges(const char* key, IpRanges& value) +{ + ; // Not yet implemented +} //==================================================================== void Serializer::GetInt(const char* key, int&value, bool required) @@ -376,6 +393,13 @@ void Serializer::GetDate(const char* key, time_t& value, bool required) } } +void Serializer::GetIpRanges(const char* key, IpRanges& value, bool required) +{ + GetCsv(key, value.m_asciiIpRanges, required); + value.Compute(); +} + + //------------------------------------------------------------------------- // Escape the comma and percent characters for adding string to csv list void Serializer::EscapeCsv(CStdString& in, CStdString& out) diff --git a/orkbasecxx/serializers/Serializer.h b/orkbasecxx/serializers/Serializer.h index 832fbde..fc60b02 100644 --- a/orkbasecxx/serializers/Serializer.h +++ b/orkbasecxx/serializers/Serializer.h @@ -16,6 +16,7 @@ #pragma warning( disable: 4786 ) // disables truncated symbols in browse-info warning +#include "Utils.h" #include "dll.h" #include "OrkBase.h" #include <map> @@ -49,6 +50,7 @@ public: void CsvMapValue(const char* key, std::map<CStdString, CStdString>& value, bool required = false); void DateValue(const char* key, time_t& value, bool required = false); virtual void ListValue(const char* key, std::list<ObjectRef>& value, Object& model, bool required = false) = 0; + void IpRangesValue(const char* key, IpRanges& value, bool required = false); void AddInt(const char* key, int value); void AddDouble(const char* key, double value); @@ -58,6 +60,7 @@ public: void AddCsvMap(const char* key, std::map<CStdString, CStdString>& value); void AddDate(const char* key, time_t value); virtual void AddString(const char* key, CStdString& value) = 0; + void AddIpRanges(const char* key, IpRanges& value); void GetInt(const char* key, int& value, bool required = false); void GetDouble(const char* key, double& value, bool required = false); @@ -67,6 +70,7 @@ public: void GetCsvMap(const char* key, std::map<CStdString, CStdString>& value, bool required = false); void GetDate(const char* key, time_t& value, bool required = false); virtual void GetString(const char* key, CStdString& value, bool required = false) = 0; + void GetIpRanges(const char* key, IpRanges& value, bool required = false); void EscapeCsv(CStdString& in, CStdString& out); void UnEscapeCsv(CStdString& in, CStdString& out); |