[asterisk-commits] mjordan: branch mjordan/trunk-http-stuff-and-things r432173 - in /team/mjorda...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sat Feb 21 17:44:10 CST 2015
Author: mjordan
Date: Sat Feb 21 17:44:05 2015
New Revision: 432173
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=432173
Log:
Re-enable automerge
Added:
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_sips_contact.c
- copied unchanged from r432155, trunk/res/res_pjsip_sips_contact.c
Modified:
team/mjordan/trunk-http-stuff-and-things/ (props changed)
team/mjordan/trunk-http-stuff-and-things/CHANGES
team/mjordan/trunk-http-stuff-and-things/apps/app_agent_pool.c
team/mjordan/trunk-http-stuff-and-things/apps/app_confbridge.c
team/mjordan/trunk-http-stuff-and-things/apps/app_mixmonitor.c
team/mjordan/trunk-http-stuff-and-things/apps/app_voicemail.c
team/mjordan/trunk-http-stuff-and-things/bridges/bridge_builtin_features.c
team/mjordan/trunk-http-stuff-and-things/channels/chan_dahdi.c
team/mjordan/trunk-http-stuff-and-things/channels/chan_iax2.c
team/mjordan/trunk-http-stuff-and-things/channels/chan_pjsip.c
team/mjordan/trunk-http-stuff-and-things/channels/chan_sip.c
team/mjordan/trunk-http-stuff-and-things/channels/pjsip/dialplan_functions.c
team/mjordan/trunk-http-stuff-and-things/channels/sig_analog.c
team/mjordan/trunk-http-stuff-and-things/configs/samples/http.conf.sample
team/mjordan/trunk-http-stuff-and-things/configs/samples/pjsip.conf.sample
team/mjordan/trunk-http-stuff-and-things/configs/samples/pjsip_wizard.conf.sample
team/mjordan/trunk-http-stuff-and-things/contrib/scripts/install_prereq
team/mjordan/trunk-http-stuff-and-things/funcs/func_curl.c
team/mjordan/trunk-http-stuff-and-things/include/asterisk.h
team/mjordan/trunk-http-stuff-and-things/include/asterisk/bridge.h
team/mjordan/trunk-http-stuff-and-things/include/asterisk/channel.h
team/mjordan/trunk-http-stuff-and-things/include/asterisk/http.h
team/mjordan/trunk-http-stuff-and-things/include/asterisk/lock.h
team/mjordan/trunk-http-stuff-and-things/include/asterisk/module.h
team/mjordan/trunk-http-stuff-and-things/include/asterisk/sched.h
team/mjordan/trunk-http-stuff-and-things/include/asterisk/stasis_app.h
team/mjordan/trunk-http-stuff-and-things/main/aoc.c
team/mjordan/trunk-http-stuff-and-things/main/asterisk.c
team/mjordan/trunk-http-stuff-and-things/main/bridge.c
team/mjordan/trunk-http-stuff-and-things/main/bridge_after.c
team/mjordan/trunk-http-stuff-and-things/main/bucket.c
team/mjordan/trunk-http-stuff-and-things/main/channel.c
team/mjordan/trunk-http-stuff-and-things/main/codec.c
team/mjordan/trunk-http-stuff-and-things/main/config.c
team/mjordan/trunk-http-stuff-and-things/main/http.c
team/mjordan/trunk-http-stuff-and-things/main/loader.c
team/mjordan/trunk-http-stuff-and-things/main/manager.c
team/mjordan/trunk-http-stuff-and-things/main/pbx.c
team/mjordan/trunk-http-stuff-and-things/main/sched.c
team/mjordan/trunk-http-stuff-and-things/main/sorcery.c
team/mjordan/trunk-http-stuff-and-things/main/stasis_channels.c
team/mjordan/trunk-http-stuff-and-things/main/tcptls.c
team/mjordan/trunk-http-stuff-and-things/main/utils.c
team/mjordan/trunk-http-stuff-and-things/main/xmldoc.c
team/mjordan/trunk-http-stuff-and-things/pbx/pbx_spool.c
team/mjordan/trunk-http-stuff-and-things/res/ari/ari_websockets.c
team/mjordan/trunk-http-stuff-and-things/res/ari/resource_channels.c
team/mjordan/trunk-http-stuff-and-things/res/ari/resource_channels.h
team/mjordan/trunk-http-stuff-and-things/res/res_ari_channels.c
team/mjordan/trunk-http-stuff-and-things/res/res_format_attr_h264.c
team/mjordan/trunk-http-stuff-and-things/res/res_http_websocket.c
team/mjordan/trunk-http-stuff-and-things/res/res_odbc.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip/pjsip_cli.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip/pjsip_configuration.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip/pjsip_options.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_acl.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_caller_id.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_config_wizard.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_exten_state.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_keepalive.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_messaging.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_multihomed.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_nat.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_outbound_publish.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_publish_asterisk.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_pubsub.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_refer.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_registrar.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_sdp_rtp.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_send_to_voicemail.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_session.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_t38.c
team/mjordan/trunk-http-stuff-and-things/res/res_pjsip_transport_websocket.c
team/mjordan/trunk-http-stuff-and-things/res/res_rtp_asterisk.c
team/mjordan/trunk-http-stuff-and-things/res/res_sorcery_config.c
team/mjordan/trunk-http-stuff-and-things/res/res_timing_pthread.c
team/mjordan/trunk-http-stuff-and-things/res/stasis/control.c
team/mjordan/trunk-http-stuff-and-things/res/stasis/stasis_bridge.c
team/mjordan/trunk-http-stuff-and-things/rest-api/api-docs/channels.json
Propchange: team/mjordan/trunk-http-stuff-and-things/
------------------------------------------------------------------------------
automerge = *
Propchange: team/mjordan/trunk-http-stuff-and-things/
------------------------------------------------------------------------------
Binary property 'branch-13-merged' - no diff available.
Propchange: team/mjordan/trunk-http-stuff-and-things/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Sat Feb 21 17:44:05 2015
@@ -1,1 +1,1 @@
-/trunk:1-431277
+/trunk:1-432172
Modified: team/mjordan/trunk-http-stuff-and-things/CHANGES
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/CHANGES?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/CHANGES (original)
+++ team/mjordan/trunk-http-stuff-and-things/CHANGES Sat Feb 21 17:44:05 2015
@@ -99,6 +99,24 @@
* Added preferchannelclass=no option to prefer the application-passed class
over the channel-set musicclass. This allows separate hold-music from
application (e.g. Queue or Dial) specified music.
+
+------------------------------------------------------------------------------
+--- Functionality changes from Asterisk 13.2.0 to Asterisk 13.3.0 ------------
+------------------------------------------------------------------------------
+
+chan_pjsip/app_transfer
+------------------
+ * The Transfer application, when used with chan_pjsip, now supports using
+ a PJSIP endpoint as the transfer destination. This is in addition to
+ explicitly specifying a SIP URI to transfer to.
+
+res_ari_channels
+------------------
+ * The ARI /channels resource now supports a new operation, 'redirect'. The
+ redirect operation will perform a technology and state specific redirection
+ on the channel to a specified endpoint or destination. In the case of SIP
+ technologies, this is either a 302 Redirect response to an on-going INVITE
+ dialog or a SIP REFER request.
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 13.1.0 to Asterisk 13.2.0 ------------
Modified: team/mjordan/trunk-http-stuff-and-things/apps/app_agent_pool.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/apps/app_agent_pool.c?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/apps/app_agent_pool.c (original)
+++ team/mjordan/trunk-http-stuff-and-things/apps/app_agent_pool.c Sat Feb 21 17:44:05 2015
@@ -552,14 +552,10 @@
aco_option_register(&cfg_info, "fullname", ACO_EXACT, agent_types, NULL, OPT_STRINGFIELD_T, 0, STRFLDSET(struct agent_cfg, full_name));
if (aco_process_config(&cfg_info, 0) == ACO_PROCESS_ERROR) {
- goto error;
+ return -1;
}
return 0;
-
-error:
- destroy_config();
- return -1;
}
enum agent_state {
@@ -730,12 +726,17 @@
*/
static enum ast_device_state agent_pvt_devstate_get(const char *agent_id)
{
- RAII_VAR(struct agent_pvt *, agent, ao2_find(agents, agent_id, OBJ_KEY), ao2_cleanup);
-
+ enum ast_device_state dev_state = AST_DEVICE_INVALID;
+ struct agent_pvt *agent;
+
+ agent = ao2_find(agents, agent_id, OBJ_KEY);
if (agent) {
- return agent->devstate;
- }
- return AST_DEVICE_INVALID;
+ agent_lock(agent);
+ dev_state = agent->devstate;
+ agent_unlock(agent);
+ ao2_ref(agent, -1);
+ }
+ return dev_state;
}
/*!
@@ -2642,7 +2643,7 @@
}
destroy_config();
- ao2_ref(agents, -1);
+ ao2_cleanup(agents);
agents = NULL;
return 0;
}
@@ -2656,12 +2657,6 @@
if (!agents) {
return AST_MODULE_LOAD_FAILURE;
}
- if (load_config()) {
- ast_log(LOG_ERROR, "Unable to load config. Not loading module.\n");
- ao2_ref(agents, -1);
- agents = NULL;
- return AST_MODULE_LOAD_DECLINE;
- }
/* Init agent holding bridge v_table. */
bridge_init_agent_hold();
@@ -2687,6 +2682,13 @@
unload_module();
return AST_MODULE_LOAD_FAILURE;
}
+
+ if (load_config()) {
+ ast_log(LOG_ERROR, "Unable to load config. Not loading module.\n");
+ unload_module();
+ return AST_MODULE_LOAD_DECLINE;
+ }
+
return AST_MODULE_LOAD_SUCCESS;
}
Modified: team/mjordan/trunk-http-stuff-and-things/apps/app_confbridge.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/apps/app_confbridge.c?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/apps/app_confbridge.c (original)
+++ team/mjordan/trunk-http-stuff-and-things/apps/app_confbridge.c Sat Feb 21 17:44:05 2015
@@ -1757,6 +1757,12 @@
/* if we're shutting down, don't attempt to do further processing */
if (ast_shutting_down()) {
+ /*
+ * Not taking any new calls at this time. We cannot create
+ * the announcer channel if this is the first channel into
+ * the conference and we certainly cannot create any
+ * recording channel.
+ */
leave_conference(&user);
conference = NULL;
goto confbridge_cleanup;
Modified: team/mjordan/trunk-http-stuff-and-things/apps/app_mixmonitor.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/apps/app_mixmonitor.c?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/apps/app_mixmonitor.c (original)
+++ team/mjordan/trunk-http-stuff-and-things/apps/app_mixmonitor.c Sat Feb 21 17:44:05 2015
@@ -727,12 +727,6 @@
ast_audiohook_lock(&mixmonitor->audiohook);
}
- /* Test Event */
- ast_test_suite_event_notify("MIXMONITOR_END", "Channel: %s\r\n"
- "File: %s\r\n",
- ast_channel_name(mixmonitor->autochan->chan),
- mixmonitor->filename);
-
ast_audiohook_unlock(&mixmonitor->audiohook);
ast_channel_lock(mixmonitor->autochan->chan);
@@ -760,6 +754,7 @@
}
ast_verb(2, "End MixMonitor Recording %s\n", mixmonitor->name);
+ ast_test_suite_event_notify("MIXMONITOR_END", "File: %s\r\n", mixmonitor->filename);
if (!AST_LIST_EMPTY(&mixmonitor->recipient_list)) {
if (ast_strlen_zero(fs_ext)) {
Modified: team/mjordan/trunk-http-stuff-and-things/apps/app_voicemail.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/apps/app_voicemail.c?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/apps/app_voicemail.c (original)
+++ team/mjordan/trunk-http-stuff-and-things/apps/app_voicemail.c Sat Feb 21 17:44:05 2015
@@ -2430,7 +2430,7 @@
/* We have to get the user before we can open the stream! */
vmu = find_user(&vmus, context, mailbox);
if (!vmu) {
- ast_log(AST_LOG_ERROR, "Couldn't find mailbox %s in context %s\n", mailbox, context);
+ ast_log(AST_LOG_WARNING, "Couldn't find mailbox %s in context %s\n", mailbox, context);
return -1;
} else {
/* No IMAP account available */
@@ -3334,7 +3334,7 @@
if (taglen < 1)
return NULL;
- if (!(start = strstr(header, tag)))
+ if (!(start = strcasestr(header, tag)))
return NULL;
/* Since we can be called multiple times we should clear our buffer */
Modified: team/mjordan/trunk-http-stuff-and-things/bridges/bridge_builtin_features.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/bridges/bridge_builtin_features.c?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/bridges/bridge_builtin_features.c (original)
+++ team/mjordan/trunk-http-stuff-and-things/bridges/bridge_builtin_features.c Sat Feb 21 17:44:05 2015
@@ -499,6 +499,10 @@
static int unload_module(void)
{
+ ast_bridge_features_unregister(AST_BRIDGE_BUILTIN_HANGUP);
+ ast_bridge_features_unregister(AST_BRIDGE_BUILTIN_AUTOMON);
+ ast_bridge_features_unregister(AST_BRIDGE_BUILTIN_AUTOMIXMON);
+
return 0;
}
@@ -508,8 +512,8 @@
ast_bridge_features_register(AST_BRIDGE_BUILTIN_AUTOMON, feature_automonitor, NULL);
ast_bridge_features_register(AST_BRIDGE_BUILTIN_AUTOMIXMON, feature_automixmonitor, NULL);
- /* Bump up our reference count so we can't be unloaded */
- ast_module_ref(ast_module_info->self);
+ /* This module cannot be unloaded until shutdown */
+ ast_module_shutdown_ref(ast_module_info->self);
return AST_MODULE_LOAD_SUCCESS;
}
Modified: team/mjordan/trunk-http-stuff-and-things/channels/chan_dahdi.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/channels/chan_dahdi.c?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/channels/chan_dahdi.c (original)
+++ team/mjordan/trunk-http-stuff-and-things/channels/chan_dahdi.c Sat Feb 21 17:44:05 2015
@@ -1423,7 +1423,8 @@
for (;;) {
i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
- if ((res = ioctl(p->subs[idx].dfd, DAHDI_IOMUX, &i))) {
+ res = ioctl(p->subs[idx].dfd, DAHDI_IOMUX, &i);
+ if (res) {
ast_log(LOG_WARNING, "I/O MUX failed: %s\n", strerror(errno));
ast_hangup(chan);
return 1;
@@ -1458,7 +1459,6 @@
}
if (analog_p->ringt > 0) {
if (!(--analog_p->ringt)) {
- res = -1;
break;
}
}
Modified: team/mjordan/trunk-http-stuff-and-things/channels/chan_iax2.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/channels/chan_iax2.c?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/channels/chan_iax2.c (original)
+++ team/mjordan/trunk-http-stuff-and-things/channels/chan_iax2.c Sat Feb 21 17:44:05 2015
@@ -14692,7 +14692,6 @@
ao2_ref(users, -1);
ao2_ref(iax_peercallno_pvts, -1);
ao2_ref(iax_transfercallno_pvts, -1);
- ao2_ref(peercnts, -1);
ao2_ref(callno_limits, -1);
ao2_ref(calltoken_ignores, -1);
if (timer) {
@@ -14700,8 +14699,11 @@
timer = NULL;
}
transmit_processor = ast_taskprocessor_unreference(transmit_processor);
+
+ ast_sched_clean_by_callback(sched, peercnt_remove_cb, peercnt_remove_cb);
ast_sched_context_destroy(sched);
sched = NULL;
+ ao2_ref(peercnts, -1);
con = ast_context_find(regcontext);
if (con)
Modified: team/mjordan/trunk-http-stuff-and-things/channels/chan_pjsip.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/channels/chan_pjsip.c?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/channels/chan_pjsip.c (original)
+++ team/mjordan/trunk-http-stuff-and-things/channels/chan_pjsip.c Sat Feb 21 17:44:05 2015
@@ -1378,6 +1378,8 @@
pj_str_t tmp;
if (pjsip_inv_end_session(session->inv_session, 302, NULL, &packet) != PJ_SUCCESS) {
+ ast_log(LOG_WARNING, "Failed to redirect PJSIP session for channel %s\n",
+ ast_channel_name(session->channel));
message = AST_TRANSFER_FAILED;
ast_queue_control_data(session->channel, AST_CONTROL_TRANSFER, &message, sizeof(message));
@@ -1390,6 +1392,8 @@
pj_strdup2_with_null(packet->pool, &tmp, target);
if (!(contact->uri = pjsip_parse_uri(packet->pool, tmp.ptr, tmp.slen, PJSIP_PARSE_URI_AS_NAMEADDR))) {
+ ast_log(LOG_WARNING, "Failed to parse destination URI '%s' for channel %s\n",
+ target, ast_channel_name(session->channel));
message = AST_TRANSFER_FAILED;
ast_queue_control_data(session->channel, AST_CONTROL_TRANSFER, &message, sizeof(message));
pjsip_tx_data_dec_ref(packet);
@@ -1431,14 +1435,28 @@
static int transfer(void *data)
{
struct transfer_data *trnf_data = data;
+ struct ast_sip_endpoint *endpoint = NULL;
+ struct ast_sip_contact *contact = NULL;
+ const char *target = trnf_data->target;
+
+ /* See if we have an endpoint; if so, use its contact */
+ endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", target);
+ if (endpoint) {
+ contact = ast_sip_location_retrieve_contact_from_aor_list(endpoint->aors);
+ if (contact && !ast_strlen_zero(contact->uri)) {
+ target = contact->uri;
+ }
+ }
if (ast_channel_state(trnf_data->session->channel) == AST_STATE_RING) {
- transfer_redirect(trnf_data->session, trnf_data->target);
+ transfer_redirect(trnf_data->session, target);
} else {
- transfer_refer(trnf_data->session, trnf_data->target);
+ transfer_refer(trnf_data->session, target);
}
ao2_ref(trnf_data, -1);
+ ao2_cleanup(endpoint);
+ ao2_cleanup(contact);
return 0;
}
@@ -2107,7 +2125,7 @@
static int call_pickup_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata)
{
- struct ast_features_pickup_config *pickup_cfg = ast_get_chan_features_pickup_config(session->channel);
+ struct ast_features_pickup_config *pickup_cfg;
struct ast_channel *chan;
/* We don't care about reinvites */
@@ -2115,6 +2133,7 @@
return 0;
}
+ pickup_cfg = ast_get_chan_features_pickup_config(session->channel);
if (!pickup_cfg) {
ast_log(LOG_ERROR, "Unable to retrieve pickup configuration options. Unable to detect call pickup extension.\n");
return 0;
Modified: team/mjordan/trunk-http-stuff-and-things/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/channels/chan_sip.c?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/channels/chan_sip.c (original)
+++ team/mjordan/trunk-http-stuff-and-things/channels/chan_sip.c Sat Feb 21 17:44:05 2015
@@ -1447,7 +1447,7 @@
static void set_destination(struct sip_pvt *p, const char *uri);
static void add_date(struct sip_request *req);
static void add_expires(struct sip_request *req, int expires);
-static void build_contact(struct sip_pvt *p);
+static void build_contact(struct sip_pvt *p, struct sip_request *req, int incoming);
/*------Request handling functions */
static int handle_incoming(struct sip_pvt *p, struct sip_request *req, struct ast_sockaddr *addr, int *recount, int *nounlock);
@@ -13847,22 +13847,110 @@
if (!ast_strlen_zero(c)) {
ast_string_field_set(p, uri, c);
}
-
-}
-
-/*! \brief Build contact header - the contact header we send out */
-static void build_contact(struct sip_pvt *p)
+}
+
+/*!
+ * \brief Determine if, as a UAS, we need to use a SIPS Contact.
+ *
+ * This uses the rules defined in RFC 3261 section 12.1.1 to
+ * determine if a SIPS URI should be used as the Contact header
+ * when responding to incoming SIP requests.
+ *
+ * \param req The incoming SIP request
+ * \retval 0 SIPS is not required
+ * \retval 1 SIPS is required
+ */
+static int uas_sips_contact(struct sip_request *req)
+{
+ const char *record_route = sip_get_header(req, "Record-Route");
+
+ if (!strncmp(REQ_OFFSET_TO_STR(req, rlpart2), "sips:", 5)) {
+ return 1;
+ }
+
+ if (record_route) {
+ char *record_route_uri = get_in_brackets(ast_strdupa(record_route));
+
+ if (!strncmp(record_route_uri, "sips:", 5)) {
+ return 1;
+ }
+ } else {
+ const char *contact = sip_get_header(req, "Contact");
+ char *contact_uri = get_in_brackets(ast_strdupa(contact));
+
+ if (!strncmp(contact_uri, "sips:", 5)) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/*!
+ * \brief Determine if, as a UAC, we need to use a SIPS Contact.
+ *
+ * This uses the rules defined in RFC 3621 section 8.1.1.8 to
+ * determine if a SIPS URI should be used as the Contact header
+ * on our outgoing request.
+ *
+ * \param req The outgoing SIP request
+ * \retval 0 SIPS is not required
+ * \retval 1 SIPS is required
+ */
+static int uac_sips_contact(struct sip_request *req)
+{
+ const char *route = sip_get_header(req, "Route");
+
+ if (!strncmp(REQ_OFFSET_TO_STR(req, rlpart2), "sips:", 5)) {
+ return 1;
+ }
+
+ if (route) {
+ char *route_uri = get_in_brackets(ast_strdupa(route));
+
+ if (!strncmp(route_uri, "sips:", 5)) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/*!
+ * \brief Build contact header
+ *
+ * This is the Contact header that we send out in SIP requests and responses
+ * involving this sip_pvt.
+ *
+ * The incoming parameter is used to tell if we are building the request parameter
+ * is an incoming SIP request that we are building the Contact header in response to,
+ * or if the req parameter is an outbound SIP request that we will later be adding
+ * the Contact header to.
+ *
+ * \param p The sip_pvt where the built Contact will be saved.
+ * \param req The request that triggered the creation of a Contact header.
+ * \param incoming Indicates if the Contact header is being created for a response to an incoming request
+ */
+static void build_contact(struct sip_pvt *p, struct sip_request *req, int incoming)
{
char tmp[SIPBUFSIZE];
char *user = ast_uri_encode(p->exten, tmp, sizeof(tmp), ast_uri_sip_user);
+ int use_sips;
+
+ if (incoming) {
+ use_sips = uas_sips_contact(req);
+ } else {
+ use_sips = uac_sips_contact(req);
+ }
if (p->socket.type == AST_TRANSPORT_UDP) {
- ast_string_field_build(p, our_contact, "<sip:%s%s%s>", user,
- ast_strlen_zero(user) ? "" : "@", ast_sockaddr_stringify_remote(&p->ourip));
+ ast_string_field_build(p, our_contact, "<%s:%s%s%s>", use_sips ? "sips" : "sip",
+ user, ast_strlen_zero(user) ? "" : "@",
+ ast_sockaddr_stringify_remote(&p->ourip));
} else {
- ast_string_field_build(p, our_contact, "<sip:%s%s%s;transport=%s>", user,
- ast_strlen_zero(user) ? "" : "@", ast_sockaddr_stringify_remote(&p->ourip),
- sip_get_transport(p->socket.type));
+ 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));
}
}
@@ -14058,7 +14146,7 @@
add_header(req, "From", from);
add_header(req, "To", to);
ast_string_field_set(p, exten, l);
- build_contact(p);
+ build_contact(p, req, 0);
add_header(req, "Contact", p->our_contact);
add_header(req, "Call-ID", p->callid);
add_header(req, "CSeq", tmp_n);
@@ -14487,7 +14575,6 @@
set_socket_transport(&mwi->call->socket, mwi->transport);
mwi->call->socket.port = htons(mwi->portno);
ast_sip_ouraddrfor(&mwi->call->sa, &mwi->call->ourip, mwi->call);
- build_contact(mwi->call);
build_via(mwi->call);
/* Change the dialog callid. */
@@ -15455,7 +15542,6 @@
internal network so we can register through nat
*/
ast_sip_ouraddrfor(&p->sa, &p->ourip, p);
- build_contact(p);
}
/* set up a timeout */
@@ -15535,6 +15621,7 @@
}
add_expires(&req, r->expiry);
+ build_contact(p, &req, 0);
add_header(&req, "Contact", p->our_contact);
initialize_initreq(p, &req);
@@ -15822,7 +15909,7 @@
if (!sip_cfg.ignore_regexpire) {
if (peer->rt_fromcontact && sip_cfg.peer_rtupdate) {
- ast_update_realtime(tablename, "name", peer->name, "fullcontact", "", "ipaddr", "", "port", "", "regseconds", "0", "regserver", "", "useragent", "", "lastms", "0", SENTINEL);
+ ast_update_realtime(tablename, "name", peer->name, "fullcontact", "", "ipaddr", "", "port", "0", "regseconds", "0", "regserver", "", "useragent", "", "lastms", "0", SENTINEL);
} else {
ast_db_del("SIP/Registry", peer->name);
ast_db_del("SIP/RegistryPath", peer->name);
@@ -17064,7 +17151,7 @@
}
ast_string_field_set(p, exten, name);
- build_contact(p);
+ build_contact(p, req, 1);
if (req->ignore) {
/* Expires is a special case, where we only want to load the peer if this isn't a deregistration attempt */
const char *expires = sip_get_header(req, "Expires");
@@ -18610,8 +18697,9 @@
if (t)
*t = '\0';
- if (ast_strlen_zero(p->our_contact))
- build_contact(p);
+ if (ast_strlen_zero(p->our_contact)) {
+ build_contact(p, req, 1);
+ }
}
of = get_in_brackets(of);
@@ -24760,12 +24848,16 @@
/* must go through authentication before getting here */
gotdest = get_destination(p, req, NULL);
- build_contact(p);
+ build_contact(p, req, 1);
if (ast_strlen_zero(p->context))
ast_string_field_set(p, context, sip_cfg.default_context);
if (ast_shutting_down()) {
+ /*
+ * Not taking any new calls at this time.
+ * Likely a server availability OPTIONS poll.
+ */
msg = "503 Unavailable";
} else {
msg = "404 Not Found";
@@ -25526,8 +25618,8 @@
goto request_invite_cleanup;
}
gotdest = get_destination(p, NULL, &cc_recall_core_id); /* Get destination right away */
- extract_uri(p, req); /* Get the Contact URI */
- build_contact(p); /* Build our contact header */
+ extract_uri(p, req); /* Get the Contact URI */
+ build_contact(p, req, 1); /* Build our contact header */
if (p->rtp) {
ast_rtp_instance_set_prop(p->rtp, AST_RTP_PROPERTY_DTMF, ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_RFC2833);
@@ -27435,7 +27527,7 @@
/* Get full contact header - this needs to be used as a request URI in NOTIFY's */
parse_ok_contact(p, req);
- build_contact(p);
+ build_contact(p, req, 1);
/* Initialize tag for new subscriptions */
if (ast_strlen_zero(p->tag)) {
Modified: team/mjordan/trunk-http-stuff-and-things/channels/pjsip/dialplan_functions.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/channels/pjsip/dialplan_functions.c?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/channels/pjsip/dialplan_functions.c (original)
+++ team/mjordan/trunk-http-stuff-and-things/channels/pjsip/dialplan_functions.c Sat Feb 21 17:44:05 2015
@@ -591,7 +591,10 @@
dlg = channel->session->inv_session->dlg;
- if (!strcmp(type, "secure")) {
+ if (ast_strlen_zero(type)) {
+ ast_log(LOG_WARNING, "You must supply a type field for 'pjsip' information\n");
+ return -1;
+ } else if (!strcmp(type, "secure")) {
#ifdef HAVE_PJSIP_GET_DEST_INFO
pjsip_host_info dest;
pj_pool_t *pool = pjsip_endpt_create_pool(ast_sip_get_pjsip_endpoint(), "secure-check", 128, 128);
Modified: team/mjordan/trunk-http-stuff-and-things/channels/sig_analog.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/channels/sig_analog.c?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/channels/sig_analog.c (original)
+++ team/mjordan/trunk-http-stuff-and-things/channels/sig_analog.c Sat Feb 21 17:44:05 2015
@@ -1703,7 +1703,6 @@
char dtmfbuf[300];
char namebuf[ANALOG_MAX_CID];
char numbuf[ANALOG_MAX_CID];
- struct callerid_state *cs = NULL;
char *name = NULL, *number = NULL;
int flags = 0;
struct ast_smdi_md_message *smdi_msg = NULL;
@@ -2391,7 +2390,6 @@
int timeout_ms;
int ms;
struct timeval start = ast_tvnow();
- cs = NULL;
ast_debug(1, "Receiving DTMF cid on channel %s\n", ast_channel_name(chan));
oldlinearity = analog_set_linear_mode(p, idx, 0);
@@ -2415,8 +2413,8 @@
* or AST_FLAG_END_DTMF_ONLY flag settings since we
* are hanging up the channel.
*/
- ast_log(LOG_WARNING, "DTMFCID timed out waiting for ring. "
- "Exiting simple switch\n");
+ ast_log(LOG_WARNING,
+ "DTMFCID timed out waiting for ring. Exiting simple switch\n");
ast_hangup(chan);
goto quit;
}
@@ -2510,8 +2508,8 @@
res = ast_waitfor(chan, ms);
if (res <= 0) {
- ast_log(LOG_WARNING, "CID timed out waiting for ring. "
- "Exiting simple switch\n");
+ ast_log(LOG_WARNING,
+ "CID timed out waiting for ring. Exiting simple switch\n");
ast_hangup(chan);
goto quit;
}
@@ -2537,10 +2535,8 @@
ast_log(LOG_WARNING, "Unable to get caller ID space\n");
}
} else {
- ast_log(LOG_WARNING, "Channel %s in prering "
- "state, but I have nothing to do. "
- "Terminating simple switch, should be "
- "restarted by the actual ring.\n",
+ ast_log(LOG_WARNING,
+ "Channel %s in prering state, but I have nothing to do. Terminating simple switch, should be restarted by the actual ring.\n",
ast_channel_name(chan));
ast_hangup(chan);
goto quit;
@@ -2609,18 +2605,12 @@
} else {
ast_log(LOG_WARNING, "Unable to get caller ID space\n");
}
- } else {
- cs = NULL;
}
if (number) {
ast_shrink_phone_number(number);
}
ast_set_callerid(chan, number, name, number);
-
- if (cs) {
- callerid_free(cs);
- }
analog_handle_notify_message(chan, p, flags, -1);
@@ -3846,8 +3836,7 @@
}
if (i->cid_start == ANALOG_CID_START_POLARITY || i->cid_start == ANALOG_CID_START_POLARITY_IN) {
i->polarity = POLARITY_REV;
- ast_verb(2, "Starting post polarity "
- "CID detection on channel %d\n",
+ ast_verb(2, "Starting post polarity CID detection on channel %d\n",
i->channel);
chan = analog_new_ast_channel(i, AST_STATE_PRERING, 0, ANALOG_SUB_REAL, NULL);
i->ss_astchan = chan;
@@ -3861,9 +3850,9 @@
ast_callid_threadstorage_auto_clean(callid, callid_created);
break;
default:
- ast_log(LOG_WARNING, "handle_init_event detected "
- "polarity reversal on non-FXO (ANALOG_SIG_FXS) "
- "interface %d\n", i->channel);
+ ast_log(LOG_WARNING,
+ "handle_init_event detected polarity reversal on non-FXO (ANALOG_SIG_FXS) interface %d\n",
+ i->channel);
break;
}
break;
@@ -3888,9 +3877,9 @@
ast_callid_threadstorage_auto_clean(callid, callid_created);
break;
default:
- ast_log(LOG_WARNING, "handle_init_event detected "
- "dtmfcid generation event on non-FXO (ANALOG_SIG_FXS) "
- "interface %d\n", i->channel);
+ ast_log(LOG_WARNING,
+ "handle_init_event detected dtmfcid generation event on non-FXO (ANALOG_SIG_FXS) interface %d\n",
+ i->channel);
break;
}
break;
Modified: team/mjordan/trunk-http-stuff-and-things/configs/samples/http.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/configs/samples/http.conf.sample?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/configs/samples/http.conf.sample (original)
+++ team/mjordan/trunk-http-stuff-and-things/configs/samples/http.conf.sample Sat Feb 21 17:44:05 2015
@@ -12,6 +12,16 @@
; http://<server_ip>:<bindport>/static/docs/index.html
;
[general]
+;
+; The name of the server, advertised in both the Server field in HTTP
+; response message headers, as well as the <address /> element in certain HTTP
+; response message bodies. If not furnished here, "Asterisk/{version}" will be
+; used as a default value for the Server header field and the <address />
+; element. Setting this property to a blank value will result in the omission
+; of the Server header field from HTTP response message headers and the
+; <address /> element from HTTP response message bodies.
+;
+servername=Asterisk
;
; Whether HTTP/HTTPS interface is enabled or not. Default is no.
; This also affects manager/rawman/mxml access (see manager.conf)
Modified: team/mjordan/trunk-http-stuff-and-things/configs/samples/pjsip.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/configs/samples/pjsip.conf.sample?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/configs/samples/pjsip.conf.sample (original)
+++ team/mjordan/trunk-http-stuff-and-things/configs/samples/pjsip.conf.sample Sat Feb 21 17:44:05 2015
@@ -795,17 +795,6 @@
; information. Value is in milliseconds; default
; is 100 ms.
-;==========================CONTACT SECTION OPTIONS=========================
-;[contact]
-; SYNOPSIS: A way of creating an aliased name to a SIP URI
-;type= ; Must be of type contact (default: "")
-;uri= ; SIP URI to contact peer (default: "")
-;expiration_time= ; Time to keep alive a contact (default: "")
-;qualify_frequency=0 ; Interval at which to qualify a contact (default: "0")
-;outbound_proxy= ; Outbound proxy used when sending OPTIONS request
- ; (default: "")
-
-
;==========================AOR SECTION OPTIONS=========================
;[aor]
; SYNOPSIS: The configuration for a location of an endpoint
Modified: team/mjordan/trunk-http-stuff-and-things/configs/samples/pjsip_wizard.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/configs/samples/pjsip_wizard.conf.sample?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/configs/samples/pjsip_wizard.conf.sample (original)
+++ team/mjordan/trunk-http-stuff-and-things/configs/samples/pjsip_wizard.conf.sample Sat Feb 21 17:44:05 2015
@@ -24,7 +24,7 @@
;============EXAMPLE WIZARD CONFIGURATION FOR A PHONE=======================
; This config would create an endpoint, aor with dynamic contact, inbound
-; auth and a phoneprov object.
+; auth, a phoneprov object and a dialplan hint for extension 1000.
;[myphone]
;type = wizard
@@ -32,6 +32,8 @@
;accepts_registrations = yes
;has_phoneprov = yes
;transport = ipv4
+;has_hint = yes
+;hint_exten = 1000
;inbound_auth/username = testname
;inbound_auth/password = test password
;endpoint/allow = ulaw
@@ -116,6 +118,24 @@
; If yes, phoneprov/MAC must be specified.
; (default: "no")
+;has_hint= ; Create hint and optionally a default application.
+ ; (default: "no")
+
+;hint_context ; Any hints created for this wizard will be placed in this
+ ; context.
+ ; (default: endpoint/context)
+
+;hint_exten ; If specified, a PJSIP/<wizard_id> hint will be created
+ ; for this extension in 'hint_context'.
+ ; context.
+ ; (default: none)
+
+;hint_application ; If specified, an extension will be placed in 'hint_context'
+ ; at priority 1 that calls this application. Could be any
+ ; valid dialplan expression like
+ ; "Gosub(stdexten,${EXTEN},1(${HINT}))"
+ ; (default: "Dial(${HINT})")
+
;endpoint/<param> ; Any parameters to be passed directly to and validated
;aor/<param> ; by their respective objects.
;inbound_auth/<param>
Modified: team/mjordan/trunk-http-stuff-and-things/contrib/scripts/install_prereq
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/contrib/scripts/install_prereq?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/contrib/scripts/install_prereq (original)
+++ team/mjordan/trunk-http-stuff-and-things/contrib/scripts/install_prereq Sat Feb 21 17:44:05 2015
@@ -163,7 +163,7 @@
cd pjproject
git pull
fi
- ./configure --enable-shared --with-external-speex --with-external-gsm --with-external-srtp --disable-sound --disable-resample && make && make install
+ ./configure CFLAGS="-DNDEBUG -DPJ_HAS_IPV6=1" --enable-shared --with-external-speex --with-external-gsm --with-external-srtp --disable-sound --disable-resample && make && make install
cd ..
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local.conf
/sbin/ldconfig
Modified: team/mjordan/trunk-http-stuff-and-things/funcs/func_curl.c
URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-http-stuff-and-things/funcs/func_curl.c?view=diff&rev=432173&r1=432172&r2=432173
==============================================================================
--- team/mjordan/trunk-http-stuff-and-things/funcs/func_curl.c (original)
+++ team/mjordan/trunk-http-stuff-and-things/funcs/func_curl.c Sat Feb 21 17:44:05 2015
@@ -50,6 +50,7 @@
#include "asterisk/app.h"
#include "asterisk/utils.h"
#include "asterisk/threadstorage.h"
+#include "asterisk/test.h"
/*** DOCUMENTATION
<function name="CURL" language="en_US">
@@ -609,6 +610,31 @@
struct curl_write_callback_data cb_data;
};
+/*!
+ * \brief Check for potential HTTP injection risk.
+ *
+ * CVE-2014-8150 brought up the fact that HTTP proxies are subject to injection
+ * attacks. An HTTP URL sent to a proxy contains a carriage-return linefeed combination,
+ * followed by a complete HTTP request. Proxies will handle this as two separate HTTP
+ * requests rather than as a malformed URL.
+ *
+ * libcURL patched this vulnerability in version 7.40.0, but we have no guarantee that
+ * Asterisk systems will be using an up-to-date cURL library. Therefore, we implement
+ * the same fix as libcURL for determining if a URL is vulnerable to an injection attack.
+ *
+ * \param url The URL to check for vulnerability
+ * \retval 0 The URL is not vulnerable
+ * \retval 1 The URL is vulnerable.
+ */
+static int url_is_vulnerable(const char *url)
+{
+ if (strpbrk(url, "\r\n")) {
+ return 1;
+ }
+
+ return 0;
+}
+
static int acf_curl_helper(struct ast_channel *chan, struct curl_args *args)
{
struct ast_str *escapebuf = ast_str_thread_get(&thread_escapebuf, 16);
@@ -626,6 +652,11 @@
if (!(curl = ast_threadstorage_get(&curl_instance, sizeof(*curl)))) {
ast_log(LOG_ERROR, "Cannot allocate curl structure\n");
+ return -1;
+ }
+
+ if (url_is_vulnerable(args->url)) {
+ ast_log(LOG_ERROR, "URL '%s' is vulnerable to HTTP injection attacks. Aborting CURL() call.\n", args->url);
return -1;
}
@@ -830,12 +861,62 @@
[... 4313 lines stripped ...]
More information about the asterisk-commits
mailing list