summaryrefslogtreecommitdiffstats
path: root/src/imap/cmd-delete.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/imap/cmd-delete.c')
-rw-r--r--src/imap/cmd-delete.c59
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;
+}