From e73b94482189299eaf05fdca2850650d1f033663 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Tue, 5 Aug 2008 20:14:39 +0000 Subject: Ticket #585: Handle non-SIP URI in Contact header of incoming INVITE and SUBSCRIBE requests git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2194 74dad513-b988-da41-8d7b-12977e46ad98 --- .../test-pjsua/scripts-sendto/360_non_sip_uri.py | 27 +++++++++++++++++++ .../test-pjsua/scripts-sendto/361_non_sip_uri.py | 26 ++++++++++++++++++ .../test-pjsua/scripts-sendto/362_non_sip_uri.py | 27 +++++++++++++++++++ .../scripts-sendto/363_non_sip_uri_subscribe.py | 31 ++++++++++++++++++++++ .../scripts-sendto/364_non_sip_uri_subscribe.py | 30 +++++++++++++++++++++ pjsip/src/pjsip/sip_dialog.c | 30 ++++++++++++++++----- pjsip/src/pjsua-lib/pjsua_acc.c | 27 ++++++++++++++----- pjsip/src/pjsua-lib/pjsua_pres.c | 4 +++ 8 files changed, 190 insertions(+), 12 deletions(-) create mode 100644 pjsip-apps/src/test-pjsua/scripts-sendto/360_non_sip_uri.py create mode 100644 pjsip-apps/src/test-pjsua/scripts-sendto/361_non_sip_uri.py create mode 100644 pjsip-apps/src/test-pjsua/scripts-sendto/362_non_sip_uri.py create mode 100644 pjsip-apps/src/test-pjsua/scripts-sendto/363_non_sip_uri_subscribe.py create mode 100644 pjsip-apps/src/test-pjsua/scripts-sendto/364_non_sip_uri_subscribe.py diff --git a/pjsip-apps/src/test-pjsua/scripts-sendto/360_non_sip_uri.py b/pjsip-apps/src/test-pjsua/scripts-sendto/360_non_sip_uri.py new file mode 100644 index 00000000..ad827cc7 --- /dev/null +++ b/pjsip-apps/src/test-pjsua/scripts-sendto/360_non_sip_uri.py @@ -0,0 +1,27 @@ +# $Id:$ +import inc_sip as sip +import inc_sdp as sdp + +# Some non-SIP URI's in Contact header +# +complete_msg = \ +"""INVITE sip:localhost SIP/2.0 +Via: SIP/2.0/UDP 192.168.0.14:5060;rport;branch=z9hG4bKPj9db9 +Max-Forwards: 70 +From: ;tag=08cd5bfc2d8a4fddb1f5e59c6961d298 +To: +Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7 +CSeq: 0 INVITE +Contact: mailto:dontspam@pjsip.org +Contact: +Contact: http://www.pjsip.org/the%20path.cgi?pname=pvalue +Contact: +User-Agent: PJSUA v0.9.0-trunk/win32 +Content-Length: 0 +""" + + +sendto_cfg = sip.SendtoCfg( "Non SIP URI in Contact", + "--null-audio --auto-answer 200", + "", 200, complete_msg=complete_msg) + diff --git a/pjsip-apps/src/test-pjsua/scripts-sendto/361_non_sip_uri.py b/pjsip-apps/src/test-pjsua/scripts-sendto/361_non_sip_uri.py new file mode 100644 index 00000000..b21f6eb1 --- /dev/null +++ b/pjsip-apps/src/test-pjsua/scripts-sendto/361_non_sip_uri.py @@ -0,0 +1,26 @@ +# $Id:$ +import inc_sip as sip +import inc_sdp as sdp + +# No SIP URI in Contact header +# +complete_msg = \ +"""INVITE sip:localhost SIP/2.0 +Via: SIP/2.0/UDP 192.168.0.14:5060;rport;branch=z9hG4bKPj9db9 +Max-Forwards: 70 +From: ;tag=08cd5bfc2d8a4fddb1f5e59c6961d298 +To: +Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7 +CSeq: 0 INVITE +Contact: mailto:dontspam@pjsip.org +Contact: +Contact: http://www.pjsip.org/the%20path.cgi?pname=pvalue +User-Agent: PJSUA v0.9.0-trunk/win32 +Content-Length: 0 +""" + + +sendto_cfg = sip.SendtoCfg( "No SIP URI in Contact", + "--null-audio --auto-answer 200", + "", 500, complete_msg=complete_msg) + diff --git a/pjsip-apps/src/test-pjsua/scripts-sendto/362_non_sip_uri.py b/pjsip-apps/src/test-pjsua/scripts-sendto/362_non_sip_uri.py new file mode 100644 index 00000000..25e30e08 --- /dev/null +++ b/pjsip-apps/src/test-pjsua/scripts-sendto/362_non_sip_uri.py @@ -0,0 +1,27 @@ +# $Id:$ +import inc_sip as sip +import inc_sdp as sdp + +# Some non-SIP URI's in Contact header +# +complete_msg = \ +"""INVITE sip:localhost SIP/2.0 +Via: SIP/2.0/UDP 192.168.0.14:5060;rport;branch=z9hG4bKPj9db9 +Max-Forwards: 70 +From: ;tag=08cd5bfc2d8a4fddb1f5e59c6961d298 +To: +Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7 +CSeq: 0 INVITE +Contact: +Contact: mailto:dontspam@pjsip.org +Contact: +Contact: http://www.pjsip.org/the%20path.cgi?pname=pvalue +User-Agent: PJSUA v0.9.0-trunk/win32 +Content-Length: 0 +""" + + +sendto_cfg = sip.SendtoCfg( "Non SIP URI in Contact", + "--null-audio --auto-answer 200", + "", 200, complete_msg=complete_msg) + diff --git a/pjsip-apps/src/test-pjsua/scripts-sendto/363_non_sip_uri_subscribe.py b/pjsip-apps/src/test-pjsua/scripts-sendto/363_non_sip_uri_subscribe.py new file mode 100644 index 00000000..a191fee0 --- /dev/null +++ b/pjsip-apps/src/test-pjsua/scripts-sendto/363_non_sip_uri_subscribe.py @@ -0,0 +1,31 @@ +# $Id:$ +import inc_sip as sip +import inc_sdp as sdp + +# Some non-SIP URI's in Contact header +# +complete_msg = \ +"""SUBSCRIBE sip:localhost SIP/2.0 +Via: SIP/2.0/UDP 192.168.0.14:5060;rport;branch=z9hG4bKPj9db9 +Max-Forwards: 70 +From: ;tag=08cd5bfc2d8a4fddb1f5e59c6961d298 +To: +Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7 +CSeq: 0 SUBSCRIBE +Contact: mailto:dontspam@pjsip.org +Contact: +Contact: http://www.pjsip.org/the%20path.cgi?pname=pvalue +Contact: +Event: presence +Expires: 600 +Accept: application/pidf+xml, application/xpidf+xml +Allow-Events: presence, refer +User-Agent: PJSUA v0.9.0-trunk/win32 +Content-Length: 0 +""" + + +sendto_cfg = sip.SendtoCfg( "Non SIP URI in Contact", + "--null-audio --auto-answer 200", + "", 200, complete_msg=complete_msg) + diff --git a/pjsip-apps/src/test-pjsua/scripts-sendto/364_non_sip_uri_subscribe.py b/pjsip-apps/src/test-pjsua/scripts-sendto/364_non_sip_uri_subscribe.py new file mode 100644 index 00000000..88741bca --- /dev/null +++ b/pjsip-apps/src/test-pjsua/scripts-sendto/364_non_sip_uri_subscribe.py @@ -0,0 +1,30 @@ +# $Id:$ +import inc_sip as sip +import inc_sdp as sdp + +# Some non-SIP URI's in Contact header +# +complete_msg = \ +"""SUBSCRIBE sip:localhost SIP/2.0 +Via: SIP/2.0/UDP 192.168.0.14:5060;rport;branch=z9hG4bKPj9db9 +Max-Forwards: 70 +From: ;tag=08cd5bfc2d8a4fddb1f5e59c6961d298 +To: +Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7 +CSeq: 0 SUBSCRIBE +Contact: mailto:dontspam@pjsip.org +Contact: +Contact: http://www.pjsip.org/the%20path.cgi?pname=pvalue +Event: presence +Expires: 600 +Accept: application/pidf+xml, application/xpidf+xml +Allow-Events: presence, refer +User-Agent: PJSUA v0.9.0-trunk/win32 +Content-Length: 0 +""" + + +sendto_cfg = sip.SendtoCfg( "Non SIP URI in Contact", + "--null-audio --auto-answer 200", + "", 400, complete_msg=complete_msg) + diff --git a/pjsip/src/pjsip/sip_dialog.c b/pjsip/src/pjsip/sip_dialog.c index 969d0b3d..8df82b7d 100644 --- a/pjsip/src/pjsip/sip_dialog.c +++ b/pjsip/src/pjsip/sip_dialog.c @@ -307,7 +307,8 @@ PJ_DEF(pj_status_t) pjsip_dlg_create_uas( pjsip_user_agent *ua, pjsip_dialog **p_dlg) { pj_status_t status; - pjsip_hdr *contact_hdr; + pjsip_hdr *pos = NULL; + pjsip_contact_hdr *contact_hdr; pjsip_rr_hdr *rr; pjsip_transaction *tsx = NULL; pj_str_t tmp; @@ -416,16 +417,33 @@ PJ_DEF(pj_status_t) pjsip_dlg_create_uas( pjsip_user_agent *ua, pj_strdup(dlg->pool, &dlg->remote.info_str, &tmp); - /* Init remote's contact from Contact header. */ - contact_hdr = (pjsip_hdr*) - pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT, - NULL); + /* Init remote's contact from Contact header. + * Iterate the Contact URI until we find sip: or sips: scheme. + */ + do { + contact_hdr = (pjsip_contact_hdr*) + pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT, + pos); + if (contact_hdr) { + if (!PJSIP_URI_SCHEME_IS_SIP(contact_hdr->uri) && + !PJSIP_URI_SCHEME_IS_SIPS(contact_hdr->uri)) + { + pos = (pjsip_hdr*)contact_hdr->next; + if (pos == &rdata->msg_info.msg->hdr) + contact_hdr = NULL; + } else { + break; + } + } + } while (contact_hdr); + if (!contact_hdr) { status = PJSIP_ERRNO_FROM_SIP_STATUS(PJSIP_SC_BAD_REQUEST); goto on_error; } + dlg->remote.contact = (pjsip_contact_hdr*) - pjsip_hdr_clone(dlg->pool, contact_hdr); + pjsip_hdr_clone(dlg->pool, (pjsip_hdr*)contact_hdr); /* Init remote's CSeq from CSeq header */ dlg->remote.cseq = dlg->remote.first_cseq = rdata->msg_info.cseq->cseq; diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c index a234964c..f2853fa6 100644 --- a/pjsip/src/pjsua-lib/pjsua_acc.c +++ b/pjsip/src/pjsua-lib/pjsua_acc.c @@ -1674,15 +1674,30 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uas_contact( pj_pool_t *pool, sip_uri = (pjsip_sip_uri*) pjsip_uri_get_uri(rdata->msg_info.record_route->name_addr.uri); } else { + pjsip_hdr *pos = NULL; pjsip_contact_hdr *h_contact; pjsip_uri *uri = NULL; - /* Otherwise URI is Contact URI */ - h_contact = (pjsip_contact_hdr*) - pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT, - NULL); - if (h_contact) - uri = (pjsip_uri*) pjsip_uri_get_uri(h_contact->uri); + /* Otherwise URI is Contact URI. + * Iterate the Contact URI until we find sip: or sips: scheme. + */ + do { + h_contact = (pjsip_contact_hdr*) + pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT, + pos); + if (h_contact) { + uri = (pjsip_uri*) pjsip_uri_get_uri(h_contact->uri); + if (!PJSIP_URI_SCHEME_IS_SIP(uri) && + !PJSIP_URI_SCHEME_IS_SIPS(uri)) + { + pos = (pjsip_hdr*)h_contact->next; + if (pos == &rdata->msg_info.msg->hdr) + h_contact = NULL; + } else { + break; + } + } + } while (h_contact); /* Or if Contact URI is not present, take the remote URI from diff --git a/pjsip/src/pjsua-lib/pjsua_pres.c b/pjsip/src/pjsua-lib/pjsua_pres.c index e2c35c1e..23050ff2 100644 --- a/pjsip/src/pjsua-lib/pjsua_pres.c +++ b/pjsip/src/pjsua-lib/pjsua_pres.c @@ -688,6 +688,8 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata) pjsua_perror(THIS_FILE, "Unable to generate Contact header", status); PJSUA_UNLOCK(); + pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 400, NULL, + NULL, NULL); return PJ_TRUE; } } @@ -700,6 +702,8 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata) "Unable to create UAS dialog for subscription", status); PJSUA_UNLOCK(); + pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 400, NULL, + NULL, NULL); return PJ_TRUE; } -- cgit v1.2.3