summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2008-08-05 20:14:39 +0000
committerBenny Prijono <bennylp@teluu.com>2008-08-05 20:14:39 +0000
commite73b94482189299eaf05fdca2850650d1f033663 (patch)
tree63c06c4610e9003ce8488437218030119d13693c
parentc99d9cd5ab9be3bce89f84a54abbe87348529a2e (diff)
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
-rw-r--r--pjsip-apps/src/test-pjsua/scripts-sendto/360_non_sip_uri.py27
-rw-r--r--pjsip-apps/src/test-pjsua/scripts-sendto/361_non_sip_uri.py26
-rw-r--r--pjsip-apps/src/test-pjsua/scripts-sendto/362_non_sip_uri.py27
-rw-r--r--pjsip-apps/src/test-pjsua/scripts-sendto/363_non_sip_uri_subscribe.py31
-rw-r--r--pjsip-apps/src/test-pjsua/scripts-sendto/364_non_sip_uri_subscribe.py30
-rw-r--r--pjsip/src/pjsip/sip_dialog.c30
-rw-r--r--pjsip/src/pjsua-lib/pjsua_acc.c27
-rw-r--r--pjsip/src/pjsua-lib/pjsua_pres.c4
8 files changed, 190 insertions, 12 deletions
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: <sip:192.168.0.14>;tag=08cd5bfc2d8a4fddb1f5e59c6961d298
+To: <sip:localhost>
+Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7
+CSeq: 0 INVITE
+Contact: mailto:dontspam@pjsip.org
+Contact: <mailto:dontspam@pjsip.org>
+Contact: http://www.pjsip.org/the%20path.cgi?pname=pvalue
+Contact: <sip:localhost>
+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: <sip:192.168.0.14>;tag=08cd5bfc2d8a4fddb1f5e59c6961d298
+To: <sip:localhost>
+Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7
+CSeq: 0 INVITE
+Contact: mailto:dontspam@pjsip.org
+Contact: <mailto:dontspam@pjsip.org>
+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: <sip:192.168.0.14>;tag=08cd5bfc2d8a4fddb1f5e59c6961d298
+To: <sip:localhost>
+Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7
+CSeq: 0 INVITE
+Contact: <sip:localhost>
+Contact: mailto:dontspam@pjsip.org
+Contact: <mailto:dontspam@pjsip.org>
+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: <sip:192.168.0.14>;tag=08cd5bfc2d8a4fddb1f5e59c6961d298
+To: <sip:localhost>
+Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7
+CSeq: 0 SUBSCRIBE
+Contact: mailto:dontspam@pjsip.org
+Contact: <mailto:dontspam@pjsip.org>
+Contact: http://www.pjsip.org/the%20path.cgi?pname=pvalue
+Contact: <sip:localhost>
+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: <sip:192.168.0.14>;tag=08cd5bfc2d8a4fddb1f5e59c6961d298
+To: <sip:localhost>
+Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7
+CSeq: 0 SUBSCRIBE
+Contact: mailto:dontspam@pjsip.org
+Contact: <mailto:dontspam@pjsip.org>
+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;
}