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

Annotation of /imapfilter/imap.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.42 - (hide annotations)
Mon Feb 9 22:03:12 2004 UTC (20 years, 1 month ago) by lefcha
Branch: MAIN
Changes since 1.41: +30 -25 lines
File MIME type: text/plain
Shroud passwords in debug messages.

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

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26