summaryrefslogtreecommitdiff
path: root/channels/chan_pjsip.c
diff options
context:
space:
mode:
authorNorbert Varga <vnorbix@gmail.com>2017-01-13 18:21:36 +0100
committerJoshua Colp <jcolp@digium.com>2017-02-13 06:05:52 -0600
commit75f8167e6621243c2f5110e00185e6de461d47a9 (patch)
tree36dd56b69dff19fb2a3a8d8e156c72bee83ce242 /channels/chan_pjsip.c
parent648d181d2fb62284eb7a2284221b48240a0e876e (diff)
chan_pjsip: Multidomain endpoint finding on call
When PJSIP tries to call an endpoint with a domain (e.g. 1000@test.com), the user part is stripped down as it would be a trunk with a specified user, and only the host part is called as a PJSIP endpoint and can't be found. This is not correct in the case of a multidomain SIP account, so the stripping after the @ sign is done only if the whole endpoint (in multidomain case 1000@test.com) can't be found. ASTERISK-26248 Change-Id: I3a2dd6f57f3bd042df46b961eccd81d31ab202e6
Diffstat (limited to 'channels/chan_pjsip.c')
-rw-r--r--channels/chan_pjsip.c57
1 files changed, 44 insertions, 13 deletions
diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index 4aae15ce9..46c74adf7 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -2125,22 +2125,53 @@ static int request(void *obj)
AST_NONSTANDARD_APP_ARGS(args, tmp, '/');
- /* If a request user has been specified extract it from the endpoint name portion */
- if ((endpoint_name = strchr(args.endpoint, '@'))) {
- request_user = args.endpoint;
- *endpoint_name++ = '\0';
+ if (ast_sip_get_disable_multi_domain()) {
+ /* If a request user has been specified extract it from the endpoint name portion */
+ if ((endpoint_name = strchr(args.endpoint, '@'))) {
+ request_user = args.endpoint;
+ *endpoint_name++ = '\0';
+ } else {
+ endpoint_name = args.endpoint;
+ }
+
+ if (ast_strlen_zero(endpoint_name)) {
+ ast_log(LOG_ERROR, "Unable to create PJSIP channel with empty endpoint name\n");
+ req_data->cause = AST_CAUSE_CHANNEL_UNACCEPTABLE;
+ return -1;
+ } else if (!(endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", endpoint_name))) {
+ ast_log(LOG_ERROR, "Unable to create PJSIP channel - endpoint '%s' was not found\n", endpoint_name);
+ req_data->cause = AST_CAUSE_NO_ROUTE_DESTINATION;
+ return -1;
+ }
} else {
+ /* First try to find an exact endpoint match, for single (user) or multi-domain (user@domain) */
endpoint_name = args.endpoint;
- }
+ if (ast_strlen_zero(endpoint_name)) {
+ ast_log(LOG_ERROR, "Unable to create PJSIP channel with empty endpoint name\n");
+ req_data->cause = AST_CAUSE_CHANNEL_UNACCEPTABLE;
+ return -1;
+ } else if (!(endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", endpoint_name))) {
+ /* It seems it's not a multi-domain endpoint or single endpoint exact match,
+ * it's possible that it's a SIP trunk with a specified user (user@trunkname),
+ * so extract the user before @ sign.
+ */
+ if ((endpoint_name = strchr(args.endpoint, '@'))) {
+ request_user = args.endpoint;
+ *endpoint_name++ = '\0';
+ }
- if (ast_strlen_zero(endpoint_name)) {
- ast_log(LOG_ERROR, "Unable to create PJSIP channel with empty endpoint name\n");
- req_data->cause = AST_CAUSE_CHANNEL_UNACCEPTABLE;
- return -1;
- } else if (!(endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", endpoint_name))) {
- ast_log(LOG_ERROR, "Unable to create PJSIP channel - endpoint '%s' was not found\n", endpoint_name);
- req_data->cause = AST_CAUSE_NO_ROUTE_DESTINATION;
- return -1;
+ if (ast_strlen_zero(endpoint_name)) {
+ ast_log(LOG_ERROR, "Unable to create PJSIP channel with empty endpoint name\n");
+ req_data->cause = AST_CAUSE_CHANNEL_UNACCEPTABLE;
+ return -1;
+ }
+
+ if (!(endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", endpoint_name))) {
+ ast_log(LOG_ERROR, "Unable to create PJSIP channel - endpoint '%s' was not found\n", endpoint_name);
+ req_data->cause = AST_CAUSE_NO_ROUTE_DESTINATION;
+ return -1;
+ }
+ }
}
if (!(session = ast_sip_session_create_outgoing(endpoint, NULL, args.aor, request_user, req_data->caps))) {