summaryrefslogtreecommitdiff
path: root/res/res_pjsip_transport_websocket.c
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2013-12-01 19:58:08 +0000
committerJoshua Colp <jcolp@digium.com>2013-12-01 19:58:08 +0000
commit0620cc0c0049993df6521420d3a6f9b2933aaa55 (patch)
tree293542a1b5aa293cccd7c318216f76752bdd57ea /res/res_pjsip_transport_websocket.c
parente93fbf41e639bc1d3b17c81dab4a3c0812124dcc (diff)
res_pjsip_transport_websocket: Fix security events and simplify implementation.
Transport type determination for security events has been simplified to use the type present on the message itself instead of searching through configured transports to find the transport used. The actual WebSocket transport has also been simplified. It now leverages the existing PJSIP transport manager for finding the active WebSocket transport for outgoing messages. This removes the need for res_pjsip_transport_websocket to store a mapping itself. (closes issue ASTERISK-22897) Reported by: Max E. Reyes Vera J. Review: https://reviewboard.asterisk.org/r/3036/ ........ Merged revisions 403256 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@403257 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res/res_pjsip_transport_websocket.c')
-rw-r--r--res/res_pjsip_transport_websocket.c100
1 files changed, 11 insertions, 89 deletions
diff --git a/res/res_pjsip_transport_websocket.c b/res/res_pjsip_transport_websocket.c
index f36ede3a6..22962dab0 100644
--- a/res/res_pjsip_transport_websocket.c
+++ b/res/res_pjsip_transport_websocket.c
@@ -95,13 +95,8 @@ static pj_status_t ws_destroy(pjsip_transport *transport)
static int transport_shutdown(void *data)
{
- RAII_VAR(struct ast_sip_contact_transport *, ct, NULL, ao2_cleanup);
pjsip_transport *transport = data;
- if ((ct = ast_sip_location_retrieve_contact_transport_by_transport(transport))) {
- ast_sip_location_delete_contact_transport(ct);
- }
-
pjsip_transport_shutdown(transport);
return 0;
}
@@ -220,6 +215,7 @@ static void websocket_cb(struct ast_websocket *session, struct ast_variable *par
struct ast_taskprocessor *serializer = NULL;
struct transport_create_data create_data;
struct ws_transport *transport = NULL;
+ struct transport_read_data read_data;
if (ast_websocket_set_nonblock(session)) {
ast_websocket_unref(session);
@@ -240,9 +236,9 @@ static void websocket_cb(struct ast_websocket *session, struct ast_variable *par
}
transport = create_data.transport;
+ read_data.transport = transport;
while (ast_wait_for_input(ast_websocket_fd(session), -1) > 0) {
- struct transport_read_data read_data;
enum ast_websocket_opcode opcode;
int fragmented;
@@ -251,9 +247,7 @@ static void websocket_cb(struct ast_websocket *session, struct ast_variable *par
}
if (opcode == AST_WEBSOCKET_OPCODE_TEXT || opcode == AST_WEBSOCKET_OPCODE_BINARY) {
- read_data.transport = transport;
-
- ast_sip_push_task(serializer, transport_read, &read_data);
+ ast_sip_push_task_synchronous(serializer, transport_read, &read_data);
} else if (opcode == AST_WEBSOCKET_OPCODE_CLOSE) {
break;
}
@@ -266,72 +260,11 @@ static void websocket_cb(struct ast_websocket *session, struct ast_variable *par
}
/*!
- * \brief Session supplement handler for avoiding DNS lookup on bogus address.
- */
-static void websocket_outgoing_request(struct ast_sip_session *session, struct pjsip_tx_data *tdata)
-{
- char contact_uri[PJSIP_MAX_URL_SIZE] = { 0, };
- RAII_VAR(struct ast_sip_contact_transport *, ct, NULL, ao2_cleanup);
- pjsip_tpselector selector = { .type = PJSIP_TPSELECTOR_TRANSPORT, };
-
- const pjsip_sip_uri *request_uri = pjsip_uri_get_uri(tdata->msg->line.req.uri);
-
- if (pj_stricmp2(&request_uri->transport_param, "WS") && pj_stricmp2(&request_uri->transport_param, "WSS")) {
- return;
- }
-
- pjsip_uri_print(PJSIP_URI_IN_REQ_URI, request_uri, contact_uri, sizeof(contact_uri));
-
- if (!(ct = ast_sip_location_retrieve_contact_transport_by_uri(contact_uri))) {
- return;
- }
-
- selector.u.transport = ct->transport;
-
- pjsip_tx_data_set_transport(tdata, &selector);
-
- tdata->dest_info.addr.count = 1;
- tdata->dest_info.addr.entry[0].type = ct->transport->key.type;
- tdata->dest_info.addr.entry[0].addr = ct->transport->key.rem_addr;
- tdata->dest_info.addr.entry[0].addr_len = ct->transport->addr_len;
-}
-
-static struct ast_sip_session_supplement websocket_supplement = {
- .outgoing_request = websocket_outgoing_request,
-};
-
-/*!
- * \brief Destructor for ast_sip_contact_transport
- */
-static void contact_transport_destroy(void *obj)
-{
- struct ast_sip_contact_transport *ct = obj;
-
- ast_string_field_free_memory(ct);
-}
-
-static void *contact_transport_alloc(void)
-{
- struct ast_sip_contact_transport *ct = ao2_alloc(sizeof(*ct), contact_transport_destroy);
-
- if (!ct) {
- return NULL;
- }
-
- if (ast_string_field_init(ct, 256)) {
- ao2_cleanup(ct);
- return NULL;
- }
-
- return ct;
-}
-
-/*!
* \brief Store the transport a message came in on, so it can be used for outbound messages to that contact.
*/
static pj_bool_t websocket_on_rx_msg(pjsip_rx_data *rdata)
{
- pjsip_contact_hdr *contact_hdr = NULL;
+ pjsip_contact_hdr *contact;
long type = rdata->tp_info.transport->key.type;
@@ -339,24 +272,16 @@ static pj_bool_t websocket_on_rx_msg(pjsip_rx_data *rdata)
return PJ_FALSE;
}
- if ((contact_hdr = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT, NULL))) {
- RAII_VAR(struct ast_sip_contact_transport *, ct, NULL, ao2_cleanup);
- char contact_uri[PJSIP_MAX_URL_SIZE];
-
- pjsip_uri_print(PJSIP_URI_IN_CONTACT_HDR, pjsip_uri_get_uri(contact_hdr->uri), contact_uri, sizeof(contact_uri));
+ if ((contact = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT, NULL)) &&
+ (PJSIP_URI_SCHEME_IS_SIP(contact->uri) || PJSIP_URI_SCHEME_IS_SIPS(contact->uri))) {
+ pjsip_sip_uri *uri = pjsip_uri_get_uri(contact->uri);
- if (!(ct = ast_sip_location_retrieve_contact_transport_by_uri(contact_uri))) {
- if (!(ct = contact_transport_alloc())) {
- return PJ_FALSE;
- }
-
- ast_string_field_set(ct, uri, contact_uri);
- ct->transport = rdata->tp_info.transport;
-
- ast_sip_location_add_contact_transport(ct);
- }
+ pj_cstr(&uri->host, rdata->pkt_info.src_name);
+ uri->port = rdata->pkt_info.src_port;
}
+ rdata->msg_info.via->rport_param = 0;
+
return PJ_FALSE;
}
@@ -376,8 +301,6 @@ static int load_module(void)
return AST_MODULE_LOAD_DECLINE;
}
- ast_sip_session_register_supplement(&websocket_supplement);
-
if (ast_websocket_add_protocol("sip", websocket_cb)) {
ast_sip_unregister_service(&websocket_module);
return AST_MODULE_LOAD_DECLINE;
@@ -389,7 +312,6 @@ static int load_module(void)
static int unload_module(void)
{
ast_sip_unregister_service(&websocket_module);
- ast_sip_session_unregister_supplement(&websocket_supplement);
ast_websocket_remove_protocol("sip", websocket_cb);
return 0;