Fix null pointer dereference
[claws.git] / src / plugins / mailmbox / plugin_gtk.c
index e2f5b00a3879d8a6287a6c7454d1032add410939..16ea162f8184aa395a0652796917148ce9588c9f 100644 (file)
@@ -83,7 +83,7 @@ static FolderViewPopup claws_mailmbox_popup =
 
 static GtkActionEntry mainwindow_add_mailbox[] = {{
        "File/AddMailbox/Mbox",
-       NULL, N_("mbox (etPan!)..."), NULL, NULL, G_CALLBACK(add_mailbox)
+       NULL, "mbox...", NULL, NULL, G_CALLBACK(add_mailbox)
 }};
 
 static guint main_menu_id = 0;
@@ -112,7 +112,7 @@ void plugin_gtk_done(void)
 
        folderview_unregister_popup(&claws_mailmbox_popup);
 
-       MENUITEM_REMUI_MANAGER(mainwin->ui_manager,mainwin->action_group, "File/AddMailbox/RSSyl", main_menu_id);
+       MENUITEM_REMUI_MANAGER(mainwin->ui_manager,mainwin->action_group, "File/AddMailbox/Mbox", main_menu_id);
        main_menu_id = 0;
 }
 
@@ -146,16 +146,16 @@ static void set_sensitivity(GtkUIManager *ui_manager, FolderItem *item)
 #define SET_SENS(name, sens) \
        cm_menu_set_sensitive_full(ui_manager, "Popup/"name, sens)
 
-       SET_SENS("FolderViewPopup/CreateNewFolder",   item->stype != F_INBOX);
-       SET_SENS("FolderViewPopup/RenameFolder",       item->stype == F_NORMAL && folder_item_parent(item) != NULL);
-       SET_SENS("FolderViewPopup/MoveFolder",      folder_is_normal && folder_item_parent(item) != NULL);
-       SET_SENS("FolderViewPopup/DeleteFolder",            item->stype == F_NORMAL && folder_item_parent(item) != NULL);
+       SET_SENS("FolderViewPopup/CreateNewFolder",     item && item->stype != F_INBOX);
+       SET_SENS("FolderViewPopup/RenameFolder",        item && item->stype == F_NORMAL && folder_item_parent(item) != NULL);
+       SET_SENS("FolderViewPopup/MoveFolder",          folder_is_normal && folder_item_parent(item) != NULL);
+       SET_SENS("FolderViewPopup/DeleteFolder",        item && item->stype == F_NORMAL && folder_item_parent(item) != NULL);
 
-       SET_SENS("FolderViewPopup/CheckNewMessages", folder_item_parent(item) == NULL);
-       SET_SENS("FolderViewPopup/CheckNewFolders",  folder_item_parent(item) == NULL);
-       SET_SENS("FolderViewPopup/RebuildTree",    folder_item_parent(item) == NULL);
+       SET_SENS("FolderViewPopup/CheckNewMessages",    folder_item_parent(item) == NULL);
+       SET_SENS("FolderViewPopup/CheckNewFolders",     folder_item_parent(item) == NULL);
+       SET_SENS("FolderViewPopup/RebuildTree",         folder_item_parent(item) == NULL);
 
-       SET_SENS("FolderViewPopup/RemoveMailbox",         folder_item_parent(item) == NULL);
+       SET_SENS("FolderViewPopup/RemoveMailbox",       folder_item_parent(item) == NULL);
 
 #undef SET_SENS
 }
@@ -193,18 +193,24 @@ static void add_mailbox(GtkAction *action, gpointer callback_data)
                            "Mail");
        if (!path) return;
        if (folder_find_from_path(path)) {
-               alertpanel_error(_("The mailbox `%s' already exists."), path);
+               alertpanel_error(_("The mailbox '%s' already exists."), path);
                g_free(path);
                return;
        }
        basename = g_path_get_basename(path);
+
+       if (!folder_local_name_ok(basename)) {
+               g_free(path);
+               g_free(basename);
+               return;
+       }
+
        folder = folder_new(folder_get_class_from_string("mailmbox"), 
                            !strcmp(path, "Mail") ? _("Mailbox") : basename,
                            path);
-       g_free(basename);                           
+       g_free(basename);
        g_free(path);
 
