Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@
SELECT * FROM restcomm_incoming_phone_numbers;
</select>

<select id="getIncomingPhoneNumbersRegex" resultType="hashmap">
SELECT * FROM restcomm_incoming_phone_numbers WHERE phone_number like '%*%' or phone_number like '%#%' or phone_number like '%^%' or phone_number like '%|%' or phone_number like '%.%' or phone_number like '%$%' or phone_number like '%\%' or phone_number like '%[%' or phone_number like '%]%' ;
</select>
<!--
<select id="getIncomingPhoneNumbersByFriendlyName" parameterType="string" resultType="hashmap">
SELECT * FROM restcomm_incoming_phone_numbers WHERE account_sid=#{accountSid}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@
<select id="getAllIncomingPhoneNumbers" resultType="hashmap">
SELECT * FROM "restcomm_incoming_phone_numbers";
</select>
<!-- Does a search in the DB and find phone numbers that contain characters different from -->
<select id="getIncomingPhoneNumbersRegex" resultType="hashmap">
SELECT * FROM "restcomm_incoming_phone_numbers" WHERE "phone_number" like '%*%' or "phone_number" like '%#%' or "phone_number" like '%^%' or "phone_number" like '%|%' or "phone_number" like '%.%' or "phone_number" like '%$%' or "phone_number" like '%\%' or "phone_number" like '%[%' or "phone_number" like '%]%' ;
</select>

