chan_pjsip: Multidomain endpoint finding on call
authorNorbert Varga <vnorbix@gmail.com>
Fri, 13 Jan 2017 17:21:36 +0000 (18:21 +0100)
committerJoshua Colp <jcolp@digium.com>
Mon, 13 Feb 2017 12:05:52 +0000 (06:05 -0600)
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

channels/chan_pjsip.c

index 4aae15c..46c74ad 100644 (file)
@@ -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))) {