From Cal Turney:
authoretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Thu, 18 Jul 2013 04:28:36 +0000 (04:28 +0000)
committeretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Thu, 18 Jul 2013 04:28:36 +0000 (04:28 +0000)
Unrecognized preferences and color filters created in proprietary or older versions are discarded when saved.

If the user attempts to save the preferences or colorfilters file, a popup is displayed that warns that unrecognized prefs or color filters have been detected and will be discarded if the save operation is allowed to proceed. In the case of Preferences, the popup message includes the version at which the file was last saved.  A "Continue without Saving" button is provided so that the user can save the profile under a different name.

https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=8942

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@50716 f5534014-38df-0310-8fa8-9805f1628bb7

color_filters.c
epan/prefs.c
epan/prefs.h
ui/gtk/color_dlg.c
ui/gtk/prefs_dlg.c

index b960be5b38564b35f0960c3beccb23d306422b0c..ae894363d31003edf8d231d69338c595cdb20729 100644 (file)
@@ -570,8 +570,10 @@ read_filters_file(FILE *f, gpointer user_data)
             dfilter_t *temp_dfilter;
 
             if (!dfilter_compile(filter_exp, &temp_dfilter)) {
-                g_warning("Could not compile color filter \"%s\" from saved filters: %s",
+                g_warning("Could not compile \"%s\" in colorfilters file.\n%s",
                           name, dfilter_error_msg);
+                prefs.unknown_colorfilters = TRUE;
+
                 skip_end_of_line = TRUE;
                 continue;
             }
index 0127a0f71edb1ab4bf3acc750eee0021de901582..82fec9789a83af3d066ae7e27ea6aaf0cad3438e 100644 (file)
@@ -2900,7 +2900,7 @@ void
 prefs_reset(void)
 {
   prefs_initialized = FALSE;
-
+  g_free(prefs.saved_at_version);
   /*
    * Unload all UAT preferences.
    */
@@ -3061,11 +3061,28 @@ read_prefs_file(const char *pf_path, FILE *pf,
   GString  *cur_var;
   gboolean  got_val = FALSE;
   gint      fline = 1, pline = 1;
-  gchar     hint[] = "(applying your preferences once should remove this warning)";
-
+  gchar     hint[] = "(save preferences to remove this warning)";
+  
   cur_val = g_string_new("");
   cur_var = g_string_new("");
 
+  /* Try to read in the profile name in the first line of the preferences file. */
+  got_c = getc(pf);
+  if(got_c) {
+    GString *firstl = (GString *)pf; 
+    
+       if (strncmp(firstl->str, " Configuration file for ", 24) == 0) {      
+      gchar *eol;
+         gsize len;
+
+         firstl->str += 24;
+         eol = strchr((char *) firstl->str, '\n');
+      len = eol - firstl->str - 1;
+         prefs.saved_at_version = g_strndup((const gchar *)firstl->str, len);
+       }
+  }
+  rewind(pf);
+
   while ((got_c = getc(pf)) != EOF) {
     if (got_c == '\n') {
       state = START;
@@ -3095,8 +3112,8 @@ read_prefs_file(const char *pf_path, FILE *pf,
                 break;
 
               case PREFS_SET_SYNTAX_ERR:
-                g_warning ("%s line %d: Syntax error in preference \"%s\" %s",
-                  pf_path, pline, cur_var->str, hint);
+                g_warning ("Syntax error in preference \"%s\" at line %d of\n%s %s",
+                  cur_var->str, pline, pf_path, hint);
                 break;
 
               case PREFS_SET_NO_SUCH_PREF:
@@ -3105,19 +3122,26 @@ read_prefs_file(const char *pf_path, FILE *pf,
                  * on non-Win32 platforms.
                  */
                 if (strcmp(cur_var->str, "print.command") != 0)
-                    g_warning ("%s line %d: No such preference \"%s\" %s",
-                               pf_path, pline, cur_var->str, hint);
+                    g_warning ("No such preference \"%s\" at line %d of\n%s %s",
+                      cur_var->str, pline, pf_path, hint);
+                prefs.unknown_prefs = TRUE;
                 break;
 
               case PREFS_SET_OBSOLETE:
-                /* We silently ignore attempts to set these; it's
-                   probably not the user's fault that it's in there -
-                   they may have saved preferences with a release that
-                   supported them. */
+                if (strcmp(cur_var->str, "print.command") != 0)
+                  /* If an attempt is made to save the preferences, a popup warning will be
+                     displayed stating that obsolete prefs have been detected and the user will
+                     be given the opportunity to save these prefs under a different profile name.
+                     The prefs in question need to be listed in the console window so that the
+                     user can make an informed choice.
+                   */
+                  g_warning ("Obsolete preference \"%s\" at line %d of\n%s %s",
+                    cur_var->str, pline, pf_path, hint);
+                prefs.unknown_prefs = TRUE;
                 break;
               }
             } else {
-              g_warning ("%s line %d: Incomplete preference %s", pf_path, pline, hint);
+              g_warning ("Incomplete preference at line %d: of\n%s %s", pline, pf_path, hint);
             }
           }
           state      = IN_VAR;
@@ -3130,7 +3154,7 @@ read_prefs_file(const char *pf_path, FILE *pf,
         } else if (got_c == '#') {
           state = IN_SKIP;
         } else {
-          g_warning ("%s line %d: Malformed line %s", pf_path, fline, hint);
+          g_warning ("Malformed preference at line %d of\n%s %s", fline, pf_path, hint);
         }
         break;
       case IN_VAR:
@@ -3170,22 +3194,23 @@ read_prefs_file(const char *pf_path, FILE *pf,
         break;
 
       case PREFS_SET_SYNTAX_ERR:
-        g_warning ("%s line %d: Syntax error in preference %s %s", pf_path, pline, cur_var->str, hint);
+        g_warning ("Syntax error in preference %s at line %d of\n%s %s",
+          cur_var->str, pline, pf_path, hint);
         break;
 
       case PREFS_SET_NO_SUCH_PREF:
-        g_warning ("%s line %d: No such preference \"%s\" %s", pf_path,
-                        pline, cur_var->str, hint);
+        g_warning ("No such preference \"%s\" at line %d of\n%s %s",
+            cur_var->str, pline, pf_path, hint);
+        prefs.unknown_prefs = TRUE;
         break;
 
       case PREFS_SET_OBSOLETE:
-        /* We silently ignore attempts to set these; it's probably not
-           the user's fault that it's in there - they may have saved
-           preferences with a release that supported it. */
+        prefs.unknown_prefs = TRUE;
         break;
       }
     } else {
-      g_warning ("%s line %d: Incomplete preference %s", pf_path, pline, hint);
+      g_warning ("Incomplete preference at line %d of\n%s %s",
+        pline, pf_path, hint);
     }
   }
 
@@ -3664,9 +3689,16 @@ set_pref(gchar *pref_name, const gchar *value, void *private_data _U_,
           else if (strcmp(pref_name, "sonmp") == 0)
             module = prefs_find_module("ndp");
           else if (strcmp(pref_name, "etheric") == 0 ||
-                   strcmp(pref_name, "isup_thin") == 0)
+                   strcmp(pref_name, "isup_thin") == 0) {
             /* This protocol was removed 7. July 2009 */
             return PREFS_SET_OBSOLETE;
+          }              
+          if (module) {
+            g_warning ("Preference \"%s.%s\" has been converted to \"%s.%s.%s\"\n"
+              "Save your preferences to make this change permanent.",
+              pref_name, dotp+1, module->parent->name, pref_name, dotp+1);
+            prefs.unknown_prefs = TRUE;
+          }
         }
         *dotp = '.';                /* put the preference string back */
         dotp++;                     /* skip past separator to preference name */
@@ -3677,6 +3709,8 @@ set_pref(gchar *pref_name, const gchar *value, void *private_data _U_,
     pref = prefs_find_preference(module, dotp);
 
     if (pref == NULL) {
+      prefs.unknown_prefs = TRUE;
+
       /* "gui" prefix was added to column preferences for better organization
        * within the preferences file
        */
index e9dd89de992911658e8338dd5f4b7c10b8a656e9..6d749b8b1aaa248dce031d81eab950567115fd0b 100644 (file)
@@ -201,6 +201,9 @@ typedef struct _e_prefs {
   gboolean     gui_update_enabled;
   software_update_channel_e gui_update_channel;
   gint         gui_update_interval;
+  gchar       *saved_at_version;
+  gboolean     unknown_prefs;         /* unknown or obsolete pref(s) */ 
+  gboolean     unknown_colorfilters;  /* unknown or obsolete color filter(s) */
 } e_prefs;
 
 WS_DLL_PUBLIC e_prefs prefs;
index b222870cee94c79c3093ca329aebdca6fbaec032..84bed9bd84997ba9da5b0a8ec6ce70be1ec1cf38 100644 (file)
@@ -1019,6 +1019,42 @@ color_clear_cb(GtkWidget *widget, gpointer data _U_) {
 }
 
 
+static void 
+overwrite_existing_colorfilters_cb(gpointer dialog _U_, gint btn, gpointer data _U_)
+{
+       switch (btn) {
+       case(ESD_BTN_SAVE):
+           /* overwrite the file*/
+        if (!color_filters_write(color_filter_edit_list))
+            simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+                "Could not open colorfilter file: %s", g_strerror(errno));
+        else
+            prefs.unknown_colorfilters = FALSE;
+           break;
+       case(ESD_BTN_DONT_SAVE):
+           break;
+       default:
+           g_assert_not_reached();
+       }
+}
+
+static void
+colorfilters_main_save()
+{
+  if (prefs.unknown_colorfilters) {
+    gpointer dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE,
+      "Obsolete or unrecognized color filters have been detected. "
+      "If this profile will be used with an older or nonstandard Wireshark version "
+      "or one that includes a proprietary dissector plugin, click 'Continue "
+      "without Saving' and save this profile under a different name.\n\n");
+
+    simple_dialog_set_cb(dialog, overwrite_existing_colorfilters_cb, NULL);
+  } else {
+    if (!color_filters_write(color_filter_edit_list))
+      simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Could not open filter file: %s", g_strerror(errno));
+  }
+}
+
 
 /* User pressed "Ok" button: Exit dialog and apply new list of
    color filters to the capture. */
@@ -1038,11 +1074,8 @@ static void
 color_apply_cb(GtkButton *button _U_, gpointer user_data _U_)
 {
   /* if we don't have a Save button, just save the settings now */
-  if (!prefs.gui_use_pref_save) {
-      if (!color_filters_write(color_filter_edit_list))
-            simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
-                "Could not open filter file: %s", g_strerror(errno));
-  }
+  if (!prefs.gui_use_pref_save)
+    colorfilters_main_save();
 
   /* Apply the coloring rules, both the temporary ones in
    * color_filter_tmp_list as the permanent ones in color_filter_edit_list
@@ -1058,10 +1091,7 @@ color_apply_cb(GtkButton *button _U_, gpointer user_data _U_)
 static void
 color_save_cb(GtkButton *button _U_, gpointer user_data _U_)
 {
-
-  if (!color_filters_write(color_filter_edit_list))
-        simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
-            "Could not open filter file: %s", g_strerror(errno));
+  colorfilters_main_save();
 }
 
 /* User pressed "Cancel" button (or "ESC" or the 'X'):
index 9bc073f72a92a19c4e4c16b8ed798077a56bff72..e3a540568cdcde88adeaaa2fec1a8b20728303af 100644 (file)
@@ -1252,8 +1252,8 @@ prefs_main_fetch_all(GtkWidget *dlg, gboolean *must_redissect)
   /* XXX - check the non-registered preferences too */
   switch (prefs_modules_foreach(module_prefs_check, (gpointer)&badpref)) {
 
-  case PREFS_SET_SYNTAX_ERR:
-    switch (badpref->type) {
+    case PREFS_SET_SYNTAX_ERR:
+      switch (badpref->type) {
 
     case PREF_UINT:
       simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
@@ -1391,6 +1391,55 @@ static void prefs_copy(void) {
   prefs_modules_foreach(module_prefs_copy, NULL);
 }
 
+static void
+overwrite_existing_prefs_cb(gpointer dialog _U_, gint btn, gpointer parent_w)
+{
+  switch (btn) {
+    case(ESD_BTN_SAVE):
+      prefs_main_write();
+         prefs.unknown_prefs = FALSE;
+      break;
+    case(ESD_BTN_DONT_SAVE):
+      break;
+    default:
+      g_assert_not_reached();
+  }
+}
+static void
+prefs_main_save(gpointer parent_w)
+{
+  if (prefs.unknown_prefs) {
+    gpointer dialog;
+    gchar *msg;
+    gchar *msg1 = "These preferences were last saved at version ";
+    gchar *msg2 = "Obsolete or unrecognized preferences have been detected. "
+                  "If you plan to use this profile with ";
+    gchar *msg3 = "that version of Wireshark, ";
+    gchar *msg4 = "an older or nonstandard Wireshark version, ";
+    gchar *msg5 = "click 'Continue without Saving' and save this profile under a another name.\n";
+    
+    if (prefs.saved_at_version) {
+      gulong tot_msg_len = 246 + (gulong)strlen(prefs.saved_at_version) + 1;
+      
+      msg = (gchar *)g_malloc(tot_msg_len);
+      g_snprintf(msg, tot_msg_len, "%s\"%s\". %s%s%s",
+        msg1, prefs.saved_at_version, msg2, msg3, msg5);
+      dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE, msg);
+    } else { 
+      msg = (gchar *)g_malloc(214);
+
+      g_snprintf(msg, 214, "%s%s%s", msg2, msg4, msg5);
+      dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE, msg);
+    }
+
+    simple_dialog_set_cb(dialog, overwrite_existing_prefs_cb, parent_w);
+    g_free(msg);
+    
+  } else {
+    prefs_main_write();
+  }
+}
+
 static void
 prefs_main_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w)
 {
@@ -1401,7 +1450,7 @@ prefs_main_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w)
 
   /* if we don't have a Save button, just save the settings now */
   if (!prefs.gui_use_pref_save) {
-    prefs_main_write();
+    prefs_main_save(parent_w);
   }
 
 #ifdef HAVE_AIRPCAP
@@ -1442,7 +1491,7 @@ prefs_main_apply_cb(GtkWidget *apply_bt _U_, gpointer parent_w)
 
   /* if we don't have a Save button, just save the settings now */
   if (!prefs.gui_use_pref_save) {
-    prefs_main_write();
+    prefs_main_save(parent_w);
     prefs_copy();     /* save prefs for reverting if Cancel */
   }
 
@@ -1470,7 +1519,7 @@ prefs_main_save_cb(GtkWidget *save_bt _U_, gpointer parent_w)
   if (!prefs_main_fetch_all((GtkWidget *)parent_w, &must_redissect))
     return; /* Errors in some preference setting - already reported */
 
-  prefs_main_write();
+  prefs_main_save(parent_w);
   prefs_copy();     /* save prefs for reverting if Cancel */
 
   /* Now apply those preferences.