From 75f8167e6621243c2f5110e00185e6de461d47a9 Mon Sep 17 00:00:00 2001 From: Norbert Varga Date: Fri, 13 Jan 2017 18:21:36 +0100 Subject: 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 --- channels/chan_pjsip.c | 57 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 13 deletions(-) (limited to 'channels/chan_pjsip.c') 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))) { -- cgit v1.2.3