int inplaceHeaderFilter(string& hdrs, const set<string>& headerfilter_list, FilterType f_type) {
   if (!hdrs.length() || !isActiveFilter(f_type))
	return 0;

    int res = 0;
    size_t start_pos = 0;
    while (start_pos<hdrs.length()) {
	size_t name_end, val_begin, val_end, hdr_end;
	if ((res = skip_header(hdrs, start_pos, name_end, val_begin,
			       val_end, hdr_end)) != 0) {
	    return res;
	}
	string hdr_name = hdrs.substr(start_pos, name_end-start_pos);
	transform(hdr_name.begin(), hdr_name.end(), hdr_name.begin(), ::tolower);
	bool erase = false;
	if (f_type == Whitelist) {
	    erase = headerfilter_list.find(hdr_name)==headerfilter_list.end();
	} else if (f_type == Blacklist) {
	    erase = headerfilter_list.find(hdr_name)!=headerfilter_list.end();
	}
	if (erase) {
	    DBG("erasing header '%s'\n", hdr_name.c_str());
	    hdrs.erase(start_pos, hdr_end-start_pos);
	} else {
	    start_pos = hdr_end;
	}
    }

    // todo: multi-line header support

    return res;
}
Esempio n. 2
0
int inplaceHeaderFilter(string& hdrs, const vector<FilterEntry>& filter_list) {
    if (!hdrs.length() || ! filter_list.size())
	return 0;

    DBG("applying %zd header filters\n", filter_list.size());

    for (vector<FilterEntry>::const_iterator fe =
	     filter_list.begin(); fe != filter_list.end(); fe++) {
	const set<string>& headerfilter_list = fe->filter_list;
	const FilterType& f_type = fe->filter_type; 

	if (!isActiveFilter(f_type))
	  continue;

	// todo: multi-line header support

	size_t start_pos = 0;
	while (start_pos<hdrs.length()) {
	    size_t name_end, val_begin, val_end, hdr_end;
	    int res;
	    if ((res = skip_header(hdrs, start_pos, name_end, val_begin,
				   val_end, hdr_end)) != 0) {
		return res;
	    }
	    string hdr_name = hdrs.substr(start_pos, name_end-start_pos);
	    std::transform(hdr_name.begin(), hdr_name.end(), hdr_name.begin(), ::tolower);
	    bool erase = false;
	    if (f_type == Whitelist) {
		erase = headerfilter_list.find(hdr_name)==headerfilter_list.end();
	    } else if (f_type == Blacklist) {
		erase = headerfilter_list.find(hdr_name)!=headerfilter_list.end();
	    }
	    if (erase) {
		DBG("erasing header '%s' by %s\n", hdr_name.c_str(), FilterType2String(f_type));
		hdrs.erase(start_pos, hdr_end-start_pos);
	    } else {
		start_pos = hdr_end;
	    }
	}

    }

    return 0;
}
int filterSDPalines(AmSdp& sdp, FilterType sdpalinesfilter,
		    const std::set<string>& sdpalinesfilter_list) {
  // If not Black- or Whitelist, simply return
  if (!isActiveFilter(sdpalinesfilter))
    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 filterSDP(AmSdp& sdp, FilterType sdpfilter, const std::set<string>& sdpfilter_list) {

  if (!isActiveFilter(sdpfilter))
    return 0;

  for (std::vector<SdpMedia>::iterator m_it =
	 sdp.media.begin(); m_it != sdp.media.end(); m_it++) {
    SdpMedia& media = *m_it;

    std::vector<SdpPayload> new_pl;
    for (std::vector<SdpPayload>::iterator p_it =
	   media.payloads.begin(); p_it != media.payloads.end(); p_it++) {
      
      string c = p_it->encoding_name;
      std::transform(c.begin(), c.end(), c.begin(), ::tolower);
      
      bool is_filtered =  (sdpfilter == Whitelist) ^
	(sdpfilter_list.find(c) != sdpfilter_list.end());

      // DBG("%s (%s) is_filtered: %s\n", p_it->encoding_name.c_str(), c.c_str(), 
      // 	  is_filtered?"true":"false");

      if (!is_filtered)
	new_pl.push_back(*p_it);
    }
    if (new_pl.empty()) {
      // in case of SDP offer we could remove media line but in case of answer
      // we should just reject the stream by setting port to 0 (at least one
      // format must be given; see RFC 3264, sect. 6)
      media.port = 0;
      if (media.payloads.size() > 1) 
        media.payloads.erase(media.payloads.begin() + 1, media.payloads.end());
    }
    else media.payloads = new_pl;    
  }

  return 0;
}