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

Annotation of /imapfilter/imap.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.28 - (hide annotations)
Fri Feb 21 18:32:39 2003 UTC (21 years, 1 month ago) by lefcha
Branch: MAIN
Changes since 1.27: +18 -1 lines
File MIME type: text/plain
Added imap_authenticate().

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

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26