From 45c06f2842ef0a839efa4a5b6147527461f33a74 Mon Sep 17 00:00:00 2001
From: Matthew Jordan <mjordan@digium.com>
Date: Thu, 17 Apr 2014 19:50:05 +0000
Subject: [PATCH] chan_sip: Add SIPURIPHONECONTEXT channel variable for Request
 TEL URIs

This patch is a continuation of https://reviewboard.asterisk.org/r/3349/,
committed in r412303.

It resolves a finding oej had that the phone-context be available in a
channel variable separate from SIPDOMAIN. This patch adds that variable as
SIPURIPHONECONTEXT. It also allows a local number (or global number specified
in the TEL URI) to be used to look up as a peer.

(issue ASTERISK-17179)

Review: https://reviewboard.asterisk.org/r/3349/


git-svn-id: http://svn.asterisk.org/svn/asterisk/trunk@412467 f38db490-d61c-443f-a65b-d21fe96a405b
---
 CHANGES                    |  2 +-
 channels/chan_sip.c        | 13 ++++++++++---
 channels/sip/include/sip.h |  1 +
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/CHANGES b/CHANGES
index b4e0d4e91b..dc261055e9 100644
--- a/CHANGES
+++ b/CHANGES
@@ -98,7 +98,7 @@ chan_sip
 -------------------------
  * TEL URI support for inbound INVITE requests has been added. chan_sip will
    now handle TEL schemes in the Request and From URIs. The phone-context in
-   the Request URI will be stored in the TELPHONECONTEXT channel variable on
+   the Request URI will be stored in the SIPURIPHONECONTEXT channel variable on
    the inbound channel.
 
 Debugging
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index eb0a5f2952..e63657f2c4 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -8249,6 +8249,9 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
 	if (!ast_strlen_zero(i->domain)) {
 		pbx_builtin_setvar_helper(tmp, "SIPDOMAIN", i->domain);
 	}
+	if (!ast_strlen_zero(i->tel_phone_context)) {
+		pbx_builtin_setvar_helper(tmp, "SIPURIPHONECONTEXT", i->tel_phone_context);
+	}
 	if (!ast_strlen_zero(i->callid)) {
 		pbx_builtin_setvar_helper(tmp, "SIPCALLID", i->callid);
 	}
@@ -17694,6 +17697,12 @@ static enum sip_get_dest_result get_destination(struct sip_pvt *p, struct sip_re
 
 	extract_host_from_hostport(&domain);
 
+	if (strncasecmp(get_in_brackets(tmp), "tel:", 4)) {
+		ast_string_field_set(p, domain, domain);
+	} else {
+		ast_string_field_set(p, tel_phone_context, domain);
+	}
+
 	if (ast_strlen_zero(uri)) {
 		/*
 		 * Either there really was no extension found or the request
@@ -17703,8 +17712,6 @@ static enum sip_get_dest_result get_destination(struct sip_pvt *p, struct sip_re
 		uri = "s";
 	}
 
-	ast_string_field_set(p, domain, domain);
-
 	/* Now find the From: caller ID and name */
 	/* XXX Why is this done in get_destination? Isn't it already done?
 	   Needs to be checked
@@ -18358,7 +18365,7 @@ static enum check_auth_result check_peer_ok(struct sip_pvt *p, char *of,
 		if (!peer) {
 			char *uri_tmp, *callback = NULL, *dummy;
 			uri_tmp = ast_strdupa(uri2);
-			parse_uri(uri_tmp, "sip:,sips:", &callback, &dummy, &dummy, &dummy);
+			parse_uri(uri_tmp, "sip:,sips:,tel:", &callback, &dummy, &dummy, &dummy);
 			if (!ast_strlen_zero(callback) && (peer = sip_find_peer_by_ip_and_exten(&p->recv, callback, p->socket.type))) {
 				; /* found, fall through */
 			} else {
diff --git a/channels/sip/include/sip.h b/channels/sip/include/sip.h
index 4ea20ea4c9..9737806e37 100644
--- a/channels/sip/include/sip.h
+++ b/channels/sip/include/sip.h
@@ -1038,6 +1038,7 @@ struct sip_pvt {
 		AST_STRING_FIELD(last_presence_subtype);   /*!< The last presence subtype sent for a subscription. */
 		AST_STRING_FIELD(last_presence_message);   /*!< The last presence message for a subscription */
 		AST_STRING_FIELD(msg_body);     /*!< Text for a MESSAGE body */
+		AST_STRING_FIELD(tel_phone_context);       /*!< The phone-context portion of a TEL URI */
 	);
 	char via[128];                          /*!< Via: header */
 	int maxforwards;                        /*!< SIP Loop prevention */