<!--
<select id="getIncomingPhoneNumbersByFriendlyName" parameterType="string" resultType="hashmap">
Expand Down Expand Up @@ -84,4 +88,4 @@
"ussd_fallback_url"=#{ussd_fallback_url}, "ussd_fallback_method"=#{ussd_fallback_method}, "ussd_application_sid"=#{ussd_application_sid},
"refer_url"=#{refer_url}, "refer_method"=#{refer_method}, "refer_application_sid"=#{refer_application_sid} WHERE "sid"=#{sid};
</update>
</mapper>
</mapper>
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,5 @@ public interface IncomingPhoneNumbersDao {
void updateIncomingPhoneNumber(IncomingPhoneNumber incomingPhoneNumber);

List<IncomingPhoneNumber> getAllIncomingPhoneNumbers();
List<IncomingPhoneNumber> getIncomingPhoneNumbersRegex();
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,12 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.restcomm.connect.dao.DaoUtils;
import org.restcomm.connect.dao.IncomingPhoneNumbersDao;
Expand All @@ -43,6 +46,7 @@
public final class MybatisIncomingPhoneNumbersDao implements IncomingPhoneNumbersDao {
private static final String namespace = "org.mobicents.servlet.sip.restcomm.dao.IncomingPhoneNumbersDao.";
private final SqlSessionFactory sessions;
private final Logger logger = Logger.getLogger(MybatisIncomingPhoneNumbersDao.class.getName());

public MybatisIncomingPhoneNumbersDao(final SqlSessionFactory sessions) {
super();
Expand Down Expand Up @@ -70,19 +74,83 @@ public IncomingPhoneNumber getIncomingPhoneNumber(final String phoneNumber) {
return getIncomingPhoneNumber("getIncomingPhoneNumberByValue", phoneNumber);
}

private IncomingPhoneNumber getIncomingPhoneNumber(final String selector, Object parameter) {
private IncomingPhoneNumber getIncomingPhoneNumber(final String selector, Object parameter) {
final SqlSession session = sessions.openSession();
try {
String inboundPhoneNumber = null;
try {
final Map<String, Object> result = session.selectOne(namespace + selector, parameter);
if (result != null) {
if (result != null ) {
return toIncomingPhoneNumber(result);
} else {
return null;
}
} finally {
//check if there is a Regex match only if parameter is a String aka phone Number
if(!(parameter instanceof Sid)){
// inboundPhoneNumber = parameter.toString().replace("+1", "");
if (logger.isInfoEnabled()) {
logger.info("About to check for REGEX incoming phone number for phoneNumber : " + inboundPhoneNumber);
}
return checkIncomingPhoneNumberRegexMatch(selector, inboundPhoneNumber);
}

}finally {
session.close();
}
return null;

}

public IncomingPhoneNumber checkIncomingPhoneNumberRegexMatch ( String selector, String inBoundPhoneNumber){
final SqlSession session = sessions.openSession();
String phoneRegexPattern = null;
try {
List<IncomingPhoneNumber> listPhones = getIncomingPhoneNumbersRegex();
if (logger.isInfoEnabled()) {
String msg = String.format("Found %d Regex IncomingPhone numbers",listPhones.size());
logger.info(msg);
}
for (IncomingPhoneNumber listPhone : listPhones){
if (listPhone.getPhoneNumber().startsWith("+")){
phoneRegexPattern = listPhone.getPhoneNumber().replace("+", "/+");
}else if (listPhone.getPhoneNumber().startsWith("*")){
phoneRegexPattern = listPhone.getPhoneNumber().replace("*", "/*");
}else{
phoneRegexPattern = listPhone.getPhoneNumber();
}
Pattern p = Pattern.compile(phoneRegexPattern);
Matcher m = p.matcher(inBoundPhoneNumber);
if (m.find()) {
final Map<String, Object> resultRestcommRegexHostedNumber = session.selectOne(namespace + selector, phoneRegexPattern);
if (resultRestcommRegexHostedNumber != null) {
if (logger.isInfoEnabled()) {
String msg = String.format("Pattern \"%s\" matched the phone number \"%s\"",phoneRegexPattern, inBoundPhoneNumber);
logger.info(msg);
}
return toIncomingPhoneNumber(resultRestcommRegexHostedNumber);
} else{
if (logger.isInfoEnabled()) {
String msg = String.format("Error, Regex \"%s\" cannot be matched for phone number \"%s\"", phoneRegexPattern, inBoundPhoneNumber);
logger.info(msg);
}
}
} else {
if (logger.isInfoEnabled()) {
String msg = String.format("Error, Regex \"%s\" cannot be matched for phone number \"%s\"", phoneRegexPattern, inBoundPhoneNumber);
logger.info(msg);
}
}
}
logger.info("No matching phone number found, make sure your Restcomm Regex phone number is correctly defined");
} catch (Exception e) {
if (logger.isDebugEnabled()) {
String msg = String.format("Exception while trying to match for a REGEX incoming phone number");
logger.debug(msg);
}
}
finally {
session.close();
}
}
return null;

}

@Override
public List<IncomingPhoneNumber> getIncomingPhoneNumbers(final Sid accountSid) {
Expand Down Expand Up @@ -119,6 +187,23 @@ public List<IncomingPhoneNumber> getAllIncomingPhoneNumbers() {
}
}

@Override
public List<IncomingPhoneNumber> getIncomingPhoneNumbersRegex() {
final SqlSession session = sessions.openSession();
try {
final List<Map<String, Object>> results = session.selectList(namespace + "getIncomingPhoneNumbersRegex");
final List<IncomingPhoneNumber> incomingPhoneNumbers = new ArrayList<IncomingPhoneNumber>();
if (results != null && !results.isEmpty()) {
for (final Map<String, Object> result : results) {
incomingPhoneNumbers.add(toIncomingPhoneNumber(result));
}
}
return incomingPhoneNumbers;
} finally {
session.close();
}
}

@Override
public List<IncomingPhoneNumber> getIncomingPhoneNumbersByFilter(IncomingPhoneNumberFilter filter) {
final SqlSession session = sessions.openSession();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,7 @@ private void invite(final Object message) throws IOException, NumberParseExcepti
SipURI outboundIntf = outboundInterface(transport);

if(logger.isInfoEnabled()) {
logger.info("ToUser: " + toUser);
logger.info("ToHost: " + toHost);
logger.info("ruri: " + ruri);
logger.info("myHostIp: " + myHostIp);
Expand Down Expand Up @@ -972,9 +973,16 @@ private boolean redirectToHostedVoiceApp(final ActorRef self, final SipServletRe
// Format the destination to an E.164 phone number.
final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
String formatedPhone = null;
try {
formatedPhone = phoneNumberUtil.format(phoneNumberUtil.parse(phone, "US"), PhoneNumberFormat.E164);
} catch (Exception e) {
//Don't format to E.164 if contains# or * as this is
//for a Regex or USSD call
if (phone.contains("*") || phone.contains("#")){
formatedPhone = phone;
}else{
try {
formatedPhone = phoneNumberUtil.format(phoneNumberUtil.parse(phone, "US"), PhoneNumberFormat.E164);
} catch (NumberParseException e) {
logger.error("Exception when try to format : " + e);
}
}
IncomingPhoneNumber number = null;
try {
Expand Down Expand Up @@ -1051,7 +1059,7 @@ private boolean redirectToHostedVoiceApp(final ActorRef self, final SipServletRe
if (number != null) {
errMsg = "The number " + number.getPhoneNumber() + " does not have a Restcomm hosted application attached";
} else {
errMsg = "The number does not have a Restcomm hosted application attached";
errMsg = "The number does not exist" + notANumber;
}
sendNotification(errMsg, 11007, "error", false);
logger.warning(errMsg, notANumber);
Expand Down
Loading