summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2008-01-23 15:27:59 +0000
committerHenri Herscher <henri@oreka.org>2008-01-23 15:27:59 +0000
commit27add11974dffb1d3a6b48d140e3f8dd689c995d (patch)
tree3bf94676aa61d4b78fe0276b1c3faa7d021cf2eb
parentf915e7cad47201430fdb9575ecd0a93efa0d1c2b (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.cpp6
-rw-r--r--orkaudio/audiocaptureplugins/voip/VoIpConfig.cpp31
-rw-r--r--orkaudio/audiocaptureplugins/voip/VoIpConfig.h2
-rw-r--r--orkbasecxx/Utils.cpp77
-rw-r--r--orkbasecxx/Utils.h13
-rw-r--r--orkbasecxx/serializers/Serializer.cpp24
-rw-r--r--orkbasecxx/serializers/Serializer.h4
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);