[svn-commits] mjordan: branch mjordan/trunk-http-stuff-and-things r432173 - in /team/mjorda...

SVN commits to the Digium repositories svn-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 svn-commits mailing list