diff options
author | Matthew Jordan <mjordan@digium.com> | 2011-11-23 16:23:34 +0000 |
---|---|---|
committer | Matthew Jordan <mjordan@digium.com> | 2011-11-23 16:23:34 +0000 |
commit | 76394a727f5b18fbb0506ddcecfa6494d7cff31c (patch) | |
tree | 351c44cf2839189e561ef610278ef1f2d67c92e3 | |
parent | 6d05a31d9fb890d75acd93a9c8c7e3eaa0bc22e5 (diff) |
Fixed SendMessage stripping extension from To: header in SIP MESSAGE
When using the MessageSend application to send a SIP MESSAGE to a non-peer,
chan_sip attempted to validate the hostname or IP Address. In the process,
it stripped off the extension and failed to add it back to the sip_pvt
structure before transmitting. This patch adds the full URI passed in
from the message core to the sip_pvt structure.
(closes issue ASTERISK-18903)
Reported by: Shaun Clark
Tested by: Matt Jordan
Review: https://reviewboard.asterisk.org/r/1597/
........
Merged revisions 346040 from http://svn.asterisk.org/svn/asterisk/branches/10
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@346053 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | channels/chan_sip.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 2eecb0a6a..a76caa89e 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -24315,20 +24315,25 @@ static int sip_msg_send(const struct ast_msg *msg, const char *to, const char *f { struct sip_pvt *pvt; int res; - char *peer; + char *uri, *host; struct sip_peer *peer_ptr; if (!(pvt = sip_alloc(NULL, NULL, 0, SIP_MESSAGE, NULL))) { return -1; } - peer = ast_strdupa(to); - if (strchr(peer, '@')) { - strsep(&peer, "@"); - } else { - strsep(&peer, ":"); + uri = ast_strdupa(to); + if (!strncasecmp(uri, "sip:", 4)) { + uri += 4; + } else if (!strncasecmp(uri, "sips:", 5)) { + uri += 5; } - if (ast_strlen_zero(peer)) { + host = ast_strdupa(uri); + if (strchr(host, '@')) { + strsep(&host, "@"); + } + + if (ast_strlen_zero(host)) { ast_log(LOG_WARNING, "MESSAGE(to) is invalid for SIP - '%s'\n", to); dialog_unlink_all(pvt); dialog_unref(pvt, "MESSAGE(to) is invalid for SIP"); @@ -24364,12 +24369,16 @@ static int sip_msg_send(const struct ast_msg *msg, const char *to, const char *f sip_pvt_lock(pvt); - if (create_addr(pvt, peer, NULL, TRUE, NULL)) { + /* Look up the host to contact */ + if (create_addr(pvt, host, NULL, TRUE, NULL)) { sip_pvt_unlock(pvt); dialog_unlink_all(pvt); dialog_unref(pvt, "create_addr failed sending a MESSAGE"); return -1; } + + /* Set the tohost to the full URI provided */ + ast_string_field_set(pvt, tohost, uri); ast_sip_ouraddrfor(&pvt->sa, &pvt->ourip, pvt); ast_set_flag(&pvt->flags[0], SIP_OUTGOING); |