From 2d1b11cb727d36ca2c66e945ac771b1a79ef93f9 Mon Sep 17 00:00:00 2001
From: Grzegorz Sluja <grzegorz.sluja@iopsys.eu>
Date: Fri, 7 Oct 2022 08:53:57 +0000
Subject: [PATCH] Use correct URI schema in Referred-By and Refer-To header
 fields in call transfer

---
 channels/chan_pjsip.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index c35c20a342..633027b02e 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -2175,7 +2175,16 @@ static void transfer_refer(struct ast_sip_session *session, const char *target)
 				chan_name, target, replaces);
 	}
 
-	snprintf(referto, sizeof(referto), "<sip:%s@%s%s>", target, session->endpoint->fromdomain, replaces);
+	if (PJSIP_URI_SCHEME_IS_SIP(session->request_uri))
+		snprintf(referto, sizeof(referto), "<sip:%s@%s%s>", target, session->endpoint->fromdomain, replaces);
+	else if (PJSIP_URI_SCHEME_IS_SIPS(session->request_uri))
+		snprintf(referto, sizeof(referto), "<sips:%s@%s%s>", target, session->endpoint->fromdomain, replaces);
+	else if (PJSIP_URI_SCHEME_IS_TEL(session->request_uri))
+		snprintf(referto, sizeof(referto), "<tel:%s@%s%s>", target, session->endpoint->fromdomain, replaces);
+	else {
+		ast_log(LOG_ERROR, "Unsupported URI for Refer-To header. Refer will not be sent!\n");
+		goto failure;
+	}
 	ast_debug(1, "Refer-To: %s\n", referto);
 
 	if (pjsip_xfer_initiate(sub, pj_cstr(&tmp, referto), &packet) != PJ_SUCCESS) {
@@ -2203,7 +2212,16 @@ static void transfer_refer(struct ast_sip_session *session, const char *target)
 	if (!ast_strlen_zero(ref_by_val)) {
 		ast_sip_add_header(packet, "Referred-By", ref_by_val);
 	} else {
-		snprintf(local_info, sizeof(local_info), "%s@%s", session->endpoint->contact_user, session->endpoint->fromdomain);
+		if (PJSIP_URI_SCHEME_IS_SIP(session->request_uri))
+			snprintf(local_info, sizeof(local_info), "<sip:%s@%s>", session->endpoint->contact_user, session->endpoint->fromdomain);
+		else if (PJSIP_URI_SCHEME_IS_SIPS(session->request_uri))
+			snprintf(local_info, sizeof(local_info), "<sips:%s@%s>", session->endpoint->contact_user, session->endpoint->fromdomain);
+		else if (PJSIP_URI_SCHEME_IS_TEL(session->request_uri))
+			snprintf(local_info, sizeof(local_info), "<tel:%s@%s>", session->endpoint->contact_user, session->endpoint->fromdomain);
+		else {
+			ast_log(LOG_ERROR, "Unsupported URI for Referred-By header. Refer will not be sent!\n");
+			goto failure;
+		}
 		ast_sip_add_header(packet, "Referred-By", local_info);
 	}
 
-- 
GitLab