2 * Copyright (C) 1996-9 Brandon Long <blong@fiction.net>
3 * Copyright (C) 1999-2001 Brendan Cully <brendan@kublai.com>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
20 #ifndef _IMAP_PRIVATE_H
21 #define _IMAP_PRIVATE_H 1
26 #include "mutt_socket.h"
30 #define IMAP_SSL_PORT 993
33 #define IMAP_LOG_CMD 2
34 #define IMAP_LOG_LTRL 4
35 #define IMAP_LOG_PASS 5
37 /* IMAP command responses. Used in IMAP_COMMAND.state too */
39 #define IMAP_CMD_OK (0)
41 #define IMAP_CMD_BAD (-1)
43 #define IMAP_CMD_NO (-2)
45 #define IMAP_CMD_CONTINUE (1)
47 #define IMAP_CMD_RESPOND (2)
49 /* number of entries in the hash table */
50 #define IMAP_CACHE_LEN 10
54 #define IMAP_REOPEN_ALLOW (1<<0)
55 #define IMAP_EXPUNGE_EXPECTED (1<<1)
56 #define IMAP_EXPUNGE_PENDING (1<<2)
57 #define IMAP_NEWMAIL_PENDING (1<<3)
58 #define IMAP_FLAGS_PENDING (1<<4)
60 /* imap_exec flags (see imap_exec) */
61 #define IMAP_CMD_FAIL_OK (1<<0)
62 #define IMAP_CMD_PASS (1<<1)
74 IMAP_DISCONNECTED = 0,
104 /* Capabilities we are interested in */
110 ACL, /* RFC 2086: IMAP4 ACL extension */
111 NAMESPACE, /* RFC 2342: IMAP4 Namespace */
112 ACRAM_MD5, /* RFC 2195: CRAM-MD5 authentication */
113 AGSSAPI, /* RFC 1731: GSSAPI authentication */
114 AUTH_ANON, /* AUTH=ANONYMOUS */
115 STARTTLS, /* RFC 2595: STARTTLS */
116 LOGINDISABLED, /* LOGINDISABLED */
121 /* imap_conn_find flags */
122 #define M_IMAP_CONN_NONEW (1<<0)
123 #define M_IMAP_CONN_NOSELECT (1<<1)
125 /* -- data structures -- */
139 /* We get these when we check if namespace exists - cache them */
142 } IMAP_NAMESPACE_INFO;
144 /* IMAP command structure */
155 /* This data is specific to a CONNECTION to an IMAP server */
158 unsigned char status;
159 /* let me explain capstr: SASL needs the capability string (not bits).
161 * 1. rerun CAPABILITY inside SASL function.
162 * 2. build appropriate CAPABILITY string by reverse-engineering from bits.
163 * 3. keep a copy until after authentication.
164 * I've chosen (3) for now. (2) might not be too bad, but it involves
165 * tracking all possible capabilities. bah. (1) I don't like because
166 * it's just no fun to get the same information twice */
168 unsigned char capabilities[(CAPMAX + 7)/8];
170 time_t lastread; /* last time we read a command for the server */
171 /* who knows, one day we may run multiple commands in parallel */
174 /* The following data is all specific to the currently SELECTED mbox */
178 unsigned short check_status;
179 unsigned char reopen;
180 unsigned char rights[(RIGHTSMAX + 7)/8];
181 unsigned int newMailCount;
182 IMAP_CACHE cache[IMAP_CACHE_LEN];
185 uint64_t uid_validity;
188 /* all folder flags - system flags AND keywords */
191 /* I wish that were called IMAP_CONTEXT :( */
194 #define CTX_DATA ((IMAP_DATA *) ctx->data)
196 /* -- private IMAP functions -- */
198 int imap_create_mailbox (IMAP_DATA* idata, char* mailbox);
199 int imap_rename_mailbox (IMAP_DATA* idata, IMAP_MBOX* mx, const char* newname);
200 int imap_make_msg_set (IMAP_DATA* idata, BUFFER* buf, int flag, int changed);
201 int imap_open_connection (IMAP_DATA* idata);
202 IMAP_DATA* imap_conn_find (const ACCOUNT* account, int flags);
203 int imap_parse_list_response(IMAP_DATA* idata, char** name, int* noselect,
204 int* noinferiors, char* delim);
205 int imap_read_literal (FILE* fp, IMAP_DATA* idata, long bytes);
206 void imap_expunge_mailbox (IMAP_DATA* idata);
207 int imap_reconnect (CONTEXT* ctx);
208 void imap_logout (IMAP_DATA* idata);
211 int imap_authenticate (IMAP_DATA* idata);
214 int imap_cmd_start (IMAP_DATA* idata, const char* cmd);
215 int imap_cmd_step (IMAP_DATA* idata);
216 void imap_cmd_finish (IMAP_DATA* idata);
217 int imap_code (const char* s);
218 int imap_exec (IMAP_DATA* idata, const char* cmd, int flags);
221 void imap_add_keywords (char* s, HEADER* keywords, LIST* mailbox_flags, size_t slen);
222 void imap_free_header_data (void** data);
223 int imap_read_headers (IMAP_DATA* idata, int msgbegin, int msgend);
224 char* imap_set_flags (IMAP_DATA* idata, HEADER* h, char* s);
227 int imap_continue (const char* msg, const char* resp);
228 void imap_error (const char* where, const char* msg);
229 IMAP_DATA* imap_new_idata (void);
230 void imap_free_idata (IMAP_DATA** idata);
231 char* imap_fix_path (IMAP_DATA* idata, char* mailbox, char* path,
233 int imap_get_literal_count (const char* buf, long* bytes);
234 char* imap_get_qualifier (char* buf);
235 char* imap_next_word (char* s);
236 time_t imap_parse_date (char* s);
237 void imap_qualify_path (char *dest, size_t len, IMAP_MBOX *mx, char* path);
238 void imap_quote_string (char* dest, size_t slen, const char* src);
239 void imap_unquote_string (char* s);
240 void imap_munge_mbox_name (char *dest, size_t dlen, const char *src);
241 void imap_unmunge_mbox_name (char *s);
242 int imap_wordcasecmp(const char *a, const char *b);
245 void imap_utf7_encode (char **s);
246 void imap_utf7_decode (char **s);