annotate src/imap/cmd-x-state.c @ 21390:2e2563132d5f

Updated copyright notices to include the year 2017.
author Stephan Bosch <stephan.bosch@dovecot.fi>
date Wed, 11 Jan 2017 02:51:13 +0100
parents 0f22db71df7a
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 19552
diff changeset
1 /* Copyright (c) 2015-2017 Dovecot authors, see the included COPYING file */
18996
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "imap-common.h"
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "base64.h"
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "str.h"
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "imap-commands.h"
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "imap-state.h"
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 bool cmd_x_state(struct client_command_context *cmd)
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 {
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 /* FIXME: state importing can cause unnecessarily large memory usage
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 by specifying an old modseq, because the EXPUNGE/FETCH replies
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 aren't currently sent asynchronously. so this command is disabled
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 for now. */
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #if 0
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 const struct imap_arg *args;
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 const char *str, *error;
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 buffer_t *state, *state_encoded;
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 int ret;
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 if (!client_read_args(cmd, 0, 0, &args))
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 return FALSE;
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 state = buffer_create_dynamic(cmd->pool, 256);
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 if (imap_arg_get_astring(&args[0], &str)) {
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 if (cmd->client->mailbox != NULL) {
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 client_send_tagline(cmd,
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 "BAD Can't be used in SELECTED state");
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 return TRUE;
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 }
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 if (base64_decode(str, strlen(str), NULL, state) < 0)
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 ret = 0;
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 else {
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 ret = imap_state_import_external(cmd->client,
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 state->data, state->used, &error);
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 }
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 if (ret < 0) {
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 client_send_tagline(cmd, t_strdup_printf(
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 "NO Failed to restore state: %s", error));
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 } else if (ret == 0) {
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 client_send_tagline(cmd, t_strdup_printf(
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 "BAD Broken state: %s", error));
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 } else {
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 client_send_tagline(cmd, "OK State imported.");
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 }
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 return TRUE;
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 } else if (args[0].type == IMAP_ARG_EOL) {
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 if (!imap_state_export_external(cmd->client, state, &error)) {
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 client_send_tagline(cmd, t_strdup_printf(
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 "NO Can't save state: %s", error));
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 return TRUE;
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 }
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 state_encoded = buffer_create_dynamic(cmd->pool,
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 MAX_BASE64_ENCODED_SIZE(state->used)+10);
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 str_append(state_encoded, "* STATE ");
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 base64_encode(state->data, state->used, state_encoded);
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 client_send_line(cmd->client, str_c(state_encoded));
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 client_send_tagline(cmd, "OK State exported.");
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 return TRUE;
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 } else {
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 client_send_command_error(cmd, "Invalid arguments.");
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 return TRUE;
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 #else
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 client_send_command_error(cmd, "Command is disabled for now.");
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 return TRUE;
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 #endif
64c73e6bd397 Added imap-hibernate process for gathering IDLEing imap processes.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 }