8ee8a186ef15cd778a36ab5db34d0cd337dcfdc0
[external/uw-imap-toolkit.git] / imap-2007e / c-client / imap4r1.h
1 /* ========================================================================
2  * Copyright 1988-2007 University of Washington
3  *
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
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * 
11  * ========================================================================
12  */
13
14 /*
15  * Program:     Interactive Mail Access Protocol 4rev1 (IMAP4R1) routines
16  *
17  * Author:      Mark Crispin
18  *              Networks and Distributed Computing
19  *              Computing & Communications
20  *              University of Washington
21  *              Administration Building, AG-44
22  *              Seattle, WA  98195
23  *              Internet: MRC@CAC.Washington.EDU
24  *
25  * Date:        14 October 1988
26  * Last Edited: 5 September 2007
27  */
28
29
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.
35  *
36  * As of October 15, 2003, it is believed that:
37  *
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
47  *
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.
51  *
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.
55  */
56 \f
57 /* Server protocol level and capabilities */
58
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 urlauth : 1;     /* server has URLAUTH (RFC 4467) */
85   unsigned int catenate : 1;    /* server has CATENATE (RFC 4469) */
86   unsigned int condstore : 1;   /* server has CONDSTORE (RFC 4551) */
87   unsigned int esearch : 1;     /* server has ESEARCH (RFC 4731) */
88   unsigned int within : 1;      /* server has WITHIN (RFC 5032) */
89   unsigned int extlevel;        /* extension data level supported by server */
90                                 /* supported authenticators */
91   unsigned int auth : MAXAUTHENTICATORS;
92   THREADER *threader;           /* list of threaders */
93 } IMAPCAP;
94 \f
95 /* IMAP4rev1 level or better */
96
97 #define LEVELIMAP4rev1(stream) imap_cap (stream)->imap4rev1
98
99 #define LEVELSTATUS LEVELIMAP4rev1
100
101
102 /* IMAP4 level or better (not including RFC 1730 design mistakes) */
103
104 #define LEVELIMAP4(stream) (imap_cap (stream)->imap4rev1 || \
105                             imap_cap (stream)->imap4)
106
107
108 /* IMAP4 RFC-1730 level */
109
110 #define LEVEL1730(stream) imap_cap (stream)->imap4
111
112
113 /* IMAP2bis level or better */
114
115 #define LEVELIMAP2bis(stream) imap_cap (stream)->imap2bis
116
117
118 /* IMAP2 RFC-1176 level or better */
119
120 #define LEVEL1176(stream) imap_cap (stream)->rfc1176
121
122
123 /* IMAP2 RFC-1064 or better */
124
125 #define LEVEL1064(stream) 1
126 \f
127 /* Has ACL extension */
128
129 #define LEVELACL(stream) imap_cap (stream)->acl
130
131
132 /* Has QUOTA extension */
133
134 #define LEVELQUOTA(stream) imap_cap (stream)->quota
135
136
137 /* Has LITERALPLUS extension */
138
139 #define LEVELLITERALPLUS(stream) imap_cap (stream)->litplus
140
141
142 /* Has IDLE extension */
143
144 #define LEVELIDLE(stream) imap_cap (stream)->idle
145
146
147 /* Has mailbox referrals */
148
149 #define LEVELMBX_REF(stream) imap_cap (stream)->mbx_ref
150
151
152 /* Has login referrals */
153
154 #define LEVELLOG_REF(stream) imap_cap (stream)->log_ref
155
156
157 /* Has AUTH=ANONYMOUS extension */
158
159 #define LEVELANONYMOUS(stream) imap_cap (stream)->authanon
160
161
162 /* Has NAMESPACE extension */
163
164 #define LEVELNAMESPACE(stream) imap_cap (stream)->namespace
165
166
167 /* Has UIDPLUS extension */
168
169 #define LEVELUIDPLUS(stream) imap_cap (stream)->uidplus
170
171
172 /* Has STARTTLS extension */
173
174 #define LEVELSTARTTLS(stream) imap_cap (stream)->starttls
175
176
177 /* Has LOGINDISABLED extension */
178
179 #define LEVELLOGINDISABLED(stream) imap_cap (stream)->logindisabled
180 \f
181 /* Has ID extension */
182
183 #define LEVELID(stream) imap_cap (stream)->id
184
185
186 /* Has CHILDREN extension */
187
188 #define LEVELCHILDREN(stream) imap_cap (stream)->children
189
190
191 /* Has MULTIAPPEND extension */
192
193 #define LEVELMULTIAPPEND(stream) imap_cap (stream)->multiappend
194
195
196 /* Has BINARY extension */
197
198 #define LEVELBINARY(stream) imap_cap (stream)->binary
199
200
201 /* Has UNSELECT extension */
202
203 #define LEVELUNSELECT(stream) imap_cap (stream)->unselect
204
205
206 /* Has SASL initial response extension */
207
208 #define LEVELSASLIR(stream) imap_cap (stream)->sasl_ir
209
210
211 /* Has SORT extension */
212
213 #define LEVELSORT(stream) imap_cap (stream)->sort
214
215
216 /* Has at least one THREAD extension */
217
218 #define LEVELTHREAD(stream) ((imap_cap (stream)->threader) ? T : NIL)
219
220
221 /* Has SCAN extension */
222
223 #define LEVELSCAN(stream) imap_cap (stream)->scan
224
225
226 /* Has URLAUTH extension */
227
228 #define LEVELURLAUTH(stream) imap_cap (stream)->urlauth
229
230
231 /* Has CATENATE extension */
232
233 #define LEVELCATENATE(stream) imap_cap (stream)->catenate
234
235
236 /* Has CONDSTORE extension */
237
238 #define LEVELCONDSTORE(stream) imap_cap (stream)->condstore
239
240
241 /* Has ESEARCH extension */
242
243 #define LEVELESEARCH(stream) imap_cap (stream)->esearch
244
245
246 /* Has WITHIN extension */
247
248 #define LEVELWITHIN(stream) imap_cap (stream)->within
249 \f
250 /* Body structure extension levels */
251
252 /* These are in BODYSTRUCTURE order.  Note that multipart bodies do not have
253  * body-fld-md5.  This is alright, since all subsequent body structure
254  * extensions are in both singlepart and multipart bodies.  If that ever
255  * changes, this will have to be split.
256  */
257
258 #define BODYEXTMD5 1            /* body-fld-md5 */
259 #define BODYEXTDSP 2            /* body-fld-dsp */
260 #define BODYEXTLANG 3           /* body-fld-lang */
261 #define BODYEXTLOC 4            /* body-fld-loc */
262
263
264 /* Function prototypes */
265
266 IMAPCAP *imap_cap (MAILSTREAM *stream);
267 char *imap_host (MAILSTREAM *stream);
268 long imap_cache (MAILSTREAM *stream,unsigned long msgno,char *seg,
269                  STRINGLIST *stl,SIZEDTEXT *text);
270
271
272 /* Temporary */
273
274 long imap_setacl (MAILSTREAM *stream,char *mailbox,char *id,char *rights);
275 long imap_deleteacl (MAILSTREAM *stream,char *mailbox,char *id);
276 long imap_getacl (MAILSTREAM *stream,char *mailbox);
277 long imap_listrights (MAILSTREAM *stream,char *mailbox,char *id);
278 long imap_myrights (MAILSTREAM *stream,char *mailbox);
279 long imap_setquota (MAILSTREAM *stream,char *qroot,STRINGLIST *limits);
280 long imap_getquota (MAILSTREAM *stream,char *qroot);
281 long imap_getquotaroot (MAILSTREAM *stream,char *mailbox);