/[imapfilter]/imapfilter/imap.c
ViewVC logotype

Annotation of /imapfilter/imap.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.39 - (hide annotations)
Thu Oct 2 11:03:43 2003 UTC (20 years, 6 months ago) by lefcha
Branch: MAIN
Changes since 1.38: +26 -23 lines
File MIME type: text/plain
Bug fix related to searching of IMAP tag in the server response; IMAP tag should always be between 0x1000-0xFFFF.

1 lefcha 1.1 #include <stdio.h>
2     #include <string.h>
3    
4     #include "config.h"
5     #include "imapfilter.h"
6 lefcha 1.38 #include "buffer.h"
7 lefcha 1.1
8    
9 lefcha 1.37 extern conn_t connpri, connaux;
10 lefcha 1.24
11 lefcha 1.36 buffer_t obuf; /* Output buffer. */
12    
13 lefcha 1.39 static unsigned int tag = 0x1000; /* Every IMAP command is prefixed with
14     * a unique [:alnum:] string. */
15 lefcha 1.1
16 lefcha 1.38
17     unsigned int send_command(conn_t * conn, char *cmd);
18     void send_command_cont(conn_t * conn, char *cmd);
19    
20    
21 lefcha 1.1 /*
22 lefcha 1.13 * Send to server data; a command.
23 lefcha 1.1 */
24 lefcha 1.30 unsigned int
25 lefcha 1.37 send_command(conn_t * conn, char *cmd)
26 lefcha 1.1 {
27     #ifdef DEBUG
28 lefcha 1.32 fprintf(stderr, "debug: sending command (%s):\n\n%s\n",
29 lefcha 1.37 (conn == &connpri ? "primary" : "auxiliary"), cmd);
30 lefcha 1.1 #endif
31 lefcha 1.37 verbose("%s: %s", (conn == &connpri ? "C" : "c"), cmd);
32 lefcha 1.18
33 lefcha 1.37 socket_write(conn, cmd);
34 lefcha 1.25
35 lefcha 1.39 if (tag == 0xFFFF)
36     tag = 0x0FFF;
37    
38 lefcha 1.30 return tag++;
39 lefcha 1.1 }
40    
41    
42 lefcha 1.34 #ifdef CRAM_MD5
43     /*
44     * Send to server data: a continuation command.
45     */
46     void
47 lefcha 1.37 send_command_cont(conn_t * conn, char *cmd)
48 lefcha 1.34 {
49     #ifdef DEBUG
50     fprintf(stderr, "debug: sending command (%s):\n\n%s\r\n\n",
51 lefcha 1.37 (conn == &connpri ? "primary" : "auxiliary"), cmd);
52 lefcha 1.34 #endif
53    
54 lefcha 1.37 socket_write(conn, cmd);
55     socket_write(conn, "\r\n");
56 lefcha 1.34 }
57     #endif
58    
59    
60 lefcha 1.1 #ifdef DEBUG
61     /*
62     * IMAP NOOP: does nothing always succeeds.
63     */
64 lefcha 1.30 int
65 lefcha 1.37 imap_noop(conn_t * conn)
66 lefcha 1.1 {
67 lefcha 1.36 reset_buffer(&obuf);
68     check_buffer(&obuf, strlen("NOOP") + 12);
69 lefcha 1.1
70 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X NOOP\r\n", tag);
71 lefcha 1.1
72 lefcha 1.37 return send_command(conn, obuf.data);
73 lefcha 1.1 }
74     #endif
75    
76    
77     /*
78 lefcha 1.21 * IMAP CAPABILITY: requests listing of capabilities that the server supports.
79 lefcha 1.16 */
80 lefcha 1.30 int
81 lefcha 1.37 imap_capability(conn_t * conn)
82 lefcha 1.16 {
83 lefcha 1.36 reset_buffer(&obuf);
84     check_buffer(&obuf, strlen("CAPABILITY") + 12);
85 lefcha 1.16
86 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X CAPABILITY\r\n", tag);
87 lefcha 1.21
88 lefcha 1.37 return send_command(conn, obuf.data);
89 lefcha 1.21 }
90    
91    
92     /*
93     * IMAP NAMESPACE: discovers the prefix and delimeter of namespaces used by
94     * the server for mailboxes (RFC 2342).
95     */
96 lefcha 1.30 int
97 lefcha 1.37 imap_namespace(conn_t * conn)
98 lefcha 1.21 {
99 lefcha 1.36 reset_buffer(&obuf);
100     check_buffer(&obuf, strlen("NAMESPACE") + 12);
101 lefcha 1.21
102 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X NAMESPACE\r\n", tag);
103 lefcha 1.16
104 lefcha 1.37 return send_command(conn, obuf.data);
105 lefcha 1.16 }
106    
107    
108     /*
109 lefcha 1.1 * IMAP LOGOUT: informs server that client is done.
110     */
111 lefcha 1.30 int
112 lefcha 1.37 imap_logout(conn_t * conn)
113 lefcha 1.1 {
114 lefcha 1.36 reset_buffer(&obuf);
115     check_buffer(&obuf, strlen("LOGOUT") + 12);
116 lefcha 1.1
117 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X LOGOUT\r\n", tag);
118 lefcha 1.1
119 lefcha 1.37 return send_command(conn, obuf.data);
120 lefcha 1.28 }
121    
122    
123 lefcha 1.35 /*
124     * IMAP STARTTLS: begin TLS negotiation.
125     */
126     int
127 lefcha 1.37 imap_starttls(conn_t * conn)
128 lefcha 1.35 {
129 lefcha 1.36 reset_buffer(&obuf);
130     check_buffer(&obuf, strlen("STARTTLS") + 12);
131 lefcha 1.35
132 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X STARTTLS\r\n", tag);
133 lefcha 1.35
134 lefcha 1.37 return send_command(conn, obuf.data);
135 lefcha 1.35 }
136    
137    
138 lefcha 1.34 #ifdef CRAM_MD5
139 lefcha 1.28 /*
140     * IMAP AUTHENTICATE: indicates authentication mechanism and performs an
141     * authentication protocol exchange.
142     */
143 lefcha 1.30 int
144 lefcha 1.37 imap_authenticate(conn_t * conn, char *auth, int cont)
145 lefcha 1.28 {
146 lefcha 1.36 reset_buffer(&obuf);
147     check_buffer(&obuf, strlen("AUTHENTICATE") + 12);
148 lefcha 1.30
149 lefcha 1.34 if (!cont) {
150 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X AUTHENTICATE %s\r\n",
151 lefcha 1.36 tag, auth);
152 lefcha 1.37 return send_command(conn, obuf.data);
153 lefcha 1.34 } else {
154 lefcha 1.37 send_command_cont(conn, auth);
155 lefcha 1.34 return 0;
156     }
157     }
158     #endif
159 lefcha 1.1
160    
161     /*
162     * IMAP LOGIN: identifies client to server.
163     */
164 lefcha 1.30 int
165 lefcha 1.37 imap_login(conn_t * conn, char *user, char *pass)
166 lefcha 1.1 {
167 lefcha 1.36 int r, n;
168     char *sbuf;
169 lefcha 1.25
170 lefcha 1.36 n = strlen("LOGIN") + strlen(user) + strlen(pass) + 18;
171     sbuf = (char *)smalloc(n);
172 lefcha 1.1
173 lefcha 1.39 snprintf(sbuf, n, "%04X LOGIN \"%s\" \"%s\"\r\n", tag, user, pass);
174 lefcha 1.1
175 lefcha 1.37 r = send_command(conn, sbuf);
176 lefcha 1.25
177 lefcha 1.36 sfree(sbuf);
178 lefcha 1.23
179 lefcha 1.30 return r;
180 lefcha 1.1 }
181    
182    
183     /*
184 lefcha 1.24 * IMAP LIST: returns a subset of names from the complete set of names
185     * available to the client.
186     *
187 lefcha 1.37 int imap_list(conn_t *conn, char *refer, char *mbox)
188 lefcha 1.24 {
189 lefcha 1.36 int r;
190    
191     reset_buffer(&obuf);
192     check_buffer(&obuf, strlen("LIST") + strlen(refer) + strlen(mbox) + 18);
193    
194 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X LIST \"%s\" \"%s\"\r\n", tag,
195 lefcha 1.36 refer, mbox);
196 lefcha 1.25
197 lefcha 1.37 r = send_command(conn, obuf.data);
198 lefcha 1.25
199 lefcha 1.36 return r;
200 lefcha 1.24 }*/
201    
202    
203     /*
204     * IMAP SUBSCRIBE: adds the specified mailbox name to the server's
205     * set of "active" or "subscribed" mailboxes.
206     */
207 lefcha 1.30 int
208 lefcha 1.37 imap_subscribe(conn_t * conn, char *mbox)
209 lefcha 1.24 {
210 lefcha 1.36 reset_buffer(&obuf);
211     check_buffer(&obuf, strlen("SUBSCRIBE") + strlen(mbox) + 15);
212 lefcha 1.24
213 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X SUBSCRIBE \"%s\"\r\n", tag, mbox);
214 lefcha 1.24
215 lefcha 1.37 return send_command(conn, obuf.data);
216 lefcha 1.24 }
217    
218    
219     /*
220 lefcha 1.13 * IMAP EXAMINE: access a mailbox in READ-ONLY mode.
221 lefcha 1.31 *
222 lefcha 1.30 int
223 lefcha 1.37 imap_examine(conn_t *conn, char *mbox)
224 lefcha 1.1 {
225 lefcha 1.36 reset_buffer(&obuf);
226     check_buffer(&obuf, strlen("EXAMINE") + strlen(mbox) + 15);
227 lefcha 1.1
228 lefcha 1.39 snprintf(obuf.data, MEDIUM_CMD, "%04X EXAMINE \"%s\"\r\n", tag, mbox);
229 lefcha 1.1
230 lefcha 1.37 return send_command(conn, obuf.data);
231 lefcha 1.31 }*/
232 lefcha 1.10
233 lefcha 1.13
234 lefcha 1.10 /*
235 lefcha 1.13 * IMAP SELECT: access a mailbox in READ-WRITE mode.
236 lefcha 1.10 */
237 lefcha 1.30 int
238 lefcha 1.37 imap_select(conn_t * conn, char *mbox)
239 lefcha 1.10 {
240 lefcha 1.36 reset_buffer(&obuf);
241     check_buffer(&obuf, strlen("SELECT") + strlen(mbox) + 15);
242 lefcha 1.10
243 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X SELECT \"%s\"\r\n", tag, mbox);
244 lefcha 1.10
245 lefcha 1.37 return send_command(conn, obuf.data);
246 lefcha 1.1 }
247 lefcha 1.10
248 lefcha 1.1
249     /*
250 lefcha 1.13 * IMAP STATUS: requests status of the indicated mailbox.
251 lefcha 1.1 */
252 lefcha 1.30 int
253 lefcha 1.37 imap_status(conn_t * conn, char *mbox, char *items)
254 lefcha 1.1 {
255 lefcha 1.36 reset_buffer(&obuf);
256     check_buffer(&obuf, strlen("STATUS") + strlen(mbox) +
257     strlen(items) + 18);
258 lefcha 1.1
259 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X STATUS \"%s\" (%s)\r\n", tag, mbox, items);
260 lefcha 1.5
261 lefcha 1.37 return send_command(conn, obuf.data);
262 lefcha 1.1 }
263    
264    
265     /*
266 lefcha 1.13 * IMAP CREATE: create mailbox.
267 lefcha 1.1 */
268 lefcha 1.30 int
269 lefcha 1.37 imap_create(conn_t * conn, char *mbox)
270 lefcha 1.1 {
271 lefcha 1.36 reset_buffer(&obuf);
272     check_buffer(&obuf, strlen("CREATE") + strlen(mbox) + 14);
273 lefcha 1.1
274 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X CREATE \"%s\"\r\n", tag, mbox);
275 lefcha 1.1
276 lefcha 1.37 return send_command(conn, obuf.data);
277 lefcha 1.1 }
278    
279    
280     /*
281 lefcha 1.13 * IMAP SEARCH: searches the mailbox for messages that match certain criteria.
282 lefcha 1.1 */
283 lefcha 1.30 int
284 lefcha 1.37 imap_search(conn_t * conn, char *charset, char *search)
285 lefcha 1.1 {
286 lefcha 1.36 reset_buffer(&obuf);
287     check_buffer(&obuf, strlen("SEARCH CHARSET") + strlen(charset) +
288     strlen(search) + 15);
289 lefcha 1.1
290 lefcha 1.30 if (*charset)
291 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X SEARCH CHARSET \"%s\" %s\r\n",
292 lefcha 1.36 tag, charset, search);
293 lefcha 1.30 else
294 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X SEARCH %s\r\n", tag, search);
295 lefcha 1.1
296 lefcha 1.37 return send_command(conn, obuf.data);
297 lefcha 1.1 }
298    
299    
300     /*
301 lefcha 1.13 * IMAP FETCH: retrieves data associated with a message.
302 lefcha 1.1 */
303 lefcha 1.30 int
304 lefcha 1.37 imap_fetch(conn_t * conn, char *mesg, char *items)
305 lefcha 1.1 {
306 lefcha 1.36 reset_buffer(&obuf);
307     check_buffer(&obuf, strlen("FETCH") + strlen(mesg) + strlen(items) + 14);
308 lefcha 1.1
309 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X FETCH %s %s\r\n", tag, mesg, items);
310 lefcha 1.1
311 lefcha 1.37 return send_command(conn, obuf.data);
312 lefcha 1.1 }
313    
314    
315     /*
316 lefcha 1.13 * IMAP STORE: alters data associated with a message.
317 lefcha 1.1 */
318 lefcha 1.30 int
319 lefcha 1.37 imap_store(conn_t * conn, char *mesg, unsigned int mode, char *flags)
320 lefcha 1.1 {
321 lefcha 1.36 reset_buffer(&obuf);
322     check_buffer(&obuf, strlen("STORE") + strlen(mesg) +
323     strlen("FLAGS.SILENT") + strlen(flags) + 18);
324 lefcha 1.1
325 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X STORE %s %sFLAGS.SILENT (%s)\r\n",
326 lefcha 1.36 tag, mesg, (mode == STORE_FLAG_REPLACE ? "" :
327 lefcha 1.30 mode == STORE_FLAG_ADD ? "+" : "-"), flags);
328 lefcha 1.5
329 lefcha 1.37 return send_command(conn, obuf.data);
330 lefcha 1.5 }
331    
332    
333     /*
334 lefcha 1.13 * IMAP COPY: copy messages to mailbox.
335 lefcha 1.5 */
336 lefcha 1.30 int
337 lefcha 1.37 imap_copy(conn_t * conn, char *mesg, char *mbox)
338 lefcha 1.5 {
339 lefcha 1.36 reset_buffer(&obuf);
340     check_buffer(&obuf, strlen("COPY") + strlen(mesg) + strlen(mbox) + 16);
341 lefcha 1.5
342 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X COPY %s \"%s\"\r\n", tag, mesg, mbox);
343 lefcha 1.5
344 lefcha 1.37 return send_command(conn, obuf.data);
345 lefcha 1.5 }
346 lefcha 1.2
347    
348 lefcha 1.5 /*
349 lefcha 1.24 * IMAP APPEND: append message to the end of a mailbox.
350     */
351 lefcha 1.30 int
352 lefcha 1.37 imap_append(conn_t * conn, char *mbox, unsigned int size)
353 lefcha 1.24 {
354 lefcha 1.36 reset_buffer(&obuf);
355     check_buffer(&obuf, strlen("APPEND") + strlen(mbox) +
356     strlen(ultostr(size, 10)) + 18);
357 lefcha 1.25
358 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X APPEND \"%s\" {%d}\r\n", tag, mbox,
359 lefcha 1.36 size);
360 lefcha 1.25
361 lefcha 1.37 return send_command(conn, obuf.data);
362 lefcha 1.24 }
363    
364    
365    
366     /*
367 lefcha 1.13 * IMAP CLOSE: delete messages and return to authenticated state.
368 lefcha 1.5 */
369 lefcha 1.30 int
370 lefcha 1.37 imap_close(conn_t * conn)
371 lefcha 1.5 {
372 lefcha 1.36 reset_buffer(&obuf);
373     check_buffer(&obuf, strlen("CLOSE") + 12);
374 lefcha 1.4
375 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X CLOSE\r\n", tag);
376 lefcha 1.13
377 lefcha 1.37 return send_command(conn, obuf.data);
378 lefcha 1.5 }
379 lefcha 1.4
380 lefcha 1.1
381     /*
382 lefcha 1.13 * IMAP EXPUNGE: permanently removes any messages with the \Deleted flag set.
383 lefcha 1.25 */
384 lefcha 1.30 int
385 lefcha 1.37 imap_expunge(conn_t * conn)
386 lefcha 1.1 {
387 lefcha 1.36 reset_buffer(&obuf);
388     check_buffer(&obuf, strlen("EXPUNGE") + 12);
389 lefcha 1.1
390 lefcha 1.39 snprintf(obuf.data, obuf.size, "%04X EXPUNGE\r\n", tag);
391 lefcha 1.4
392 lefcha 1.37 return send_command(conn, obuf.data);
393 lefcha 1.25 }

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26