diff --git a/CHANGES b/CHANGES index 5e4c428469fb444cd372c18ec32f3e6690f05f2d..002ddb736d1e516e197f5640cb52426913c5e385 100644 --- a/CHANGES +++ b/CHANGES @@ -81,6 +81,11 @@ chan_sip * DTLS related configuration options can now be set at a general level. Enabling DTLS support, though, requires enabling it at the user or peer level. + * Added the possibility to set the From: header through the the SIP dial + string (populating the fromuser/fromdomain fields), complementing the + [!dnid] option for the To: header that has existed since 1.6.0 (1d6b192). + NOTE: This is again separated by an exclamation mark, so the To: header may + not contain one of those. chan_pjsip ------------------ diff --git a/UPGRADE.txt b/UPGRADE.txt index 6fb82c43aa24c8e762eda37d9ae66ed0b608220e..131ce6caab238b1ac45f8e38f58f780ba928a796 100644 --- a/UPGRADE.txt +++ b/UPGRADE.txt @@ -31,6 +31,11 @@ chan_dahdi: ring-ring-ring pattern would exceed the pattern limits and stop Caller-ID detection. +chan_sip: + - The SIP dial string has been extended past the [!dnid] option by another + exclamation mark: [!dnid[!fromuri]. An exclamation mark in the To-URI + will now mean changes to the From-URI. + Core: - The REF_DEBUG compiler flag is now used to enable refdebug by default. The setting can be overridden in asterisk.conf by setting refdebug in diff --git a/channels/chan_sip.c b/channels/chan_sip.c index aaf0b6d51dad476aea77c3ee66ae525349cac8b3..2e9a6d19590f33a93ed6653a8cabe4ec21c741d5 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -29680,7 +29680,8 @@ static int sip_devicestate(const char *data) * or SIP/devicename/extension/IPorHost * or SIP/username@domain//IPorHost * and there is an optional [!dnid] argument you can append to alter the - * To: header. + * To: header. And after that, a [![fromuser][@fromdomain]] argument. + * Leave those blank to use the defaults. * \endverbatim */ static struct ast_channel *sip_request_call(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *dest, int *cause) @@ -29752,11 +29753,49 @@ static struct ast_channel *sip_request_call(const char *type, struct ast_format_ /* Save the destination, the SIP dial string */ ast_copy_string(tmp, dest, sizeof(tmp)); - /* Find DNID and take it away */ + /* Find optional DNID (SIP to-uri) and From-CLI (SIP from-uri) + * and strip it from the dial string: + * [!touser[@todomain][![fromuser][@fromdomain]]] + * For historical reasons, the touser@todomain is passed as dnid + * while fromuser@fromdomain are split immediately. Passing a + * todomain without touser will create an invalid SIP message. */ dnid = strchr(tmp, '!'); if (dnid != NULL) { + char *fromuser_and_domain; + *dnid++ = '\0'; - ast_string_field_set(p, todnid, dnid); + if ((fromuser_and_domain = strchr(dnid, '!'))) { + char *forward_compat; + char *fromdomain; + + *fromuser_and_domain++ = '\0'; + + /* Cut it at a trailing NUL or trailing '!' for + * forward compatibility with extra arguments + * in the future. */ + if ((forward_compat = strchr(fromuser_and_domain, '!'))) { + /* Ignore the rest.. */ + *forward_compat = '\0'; + } + + if ((fromdomain = strchr(fromuser_and_domain, '@'))) { + *fromdomain++ = '\0'; + /* Set fromdomain. */ + if (!ast_strlen_zero(fromdomain)) { + ast_string_field_set(p, fromdomain, fromdomain); + } + } + + /* Set fromuser. */ + if (!ast_strlen_zero(fromuser_and_domain)) { + ast_string_field_set(p, fromuser, fromuser_and_domain); + } + } + + /* Set DNID (touser/todomain). */ + if (!ast_strlen_zero(dnid)) { + ast_string_field_set(p, todnid, dnid); + } } /* Divvy up the items separated by slashes */ diff --git a/configs/samples/sip.conf.sample b/configs/samples/sip.conf.sample index fe685141af634ec893d0a4eae13811adb919aaec..d89a2a157359461b340f8689606baa5c29d6a4e5 100644 --- a/configs/samples/sip.conf.sample +++ b/configs/samples/sip.conf.sample @@ -24,6 +24,9 @@ ; SIP/devicename/extension ; SIP/devicename/extension/IPorHost ; SIP/username@domain//IPorHost +; And to alter the To: or the From: header, you can additionally append +; the following to any of the above strings: +; [![touser[@todomain]][![fromuser][@fromdomain]]] ; ; ; Devicename @@ -57,6 +60,14 @@ ; ; SIP/sales@mysipproxy!sales@edvina.net ; +; (Specifying only @todomain without touser will create an invalid SIP +; request.) +; +; Similarly, you can specify the From header as well, after a second +; exclamation mark: +; +; SIP/customer@mysipproxy!!customersupport@wearespindle.com +; ; A new feature for 1.8 allows one to specify a host or IP address to use ; when routing the call. This is typically used in tandem with func_srv if ; multiple methods of reaching the same domain exist. The host or IP address