From 0e157607957387ff211f4fa56eda58846617cb15 Mon Sep 17 00:00:00 2001 From: Matt Jordan Date: Tue, 22 Nov 2016 10:27:46 -0600 Subject: res_pjsip/chan_sip: Advertise 'ws' in the SIP URI transport parameter Per RFC 7118 5.2, the SIP URI 'transport' parameter should advertise 'ws' when WebSockets are to be used as the transport. This applies to both secure and insecure WebSockets. There were two bugs in Asterisk with respect to this: (1) The most egregious occurs in res_pjsip. There, we advertise 'ws' for insecure websockets and 'wss' for secure websockets. While this would seem to make sense - since 'WS' and 'WSS' are used for the Via Transport parameter - this is not the case for the SIP URI. This patch corrects that by registering the secure websockets with pjproject using the shorthand 'WS', and by returning 'ws' when asked for the transport parameter. Note that in pjproject, it is perfectly valid to have multiple transports use the same shorthand. (2) In chan_sip, we return an upper-case version of the transport 'WS' instead of 'ws'. Since we should be strict in what we send and liberal in what we accept (within reason), this patch lower-cases the transport before appending it to the parameter. ASTERISK-24330 #close Reported by: cervajs, Inaki Baz Castillo Change-Id: Iff77b645f8cc3b7cd35168a6676c26b147f22f42 --- channels/chan_sip.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'channels/chan_sip.c') diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 870b53edf..126a926bd 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -14153,6 +14153,7 @@ static void build_contact(struct sip_pvt *p, struct sip_request *req, int incomi char tmp[SIPBUFSIZE]; char *user = ast_uri_encode(p->exten, tmp, sizeof(tmp), ast_uri_sip_user); int use_sips; + char *transport = ast_strdupa(sip_get_transport(p->socket.type)); if (incoming) { use_sips = uas_sips_contact(req); @@ -14167,7 +14168,7 @@ static void build_contact(struct sip_pvt *p, struct sip_request *req, int incomi } else { ast_string_field_build(p, our_contact, "<%s:%s%s%s;transport=%s>", use_sips ? "sips" : "sip", user, ast_strlen_zero(user) ? "" : "@", - ast_sockaddr_stringify_remote(&p->ourip), sip_get_transport(p->socket.type)); + ast_sockaddr_stringify_remote(&p->ourip), ast_str_to_lower(transport)); } } -- cgit v1.2.3