apps/app_sms: Add an option to prevent SMS content from being logged
authorMatthew Jordan <mjordan@digium.com>
Sat, 14 Mar 2015 01:53:13 +0000 (01:53 +0000)
committerMatthew Jordan <mjordan@digium.com>
Sat, 14 Mar 2015 01:53:13 +0000 (01:53 +0000)
In some countries, privacy laws specify that SMS content cannot be saved by a
provider. This patch adds a new option to the SMS application, 'n', which
prevents the SMS content from being written to the SMS log.

ASTERISK-22591 #close
Reported by: Jan Juergens
patches:
  DisableSmsContentLoggingByParam.patch uploaded by Jan Juergens (License 6538)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@432947 65c4cc65-6c06-0410-ace0-fbb531ad65f3

CHANGES
apps/app_sms.c

diff --git a/CHANGES b/CHANGES
index 5f08d5a..dea688e 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -26,6 +26,12 @@ ConfBridge
    - record_command: a command to execute when recording is finished
    Note that these options may also be with the CONFBRIDGE function.
 
+SMS
+------------------
+ * Added the 'n' option, which prevents the SMS from being written to the log
+   file. This is needed for those countries with privacy laws that require
+   providers to not log SMS content.
+
 
 Channel Drivers
 ------------------
index 385f479..eb17c27 100644 (file)
@@ -88,6 +88,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
                                        <option name="o">
                                                <para>The body should be coded as octets not 7-bit symbols.</para>
                                        </option>
+                                       <option name="n">
+                                               <para>Do not log any SMS content to log file (privacy).</para>
+                                       </option>
                                </optionlist>
                        </parameter>
                        <parameter name="addr" />
@@ -220,6 +223,7 @@ typedef struct sms_s {
        unsigned char sent_rel:1;     /*!< have sent REL message... */
        unsigned char smsc:1;        /*!< we are SMSC */
        unsigned char rx:1;          /*!< this is a received message */
+       unsigned char nolog:1;       /*!< do not log plain text SMS content (privacy) */
        char queue[30];              /*!< queue name */
        char oa[20];                 /*!< originating address */
        char da[20];                 /*!< destination address */
@@ -790,20 +794,25 @@ static void sms_log(sms_t * h, char status)
                        status, h->rx ? 'I' : 'O', h->smsc ? 'S' : 'M', mrs, h->queue,
                        S_OR(h->oa, "-"), S_OR(h->da, "-") );
                p = line + strlen(line);
-               for (n = 0; n < h->udl; n++) {
-                       if (h->ud[n] == '\\') {
-                               *p++ = '\\';
-                               *p++ = '\\';
-                       } else if (h->ud[n] == '\n') {
-                               *p++ = '\\';
-                               *p++ = 'n';
-                       } else if (h->ud[n] == '\r') {
-                               *p++ = '\\';
-                               *p++ = 'r';
-                       } else if (h->ud[n] < 32 || h->ud[n] == 127) {
-                               *p++ = 191;
-                       } else {
-                               *p++ = h->ud[n];
+
+               if (h->nolog) {
+                       p += snprintf(p, 1000 - strlen(line), "udl=%d", h->udl);
+               } else {
+                       for (n = 0; n < h->udl; n++) {
+                               if (h->ud[n] == '\\') {
+                                       *p++ = '\\';
+                                       *p++ = '\\';
+                               } else if (h->ud[n] == '\n') {
+                                       *p++ = '\\';
+                                       *p++ = 'n';
+                               } else if (h->ud[n] == '\r') {
+                                       *p++ = '\\';
+                                       *p++ = 'r';
+                               } else if (h->ud[n] < 32 || h->ud[n] == 127) {
+                                       *p++ = 191;
+                               } else {
+                                       *p++ = h->ud[n];
+                               }
                        }
                }
                *p++ = '\n';
@@ -1853,6 +1862,7 @@ enum sms_flags {
        OPTION_PAUSE    = (1 << 3),             /* pause before sending data, in ms */
        OPTION_SRR      = (1 << 4),                 /* set srr */
        OPTION_DCS      = (1 << 5),                 /* set dcs */
+       OPTIONS_NO_LOG  = (1 << 6),             /* Don't log SMS content */
 };
 
 enum sms_opt_args {
@@ -1866,6 +1876,7 @@ AST_APP_OPTIONS(sms_options, {
        AST_APP_OPTION('t', OPTION_TWO),
        AST_APP_OPTION('r', OPTION_SRR),
        AST_APP_OPTION('o', OPTION_DCS),
+       AST_APP_OPTION('n', OPTIONS_NO_LOG),
        AST_APP_OPTION_ARG('p', OPTION_PAUSE, OPTION_ARG_PAUSE),
        } );
 
@@ -1926,6 +1937,7 @@ static int sms_exec(struct ast_channel *chan, const char *data)
 
        h.smsc = ast_test_flag(&flags, OPTION_BE_SMSC);
        h.protocol = ast_test_flag(&flags, OPTION_TWO) ? 2 : 1;
+       h.nolog = ast_test_flag(&flags, OPTIONS_NO_LOG) ? 1 : 0;
        if (!ast_strlen_zero(sms_opts[OPTION_ARG_PAUSE])) {
                h.opause_0 = atoi(sms_opts[OPTION_ARG_PAUSE]);
        }