1
/* ========================================================================
2
* Copyright 1988-2006 University of Washington
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
8
* http://www.apache.org/licenses/LICENSE-2.0
11
* ========================================================================
15
* Program: Interactive Mail Access Protocol 4rev1 (IMAP4R1) routines
17
* Author: Mark Crispin
18
* Networks and Distributed Computing
19
* Computing & Communications
20
* University of Washington
21
* Administration Building, AG-44
23
* Internet: MRC@CAC.Washington.EDU
25
* Date: 14 October 1988
26
* Last Edited: 6 December 2006
30
/* This include file is provided for applications which need to look under
31
* the covers at the IMAP driver and in particular want to do different
32
* operations depending upon the IMAP server's protocol level and
33
* capabilities. It is NOT included in the normal c-client.h application
34
* export, and most applications do NOT need the definitions in this file.
36
* As of October 15, 2003, it is believed that:
38
* Version RFC Status Known Implementations
39
* ------- --- ------ ---------------------
40
* IMAP1 none extinct experimental TOPS-20 server
41
* IMAP2 1064 extinct old TOPS-20, SUMEX servers
42
* IMAP2 1176 rare TOPS-20, old UW servers
43
* IMAP2bis expired I-D uncommon old UW, Cyrus servers
44
* IMAP3 1203 extinct none (never implemented)
45
* IMAP4 1730 rare old UW, Cyrus, Netscape servers
46
* IMAP4rev1 2060, 3501 ubiquitous UW, Cyrus, and many others
48
* Most client implementations will only interoperate with an IMAP4rev1
49
* server. c-client based client implementations can interoperate with IMAP2,
50
* IMAP2bis, IMAP4, and IMAP4rev1 servers, but only if they are very careful.
52
* The LEVELxxx() macros in this file enable the client to determine the
53
* server protocol level and capabilities. This file also contains a few
54
* backdoor calls into the IMAP driver.
57
/* Server protocol level and capabilities */
59
typedef struct imap_cap {
60
unsigned int rfc1176 : 1; /* server is RFC-1176 IMAP2 */
61
unsigned int imap2bis : 1; /* server is IMAP2bis */
62
unsigned int imap4 : 1; /* server is IMAP4 (RFC 1730) */
63
unsigned int imap4rev1 : 1; /* server is IMAP4rev1 */
64
unsigned int acl : 1; /* server has ACL (RFC 2086) */
65
unsigned int quota : 1; /* server has QUOTA (RFC 2087) */
66
unsigned int litplus : 1; /* server has LITERAL+ (RFC 2088) */
67
unsigned int idle : 1; /* server has IDLE (RFC 2177) */
68
unsigned int mbx_ref : 1; /* server has mailbox referrals (RFC 2193) */
69
unsigned int log_ref : 1; /* server has login referrals (RFC 2221) */
70
unsigned int authanon : 1; /* server has anonymous SASL (RFC 2245) */
71
unsigned int namespace :1; /* server has NAMESPACE (RFC 2342) */
72
unsigned int uidplus : 1; /* server has UIDPLUS (RFC 2359) */
73
unsigned int starttls : 1; /* server has STARTTLS (RFC 2595) */
74
/* server disallows LOGIN command (RFC 2595) */
75
unsigned int logindisabled : 1;
76
unsigned int id : 1; /* server has ID (RFC 2971) */
77
unsigned int children : 1; /* server has CHILDREN (RFC 3348) */
78
unsigned int multiappend : 1; /* server has multi-APPEND (RFC 3502) ;*/
79
unsigned int binary : 1; /* server has BINARY (RFC 3516) */
80
unsigned int unselect : 1; /* server has UNSELECT */
81
unsigned int sasl_ir : 1; /* server has SASL-IR initial response */
82
unsigned int sort : 1; /* server has SORT */
83
unsigned int scan : 1; /* server has SCAN */
84
unsigned int extlevel; /* extension data level supported by server */
85
/* supported authenticators */
86
unsigned int auth : MAXAUTHENTICATORS;
87
THREADER *threader; /* list of threaders */
90
/* IMAP4rev1 level or better */
92
#define LEVELIMAP4rev1(stream) imap_cap (stream)->imap4rev1
94
#define LEVELSTATUS LEVELIMAP4rev1
97
/* IMAP4 level or better (not including RFC 1730 design mistakes) */
99
#define LEVELIMAP4(stream) (imap_cap (stream)->imap4rev1 || \
100
imap_cap (stream)->imap4)
103
/* IMAP4 RFC-1730 level */
105
#define LEVEL1730(stream) imap_cap (stream)->imap4
108
/* IMAP2bis level or better */
110
#define LEVELIMAP2bis(stream) imap_cap (stream)->imap2bis
113
/* IMAP2 RFC-1176 level or better */
115
#define LEVEL1176(stream) imap_cap (stream)->rfc1176
118
/* IMAP2 RFC-1064 or better */
120
#define LEVEL1064(stream) 1
122
/* Has ACL extension */
124
#define LEVELACL(stream) imap_cap (stream)->acl
127
/* Has QUOTA extension */
129
#define LEVELQUOTA(stream) imap_cap (stream)->quota
132
/* Has LITERALPLUS extension */
134
#define LEVELLITERALPLUS(stream) imap_cap (stream)->litplus
137
/* Has IDLE extension */
139
#define LEVELIDLE(stream) imap_cap (stream)->idle
142
/* Has mailbox referrals */
144
#define LEVELMBX_REF(stream) imap_cap (stream)->mbx_ref
147
/* Has login referrals */
149
#define LEVELLOG_REF(stream) imap_cap (stream)->log_ref
152
/* Has AUTH=ANONYMOUS extension */
154
#define LEVELANONYMOUS(stream) imap_cap (stream)->authanon
157
/* Has NAMESPACE extension */
159
#define LEVELNAMESPACE(stream) imap_cap (stream)->namespace
162
/* Has UIDPLUS extension */
164
#define LEVELUIDPLUS(stream) imap_cap (stream)->uidplus
167
/* Has STARTTLS extension */
169
#define LEVELSTARTTLS(stream) imap_cap (stream)->starttls
172
/* Has LOGINDISABLED extension */
174
#define LEVELLOGINDISABLED(stream) imap_cap (stream)->logindisabled
176
/* Has ID extension */
178
#define LEVELID(stream) imap_cap (stream)->id
181
/* Has CHILDREN extension */
183
#define LEVELCHILDREN(stream) imap_cap (stream)->children
186
/* Has MULTIAPPEND extension */
188
#define LEVELMULTIAPPEND(stream) imap_cap (stream)->multiappend
191
/* Has BINARY extension */
193
#define LEVELBINARY(stream) imap_cap (stream)->binary
196
/* Has UNSELECT extension */
198
#define LEVELUNSELECT(stream) imap_cap (stream)->unselect
201
/* Has SASL initial response extension */
203
#define LEVELSASLIR(stream) imap_cap (stream)->sasl_ir
206
/* Has SORT extension */
208
#define LEVELSORT(stream) imap_cap (stream)->sort
211
/* Has at least one THREAD extension */
213
#define LEVELTHREAD(stream) ((imap_cap (stream)->threader) ? T : NIL)
215
/* Has SCAN extension */
217
#define LEVELSCAN(stream) imap_cap (stream)->scan
219
/* Body structure extension levels */
221
/* These are in BODYSTRUCTURE order. Note that multipart bodies do not have
222
* body-fld-md5. This is alright, since all subsequent body structure
223
* extensions are in both singlepart and multipart bodies. If that ever
224
* changes, this will have to be split.
227
#define BODYEXTMD5 1 /* body-fld-md5 */
228
#define BODYEXTDSP 2 /* body-fld-dsp */
229
#define BODYEXTLANG 3 /* body-fld-lang */
230
#define BODYEXTLOC 4 /* body-fld-loc */
233
/* Function prototypes */
235
IMAPCAP *imap_cap (MAILSTREAM *stream);
236
char *imap_host (MAILSTREAM *stream);
237
long imap_cache (MAILSTREAM *stream,unsigned long msgno,char *seg,
238
STRINGLIST *stl,SIZEDTEXT *text);
243
long imap_setacl (MAILSTREAM *stream,char *mailbox,char *id,char *rights);
244
long imap_deleteacl (MAILSTREAM *stream,char *mailbox,char *id);
245
long imap_getacl (MAILSTREAM *stream,char *mailbox);
246
long imap_listrights (MAILSTREAM *stream,char *mailbox,char *id);
247
long imap_myrights (MAILSTREAM *stream,char *mailbox);
248
long imap_setquota (MAILSTREAM *stream,char *qroot,STRINGLIST *limits);
249
long imap_getquota (MAILSTREAM *stream,char *qroot);
250
long imap_getquotaroot (MAILSTREAM *stream,char *mailbox);