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

Annotation of /imapfilter/imap.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.34 - (hide annotations)
Sat Jul 26 19:43:02 2003 UTC (20 years, 8 months ago) by lefcha
Branch: MAIN
Changes since 1.33: +30 -4 lines
File MIME type: text/plain
Added CRAM-MD5 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.34 #ifdef CRAM_MD5
115 lefcha 1.28 /*
116     * IMAP AUTHENTICATE: indicates authentication mechanism and performs an
117     * authentication protocol exchange.
118     */
119 lefcha 1.30 int
120 lefcha 1.34 imap_authenticate(int *sock, char *auth, int cont)
121 lefcha 1.28 {
122 lefcha 1.30 char cmd[MEDIUM_CMD];
123    
124 lefcha 1.34 if (!cont) {
125     snprintf(cmd, MEDIUM_CMD, "%X AUTHENTICATE %s\r\n", tag, auth);
126     return send_command(sock, cmd);
127     } else {
128     send_command_cont(sock, auth);
129     return 0;
130     }
131     }
132 lefcha 1.30
133 lefcha 1.34 #endif
134 lefcha 1.1
135    
136     /*
137     * IMAP LOGIN: identifies client to server.
138     */
139 lefcha 1.30 int
140     imap_login(int *sock, char *user, char *pass)
141 lefcha 1.1 {
142 lefcha 1.30 int r;
143     char *cmd;
144 lefcha 1.25
145 lefcha 1.30 cmd = (char *)smalloc(MEDIUM_CMD);
146 lefcha 1.1
147 lefcha 1.30 snprintf(cmd, MEDIUM_CMD, "%X LOGIN \"%s\" \"%s\"\r\n", tag, user,
148     pass);
149 lefcha 1.1
150 lefcha 1.30 r = send_command(sock, cmd);
151 lefcha 1.25
152 lefcha 1.30 sfree(cmd);
153 lefcha 1.23
154 lefcha 1.30 return r;
155 lefcha 1.1 }
156    
157    
158     /*
159 lefcha 1.24 * IMAP LIST: returns a subset of names from the complete set of names
160     * available to the client.
161     *
162     int imap_list(int *sock, char *refer, char *mbox)
163     {
164     int r;
165     char cmd[BIG_CMD];
166 lefcha 1.25
167 lefcha 1.24 snprintf(cmd, MEDIUM_CMD, "%X LIST \"%s\" \"%s\"\r\n", tag, refer,
168     mbox);
169 lefcha 1.25
170 lefcha 1.24 r = send_command(sock, cmd);
171 lefcha 1.25
172 lefcha 1.24 return r;
173     }*/
174    
175    
176     /*
177     * IMAP SUBSCRIBE: adds the specified mailbox name to the server's
178     * set of "active" or "subscribed" mailboxes.
179     */
180 lefcha 1.30 int
181     imap_subscribe(int *sock, char *mbox)
182 lefcha 1.24 {
183 lefcha 1.30 char cmd[MEDIUM_CMD];
184 lefcha 1.24
185 lefcha 1.30 snprintf(cmd, MEDIUM_CMD, "%X SUBSCRIBE \"%s\"\r\n", tag, mbox);
186 lefcha 1.24
187 lefcha 1.30 return send_command(sock, cmd);
188 lefcha 1.24 }
189    
190    
191     /*
192 lefcha 1.13 * IMAP EXAMINE: access a mailbox in READ-ONLY mode.
193 lefcha 1.31 *
194 lefcha 1.30 int
195     imap_examine(int *sock, char *mbox)
196 lefcha 1.1 {
197 lefcha 1.30 char cmd[MEDIUM_CMD];
198 lefcha 1.1
199 lefcha 1.30 snprintf(cmd, MEDIUM_CMD, "%X EXAMINE \"%s\"\r\n", tag, mbox);
200 lefcha 1.1
201 lefcha 1.30 return send_command(sock, cmd);
202 lefcha 1.31 }*/
203 lefcha 1.10
204 lefcha 1.13
205 lefcha 1.10 /*
206 lefcha 1.13 * IMAP SELECT: access a mailbox in READ-WRITE mode.
207 lefcha 1.10 */
208 lefcha 1.30 int
209     imap_select(int *sock, char *mbox)
210 lefcha 1.10 {
211 lefcha 1.30 char cmd[SMALL_CMD];
212 lefcha 1.10
213 lefcha 1.30 snprintf(cmd, SMALL_CMD, "%X SELECT \"%s\"\r\n", tag, mbox);
214 lefcha 1.10
215 lefcha 1.30 return send_command(sock, cmd);
216 lefcha 1.1 }
217 lefcha 1.10
218 lefcha 1.1
219     /*
220 lefcha 1.13 * IMAP STATUS: requests status of the indicated mailbox.
221 lefcha 1.1 */
222 lefcha 1.30 int
223     imap_status(int *sock, char *mbox, char *items)
224 lefcha 1.1 {
225 lefcha 1.30 char cmd[MEDIUM_CMD];
226 lefcha 1.1
227 lefcha 1.30 snprintf(cmd, MEDIUM_CMD, "%X STATUS \"%s\" (%s)\r\n", tag, mbox, items);
228 lefcha 1.5
229 lefcha 1.30 return send_command(sock, cmd);
230 lefcha 1.1 }
231    
232    
233     /*
234 lefcha 1.13 * IMAP CREATE: create mailbox.
235 lefcha 1.1 */
236 lefcha 1.30 int
237     imap_create(int *sock, char *mbox)
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 CREATE \"%s\"\r\n", tag, mbox);
242 lefcha 1.1
243 lefcha 1.30 return send_command(sock, cmd);
244 lefcha 1.1 }
245    
246    
247     /*
248 lefcha 1.13 * IMAP SEARCH: searches the mailbox for messages that match certain criteria.
249 lefcha 1.1 */
250 lefcha 1.30 int
251     imap_search(int *sock, char *charset, char *search)
252 lefcha 1.1 {
253 lefcha 1.30 char cmd[BIG_CMD];
254 lefcha 1.1
255 lefcha 1.30 if (*charset)
256     snprintf(cmd, BIG_CMD, "%X SEARCH CHARSET \"%s\" %s\r\n", tag,
257     charset, search);
258     else
259     snprintf(cmd, BIG_CMD, "%X SEARCH %s\r\n", tag, search);
260 lefcha 1.1
261 lefcha 1.30 return send_command(sock, cmd);
262 lefcha 1.1 }
263    
264    
265     /*
266 lefcha 1.13 * IMAP FETCH: retrieves data associated with a message.
267 lefcha 1.1 */
268 lefcha 1.30 int
269     imap_fetch(int *sock, char *mesg, char *items)
270 lefcha 1.1 {
271 lefcha 1.30 char cmd[MEDIUM_CMD];
272 lefcha 1.1
273 lefcha 1.30 snprintf(cmd, MEDIUM_CMD, "%X FETCH %s %s\r\n", tag, mesg, items);
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 STORE: alters data associated with a message.
281 lefcha 1.1 */
282 lefcha 1.30 int
283     imap_store(int *sock, char *mesg, unsigned int mode, char *flags)
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 STORE %s %sFLAGS.SILENT (%s)\r\n", tag,
288     mesg, (mode == STORE_FLAG_REPLACE ? "" :
289     mode == STORE_FLAG_ADD ? "+" : "-"), flags);
290 lefcha 1.5
291 lefcha 1.30 return send_command(sock, cmd);
292 lefcha 1.5 }
293    
294    
295     /*
296 lefcha 1.13 * IMAP COPY: copy messages to mailbox.
297 lefcha 1.5 */
298 lefcha 1.30 int
299     imap_copy(int *sock, char *mesg, char *mbox)
300 lefcha 1.5 {
301 lefcha 1.30 char cmd[MEDIUM_CMD];
302 lefcha 1.5
303 lefcha 1.30 snprintf(cmd, MEDIUM_CMD, "%X COPY %s \"%s\"\r\n", tag, mesg, mbox);
304 lefcha 1.5
305 lefcha 1.30 return send_command(sock, cmd);
306 lefcha 1.5 }
307 lefcha 1.2
308    
309 lefcha 1.5 /*
310 lefcha 1.24 * IMAP APPEND: append message to the end of a mailbox.
311     */
312 lefcha 1.30 int
313     imap_append(int *sock, char *mbox, unsigned int size)
314 lefcha 1.24 {
315 lefcha 1.30 char cmd[MEDIUM_CMD];
316 lefcha 1.25
317 lefcha 1.30 snprintf(cmd, MEDIUM_CMD, "%X APPEND \"%s\" {%d}\r\n", tag, mbox, size);
318 lefcha 1.25
319 lefcha 1.30 return send_command(sock, cmd);
320 lefcha 1.24 }
321    
322    
323    
324     /*
325 lefcha 1.13 * IMAP CLOSE: delete messages and return to authenticated state.
326 lefcha 1.5 */
327 lefcha 1.30 int
328     imap_close(int *sock)
329 lefcha 1.5 {
330 lefcha 1.30 char cmd[SMALL_CMD];
331 lefcha 1.4
332 lefcha 1.30 snprintf(cmd, SMALL_CMD, "%X CLOSE\r\n", tag);
333 lefcha 1.13
334 lefcha 1.30 return send_command(sock, cmd);
335 lefcha 1.5 }
336 lefcha 1.4
337 lefcha 1.1
338     /*
339 lefcha 1.13 * IMAP EXPUNGE: permanently removes any messages with the \Deleted flag set.
340 lefcha 1.25 */
341 lefcha 1.30 int
342     imap_expunge(int *sock)
343 lefcha 1.1 {
344 lefcha 1.30 char cmd[SMALL_CMD];
345 lefcha 1.1
346 lefcha 1.30 snprintf(cmd, SMALL_CMD, "%X EXPUNGE\r\n", tag);
347 lefcha 1.4
348 lefcha 1.30 return send_command(sock, cmd);
349 lefcha 1.25 }

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26