Diffstat (limited to 'kmicromail/libetpan/generic/nntpdriver.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | kmicromail/libetpan/generic/nntpdriver.c | 10 |
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 | ||
47 | static int nntpdriver_initialize(mailsession * session); | 47 | static int nntpdriver_initialize(mailsession * session); |
48 | 48 | ||
49 | static void nntpdriver_uninitialize(mailsession * session); | 49 | static void nntpdriver_uninitialize(mailsession * session); |
50 | 50 | ||
51 | static int nntpdriver_parameters(mailsession * session, | 51 | static int nntpdriver_parameters(mailsession * session, |
52 | int id, void * value); | 52 | int id, void * value); |
53 | 53 | ||
54 | static int nntpdriver_connect_stream(mailsession * session, mailstream * s); | 54 | static int nntpdriver_connect_stream(mailsession * session, mailstream * s); |
55 | 55 | ||
56 | static int nntpdriver_login(mailsession * session, | 56 | static int nntpdriver_login(mailsession * session, |
57 | char * userid, char * password); | 57 | char * userid, char * password); |
58 | 58 | ||
59 | static int nntpdriver_logout(mailsession * session); | 59 | static int nntpdriver_logout(mailsession * session); |
60 | 60 | ||
61 | static int nntpdriver_status_folder(mailsession * session, char * mb, | 61 | static 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 | ||
66 | static int nntpdriver_messages_number(mailsession * session, char * mb, | 66 | static int nntpdriver_messages_number(mailsession * session, char * mb, |
67 | uint32_t * result); | 67 | uint32_t * result); |
68 | 68 | ||
69 | static int nntpdriver_append_message(mailsession * session, | 69 | static int nntpdriver_append_message(mailsession * session, |
70 | char * message, size_t size); | 70 | char * message, size_t size); |
71 | 71 | ||
72 | static int nntpdriver_append_message_flags(mailsession * session, | ||
73 | char * message, size_t size, struct mail_flags * flags); | ||
74 | |||
72 | static int | 75 | static int |
73 | nntpdriver_get_envelopes_list(mailsession * session, | 76 | nntpdriver_get_envelopes_list(mailsession * session, |
74 | struct mailmessage_list * env_list); | 77 | struct mailmessage_list * env_list); |
75 | 78 | ||
76 | 79 | ||
77 | static int nntpdriver_get_messages_list(mailsession * session, | 80 | static int nntpdriver_get_messages_list(mailsession * session, |
78 | struct mailmessage_list ** result); | 81 | struct mailmessage_list ** result); |
79 | 82 | ||
80 | static int nntpdriver_list_folders(mailsession * session, char * mb, | 83 | static int nntpdriver_list_folders(mailsession * session, char * mb, |
81 | struct mail_list ** result); | 84 | struct mail_list ** result); |
82 | 85 | ||
83 | static int nntpdriver_lsub_folders(mailsession * session, char * mb, | 86 | static int nntpdriver_lsub_folders(mailsession * session, char * mb, |
84 | struct mail_list ** result); | 87 | struct mail_list ** result); |
85 | 88 | ||
86 | static int nntpdriver_subscribe_folder(mailsession * session, char * mb); | 89 | static int nntpdriver_subscribe_folder(mailsession * session, char * mb); |
87 | 90 | ||
88 | static int nntpdriver_unsubscribe_folder(mailsession * session, char * mb); | 91 | static int nntpdriver_unsubscribe_folder(mailsession * session, char * mb); |
89 | 92 | ||
90 | static int nntpdriver_get_message(mailsession * session, | 93 | static int nntpdriver_get_message(mailsession * session, |
91 | uint32_t num, mailmessage ** result); | 94 | uint32_t num, mailmessage ** result); |
92 | 95 | ||
93 | static int nntpdriver_get_message_by_uid(mailsession * session, | 96 | static int nntpdriver_get_message_by_uid(mailsession * session, |
94 | const char * uid, | 97 | const char * uid, |
95 | mailmessage ** result); | 98 | mailmessage ** result); |
96 | 99 | ||
97 | static int nntpdriver_noop(mailsession * session); | 100 | static int nntpdriver_noop(mailsession * session); |
98 | 101 | ||
99 | static mailsession_driver local_nntp_session_driver = { | 102 | static 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 | ||
147 | mailsession_driver * nntp_session_driver = &local_nntp_session_driver; | 151 | mailsession_driver * nntp_session_driver = &local_nntp_session_driver; |
148 | 152 | ||
149 | static inline struct nntp_session_state_data * | 153 | static inline struct nntp_session_state_data * |
150 | get_data(mailsession * session) | 154 | get_data(mailsession * session) |
151 | { | 155 | { |
152 | return session->sess_data; | 156 | return session->sess_data; |
153 | } | 157 | } |
154 | 158 | ||
155 | static inline newsnntp * get_nntp_session(mailsession * session) | 159 | static 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 | ||
160 | static int nntpdriver_initialize(mailsession * session) | 164 | static 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 | ||
588 | static int nntpdriver_unsubscribe_folder(mailsession * session, char * mb) | 592 | static 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 | ||
603 | static int nntpdriver_append_message(mailsession * session, | 607 | static 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 | ||
637 | static 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 | ||
634 | static int xover_resp_to_fields(struct newsnntp_xover_resp_item * item, | 644 | static 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 | ||
638 | static int | 648 | static int |
639 | nntpdriver_get_envelopes_list(mailsession * session, | 649 | nntpdriver_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) |