1 /*
2  * libEtPan! -- a mail stuff library
3  *
4  * Copyright (C) 2001, 2005 - DINH Viet Hoa
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the libEtPan! project nor the names of its
16  *    contributors may be used to endorse or promote products derived
17  *    from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 
32 /*
33  * $Id: maildriver.c,v 1.28 2006/06/07 15:10:01 smarinier Exp $
34  */
35 
36 #ifdef HAVE_CONFIG_H
37 #	include <config.h>
38 #endif
39 
40 #include "maildriver.h"
41 #include <ctype.h>
42 #include <string.h>
43 #include <stdlib.h>
44 
45 /* *********************************************************************** */
46 /* mail session */
47 
48 LIBETPAN_EXPORT
mailsession_new(mailsession_driver * sess_driver)49 mailsession * mailsession_new(mailsession_driver * sess_driver)
50 {
51   mailsession * session;
52   int r;
53 
54   session = malloc(sizeof(* session));
55 
56   session->sess_data = NULL;
57 
58   if (sess_driver->sess_initialize != NULL) {
59     r = sess_driver->sess_initialize(session);
60     if (r != MAIL_NO_ERROR)
61       goto free;
62   }
63 
64   session->sess_driver = sess_driver;
65 
66   return session;
67 
68  free:
69   free(session);
70   return NULL;
71 }
72 
73 LIBETPAN_EXPORT
mailsession_free(mailsession * session)74 void mailsession_free(mailsession * session)
75 {
76   if (session->sess_driver->sess_uninitialize != NULL)
77     session->sess_driver->sess_uninitialize(session);
78   free(session);
79 }
80 
81 LIBETPAN_EXPORT
mailsession_parameters(mailsession * session,int id,void * value)82 int mailsession_parameters(mailsession * session,
83 			   int id, void * value)
84 {
85   if (session->sess_driver->sess_parameters == NULL)
86     return MAIL_ERROR_NOT_IMPLEMENTED;
87 
88   return session->sess_driver->sess_parameters(session, id, value);
89 }
90 
91 LIBETPAN_EXPORT
mailsession_connect_stream(mailsession * session,mailstream * s)92 int mailsession_connect_stream(mailsession * session, mailstream * s)
93 {
94   if (session->sess_driver->sess_connect_stream == NULL)
95     return MAIL_ERROR_NOT_IMPLEMENTED;
96 
97   return session->sess_driver->sess_connect_stream(session, s);
98 }
99 
100 LIBETPAN_EXPORT
mailsession_connect_path(mailsession * session,const char * path)101 int mailsession_connect_path(mailsession * session, const char * path)
102 {
103   if (session->sess_driver->sess_connect_path == NULL)
104     return MAIL_ERROR_NOT_IMPLEMENTED;
105 
106   return session->sess_driver->sess_connect_path(session, path);
107 }
108 
109 LIBETPAN_EXPORT
mailsession_starttls(mailsession * session)110 int mailsession_starttls(mailsession * session)
111 {
112   if (session->sess_driver->sess_starttls == NULL)
113     return MAIL_ERROR_NOT_IMPLEMENTED;
114 
115   return session->sess_driver->sess_starttls(session);
116 }
117 
118 LIBETPAN_EXPORT
mailsession_login(mailsession * session,const char * userid,const char * password)119 int mailsession_login(mailsession * session,
120 		      const char * userid, const char * password)
121 {
122   if (session->sess_driver->sess_login == NULL)
123     return MAIL_ERROR_NOT_IMPLEMENTED;
124 
125   return session->sess_driver->sess_login(session, userid, password);
126 }
127 
128 LIBETPAN_EXPORT
mailsession_logout(mailsession * session)129 int mailsession_logout(mailsession * session)
130 {
131   if (session->sess_driver->sess_logout == NULL)
132     return MAIL_ERROR_NOT_IMPLEMENTED;
133 
134   return session->sess_driver->sess_logout(session);
135 }
136 
137 LIBETPAN_EXPORT
mailsession_noop(mailsession * session)138 int mailsession_noop(mailsession * session)
139 {
140   if (session->sess_driver->sess_noop == NULL)
141     return MAIL_ERROR_NOT_IMPLEMENTED;
142 
143   return session->sess_driver->sess_noop(session);
144 }
145 
146 /* folders operations */
147 
148 LIBETPAN_EXPORT
mailsession_build_folder_name(mailsession * session,const char * mb,const char * name,char ** result)149 int mailsession_build_folder_name(mailsession * session, const char * mb,
150 				  const char * name, char ** result)
151 {
152   if (session->sess_driver->sess_build_folder_name == NULL)
153     return MAIL_ERROR_NOT_IMPLEMENTED;
154 
155   return session->sess_driver->sess_build_folder_name(session,
156       mb, name, result);
157 }
158 
159 LIBETPAN_EXPORT
mailsession_create_folder(mailsession * session,const char * mb)160 int mailsession_create_folder(mailsession * session, const char * mb)
161 {
162   if (session->sess_driver->sess_create_folder == NULL)
163     return MAIL_ERROR_NOT_IMPLEMENTED;
164 
165   return session->sess_driver->sess_create_folder(session, mb);
166 }
167 
168 LIBETPAN_EXPORT
mailsession_delete_folder(mailsession * session,const char * mb)169 int mailsession_delete_folder(mailsession * session, const char * mb)
170 {
171   if (session->sess_driver->sess_delete_folder == NULL)
172     return MAIL_ERROR_NOT_IMPLEMENTED;
173 
174   return session->sess_driver->sess_delete_folder(session, mb);
175 }
176 
177 LIBETPAN_EXPORT
mailsession_rename_folder(mailsession * session,const char * mb,const char * new_name)178 int mailsession_rename_folder(mailsession * session,
179     const char * mb, const char * new_name)
180 {
181   if (session->sess_driver->sess_rename_folder == NULL)
182     return MAIL_ERROR_NOT_IMPLEMENTED;
183 
184   return session->sess_driver->sess_rename_folder(session, mb, new_name);
185 }
186 
187 LIBETPAN_EXPORT
mailsession_check_folder(mailsession * session)188 int mailsession_check_folder(mailsession * session)
189 {
190   if (session->sess_driver->sess_check_folder == NULL)
191     return MAIL_ERROR_NOT_IMPLEMENTED;
192 
193   return session->sess_driver->sess_check_folder(session);
194 }
195 
196 LIBETPAN_EXPORT
mailsession_examine_folder(mailsession * session,const char * mb)197 int mailsession_examine_folder(mailsession * session, const char * mb)
198 {
199   if (session->sess_driver->sess_examine_folder == NULL)
200     return MAIL_ERROR_NOT_IMPLEMENTED;
201 
202   return session->sess_driver->sess_examine_folder(session, mb);
203 }
204 
205 LIBETPAN_EXPORT
mailsession_select_folder(mailsession * session,const char * mb)206 int mailsession_select_folder(mailsession * session, const char * mb)
207 {
208   if (session->sess_driver->sess_select_folder == NULL)
209     return MAIL_ERROR_NOT_IMPLEMENTED;
210 
211   return session->sess_driver->sess_select_folder(session, mb);
212 }
213 
214 LIBETPAN_EXPORT
mailsession_expunge_folder(mailsession * session)215 int mailsession_expunge_folder(mailsession * session)
216 {
217   if (session->sess_driver->sess_expunge_folder == NULL)
218     return MAIL_ERROR_NOT_IMPLEMENTED;
219 
220   return session->sess_driver->sess_expunge_folder(session);
221 }
222 
223 LIBETPAN_EXPORT
mailsession_status_folder(mailsession * session,const char * mb,uint32_t * result_messages,uint32_t * result_recent,uint32_t * result_unseen)224 int mailsession_status_folder(mailsession * session, const char * mb,
225     uint32_t * result_messages, uint32_t * result_recent,
226     uint32_t * result_unseen)
227 {
228   if (session->sess_driver->sess_status_folder == NULL)
229     return MAIL_ERROR_NOT_IMPLEMENTED;
230 
231   return session->sess_driver->sess_status_folder(session, mb,
232       result_messages, result_recent, result_unseen);
233 }
234 
235 LIBETPAN_EXPORT
mailsession_messages_number(mailsession * session,const char * mb,uint32_t * result)236 int mailsession_messages_number(mailsession * session, const char * mb,
237 				uint32_t * result)
238 {
239   if (session->sess_driver->sess_messages_number == NULL)
240     return MAIL_ERROR_NOT_IMPLEMENTED;
241 
242   return session->sess_driver->sess_messages_number(session, mb, result);
243 }
244 
245 LIBETPAN_EXPORT
mailsession_recent_number(mailsession * session,const char * mb,uint32_t * result)246 int mailsession_recent_number(mailsession * session, const char * mb,
247 			      uint32_t * result)
248 {
249   if (session->sess_driver->sess_recent_number == NULL)
250     return MAIL_ERROR_NOT_IMPLEMENTED;
251 
252   return session->sess_driver->sess_recent_number(session, mb, result);
253 }
254 
255 LIBETPAN_EXPORT
mailsession_unseen_number(mailsession * session,const char * mb,uint32_t * result)256 int mailsession_unseen_number(mailsession * session, const char * mb,
257     uint32_t * result)
258 {
259   if (session->sess_driver->sess_unseen_number == NULL)
260     return MAIL_ERROR_NOT_IMPLEMENTED;
261 
262   return session->sess_driver->sess_unseen_number(session, mb, result);
263 }
264 
265 LIBETPAN_EXPORT
mailsession_list_folders(mailsession * session,const char * mb,struct mail_list ** result)266 int mailsession_list_folders(mailsession * session, const char * mb,
267 			     struct mail_list ** result)
268 {
269   if (session->sess_driver->sess_list_folders == NULL)
270     return MAIL_ERROR_NOT_IMPLEMENTED;
271 
272   return session->sess_driver->sess_list_folders(session, mb, result);
273 }
274 
275 LIBETPAN_EXPORT
mailsession_lsub_folders(mailsession * session,const char * mb,struct mail_list ** result)276 int mailsession_lsub_folders(mailsession * session, const char * mb,
277     struct mail_list ** result)
278 {
279   if (session->sess_driver->sess_lsub_folders == NULL)
280     return MAIL_ERROR_NOT_IMPLEMENTED;
281 
282   return session->sess_driver->sess_lsub_folders(session, mb, result);
283 }
284 
285 LIBETPAN_EXPORT
mailsession_subscribe_folder(mailsession * session,const char * mb)286 int mailsession_subscribe_folder(mailsession * session, const char * mb)
287 {
288   if (session->sess_driver->sess_subscribe_folder == NULL)
289     return MAIL_ERROR_NOT_IMPLEMENTED;
290 
291   return session->sess_driver->sess_subscribe_folder(session, mb);
292 }
293 
294 LIBETPAN_EXPORT
mailsession_unsubscribe_folder(mailsession * session,const char * mb)295 int mailsession_unsubscribe_folder(mailsession * session, const char * mb)
296 {
297   if (session->sess_driver->sess_unsubscribe_folder == NULL)
298     return MAIL_ERROR_NOT_IMPLEMENTED;
299 
300   return session->sess_driver->sess_unsubscribe_folder(session, mb);
301 }
302 
303 /* message */
304 
305 LIBETPAN_EXPORT
mailsession_append_message(mailsession * session,const char * message,size_t size)306 int mailsession_append_message(mailsession * session,
307 			       const char * message, size_t size)
308 {
309   if (session->sess_driver->sess_append_message == NULL)
310     return MAIL_ERROR_NOT_IMPLEMENTED;
311 
312   return session->sess_driver->sess_append_message(session, message, size);
313 }
314 
315 LIBETPAN_EXPORT
mailsession_append_message_flags(mailsession * session,const char * message,size_t size,struct mail_flags * flags)316 int mailsession_append_message_flags(mailsession * session,
317     const char * message, size_t size, struct mail_flags * flags)
318 {
319   if (session->sess_driver->sess_append_message_flags == NULL)
320     return MAIL_ERROR_NOT_IMPLEMENTED;
321 
322   return session->sess_driver->sess_append_message_flags(session,
323       message, size, flags);
324 }
325 
326 LIBETPAN_EXPORT
mailsession_copy_message(mailsession * session,uint32_t num,const char * mb)327 int mailsession_copy_message(mailsession * session,
328 			     uint32_t num, const char * mb)
329 {
330   if (session->sess_driver->sess_copy_message == NULL)
331     return MAIL_ERROR_NOT_IMPLEMENTED;
332 
333   return session->sess_driver->sess_copy_message(session, num, mb);
334 }
335 
336 LIBETPAN_EXPORT
mailsession_move_message(mailsession * session,uint32_t num,const char * mb)337 int mailsession_move_message(mailsession * session,
338 			     uint32_t num, const char * mb)
339 {
340   if (session->sess_driver->sess_move_message == NULL) {
341     int r;
342 
343     if ((session->sess_driver->sess_copy_message == NULL) &&
344 	(session->sess_driver->sess_remove_message == NULL))
345       return MAIL_ERROR_NOT_IMPLEMENTED;
346 
347     r = mailsession_copy_message(session, num, mb);
348     if (r != MAIL_NO_ERROR)
349       return r;
350 
351     r = mailsession_remove_message(session, num);
352     if (r != MAIL_NO_ERROR)
353       return r;
354 
355     return MAIL_NO_ERROR;
356   }
357 
358   return session->sess_driver->sess_move_message(session, num, mb);
359 }
360 
361 LIBETPAN_EXPORT
mailsession_get_envelopes_list(mailsession * session,struct mailmessage_list * env_list)362 int mailsession_get_envelopes_list(mailsession * session,
363     struct mailmessage_list * env_list)
364 {
365   if (session->sess_driver->sess_get_envelopes_list == NULL)
366     return MAIL_ERROR_NOT_IMPLEMENTED;
367 
368   return session->sess_driver->sess_get_envelopes_list(session, env_list);
369 }
370 
371 LIBETPAN_EXPORT
mailsession_get_messages_list(mailsession * session,struct mailmessage_list ** result)372 int mailsession_get_messages_list(mailsession * session,
373     struct mailmessage_list ** result)
374 {
375   if (session->sess_driver->sess_get_messages_list == NULL)
376     return MAIL_ERROR_NOT_IMPLEMENTED;
377 
378   return session->sess_driver->sess_get_messages_list(session, result);
379 }
380 
381 LIBETPAN_EXPORT
mailsession_remove_message(mailsession * session,uint32_t num)382 int mailsession_remove_message(mailsession * session, uint32_t num)
383 {
384   if (session->sess_driver->sess_remove_message == NULL)
385     return MAIL_ERROR_NOT_IMPLEMENTED;
386 
387   return session->sess_driver->sess_remove_message(session, num);
388 }
389 
390 #if 0
391 LIBETPAN_EXPORT
392 int mailsession_search_messages(mailsession * session, const char * charset,
393     struct mail_search_key * key,
394     struct mail_search_result ** result)
395 {
396   if (session->sess_driver->sess_search_messages == NULL)
397     return MAIL_ERROR_NOT_IMPLEMENTED;
398 
399   return session->sess_driver->sess_search_messages(session,
400       charset, key, result);
401 }
402 #endif
403 
404 LIBETPAN_EXPORT
mailsession_get_message(mailsession * session,uint32_t num,mailmessage ** result)405 int mailsession_get_message(mailsession * session,
406 			    uint32_t num, mailmessage ** result)
407 {
408   if (session->sess_driver->sess_get_message == NULL)
409     return MAIL_ERROR_NOT_IMPLEMENTED;
410 
411   return session->sess_driver->sess_get_message(session, num, result);
412 }
413 
414 LIBETPAN_EXPORT
mailsession_get_message_by_uid(mailsession * session,const char * uid,mailmessage ** result)415 int mailsession_get_message_by_uid(mailsession * session,
416     const char * uid, mailmessage ** result)
417 {
418   if (session->sess_driver->sess_get_message_by_uid == NULL)
419     return MAIL_ERROR_NOT_IMPLEMENTED;
420 
421   return session->sess_driver->sess_get_message_by_uid(session, uid, result);
422 }
423 
424 LIBETPAN_EXPORT
mailsession_login_sasl(mailsession * session,const char * auth_type,const char * server_fqdn,const char * local_ip_port,const char * remote_ip_port,const char * login,const char * auth_name,const char * password,const char * realm)425 int mailsession_login_sasl(mailsession * session, const char * auth_type,
426     const char * server_fqdn,
427     const char * local_ip_port,
428     const char * remote_ip_port,
429     const char * login, const char * auth_name,
430     const char * password, const char * realm)
431 {
432   if (session->sess_driver->sess_login_sasl == NULL)
433     return MAIL_ERROR_NOT_IMPLEMENTED;
434 
435   return session->sess_driver->sess_login_sasl(session, auth_type,
436       server_fqdn,
437       local_ip_port,
438       remote_ip_port,
439       login, auth_name,
440       password, realm);
441 }
442