]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Handle the response to UNSELECT on the remote side
authorMarco Bettini <marco.bettini@open-xchange.com>
Tue, 18 Nov 2025 10:30:14 +0000 (10:30 +0000)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 24 Nov 2025 12:20:11 +0000 (12:20 +0000)
src/lib-imap-client/imapc-client.h
src/lib-imap-client/imapc-connection.c
src/lib-storage/index/imapc/imapc-storage.c

index 34ab1a2d75313b29b633853b4a8bc9ce732f1952..27409f1e2fd68b4fe78c77437c9a205c9e6b5160 100644 (file)
@@ -57,7 +57,9 @@ enum imapc_command_flags {
        /* This is the LOGOUT command. Use a small timeout for it. */
        IMAPC_COMMAND_FLAG_LOGOUT       = 0x08,
        /* Command is being resent after a reconnection. */
-       IMAPC_COMMAND_FLAG_RECONNECTED  = 0x10
+       IMAPC_COMMAND_FLAG_RECONNECTED  = 0x10,
+       /* The command unselects the mailbox (UNSELECT) */
+       IMAPC_COMMAND_FLAG_UNSELECT     = 0x20,
 };
 
 struct imapc_command_reply {
index fc6dbd357a998f564873e2218bca16f7ec9f020c..f6517a427ea0e19b86296bafcf43ade1634164f6 100644 (file)
@@ -1585,7 +1585,10 @@ static int imapc_connection_input_tagged(struct imapc_connection *conn)
            conn->selected_box != NULL) {
                /* EXAMINE/SELECT failed: mailbox is no longer selected */
                imapc_connection_mailbox_closed(conn->selected_box, TRUE);
-       }
+       } else if (reply.state == IMAPC_COMMAND_STATE_OK &&
+                   (cmd->flags & IMAPC_COMMAND_FLAG_UNSELECT) != 0) {
+                       i_free_and_null(conn->selected_on_server);
+        }
 
        if (conn->reconnect_command_count > 0 &&
            (cmd->flags & IMAPC_COMMAND_FLAG_RECONNECTED) != 0) {
index cc139aa49d153e1a0532115e4e9ca2d03c004f4a..9edfc302d2f0fa04c5ec1b9af32764a6e96527a5 100644 (file)
@@ -1165,11 +1165,13 @@ int imapc_server_unselect(struct imapc_storage_client *client)
        struct imapc_command *cmd = imapc_client_cmd(client->client,
                                                     imapc_simple_callback, &sctx);
 
-       imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_SELECT);
-       if ((caps & IMAPC_CAPABILITY_UNSELECT) != 0)
+       if ((caps & IMAPC_CAPABILITY_UNSELECT) != 0) {
+               imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_UNSELECT);
                imapc_command_sendf(cmd, "UNSELECT");
-       else
+       } else {
+               imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_SELECT);
                imapc_command_sendf(cmd, "SELECT \"~~~\"");
+       }
 
        imapc_simple_run(&sctx, &cmd);
        return 0;