diff options
Diffstat (limited to 'src/imap/cmd-delete.c')
-rw-r--r-- | src/imap/cmd-delete.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/imap/cmd-delete.c b/src/imap/cmd-delete.c new file mode 100644 index 0000000..e095321 --- /dev/null +++ b/src/imap/cmd-delete.c @@ -0,0 +1,59 @@ +/* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */ + +#include "imap-common.h" +#include "imap-commands.h" + +bool cmd_delete(struct client_command_context *cmd) +{ + struct client *client = cmd->client; + struct mail_namespace *ns; + struct mailbox *box; + const char *name, *client_error; + enum mail_error error; + bool disconnect = FALSE; + + /* <mailbox> */ + if (!client_read_string_args(cmd, 1, &name)) + return FALSE; + + ns = client_find_namespace(cmd, &name); + if (ns == NULL) + return TRUE; + + box = mailbox_alloc(ns->list, name, 0); + event_add_str(cmd->global_event, "mailbox", mailbox_get_vname(box)); + if (mailbox_is_any_inbox(box)) { + /* IMAP protocol allows this, but I think it's safer to + not allow it. */ + mailbox_free(&box); + client_send_tagline(cmd, "NO INBOX can't be deleted."); + return TRUE; + } + if (client->mailbox != NULL && + mailbox_backends_equal(box, client->mailbox)) { + /* deleting selected mailbox. close it first */ + client_search_updates_free(client); + mailbox_free(&client->mailbox); + disconnect = TRUE; + } + + if (mailbox_delete(box) == 0) + client_send_tagline(cmd, "OK Delete completed."); + else { + client_error = mailbox_get_last_error(box, &error); + if (error != MAIL_ERROR_EXISTS) + client_send_box_error(cmd, box); + else { + /* mailbox has children */ + client_send_tagline(cmd, t_strdup_printf("NO %s", + client_error)); + } + } + mailbox_free(&box); + + if (disconnect) { + client_disconnect_with_error(cmd->client, + "Selected mailbox was deleted, have to disconnect."); + } + return TRUE; +} |