]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_sip: Optionally supply fromuser/fromdomain in SIP dial string. 81/2281/1
authorWalter Doekes <walter+asterisk@wjd.nu>
Fri, 19 Feb 2016 10:30:15 +0000 (11:30 +0100)
committerWalter Doekes <walter+asterisk@wjd.nu>
Fri, 19 Feb 2016 10:30:15 +0000 (11:30 +0100)
Previously you could add [!dnid] to the SIP dial string to alter the To:
header. This change allows you to alter the From header as well.

SIP dial string extra options now look like this:

    [![touser[@todomain]][![fromuser][@fromdomain]]]

INCOMPATIBLE CHANGE: If you were using an exclamation mark in your To:
header, that is no longer possible.

ASTERISK-25803 #close

Change-Id: I2457e9ba7a89eb1da22084bab5a4d4328e189db7

CHANGES
UPGRADE.txt
channels/chan_sip.c
configs/samples/sip.conf.sample

diff --git a/CHANGES b/CHANGES
index 5e4c428469fb444cd372c18ec32f3e6690f05f2d..002ddb736d1e516e197f5640cb52426913c5e385 100644 (file)
--- 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
 ------------------
index 6fb82c43aa24c8e762eda37d9ae66ed0b608220e..131ce6caab238b1ac45f8e38f58f780ba928a796 100644 (file)
@@ -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
index aaf0b6d51dad476aea77c3ee66ae525349cac8b3..2e9a6d19590f33a93ed6653a8cabe4ec21c741d5 100644 (file)
@@ -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 */
index fe685141af634ec893d0a4eae13811adb919aaec..d89a2a157359461b340f8689606baa5c29d6a4e5 100644 (file)
@@ -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
 ;
 ;         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