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

Annotation of /imapfilter/imap.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.35 - (hide annotations)
Sun Jul 27 10:08:42 2003 UTC (20 years, 8 months ago) by lefcha
Branch: MAIN
Changes since 1.34: +14 -0 lines
File MIME type: text/plain
Added STARTTLS support.

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

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26