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

Reply via email to