summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/generic/nntpdriver.c
Unidiff
Diffstat (limited to 'kmicromail/libetpan/generic/nntpdriver.c') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libetpan/generic/nntpdriver.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/kmicromail/libetpan/generic/nntpdriver.c b/kmicromail/libetpan/generic/nntpdriver.c
index fde5f1a..1b65838 100644
--- a/kmicromail/libetpan/generic/nntpdriver.c
+++ b/kmicromail/libetpan/generic/nntpdriver.c
@@ -24,156 +24,160 @@
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 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 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 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE. 29 * SUCH DAMAGE.
30 */ 30 */
31 31
32/* 32/*
33 * $Id$ 33 * $Id$
34 */ 34 */
35 35
36#include "nntpdriver.h" 36#include "nntpdriver.h"
37 37
38#include <string.h> 38#include <string.h>
39#include <stdlib.h> 39#include <stdlib.h>
40 40
41#include "mail.h" 41#include "mail.h"
42#include "mailmessage.h" 42#include "mailmessage.h"
43#include "nntpdriver_tools.h" 43#include "nntpdriver_tools.h"
44#include "maildriver_tools.h" 44#include "maildriver_tools.h"
45#include "nntpdriver_message.h" 45#include "nntpdriver_message.h"
46 46
47static int nntpdriver_initialize(mailsession * session); 47static int nntpdriver_initialize(mailsession * session);
48 48
49static void nntpdriver_uninitialize(mailsession * session); 49static void nntpdriver_uninitialize(mailsession * session);
50 50
51static int nntpdriver_parameters(mailsession * session, 51static int nntpdriver_parameters(mailsession * session,
52 int id, void * value); 52 int id, void * value);
53 53
54static int nntpdriver_connect_stream(mailsession * session, mailstream * s); 54static int nntpdriver_connect_stream(mailsession * session, mailstream * s);
55 55
56static int nntpdriver_login(mailsession * session, 56static int nntpdriver_login(mailsession * session,
57 char * userid, char * password); 57 char * userid, char * password);
58 58
59static int nntpdriver_logout(mailsession * session); 59static int nntpdriver_logout(mailsession * session);
60 60
61static int nntpdriver_status_folder(mailsession * session, char * mb, 61static int nntpdriver_status_folder(mailsession * session, char * mb,
62 uint32_t * result_messages, 62 uint32_t * result_messages,
63 uint32_t * result_recent, 63 uint32_t * result_recent,
64 uint32_t * result_unseen); 64 uint32_t * result_unseen);
65 65
66static int nntpdriver_messages_number(mailsession * session, char * mb, 66static int nntpdriver_messages_number(mailsession * session, char * mb,
67 uint32_t * result); 67 uint32_t * result);
68 68
69static int nntpdriver_append_message(mailsession * session, 69static int nntpdriver_append_message(mailsession * session,
70 char * message, size_t size); 70 char * message, size_t size);
71 71
72static int nntpdriver_append_message_flags(mailsession * session,
73 char * message, size_t size, struct mail_flags * flags);
74
72static int 75static int
73nntpdriver_get_envelopes_list(mailsession * session, 76nntpdriver_get_envelopes_list(mailsession * session,
74 struct mailmessage_list * env_list); 77 struct mailmessage_list * env_list);
75 78
76 79
77static int nntpdriver_get_messages_list(mailsession * session, 80static int nntpdriver_get_messages_list(mailsession * session,
78 struct mailmessage_list ** result); 81 struct mailmessage_list ** result);
79 82
80static int nntpdriver_list_folders(mailsession * session, char * mb, 83static int nntpdriver_list_folders(mailsession * session, char * mb,
81 struct mail_list ** result); 84 struct mail_list ** result);
82 85
83static int nntpdriver_lsub_folders(mailsession * session, char * mb, 86static int nntpdriver_lsub_folders(mailsession * session, char * mb,
84 struct mail_list ** result); 87 struct mail_list ** result);
85 88
86static int nntpdriver_subscribe_folder(mailsession * session, char * mb); 89static int nntpdriver_subscribe_folder(mailsession * session, char * mb);
87 90
88static int nntpdriver_unsubscribe_folder(mailsession * session, char * mb); 91static int nntpdriver_unsubscribe_folder(mailsession * session, char * mb);
89 92
90static int nntpdriver_get_message(mailsession * session, 93static int nntpdriver_get_message(mailsession * session,
91 uint32_t num, mailmessage ** result); 94 uint32_t num, mailmessage ** result);
92 95
93static int nntpdriver_get_message_by_uid(mailsession * session, 96static int nntpdriver_get_message_by_uid(mailsession * session,
94 const char * uid, 97 const char * uid,
95 mailmessage ** result); 98 mailmessage ** result);
96 99
97static int nntpdriver_noop(mailsession * session); 100static int nntpdriver_noop(mailsession * session);
98 101
99static mailsession_driver local_nntp_session_driver = { 102static mailsession_driver local_nntp_session_driver = {
100 .sess_name = "nntp", 103 .sess_name = "nntp",
101 104
102 .sess_initialize = nntpdriver_initialize, 105 .sess_initialize = nntpdriver_initialize,
103 .sess_uninitialize = nntpdriver_uninitialize, 106 .sess_uninitialize = nntpdriver_uninitialize,
104 107
105 .sess_parameters = nntpdriver_parameters, 108 .sess_parameters = nntpdriver_parameters,
106 109
107 .sess_connect_stream = nntpdriver_connect_stream, 110 .sess_connect_stream = nntpdriver_connect_stream,
108 .sess_connect_path = NULL, 111 .sess_connect_path = NULL,
109 .sess_starttls = NULL, 112 .sess_starttls = NULL,
110 .sess_login = nntpdriver_login, 113 .sess_login = nntpdriver_login,
111 .sess_logout = nntpdriver_logout, 114 .sess_logout = nntpdriver_logout,
112 .sess_noop = nntpdriver_noop, 115 .sess_noop = nntpdriver_noop,
113 116
114 .sess_build_folder_name = NULL, 117 .sess_build_folder_name = NULL,
115 .sess_create_folder = NULL, 118 .sess_create_folder = NULL,
116 .sess_delete_folder = NULL, 119 .sess_delete_folder = NULL,
117 .sess_rename_folder = NULL, 120 .sess_rename_folder = NULL,
118 .sess_check_folder = NULL, 121 .sess_check_folder = NULL,
119 .sess_examine_folder = NULL, 122 .sess_examine_folder = NULL,
120 .sess_select_folder = nntpdriver_select_folder, 123 .sess_select_folder = nntpdriver_select_folder,
121 .sess_expunge_folder = NULL, 124 .sess_expunge_folder = NULL,
122 .sess_status_folder = nntpdriver_status_folder, 125 .sess_status_folder = nntpdriver_status_folder,
123 .sess_messages_number = nntpdriver_messages_number, 126 .sess_messages_number = nntpdriver_messages_number,
124 .sess_recent_number = nntpdriver_messages_number, 127 .sess_recent_number = nntpdriver_messages_number,
125 .sess_unseen_number = nntpdriver_messages_number, 128 .sess_unseen_number = nntpdriver_messages_number,
126 .sess_list_folders = nntpdriver_list_folders, 129 .sess_list_folders = nntpdriver_list_folders,
127 .sess_lsub_folders = nntpdriver_lsub_folders, 130 .sess_lsub_folders = nntpdriver_lsub_folders,
128 .sess_subscribe_folder = nntpdriver_subscribe_folder, 131 .sess_subscribe_folder = nntpdriver_subscribe_folder,
129 .sess_unsubscribe_folder = nntpdriver_unsubscribe_folder, 132 .sess_unsubscribe_folder = nntpdriver_unsubscribe_folder,
130 133
131 .sess_append_message = nntpdriver_append_message, 134 .sess_append_message = nntpdriver_append_message,
135 .sess_append_message_flags = nntpdriver_append_message_flags,
132 .sess_copy_message = NULL, 136 .sess_copy_message = NULL,
133 .sess_move_message = NULL, 137 .sess_move_message = NULL,
134 138
135 .sess_get_messages_list = nntpdriver_get_messages_list, 139 .sess_get_messages_list = nntpdriver_get_messages_list,
136 .sess_get_envelopes_list = nntpdriver_get_envelopes_list, 140 .sess_get_envelopes_list = nntpdriver_get_envelopes_list,
137 .sess_remove_message = NULL, 141 .sess_remove_message = NULL,
138#if 0 142#if 0
139 .sess_search_messages = maildriver_generic_search_messages, 143 .sess_search_messages = maildriver_generic_search_messages,
140#endif 144#endif
141 145
142 .sess_get_message = nntpdriver_get_message, 146 .sess_get_message = nntpdriver_get_message,
143 .sess_get_message_by_uid = nntpdriver_get_message_by_uid, 147 .sess_get_message_by_uid = nntpdriver_get_message_by_uid,
144}; 148};
145 149
146 150
147mailsession_driver * nntp_session_driver = &local_nntp_session_driver; 151mailsession_driver * nntp_session_driver = &local_nntp_session_driver;
148 152
149static inline struct nntp_session_state_data * 153static inline struct nntp_session_state_data *
150get_data(mailsession * session) 154get_data(mailsession * session)
151{ 155{
152 return session->sess_data; 156 return session->sess_data;
153} 157}
154 158
155static inline newsnntp * get_nntp_session(mailsession * session) 159static inline newsnntp * get_nntp_session(mailsession * session)
156{ 160{
157 return get_data(session)->nntp_session; 161 return get_data(session)->nntp_session;
158} 162}
159 163
160static int nntpdriver_initialize(mailsession * session) 164static int nntpdriver_initialize(mailsession * session)
161{ 165{
162 struct nntp_session_state_data * data; 166 struct nntp_session_state_data * data;
163 newsnntp * nntp; 167 newsnntp * nntp;
164 168
165 nntp = newsnntp_new(0, NULL); 169 nntp = newsnntp_new(0, NULL);
166 if (nntp == NULL) 170 if (nntp == NULL)
167 goto err; 171 goto err;
168 172
169 data = malloc(sizeof(* data)); 173 data = malloc(sizeof(* data));
170 if (data == NULL) 174 if (data == NULL)
171 goto free; 175 goto free;
172 176
173 data->nntp_session = nntp; 177 data->nntp_session = nntp;
174 178
175 data->nntp_userid = NULL; 179 data->nntp_userid = NULL;
176 data->nntp_password = NULL; 180 data->nntp_password = NULL;
177 181
178 data->nntp_group_info = NULL; 182 data->nntp_group_info = NULL;
179 data->nntp_group_name = NULL; 183 data->nntp_group_name = NULL;
@@ -585,96 +589,102 @@ static int nntpdriver_subscribe_folder(mailsession * session, char * mb)
585 return MAIL_NO_ERROR; 589 return MAIL_NO_ERROR;
586} 590}
587 591
588static int nntpdriver_unsubscribe_folder(mailsession * session, char * mb) 592static int nntpdriver_unsubscribe_folder(mailsession * session, char * mb)
589{ 593{
590 int r; 594 int r;
591 595
592 r = remove_from_list(session, mb); 596 r = remove_from_list(session, mb);
593 if (r < 0) 597 if (r < 0)
594 return MAIL_ERROR_UNSUBSCRIBE; 598 return MAIL_ERROR_UNSUBSCRIBE;
595 599
596 return MAIL_NO_ERROR; 600 return MAIL_NO_ERROR;
597} 601}
598 602
599 603
600 604
601/* messages operations */ 605/* messages operations */
602 606
603static int nntpdriver_append_message(mailsession * session, 607static int nntpdriver_append_message(mailsession * session,
604 char * message, size_t size) 608 char * message, size_t size)
605{ 609{
606 int r; 610 int r;
607 struct nntp_session_state_data * data; 611 struct nntp_session_state_data * data;
608 612
609 data = get_data(session); 613 data = get_data(session);
610 614
611 do { 615 do {
612 r = newsnntp_post(get_nntp_session(session), message, size); 616 r = newsnntp_post(get_nntp_session(session), message, size);
613 switch (r) { 617 switch (r) {
614 case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_USERNAME: 618 case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_USERNAME:
615 r = nntpdriver_authenticate_user(session); 619 r = nntpdriver_authenticate_user(session);
616 if (r != MAIL_NO_ERROR) 620 if (r != MAIL_NO_ERROR)
617 return r; 621 return r;
618 break; 622 break;
619 623
620 case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD: 624 case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD:
621 r = nntpdriver_authenticate_password(session); 625 r = nntpdriver_authenticate_password(session);
622 if (r != MAIL_NO_ERROR) 626 if (r != MAIL_NO_ERROR)
623 return r; 627 return r;
624 break; 628 break;
625 629
626 default: 630 default:
627 return nntpdriver_nntp_error_to_mail_error(r); 631 return nntpdriver_nntp_error_to_mail_error(r);
628 } 632 }
629 } 633 }
630 while (1); 634 while (1);
631} 635}
632 636
637static int nntpdriver_append_message_flags(mailsession * session,
638 char * message, size_t size, struct mail_flags * flags)
639{
640 return nntpdriver_append_message(session, message, size);
641}
642
633 643
634static int xover_resp_to_fields(struct newsnntp_xover_resp_item * item, 644static int xover_resp_to_fields(struct newsnntp_xover_resp_item * item,
635 struct mailimf_fields ** result); 645 struct mailimf_fields ** result);
636 646
637 647
638static int 648static int
639nntpdriver_get_envelopes_list(mailsession * session, 649nntpdriver_get_envelopes_list(mailsession * session,
640 struct mailmessage_list * env_list) 650 struct mailmessage_list * env_list)
641{ 651{
642 newsnntp * nntp; 652 newsnntp * nntp;
643 int r; 653 int r;
644 struct nntp_session_state_data * data; 654 struct nntp_session_state_data * data;
645 clist * list; 655 clist * list;
646 int done; 656 int done;
647 clistiter * cur; 657 clistiter * cur;
648 uint32_t first_seq; 658 uint32_t first_seq;
649 unsigned int i; 659 unsigned int i;
650 660
651 nntp = get_nntp_session(session); 661 nntp = get_nntp_session(session);
652 662
653 data = get_data(session); 663 data = get_data(session);
654 664
655 if (data->nntp_group_info == NULL) 665 if (data->nntp_group_info == NULL)
656 return MAIL_ERROR_BAD_STATE; 666 return MAIL_ERROR_BAD_STATE;
657 667
658 first_seq = data->nntp_group_info->grp_first; 668 first_seq = data->nntp_group_info->grp_first;
659 669
660 if (carray_count(env_list->msg_tab) > 0) { 670 if (carray_count(env_list->msg_tab) > 0) {
661 mailmessage * msg; 671 mailmessage * msg;
662 672
663 msg = carray_get(env_list->msg_tab, 0); 673 msg = carray_get(env_list->msg_tab, 0);
664 674
665 first_seq = msg->msg_index; 675 first_seq = msg->msg_index;
666 } 676 }
667 677
668 if (carray_count(env_list->msg_tab) > 0) { 678 if (carray_count(env_list->msg_tab) > 0) {
669 i = carray_count(env_list->msg_tab) - 1; 679 i = carray_count(env_list->msg_tab) - 1;
670 while (1) { 680 while (1) {
671 mailmessage * msg; 681 mailmessage * msg;
672 682
673 msg = carray_get(env_list->msg_tab, i); 683 msg = carray_get(env_list->msg_tab, i);
674 684
675 if (msg->msg_fields != NULL) { 685 if (msg->msg_fields != NULL) {
676 first_seq = msg->msg_index + 1; 686 first_seq = msg->msg_index + 1;
677 break; 687 break;
678 } 688 }
679 689
680 if (i == 0) 690 if (i == 0)