-
        if (folder->klass->create_tree(folder) < 0) {
                alertpanel_error(_("Creation of the mailbox failed.\n"
                                   "Maybe some files already exist, or you don't have the permission to write there."));
@@ -223,7 +229,6 @@ static void add_mailbox(GtkAction *action, gpointer callback_data)
 static void new_folder_cb(GtkAction *action, gpointer data)
 {
        FolderView *folderview = (FolderView *)data;
-       GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
        FolderItem *item;
        FolderItem *new_item;
        gchar *new_folder;
@@ -232,7 +237,7 @@ static void new_folder_cb(GtkAction *action, gpointer data)
 
        if (!folderview->selected) return;
 
-       item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+       item = folderview_get_selected_item(folderview);
        g_return_if_fail(item != NULL);
        g_return_if_fail(item->folder != NULL);
 
@@ -246,11 +251,14 @@ static void new_folder_cb(GtkAction *action, gpointer data)
        if (p == NULL)
                p = strchr(new_folder, '.');
        if (p) {
-               alertpanel_error(_("`%c' can't be included in folder name."),
+               alertpanel_error(_("'%c' can't be included in folder name."),
                                 p[0]);
                return;
        }
 
+       if (!folder_local_name_ok(new_folder))
+               return;
+
        name = trim_string(new_folder, 32);
        AUTORELEASE_STR(name, {g_free(name); return;});
 
@@ -258,14 +266,14 @@ static void new_folder_cb(GtkAction *action, gpointer data)
        p = g_strconcat(item->path ? item->path : "", ".", new_folder, NULL);
        if (folder_find_child_item_by_name(item, p)) {
                g_free(p);
-               alertpanel_error(_("The folder `%s' already exists."), name);
+               alertpanel_error(_("The folder '%s' already exists."), name);
                return;
        }
        g_free(p);
 
        new_item = folder_create_folder(item, new_folder);
        if (!new_item) {
-               alertpanel_error(_("Can't create the folder `%s'."), name);
+               alertpanel_error(_("Can't create the folder '%s'."), name);
                return;
        }
 
@@ -287,7 +295,7 @@ static void remove_mailbox_cb(GtkAction *action, gpointer data)
 
        name = trim_string(item->folder->name, 32);
        message = g_strdup_printf
-               (_("Really remove the mailbox `%s' ?\n"
+               (_("Really remove the mailbox '%s'?\n"
                   "(The messages are NOT deleted from the disk)"), name);
        avalue = alertpanel_full(_("Remove mailbox"), message,
                                 GTK_STOCK_CANCEL, _("_Remove"), NULL, FALSE,
@@ -309,7 +317,6 @@ static void delete_folder_cb(GtkAction *action, gpointer data)
        FolderItem *item;
        gchar *message, *name;
        AlertValue avalue;
-       gchar *old_path;
        gchar *old_id;
 
        item = folderview_get_selected_item(folderview);
@@ -320,7 +327,7 @@ static void delete_folder_cb(GtkAction *action, gpointer data)
        name = trim_string(item->name, 32);
        AUTORELEASE_STR(name, {g_free(name); return;});
        message = g_strdup_printf
-               (_("All folder(s) and message(s) under `%s' will be deleted.\n"
+               (_("All folder(s) and message(s) under '%s' will be deleted.\n"
                   "Do you really want to delete?"), name);
        avalue = alertpanel_full(_("Delete folder"), message,
                                 GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL, FALSE,
@@ -328,7 +335,6 @@ static void delete_folder_cb(GtkAction *action, gpointer data)
        g_free(message);
        if (avalue != G_ALERTALTERNATE) return;
 
-       Xstrdup_a(old_path, item->path, return);
        old_id = folder_item_get_identifier(item);
 
        if (folderview->opened == folderview->selected ||
@@ -340,7 +346,7 @@ static void delete_folder_cb(GtkAction *action, gpointer data)
        }
 
        if (item->folder->klass->remove_folder(item->folder, item) < 0) {
-               alertpanel_error(_("Can't remove the folder `%s'."), name);
+               alertpanel_error(_("Can't remove the folder '%s'."), name);
                if (folderview->opened == folderview->selected)
                        summary_show(folderview->summaryview,
                                     folderview->summaryview->folder_item);
@@ -364,7 +370,7 @@ static void move_folder_cb(GtkAction *action, gpointer data)
        if (!from_folder || from_folder->folder->klass != claws_mailmbox_get_class())
                return;
 
-       to_folder = foldersel_folder_sel(from_folder->folder, FOLDER_SEL_MOVE, NULL, FALSE);
+       to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_MOVE, NULL, FALSE);
        if (!to_folder)
                return;
 
@@ -380,7 +386,7 @@ static void copy_folder_cb(GtkAction *action, gpointer data)
        if (!from_folder || from_folder->folder->klass != claws_mailmbox_get_class())
                return;
 
-       to_folder = foldersel_folder_sel(from_folder->folder, FOLDER_SEL_MOVE, NULL, FALSE);
+       to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_MOVE, NULL, FALSE);
        if (!to_folder)
                return;
 
@@ -394,7 +400,6 @@ static void rename_folder_cb(GtkAction *action, gpointer data)
        gchar *new_folder;
        gchar *name;
        gchar *message;
-       gchar *old_path;
        gchar *old_id;
        gchar *new_id;
        gchar *p;
@@ -405,7 +410,7 @@ static void rename_folder_cb(GtkAction *action, gpointer data)
        g_return_if_fail(item->folder != NULL);
 
        name = trim_string(item->name, 32);
-       message = g_strdup_printf(_("Input new name for `%s':"), name);
+       message = g_strdup_printf(_("Input new name for '%s':"), name);
        new_folder = input_dialog(_("Rename folder"), message, item->name);
        g_free(message);
        g_free(name);
@@ -416,22 +421,23 @@ static void rename_folder_cb(GtkAction *action, gpointer data)
        if (p == NULL)
                p = strchr(new_folder, '.');
        if (p) {
-               alertpanel_error(_("`%c' can't be included in folder name."),
+               alertpanel_error(_("'%c' can't be included in folder name."),
                                 p[0]);
                return;
        }
 
+       if (!folder_local_name_ok(new_folder))
+               return;
+
        parent = folder_item_parent(item);
        p = g_strconcat(parent->path ? parent->path : "", ".", new_folder, NULL);
        if (folder_find_child_item_by_name(parent, p)) {
                name = trim_string(new_folder, 32);
-               alertpanel_error(_("The folder `%s' already exists."), name);
+               alertpanel_error(_("The folder '%s' already exists."), name);
                g_free(name);
                return;
        }
 
-       Xstrdup_a(old_path, item->path, {g_free(new_folder); return;});
-
        old_id = folder_item_get_identifier(item);
 
        if (folder_item_rename(item, new_folder) < 0) {