예제 #1
0
void expect_cb_rule(const ss_cb_rule& expected, const simservs::CBRule& actual)
{
  EXPECT_EQ(expected.conditions, actual.conditions());
  EXPECT_EQ(expected.allow_call, actual.allow_call());
}
예제 #2
0
// Determine if an arbitary rule's conditions apply to a call.
//
// @return true if the rule should be applied (i.e. the conditions hold)
bool CallServices::CallServiceBase::check_cb_rule(const simservs::CBRule& rule, pjsip_msg* msg)
{
  bool rule_matches = true;
  int conditions = rule.conditions();
  LOG_DEBUG("Testing call against conditions (0x%X)", conditions);

  if (conditions & simservs::Rule::CONDITION_ROAMING)
  {
    // Clearwater doesn't support roaming calls yet, this never applies
    LOG_DEBUG("Roaming condition fails");
    rule_matches = false;
  }
  if (conditions & simservs::Rule::CONDITION_INTERNATIONAL)
  {
    // Detect international calls, this requires the request URI to be a TEL URI or a SIP URI with a 'phone'
    // parameter set.  Then we need to look at the country code to determine if we're going international.
    std::string dialed_number;
    pjsip_uri *uri = msg->line.req.uri;
    if (PJSIP_URI_SCHEME_IS_TEL(uri))
    {
      LOG_DEBUG("TEL: Number dialed");
      pj_str_t* tel_number = &((pjsip_tel_uri *)uri)->number;
      dialed_number.assign(pj_strbuf(tel_number), pj_strlen(tel_number));
    }
    else if (PJSIP_URI_SCHEME_IS_SIP(uri))
    {
      LOG_DEBUG("SIP/SIPS: Number dialed");
      pjsip_sip_uri *sip_uri = (pjsip_sip_uri *)uri;

      // According to 3GPP TS 24.611 v11.2.0, only SIP UIRs with user=phone may be treated as international
      // unfortunately neither X-Lite nor Accession ever set this parameter.  Therefore we will look at any SIP username
      // as a potential international number.
      //
      // To restore the specced behaviour, uncomment the below:
      //
      // if (pj_stricmp2(&sip_uri->user_param, "phone") == 0)
      {
        pj_str_t *sip_number = &sip_uri->user;
        dialed_number.assign(pj_strbuf(sip_number), pj_strlen(sip_number));
      }
    }

    // If we have no number or it starts with our country code or doesn't start with '+', '00' or '011' it's
    // non-international.
    if (dialed_number == "")
    {
      LOG_DEBUG("SIP username requested, international number detection not possible");
      rule_matches = false;
    }
    else if (!(boost::starts_with(dialed_number, "+") ||
               boost::starts_with(dialed_number, "00") ||
               boost::starts_with(dialed_number, "011")) ||
             boost::starts_with(dialed_number, "+" + _country_code) ||
             boost::starts_with(dialed_number, "00" + _country_code) ||
             boost::starts_with(dialed_number, "011" + _country_code))
    {
      LOG_DEBUG("International condition fails, dialed number is '%s'", dialed_number.c_str());
      rule_matches = false;
    }
  }
  if (conditions & simservs::Rule::CONDITION_INTERNATIONAL_EXHC)
  {
    // Clearwater does not support roaming calls yet, this never applies
    LOG_DEBUG("International Excluding Home Country rule fails");
    rule_matches = false;
  }

  return rule_matches;
}