Module: sems Branch: master Commit: 16382b11dadf77df8f6bed713de22547b7b6dc96 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=16382b11dadf77df8f6bed713de22547b7b6dc96
Author: Carsten Bock <[email protected]> Committer: Carsten Bock <[email protected]> Date: Wed Feb 8 10:44:29 2012 +0100 Modified a-lines-Filter: - "sdp_alines_filter" is now either "blacklist" or "whitelist" (or disabled) - "sdp_alinesfilter_list" contains now a list of "a="-lines, which are either blacklisted or whitelisted Example: sdp_alines_filter=blacklist sdp_alinesfilter_list=crypto,nortpproxy (this would remove the "crypto" and "nortpproxy"-lines) - updated the sample configuration (transparent.sbcprofile.conf) Thanks to Stefan Sayer for suggestions. --- apps/sbc/SBC.cpp | 20 ++++++++-- apps/sbc/SBCCallProfile.cpp | 24 ++++++++++++- apps/sbc/SBCCallProfile.h | 7 +++- apps/sbc/SDPFilter.cpp | 56 ++++++++++++++++++++++-------- apps/sbc/SDPFilter.h | 3 +- apps/sbc/etc/transparent.sbcprofile.conf | 4 ++ 6 files changed, 92 insertions(+), 22 deletions(-) diff --git a/apps/sbc/SBC.cpp b/apps/sbc/SBC.cpp index c154d72..dc6047b 100644 --- a/apps/sbc/SBC.cpp +++ b/apps/sbc/SBC.cpp @@ -843,7 +843,7 @@ void SBCDialog::onInvite(const AmSipRequest& req) removeHeader(invite_req.hdrs,PARAM_HDR); removeHeader(invite_req.hdrs,"P-App-Name"); - if (call_profile.sdpfilter_enabled) { + if ((call_profile.sdpfilter_enabled) || (call_profile.sdpalinesfilter_enabled)) { b2b_mode = B2BMode_SDPFilter; } @@ -1034,12 +1034,18 @@ int SBCDialog::relayEvent(AmEvent* ev) { int SBCDialog::filterBody(AmSdp& sdp, bool is_a2b) { if (call_profile.sdpfilter_enabled) { // normalize SDP - normalizeSDP(sdp, call_profile.anonymize_sdp, call_profile.filter_sdp_alines); + normalizeSDP(sdp, call_profile.anonymize_sdp); // filter SDP if (call_profile.sdpfilter != Transparent) { filterSDP(sdp, call_profile.sdpfilter, call_profile.sdpfilter_list); } } + if (call_profile.sdpalinesfilter_enabled) { + // filter SDP "a=lines" + if (call_profile.sdpalinesfilter != Transparent) { + filterSDPalines(sdp, call_profile.sdpalinesfilter, call_profile.sdpalinesfilter_list); + } + } return 0; } @@ -1589,7 +1595,7 @@ SBCCalleeSession::SBCCalleeSession(const AmB2BCallerSession* caller, { dlg.setRel100State(Am100rel::REL100_IGNORED); - if (call_profile.sdpfilter_enabled) { + if ((call_profile.sdpfilter_enabled) || (call_profile.sdpalinesfilter_enabled)){ b2b_mode = B2BMode_SDPFilter; } @@ -1713,12 +1719,18 @@ void SBCCalleeSession::onSendRequest(AmSipRequest& req, int flags) int SBCCalleeSession::filterBody(AmSdp& sdp, bool is_a2b) { if (call_profile.sdpfilter_enabled) { // normalize SDP - normalizeSDP(sdp, call_profile.anonymize_sdp, call_profile.filter_sdp_alines); + normalizeSDP(sdp, call_profile.anonymize_sdp); // filter SDP if (call_profile.sdpfilter != Transparent) { filterSDP(sdp, call_profile.sdpfilter, call_profile.sdpfilter_list); } } + if (call_profile.sdpalinesfilter_enabled) { + // filter SDP "a=lines" + if (call_profile.sdpalinesfilter != Transparent) { + filterSDPalines(sdp, call_profile.sdpalinesfilter, call_profile.sdpalinesfilter_list); + } + } return 0; } diff --git a/apps/sbc/SBCCallProfile.cpp b/apps/sbc/SBCCallProfile.cpp index 9bff899..2a6c099 100644 --- a/apps/sbc/SBCCallProfile.cpp +++ b/apps/sbc/SBCCallProfile.cpp @@ -113,9 +113,26 @@ bool SBCCallProfile::readFromConfiguration(const string& name, sdpfilter_list.insert(c); } anonymize_sdp = cfg.getParameter("sdp_anonymize", "no") == "yes"; - filter_sdp_alines = cfg.getParameter("filter_sdp_alines", "no") == "yes"; } + string cfg_sdp_alines_filter = cfg.getParameter("sdp_alines_filter"); + if (cfg_sdp_alines_filter=="whitelist") { + sdpalinesfilter_enabled = true; + sdpalinesfilter = Whitelist; + } else if (cfg_sdp_alines_filter=="blacklist") { + sdpalinesfilter_enabled = true; + sdpalinesfilter = Blacklist; + } else { + sdpalinesfilter_enabled = false; + } + if (sdpalinesfilter_enabled) { + vector<string> c_elems = explode(cfg.getParameter("sdp_alinesfilter_list"), ","); + for (vector<string>::iterator it=c_elems.begin(); it != c_elems.end(); it++) { + string c = *it; + std::transform(c.begin(), c.end(), c.begin(), ::tolower); + sdpalinesfilter_list.insert(c); + } + } sst_enabled = cfg.getParameter("enable_session_timer"); if (cfg.hasParameter("enable_aleg_session_timer")) { @@ -318,6 +335,9 @@ bool SBCCallProfile::readFromConfiguration(const string& name, INFO("SBC: SDP filter is %sabled, %s, %zd items in list, %sanonymizing SDP\n", sdpfilter_enabled?"en":"dis", FilterType2String(sdpfilter), sdpfilter_list.size(), anonymize_sdp?"":"not "); + INFO("SBC: SDP alines-filter is %sabled, %s, %zd items in list\n", + sdpalinesfilter_enabled?"en":"dis", FilterType2String(sdpalinesfilter), + sdpalinesfilter_list.size()); INFO("SBC: RTP relay %sabled\n", rtprelay_enabled?"en":"dis"); if (rtprelay_enabled) { @@ -475,6 +495,8 @@ string SBCCallProfile::print() const { res += "sdpfilter_enabled: " + string(sdpfilter_enabled?"true":"false") + "\n"; res += "sdpfilter: " + string(FilterType2String(sdpfilter)) + "\n"; res += "sdpfilter_list: " + stringset_print(sdpfilter_list) + "\n"; + res += "sdpalinesfilter: " + string(FilterType2String(sdpalinesfilter)) + "\n"; + res += "sdpalinesfilter_list: " + stringset_print(sdpalinesfilter_list) + "\n"; res += "sst_enabled: " + sst_enabled + "\n"; res += "sst_aleg_enabled: " + sst_aleg_enabled + "\n"; res += "auth_enabled: " + string(auth_enabled?"true":"false") + "\n"; diff --git a/apps/sbc/SBCCallProfile.h b/apps/sbc/SBCCallProfile.h index 5b3e567..f9991bc 100644 --- a/apps/sbc/SBCCallProfile.h +++ b/apps/sbc/SBCCallProfile.h @@ -85,7 +85,10 @@ struct SBCCallProfile FilterType sdpfilter; set<string> sdpfilter_list; bool anonymize_sdp; - bool filter_sdp_alines; + + bool sdpalinesfilter_enabled; + FilterType sdpalinesfilter; + set<string> sdpalinesfilter_list; string sst_enabled; string sst_aleg_enabled; @@ -126,6 +129,8 @@ struct SBCCallProfile messagefilter(Transparent), sdpfilter_enabled(false), sdpfilter(Transparent), + sdpalinesfilter_enabled(false), + sdpalinesfilter(Transparent), auth_enabled(false), next_hop_port_i(0), rtprelay_enabled(false), diff --git a/apps/sbc/SDPFilter.cpp b/apps/sbc/SDPFilter.cpp index c0d0982..a6eaebf 100644 --- a/apps/sbc/SDPFilter.cpp +++ b/apps/sbc/SDPFilter.cpp @@ -101,22 +101,50 @@ void fix_incomplete_silencesupp(SdpMedia& m) { } } -void filter_alines(SdpMedia& m) { +std::vector<SdpAttribute> filterAlinesInternal(std::vector<SdpAttribute> list, + FilterType sdpalinesfilter, const std::set<string>& sdpalinesfilter_list) { + std::vector<SdpAttribute> new_alines; for (std::vector<SdpAttribute>::iterator a_it = - m.attributes.begin(); a_it != m.attributes.end(); a_it++) { - // Various Attributes are added by the SDP-Parser itself, such as rtpmap, ftmp, etc. - if ((a_it->attribute == "silenceSupp") - || (a_it->attribute == "ptime")) { - new_alines.push_back(*a_it); - } else { - DBG("Dropped SDP-Attribute: '%s':'%s'\n", a_it->attribute.c_str(), a_it->value.c_str()); - } + list.begin(); a_it != list.end(); a_it++) { + + // Case insensitive search: + string c = a_it->attribute; + std::transform(c.begin(), c.end(), c.begin(), ::tolower); + + // Check, if this should be filtered: + bool is_filtered = (sdpalinesfilter == Whitelist) ^ + (sdpalinesfilter_list.find(c) != sdpalinesfilter_list.end()); + + DBG("%s (%s) is_filtered: %s\n", a_it->attribute.c_str(), c.c_str(), + is_filtered?"true":"false"); + + // If it is not filtered, just add it to the list: + if (!is_filtered) + new_alines.push_back(*a_it); } - m.attributes = new_alines; + return new_alines; } -int normalizeSDP(AmSdp& sdp, bool anonymize_sdp, bool filter_sdp_alines) { +int filterSDPalines(AmSdp& sdp, FilterType sdpalinesfilter, const std::set<string>& sdpalinesfilter_list) { + // If not Black- or Whitelist, simply return + if (sdpalinesfilter == Transparent) + return 0; + + // We start with per Session-alines + sdp.attributes = filterAlinesInternal(sdp.attributes, sdpalinesfilter, sdpalinesfilter_list); + + for (std::vector<SdpMedia>::iterator m_it = + sdp.media.begin(); m_it != sdp.media.end(); m_it++) { + SdpMedia& media = *m_it; + // todo: what if no payload supported any more? + media.attributes = filterAlinesInternal(media.attributes, sdpalinesfilter, sdpalinesfilter_list); + } + + return 0; +} + +int normalizeSDP(AmSdp& sdp, bool anonymize_sdp) { for (std::vector<SdpMedia>::iterator m_it= sdp.media.begin(); m_it != sdp.media.end(); m_it++) { if (m_it->type != MT_AUDIO && m_it->type != MT_VIDEO) @@ -128,10 +156,6 @@ int normalizeSDP(AmSdp& sdp, bool anonymize_sdp, bool filter_sdp_alines) { // fix incomplete silenceSupp attributes (see RFC3108) // (only media level - RFC3108 4.) fix_incomplete_silencesupp(*m_it); - - // Filter SDP A-Lines, if wanted: - if (filter_sdp_alines) - filter_alines(*m_it); } if (anonymize_sdp) { @@ -146,3 +170,5 @@ int normalizeSDP(AmSdp& sdp, bool anonymize_sdp, bool filter_sdp_alines) { return 0; } + + diff --git a/apps/sbc/SDPFilter.h b/apps/sbc/SDPFilter.h index 4096c2d..f422715 100644 --- a/apps/sbc/SDPFilter.h +++ b/apps/sbc/SDPFilter.h @@ -36,8 +36,9 @@ using std::string; int filterSDP(AmSdp& sdp, FilterType sdpfilter, const std::set<string>& sdpfilter_list); +int filterSDPalines(AmSdp& sdp, FilterType sdpalinesfilter, const std::set<string>& sdpalinesfilter_list); /** normalize SDP, fixing some common issues */ -int normalizeSDP(AmSdp& sdp, bool anonymize_sdp, bool filter_sdp_alines); +int normalizeSDP(AmSdp& sdp, bool anonymize_sdp); #endif diff --git a/apps/sbc/etc/transparent.sbcprofile.conf b/apps/sbc/etc/transparent.sbcprofile.conf index 4a055c0..f5fd8ec 100644 --- a/apps/sbc/etc/transparent.sbcprofile.conf +++ b/apps/sbc/etc/transparent.sbcprofile.conf @@ -48,6 +48,10 @@ #message_list= #sdp_filter=whitelist #sdpfilter_list=g729,g723,ilbc,speex,gsm,amr +# Filter A-Lines: Either black or whitelist +#sdp_alines_filter=whitelist +# Lines to be filtered, separated by "," +#sdp_alinesfilter_list=crypto,x-cap #sdp_anonymize=yes ## append extra headers _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
