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

Annotation of /imapfilter/imap.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.45 - (hide annotations)
Sat Feb 14 19:14:43 2004 UTC (20 years, 2 months ago) by lefcha
Branch: MAIN
Changes since 1.44: +20 -14 lines
File MIME type: text/plain
Indentation.

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

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26