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

Annotation of /imapfilter/imap.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.43 - (hide annotations)
Wed Feb 11 00:03:46 2004 UTC (20 years, 2 months ago) by lefcha
Branch: MAIN
Changes since 1.42: +27 -7 lines
File MIME type: text/plain
Added debugging level 2, where passwords are not shrouded.

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

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26