Mercurial > dovecot > core-2.2
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 |
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 } |