Added TLS/SSL support (via GnuTLS)
Showing
10 changed files
with
158 additions
and
85 deletions
1 | ## Process this file with GNU Automake to create Makefile.in | 1 | ## Process this file with GNU Automake to create Makefile.in |
2 | 2 | ||
3 | ## Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. | 3 | ## Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. |
4 | ## | 4 | ## |
5 | ## GNU Mailtuils is free software; you can redistribute it and/or | 5 | ## GNU Mailutils is free software; you can redistribute it and/or |
6 | ## modify it under the terms of the GNU General Public License as | 6 | ## modify it under the terms of the GNU General Public License as |
7 | ## published by the Free Software Foundation; either version 2, or (at | 7 | ## published by the Free Software Foundation; either version 2, or (at |
8 | ## your option) any later version. | 8 | ## your option) any later version. |
9 | ## | 9 | ## |
10 | ## This program is distributed in the hope that it will be useful, but | 10 | ## GNU Mailutils is distributed in the hope that it will be useful, but |
11 | ## WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | ## WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 12 | ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | ## General Public License for more details. | 13 | ## General Public License for more details. |
14 | ## | 14 | ## |
15 | ## You should have received a copy of the GNU General Public License | 15 | ## You should have received a copy of the GNU General Public License |
16 | ## along with this program; if not, write to the Free Software | 16 | ## along with GNU Mailutils; if not, write to the Free Software |
17 | ## Foundation, Inc. | 17 | ## Foundation, Inc. |
18 | ## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 18 | ## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | 19 | ||
... | @@ -26,8 +26,8 @@ imap4d_LDADD = @AUTHOBJS@ ../mailbox/libmailbox.la @AUTHLIBS@ ../lib/libmailuti | ... | @@ -26,8 +26,8 @@ imap4d_LDADD = @AUTHOBJS@ ../mailbox/libmailbox.la @AUTHLIBS@ ../lib/libmailuti |
26 | imap4d_SOURCES = append.c authenticate.c bye.c capability.c check.c close.c \ | 26 | imap4d_SOURCES = append.c authenticate.c bye.c capability.c check.c close.c \ |
27 | commands.c copy.c create.c delete.c examine.c expunge.c fetch.c imap4d.c \ | 27 | commands.c copy.c create.c delete.c examine.c expunge.c fetch.c imap4d.c \ |
28 | imap4d.h list.c logout.c login.c lsub.c namespace.c noop.c rename.c search.c \ | 28 | imap4d.h list.c logout.c login.c lsub.c namespace.c noop.c rename.c search.c \ |
29 | select.c signal.c status.c store.c subscribe.c sync.c uid.c unsubscribe.c \ | 29 | select.c signal.c starttls.c status.c store.c subscribe.c sync.c uid.c \ |
30 | util.c version.c | 30 | unsubscribe.c util.c version.c |
31 | 31 | ||
32 | ## This kludge is necessary to correctly establish imap4d -> AUTHOBJS | 32 | ## This kludge is necessary to correctly establish imap4d -> AUTHOBJS |
33 | ## dependency. Think about better approach --gray | 33 | ## dependency. Think about better approach --gray | ... | ... |
1 | /* GNU Mailutils -- a suite of utilities for electronic mail | 1 | /* GNU Mailutils -- a suite of utilities for electronic mail |
2 | Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc. | 2 | Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc. |
3 | 3 | ||
4 | GNU Mailutils is free software; you can redistribute it and/or modify | 4 | GNU Mailutils is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
... | @@ -13,9 +13,10 @@ | ... | @@ -13,9 +13,10 @@ |
13 | 13 | ||
14 | You should have received a copy of the GNU General Public License | 14 | You should have received a copy of the GNU General Public License |
15 | along with GNU Mailutils; if not, write to the Free Software | 15 | along with GNU Mailutils; if not, write to the Free Software |
16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | 16 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ |
17 | 17 | ||
18 | /* GSSAPI authentication for imap (rfc 1731). | 18 | /* |
19 | GSSAPI authentication for imap (rfc 1731). | ||
19 | */ | 20 | */ |
20 | 21 | ||
21 | #include "imap4d.h" | 22 | #include "imap4d.h" |
... | @@ -46,11 +47,8 @@ display_status_1 (char *m, OM_uint32 code, int type) | ... | @@ -46,11 +47,8 @@ display_status_1 (char *m, OM_uint32 code, int type) |
46 | do | 47 | do |
47 | { | 48 | { |
48 | maj_stat = gss_display_status (&min_stat, code, | 49 | maj_stat = gss_display_status (&min_stat, code, |
49 | type, GSS_C_NULL_OID, | 50 | type, GSS_C_NULL_OID, &msg_ctx, &msg); |
50 | &msg_ctx, &msg); | 51 | syslog (LOG_ERR, _("GSS-API error %s: %s\n"), m, (char *) msg.value); |
51 | syslog (LOG_ERR, | ||
52 | _("GSS-API error %s: %s\n"), m, | ||
53 | (char *)msg.value); | ||
54 | gss_release_buffer (&min_stat, &msg); | 52 | gss_release_buffer (&min_stat, &msg); |
55 | } | 53 | } |
56 | while (msg_ctx); | 54 | while (msg_ctx); |
... | @@ -64,7 +62,7 @@ display_status (char *msg, OM_uint32 maj_stat, OM_uint32 min_stat) | ... | @@ -64,7 +62,7 @@ display_status (char *msg, OM_uint32 maj_stat, OM_uint32 min_stat) |
64 | } | 62 | } |
65 | 63 | ||
66 | static int | 64 | static int |
67 | imap4d_gss_userok(gss_buffer_t client_name, char *name) | 65 | imap4d_gss_userok (gss_buffer_t client_name, char *name) |
68 | { | 66 | { |
69 | int rc = -1; | 67 | int rc = -1; |
70 | krb5_principal p; | 68 | krb5_principal p; |
... | @@ -109,30 +107,27 @@ auth_gssapi (struct imap4d_command *command, char **username) | ... | @@ -109,30 +107,27 @@ auth_gssapi (struct imap4d_command *command, char **username) |
109 | work (possibly due to a bug in krb5_gss_accept_sec_context()), so | 107 | work (possibly due to a bug in krb5_gss_accept_sec_context()), so |
110 | we acquire server credentials explicitly. */ | 108 | we acquire server credentials explicitly. */ |
111 | 109 | ||
112 | asprintf ((char**)&tmp, "imap@%s", util_localname ()); | 110 | asprintf ((char **) &tmp, "imap@%s", util_localname ()); |
113 | tokbuf.value = tmp; | 111 | tokbuf.value = tmp; |
114 | tokbuf.length = strlen (tokbuf.value) + 1; | 112 | tokbuf.length = strlen (tokbuf.value) + 1; |
115 | maj_stat = gss_import_name (&min_stat, &tokbuf, | 113 | maj_stat = gss_import_name (&min_stat, &tokbuf, |
116 | gss_nt_service_name, | 114 | gss_nt_service_name, &server_name); |
117 | &server_name); | ||
118 | if (maj_stat != GSS_S_COMPLETE) | 115 | if (maj_stat != GSS_S_COMPLETE) |
119 | { | 116 | { |
120 | display_status ("import name", maj_stat, min_stat); | 117 | display_status ("import name", maj_stat, min_stat); |
121 | util_finish (command, RESP_NO, | 118 | util_finish (command, RESP_NO, "GSSAPI authentication not available"); |
122 | "GSSAPI authentication not available"); | ||
123 | return 1; | 119 | return 1; |
124 | } | 120 | } |
125 | 121 | ||
126 | maj_stat = gss_acquire_cred (&min_stat, server_name, 0, | 122 | maj_stat = gss_acquire_cred (&min_stat, server_name, 0, |
127 | GSS_C_NULL_OID_SET, GSS_C_ACCEPT, | 123 | GSS_C_NULL_OID_SET, GSS_C_ACCEPT, |
128 | &server_creds, NULL, NULL); | 124 | &server_creds, NULL, NULL); |
129 | gss_release_name(&min_stat2, &server_name); | 125 | gss_release_name (&min_stat2, &server_name); |
130 | 126 | ||
131 | if (maj_stat != GSS_S_COMPLETE) | 127 | if (maj_stat != GSS_S_COMPLETE) |
132 | { | 128 | { |
133 | display_status ("acquire credentials", maj_stat, min_stat); | 129 | display_status ("acquire credentials", maj_stat, min_stat); |
134 | util_finish (command, RESP_NO, | 130 | util_finish (command, RESP_NO, "GSSAPI authentication not available"); |
135 | "GSSAPI authentication not available"); | ||
136 | return 1; | 131 | return 1; |
137 | } | 132 | } |
138 | 133 | ||
... | @@ -144,7 +139,7 @@ auth_gssapi (struct imap4d_command *command, char **username) | ... | @@ -144,7 +139,7 @@ auth_gssapi (struct imap4d_command *command, char **username) |
144 | 139 | ||
145 | for (;;) | 140 | for (;;) |
146 | { | 141 | { |
147 | token_str = imap4d_readline_ex (ifile); | 142 | token_str = imap4d_readline_ex (); |
148 | util_base64_decode (token_str, strlen (token_str), &tmp, &size); | 143 | util_base64_decode (token_str, strlen (token_str), &tmp, &size); |
149 | tokbuf.value = tmp; | 144 | tokbuf.value = tmp; |
150 | tokbuf.length = size; | 145 | tokbuf.length = size; |
... | @@ -158,9 +153,7 @@ auth_gssapi (struct imap4d_command *command, char **username) | ... | @@ -158,9 +153,7 @@ auth_gssapi (struct imap4d_command *command, char **username) |
158 | &client, | 153 | &client, |
159 | &mech_type, | 154 | &mech_type, |
160 | &outbuf, | 155 | &outbuf, |
161 | &cflags, | 156 | &cflags, NULL, &cred_handle); |
162 | NULL, | ||
163 | &cred_handle); | ||
164 | free (tmp); | 157 | free (tmp); |
165 | if (maj_stat == GSS_S_CONTINUE_NEEDED) | 158 | if (maj_stat == GSS_S_CONTINUE_NEEDED) |
166 | { | 159 | { |
... | @@ -180,8 +173,7 @@ auth_gssapi (struct imap4d_command *command, char **username) | ... | @@ -180,8 +173,7 @@ auth_gssapi (struct imap4d_command *command, char **username) |
180 | display_status ("accept context", maj_stat, min_stat); | 173 | display_status ("accept context", maj_stat, min_stat); |
181 | maj_stat = gss_delete_sec_context (&min_stat, &context, &outbuf); | 174 | maj_stat = gss_delete_sec_context (&min_stat, &context, &outbuf); |
182 | gss_release_buffer (&min_stat, &outbuf); | 175 | gss_release_buffer (&min_stat, &outbuf); |
183 | util_finish (command, RESP_NO, | 176 | util_finish (command, RESP_NO, "GSSAPI authentication failed"); |
184 | "GSSAPI authentication failed"); | ||
185 | return 1; | 177 | return 1; |
186 | } | 178 | } |
187 | 179 | ||
... | @@ -191,7 +183,7 @@ auth_gssapi (struct imap4d_command *command, char **username) | ... | @@ -191,7 +183,7 @@ auth_gssapi (struct imap4d_command *command, char **username) |
191 | util_send ("+ %*.*s\r\n", size, size, tmp); | 183 | util_send ("+ %*.*s\r\n", size, size, tmp); |
192 | free (tmp); | 184 | free (tmp); |
193 | gss_release_buffer (&min_stat, &outbuf); | 185 | gss_release_buffer (&min_stat, &outbuf); |
194 | token_str = imap4d_readline_ex (ifile); | 186 | token_str = imap4d_readline_ex (); |
195 | free (token_str); | 187 | free (token_str); |
196 | } | 188 | } |
197 | 189 | ||
... | @@ -205,15 +197,15 @@ auth_gssapi (struct imap4d_command *command, char **username) | ... | @@ -205,15 +197,15 @@ auth_gssapi (struct imap4d_command *command, char **username) |
205 | util_send ("+ %*.*s\r\n", size, size, tmp); | 197 | util_send ("+ %*.*s\r\n", size, size, tmp); |
206 | free (tmp); | 198 | free (tmp); |
207 | 199 | ||
208 | token_str = imap4d_readline_ex (ifile); | 200 | token_str = imap4d_readline_ex (); |
209 | util_base64_decode (token_str, strlen (token_str), | 201 | util_base64_decode (token_str, strlen (token_str), |
210 | (unsigned char **)&tokbuf.value, &tokbuf.length); | 202 | (unsigned char **) &tokbuf.value, &tokbuf.length); |
211 | free (token_str); | 203 | free (token_str); |
212 | 204 | ||
213 | gss_unwrap (&min_stat, context, &tokbuf, &outbuf, &cflags, &quality); | 205 | gss_unwrap (&min_stat, context, &tokbuf, &outbuf, &cflags, &quality); |
214 | free (tokbuf.value); | 206 | free (tokbuf.value); |
215 | 207 | ||
216 | sec_level = ntohl (*(OM_uint32*)outbuf.value); | 208 | sec_level = ntohl (*(OM_uint32 *) outbuf.value); |
217 | 209 | ||
218 | /* FIXME: parse sec_level and act accordingly to its settings */ | 210 | /* FIXME: parse sec_level and act accordingly to its settings */ |
219 | mech = sec_level >> 24; | 211 | mech = sec_level >> 24; |
... | @@ -232,19 +224,17 @@ auth_gssapi (struct imap4d_command *command, char **username) | ... | @@ -232,19 +224,17 @@ auth_gssapi (struct imap4d_command *command, char **username) |
232 | protection_mech = mech; | 224 | protection_mech = mech; |
233 | client_buffer_size = sec_level & 0x00ffffffff; | 225 | client_buffer_size = sec_level & 0x00ffffffff; |
234 | 226 | ||
235 | *username = strdup ((char*)outbuf.value + 4); | 227 | *username = strdup ((char *) outbuf.value + 4); |
236 | gss_release_buffer (&min_stat, &outbuf); | 228 | gss_release_buffer (&min_stat, &outbuf); |
237 | 229 | ||
238 | maj_stat = gss_display_name(&min_stat, client, | 230 | maj_stat = gss_display_name (&min_stat, client, &client_name, &mech_type); |
239 | &client_name, &mech_type); | ||
240 | if (maj_stat != GSS_S_COMPLETE) | 231 | if (maj_stat != GSS_S_COMPLETE) |
241 | { | 232 | { |
242 | display_status ("get client name", maj_stat, min_stat); | 233 | display_status ("get client name", maj_stat, min_stat); |
243 | maj_stat = gss_delete_sec_context (&min_stat, &context, &outbuf); | 234 | maj_stat = gss_delete_sec_context (&min_stat, &context, &outbuf); |
244 | gss_release_buffer (&min_stat, &outbuf); | 235 | gss_release_buffer (&min_stat, &outbuf); |
245 | free (*username); | 236 | free (*username); |
246 | util_finish (command, RESP_NO, | 237 | util_finish (command, RESP_NO, "GSSAPI authentication failed"); |
247 | "GSSAPI authentication failed"); | ||
248 | return 1; | 238 | return 1; |
249 | } | 239 | } |
250 | 240 | ||
... | @@ -270,8 +260,6 @@ auth_gssapi (struct imap4d_command *command, char **username) | ... | @@ -270,8 +260,6 @@ auth_gssapi (struct imap4d_command *command, char **username) |
270 | gss_release_buffer (&min_stat, &client_name); | 260 | gss_release_buffer (&min_stat, &client_name); |
271 | maj_stat = gss_delete_sec_context (&min_stat, &context, &outbuf); | 261 | maj_stat = gss_delete_sec_context (&min_stat, &context, &outbuf); |
272 | gss_release_buffer (&min_stat, &outbuf); | 262 | gss_release_buffer (&min_stat, &outbuf); |
273 | util_finish (command, RESP_OK, | 263 | util_finish (command, RESP_OK, "GSSAPI authentication successful"); |
274 | "GSSAPI authentication successful"); | ||
275 | return 0; | 264 | return 0; |
276 | } | 265 | } |
277 | ... | ... |
... | @@ -44,7 +44,7 @@ imap4d_bye0 (int reason, struct imap4d_command *command) | ... | @@ -44,7 +44,7 @@ imap4d_bye0 (int reason, struct imap4d_command *command) |
44 | break; | 44 | break; |
45 | 45 | ||
46 | case ERR_SIGNAL: | 46 | case ERR_SIGNAL: |
47 | if (ofile) | 47 | if (util_is_ofile()) |
48 | util_out (RESP_BYE, "Quitting on signal"); | 48 | util_out (RESP_BYE, "Quitting on signal"); |
49 | syslog (LOG_ERR, _("Quitting on signal")); | 49 | syslog (LOG_ERR, _("Quitting on signal")); |
50 | break; | 50 | break; |
... | @@ -78,6 +78,14 @@ imap4d_bye0 (int reason, struct imap4d_command *command) | ... | @@ -78,6 +78,14 @@ imap4d_bye0 (int reason, struct imap4d_command *command) |
78 | 78 | ||
79 | if (status == EXIT_SUCCESS && command) | 79 | if (status == EXIT_SUCCESS && command) |
80 | util_finish (command, RESP_OK, "Completed"); | 80 | util_finish (command, RESP_OK, "Completed"); |
81 | |||
82 | #ifdef WITH_TLS | ||
83 | if (tls_done) | ||
84 | imap4d_deinit_tls_server (); | ||
85 | if (tls_available) | ||
86 | mu_deinit_tls_libs (); | ||
87 | #endif /* WITH_TLS */ | ||
88 | |||
81 | closelog (); | 89 | closelog (); |
82 | exit (status); | 90 | exit (status); |
83 | } | 91 | } | ... | ... |
1 | /* GNU Mailutils -- a suite of utilities for electronic mail | 1 | /* GNU Mailutils -- a suite of utilities for electronic mail |
2 | Copyright (C) 1999, 2001 Free Software Foundation, Inc. | 2 | Copyright (C) 1999, 2001, 2003 Free Software Foundation, Inc. |
3 | 3 | ||
4 | GNU Mailutils is free software; you can redistribute it and/or modify | 4 | GNU Mailutils is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
... | @@ -13,7 +13,7 @@ | ... | @@ -13,7 +13,7 @@ |
13 | 13 | ||
14 | You should have received a copy of the GNU General Public License | 14 | You should have received a copy of the GNU General Public License |
15 | along with GNU Mailutils; if not, write to the Free Software | 15 | along with GNU Mailutils; if not, write to the Free Software |
16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | 16 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ |
17 | 17 | ||
18 | #include "imap4d.h" | 18 | #include "imap4d.h" |
19 | 19 | ||
... | @@ -29,12 +29,19 @@ imap4d_capability (struct imap4d_command *command, char *arg) | ... | @@ -29,12 +29,19 @@ imap4d_capability (struct imap4d_command *command, char *arg) |
29 | { | 29 | { |
30 | int i; | 30 | int i; |
31 | 31 | ||
32 | (void)arg; | 32 | (void) arg; |
33 | util_send ("* CAPABILITY"); | 33 | util_send ("* CAPABILITY"); |
34 | |||
34 | for (i = 0; capa[i]; i++) | 35 | for (i = 0; capa[i]; i++) |
35 | util_send(" %s", capa[i]); | 36 | util_send (" %s", capa[i]); |
37 | |||
38 | #ifdef WITH_TLS | ||
39 | if (tls_available) | ||
40 | util_send (" STARTTLS"); | ||
41 | #endif /* WITH_TLS */ | ||
42 | |||
36 | imap4d_auth_capability (); | 43 | imap4d_auth_capability (); |
37 | util_send("\r\n"); | 44 | util_send ("\r\n"); |
38 | 45 | ||
39 | return util_finish (command, RESP_OK, "Completed"); | 46 | return util_finish (command, RESP_OK, "Completed"); |
40 | } | 47 | } | ... | ... |
1 | /* GNU Mailutils -- a suite of utilities for electronic mail | 1 | /* GNU Mailutils -- a suite of utilities for electronic mail |
2 | Copyright (C) 1999, 2001 Free Software Foundation, Inc. | 2 | Copyright (C) 1999, 2001, 2003 Free Software Foundation, Inc. |
3 | 3 | ||
4 | GNU Mailutils is free software; you can redistribute it and/or modify | 4 | GNU Mailutils is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
... | @@ -13,7 +13,7 @@ | ... | @@ -13,7 +13,7 @@ |
13 | 13 | ||
14 | You should have received a copy of the GNU General Public License | 14 | You should have received a copy of the GNU General Public License |
15 | along with GNU Mailutils; if not, write to the Free Software | 15 | along with GNU Mailutils; if not, write to the Free Software |
16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | 16 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ |
17 | 17 | ||
18 | #include "imap4d.h" | 18 | #include "imap4d.h" |
19 | 19 | ||
... | @@ -45,5 +45,8 @@ struct imap4d_command imap4d_command_table [] = | ... | @@ -45,5 +45,8 @@ struct imap4d_command imap4d_command_table [] = |
45 | { "UID", imap4d_uid, STATE_SEL, STATE_NONE, STATE_NONE, NULL }, | 45 | { "UID", imap4d_uid, STATE_SEL, STATE_NONE, STATE_NONE, NULL }, |
46 | { "NAMESPACE", imap4d_namespace, STATE_AUTH | STATE_SEL, STATE_NONE, STATE_NONE, NULL }, | 46 | { "NAMESPACE", imap4d_namespace, STATE_AUTH | STATE_SEL, STATE_NONE, STATE_NONE, NULL }, |
47 | { "X-VERSION", imap4d_version, STATE_AUTH | STATE_SEL, STATE_NONE, STATE_NONE, NULL }, | 47 | { "X-VERSION", imap4d_version, STATE_AUTH | STATE_SEL, STATE_NONE, STATE_NONE, NULL }, |
48 | #ifdef WITH_TLS | ||
49 | { "STARTTLS", imap4d_starttls, STATE_NONAUTH, STATE_NONE, STATE_NONE, NULL }, | ||
50 | #endif /* WITH_TLS */ | ||
48 | { NULL, 0, 0, 0, 0, NULL } | 51 | { NULL, 0, 0, 0, 0, NULL } |
49 | }; | 52 | }; | ... | ... |
1 | /* GNU Mailutils -- a suite of utilities for electronic mail | 1 | /* GNU Mailutils -- a suite of utilities for electronic mail |
2 | Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc. | 2 | Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc. |
3 | 3 | ||
4 | GNU Mailutils is free software; you can redistribute it and/or modify | 4 | GNU Mailutils is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
... | @@ -13,12 +13,10 @@ | ... | @@ -13,12 +13,10 @@ |
13 | 13 | ||
14 | You should have received a copy of the GNU General Public License | 14 | You should have received a copy of the GNU General Public License |
15 | along with GNU Mailutils; if not, write to the Free Software | 15 | along with GNU Mailutils; if not, write to the Free Software |
16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | 16 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ |
17 | 17 | ||
18 | #include "imap4d.h" | 18 | #include "imap4d.h" |
19 | 19 | ||
20 | FILE *ifile; | ||
21 | FILE *ofile; | ||
22 | mailbox_t mbox; | 20 | mailbox_t mbox; |
23 | char *homedir; | 21 | char *homedir; |
24 | int state = STATE_NONAUTH; | 22 | int state = STATE_NONAUTH; |
... | @@ -33,22 +31,27 @@ struct daemon_param daemon_param = { | ... | @@ -33,22 +31,27 @@ struct daemon_param daemon_param = { |
33 | 0 /* No transcript by default */ | 31 | 0 /* No transcript by default */ |
34 | }; | 32 | }; |
35 | 33 | ||
34 | #ifdef WITH_TLS | ||
35 | int tls_available; | ||
36 | int tls_done; | ||
37 | #endif /* WITH_TLS */ | ||
38 | |||
36 | /* Number of child processes. */ | 39 | /* Number of child processes. */ |
37 | volatile size_t children; | 40 | volatile size_t children; |
38 | 41 | ||
39 | const char *argp_program_version = "imap4d (" PACKAGE_STRING ")"; | 42 | const char *argp_program_version = "imap4d (" PACKAGE_STRING ")"; |
40 | static char doc[] = N_("GNU imap4d -- the IMAP4D daemon"); | 43 | static char doc[] = N_("GNU imap4d -- the IMAP4D daemon"); |
41 | 44 | ||
42 | static struct argp_option options[] = | 45 | static struct argp_option options[] = { |
43 | { | ||
44 | {"other-namespace", 'O', N_("PATHLIST"), 0, | 46 | {"other-namespace", 'O', N_("PATHLIST"), 0, |
45 | N_("set the `other' namespace"), 0}, | 47 | N_("set the `other' namespace"), 0}, |
46 | {"shared-namespace", 'S', N_("PATHLIST"), 0, | 48 | {"shared-namespace", 'S', N_("PATHLIST"), 0, |
47 | N_("set the `shared' namespace"), 0}, | 49 | N_("set the `shared' namespace"), 0}, |
48 | { NULL, 0, NULL, 0, NULL, 0 } | 50 | {NULL, 0, NULL, 0, NULL, 0} |
49 | }; | 51 | }; |
50 | 52 | ||
51 | static error_t imap4d_parse_opt (int key, char *arg, struct argp_state *state); | 53 | static error_t imap4d_parse_opt (int key, char *arg, |
54 | struct argp_state *state); | ||
52 | 55 | ||
53 | static struct argp argp = { | 56 | static struct argp argp = { |
54 | options, | 57 | options, |
... | @@ -62,6 +65,9 @@ static struct argp argp = { | ... | @@ -62,6 +65,9 @@ static struct argp argp = { |
62 | static const char *imap4d_capa[] = { | 65 | static const char *imap4d_capa[] = { |
63 | "daemon", | 66 | "daemon", |
64 | "auth", | 67 | "auth", |
68 | #ifdef WITH_TLS | ||
69 | "tls", | ||
70 | #endif /* WITH_TLS */ | ||
65 | "common", | 71 | "common", |
66 | "mailbox", | 72 | "mailbox", |
67 | "logging", | 73 | "logging", |
... | @@ -108,7 +114,10 @@ main (int argc, char **argv) | ... | @@ -108,7 +114,10 @@ main (int argc, char **argv) |
108 | 114 | ||
109 | state = STATE_NONAUTH; /* Starting state in non-auth. */ | 115 | state = STATE_NONAUTH; /* Starting state in non-auth. */ |
110 | 116 | ||
111 | MU_AUTH_REGISTER_ALL_MODULES(); | 117 | MU_AUTH_REGISTER_ALL_MODULES (); |
118 | #ifdef WITH_TLS | ||
119 | mu_tls_init_argp (); | ||
120 | #endif /* WITH_TLS */ | ||
112 | mu_argp_parse (&argp, &argc, &argv, 0, imap4d_capa, NULL, &daemon_param); | 121 | mu_argp_parse (&argp, &argc, &argv, 0, imap4d_capa, NULL, &daemon_param); |
113 | 122 | ||
114 | #ifdef USE_LIBPAM | 123 | #ifdef USE_LIBPAM |
... | @@ -177,6 +186,13 @@ main (int argc, char **argv) | ... | @@ -177,6 +186,13 @@ main (int argc, char **argv) |
177 | 186 | ||
178 | umask (S_IROTH | S_IWOTH | S_IXOTH); /* 007 */ | 187 | umask (S_IROTH | S_IWOTH | S_IXOTH); /* 007 */ |
179 | 188 | ||
189 | /* Check TLS environment, i.e. cert and key files */ | ||
190 | #ifdef WITH_TLS | ||
191 | tls_available = mu_check_tls_environment (); | ||
192 | if (tls_available) | ||
193 | tls_available = mu_init_tls_libs (); | ||
194 | #endif /* WITH_TLS */ | ||
195 | |||
180 | /* Actually run the daemon. */ | 196 | /* Actually run the daemon. */ |
181 | if (daemon_param.mode == MODE_DAEMON) | 197 | if (daemon_param.mode == MODE_DAEMON) |
182 | imap4d_daemon (daemon_param.maxchildren, daemon_param.port); | 198 | imap4d_daemon (daemon_param.maxchildren, daemon_param.port); |
... | @@ -200,12 +216,7 @@ imap4d_mainloop (int infile, int outfile) | ... | @@ -200,12 +216,7 @@ imap4d_mainloop (int infile, int outfile) |
200 | /* Timeout alarm. */ | 216 | /* Timeout alarm. */ |
201 | signal (SIGALRM, imap4d_signal); | 217 | signal (SIGALRM, imap4d_signal); |
202 | 218 | ||
203 | ifile = fdopen (infile, "r"); | 219 | util_setio (infile, outfile); |
204 | ofile = fdopen (outfile, "w"); | ||
205 | if (!ofile || !ifile) | ||
206 | imap4d_bye (ERR_NO_OFILE); | ||
207 | |||
208 | setvbuf(ofile, NULL, _IOLBF, 0); | ||
209 | 220 | ||
210 | /* log information on the connecting client */ | 221 | /* log information on the connecting client */ |
211 | if (!debug_mode) | 222 | if (!debug_mode) |
... | @@ -214,11 +225,11 @@ imap4d_mainloop (int infile, int outfile) | ... | @@ -214,11 +225,11 @@ imap4d_mainloop (int infile, int outfile) |
214 | int len = sizeof cs; | 225 | int len = sizeof cs; |
215 | 226 | ||
216 | syslog (LOG_INFO, _("Incoming connection opened")); | 227 | syslog (LOG_INFO, _("Incoming connection opened")); |
217 | if (getpeername (infile, (struct sockaddr*)&cs, &len) < 0) | 228 | if (getpeername (infile, (struct sockaddr *) &cs, &len) < 0) |
218 | syslog (LOG_ERR, _("can't obtain IP address of client: %s"), | 229 | syslog (LOG_ERR, _("can't obtain IP address of client: %s"), |
219 | strerror (errno)); | 230 | strerror (errno)); |
220 | else | 231 | else |
221 | syslog (LOG_INFO, _("connect from %s"), inet_ntoa(cs.sin_addr)); | 232 | syslog (LOG_INFO, _("connect from %s"), inet_ntoa (cs.sin_addr)); |
222 | text = "IMAP4rev1"; | 233 | text = "IMAP4rev1"; |
223 | } | 234 | } |
224 | else | 235 | else |
... | @@ -229,20 +240,19 @@ imap4d_mainloop (int infile, int outfile) | ... | @@ -229,20 +240,19 @@ imap4d_mainloop (int infile, int outfile) |
229 | 240 | ||
230 | /* Greetings. */ | 241 | /* Greetings. */ |
231 | util_out (RESP_OK, text); | 242 | util_out (RESP_OK, text); |
232 | fflush (ofile); | 243 | util_flush_output (); |
233 | 244 | ||
234 | while (1) | 245 | while (1) |
235 | { | 246 | { |
236 | char *cmd = imap4d_readline (ifile); | 247 | char *cmd = imap4d_readline (); |
237 | /* check for updates */ | 248 | /* check for updates */ |
238 | imap4d_sync (); | 249 | imap4d_sync (); |
239 | util_do_command (cmd); | 250 | util_do_command (cmd); |
240 | imap4d_sync (); | 251 | imap4d_sync (); |
241 | free (cmd); | 252 | free (cmd); |
242 | fflush (ofile); | 253 | util_flush_output (); |
243 | } | 254 | } |
244 | 255 | ||
245 | closelog (); | ||
246 | return EXIT_SUCCESS; | 256 | return EXIT_SUCCESS; |
247 | } | 257 | } |
248 | 258 | ||
... | @@ -256,7 +266,7 @@ imap4d_daemon_init (void) | ... | @@ -256,7 +266,7 @@ imap4d_daemon_init (void) |
256 | first three one, in, out, err */ | 266 | first three one, in, out, err */ |
257 | if (daemon (0, 0) < 0) | 267 | if (daemon (0, 0) < 0) |
258 | { | 268 | { |
259 | perror(_("fork failed:")); | 269 | perror (_("fork failed:")); |
260 | exit (1); | 270 | exit (1); |
261 | } | 271 | } |
262 | 272 | ||
... | @@ -289,18 +299,18 @@ imap4d_daemon (unsigned int maxchildren, unsigned int port) | ... | @@ -289,18 +299,18 @@ imap4d_daemon (unsigned int maxchildren, unsigned int port) |
289 | listenfd = socket (AF_INET, SOCK_STREAM, 0); | 299 | listenfd = socket (AF_INET, SOCK_STREAM, 0); |
290 | if (listenfd == -1) | 300 | if (listenfd == -1) |
291 | { | 301 | { |
292 | syslog (LOG_ERR, "socket: %s", strerror(errno)); | 302 | syslog (LOG_ERR, "socket: %s", strerror (errno)); |
293 | exit (1); | 303 | exit (1); |
294 | } | 304 | } |
295 | size = 1; /* Use size here to avoid making a new variable. */ | 305 | size = 1; /* Use size here to avoid making a new variable. */ |
296 | setsockopt (listenfd, SOL_SOCKET, SO_REUSEADDR, &size, sizeof(size)); | 306 | setsockopt (listenfd, SOL_SOCKET, SO_REUSEADDR, &size, sizeof (size)); |
297 | size = sizeof (server); | 307 | size = sizeof (server); |
298 | memset (&server, 0, size); | 308 | memset (&server, 0, size); |
299 | server.sin_family = AF_INET; | 309 | server.sin_family = AF_INET; |
300 | server.sin_addr.s_addr = htonl (INADDR_ANY); | 310 | server.sin_addr.s_addr = htonl (INADDR_ANY); |
301 | server.sin_port = htons (port); | 311 | server.sin_port = htons (port); |
302 | 312 | ||
303 | if (bind (listenfd, (struct sockaddr *)&server, size) == -1) | 313 | if (bind (listenfd, (struct sockaddr *) &server, size) == -1) |
304 | { | 314 | { |
305 | syslog (LOG_ERR, "bind: %s", strerror (errno)); | 315 | syslog (LOG_ERR, "bind: %s", strerror (errno)); |
306 | exit (1); | 316 | exit (1); |
... | @@ -321,8 +331,8 @@ imap4d_daemon (unsigned int maxchildren, unsigned int port) | ... | @@ -321,8 +331,8 @@ imap4d_daemon (unsigned int maxchildren, unsigned int port) |
321 | pause (); | 331 | pause (); |
322 | continue; | 332 | continue; |
323 | } | 333 | } |
324 | connfd = accept (listenfd, (struct sockaddr *)&client, | 334 | connfd = accept (listenfd, (struct sockaddr *) &client, |
325 | (socklen_t*) &size); | 335 | (socklen_t *) & size); |
326 | if (connfd == -1) | 336 | if (connfd == -1) |
327 | { | 337 | { |
328 | if (errno == EINTR) | 338 | if (errno == EINTR) |
... | @@ -333,7 +343,7 @@ imap4d_daemon (unsigned int maxchildren, unsigned int port) | ... | @@ -333,7 +343,7 @@ imap4d_daemon (unsigned int maxchildren, unsigned int port) |
333 | 343 | ||
334 | pid = fork (); | 344 | pid = fork (); |
335 | if (pid == -1) | 345 | if (pid == -1) |
336 | syslog(LOG_ERR, "fork: %s", strerror (errno)); | 346 | syslog (LOG_ERR, "fork: %s", strerror (errno)); |
337 | else if (pid == 0) /* Child. */ | 347 | else if (pid == 0) /* Child. */ |
338 | { | 348 | { |
339 | int status; | 349 | int status; |
... | @@ -349,4 +359,3 @@ imap4d_daemon (unsigned int maxchildren, unsigned int port) | ... | @@ -349,4 +359,3 @@ imap4d_daemon (unsigned int maxchildren, unsigned int port) |
349 | close (connfd); | 359 | close (connfd); |
350 | } | 360 | } |
351 | } | 361 | } |
352 | ... | ... |
1 | /* GNU Mailutils -- a suite of utilities for electronic mail | 1 | /* GNU Mailutils -- a suite of utilities for electronic mail |
2 | Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc. | 2 | Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc. |
3 | 3 | ||
4 | GNU Mailutils is free software; you can redistribute it and/or modify | 4 | GNU Mailutils is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 5 | it under the terms of the GNU General Public License as published by |
... | @@ -13,7 +13,7 @@ | ... | @@ -13,7 +13,7 @@ |
13 | 13 | ||
14 | You should have received a copy of the GNU General Public License | 14 | You should have received a copy of the GNU General Public License |
15 | along with GNU Mailutils; if not, write to the Free Software | 15 | along with GNU Mailutils; if not, write to the Free Software |
16 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | 16 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ |
17 | 17 | ||
18 | #ifndef _IMAP4D_H | 18 | #ifndef _IMAP4D_H |
19 | #define _IMAP4D_H 1 | 19 | #define _IMAP4D_H 1 |
... | @@ -87,6 +87,7 @@ | ... | @@ -87,6 +87,7 @@ |
87 | #include <mailutils/stream.h> | 87 | #include <mailutils/stream.h> |
88 | #include <mailutils/mu_auth.h> | 88 | #include <mailutils/mu_auth.h> |
89 | #include <mailutils/url.h> | 89 | #include <mailutils/url.h> |
90 | #include <mailutils/tls.h> | ||
90 | #include <mailutils/nls.h> | 91 | #include <mailutils/nls.h> |
91 | 92 | ||
92 | #ifdef __cplusplus | 93 | #ifdef __cplusplus |
... | @@ -126,6 +127,7 @@ struct imap4d_command | ... | @@ -126,6 +127,7 @@ struct imap4d_command |
126 | #define ERR_NO_OFILE 2 | 127 | #define ERR_NO_OFILE 2 |
127 | #define ERR_TIMEOUT 3 | 128 | #define ERR_TIMEOUT 3 |
128 | #define ERR_SIGNAL 4 | 129 | #define ERR_SIGNAL 4 |
130 | #define ERR_TLS 5 | ||
129 | 131 | ||
130 | /* Namespace numbers */ | 132 | /* Namespace numbers */ |
131 | #define NS_PRIVATE 0 | 133 | #define NS_PRIVATE 0 |
... | @@ -139,8 +141,6 @@ struct imap4d_command | ... | @@ -139,8 +141,6 @@ struct imap4d_command |
139 | #define WCARD_RECURSE_MATCH 2 | 141 | #define WCARD_RECURSE_MATCH 2 |
140 | 142 | ||
141 | extern struct imap4d_command imap4d_command_table[]; | 143 | extern struct imap4d_command imap4d_command_table[]; |
142 | extern FILE *ifile; | ||
143 | extern FILE *ofile; | ||
144 | extern mailbox_t mbox; | 144 | extern mailbox_t mbox; |
145 | extern char *homedir; | 145 | extern char *homedir; |
146 | extern char *rootdir; | 146 | extern char *rootdir; |
... | @@ -150,6 +150,11 @@ extern int is_virtual; | ... | @@ -150,6 +150,11 @@ extern int is_virtual; |
150 | extern struct daemon_param daemon_param; | 150 | extern struct daemon_param daemon_param; |
151 | extern struct mu_auth_data *auth_data; | 151 | extern struct mu_auth_data *auth_data; |
152 | 152 | ||
153 | #ifdef WITH_TLS | ||
154 | extern int tls_available; | ||
155 | extern int tls_done; | ||
156 | #endif /* WITH_TLS */ | ||
157 | |||
153 | #ifndef HAVE_STRTOK_R | 158 | #ifndef HAVE_STRTOK_R |
154 | extern char *strtok_r __P((char *s, const char *delim, char **save_ptr)); | 159 | extern char *strtok_r __P((char *s, const char *delim, char **save_ptr)); |
155 | #endif | 160 | #endif |
... | @@ -181,6 +186,9 @@ extern int imap4d_search0 __P((char *arg, int isuid, char *replybuf, size_t rep | ... | @@ -181,6 +186,9 @@ extern int imap4d_search0 __P((char *arg, int isuid, char *replybuf, size_t rep |
181 | extern int imap4d_select __P ((struct imap4d_command *, char *)); | 186 | extern int imap4d_select __P ((struct imap4d_command *, char *)); |
182 | extern int imap4d_select0 __P ((struct imap4d_command *, char *, int)); | 187 | extern int imap4d_select0 __P ((struct imap4d_command *, char *, int)); |
183 | extern int imap4d_select_status __P((void)); | 188 | extern int imap4d_select_status __P((void)); |
189 | #ifdef WITH_TLS | ||
190 | extern int imap4d_starttls __P ((struct imap4d_command *, char *)); | ||
191 | #endif /* WITH_TLS */ | ||
184 | extern int imap4d_status __P ((struct imap4d_command *, char *)); | 192 | extern int imap4d_status __P ((struct imap4d_command *, char *)); |
185 | extern int imap4d_store __P ((struct imap4d_command *, char *)); | 193 | extern int imap4d_store __P ((struct imap4d_command *, char *)); |
186 | extern int imap4d_store0 __P ((char *, int, char *, size_t)); | 194 | extern int imap4d_store0 __P ((char *, int, char *, size_t)); |
... | @@ -220,8 +228,8 @@ extern int util_start __P ((char *)); | ... | @@ -220,8 +228,8 @@ extern int util_start __P ((char *)); |
220 | extern int util_finish __P ((struct imap4d_command *, int, const char *, ...)); | 228 | extern int util_finish __P ((struct imap4d_command *, int, const char *, ...)); |
221 | extern int util_getstate __P ((void)); | 229 | extern int util_getstate __P ((void)); |
222 | extern int util_do_command __P ((char *)); | 230 | extern int util_do_command __P ((char *)); |
223 | extern char *imap4d_readline __P ((FILE*)); | 231 | extern char *imap4d_readline __P ((void)); |
224 | extern char *imap4d_readline_ex __P ((FILE*)); | 232 | extern char *imap4d_readline_ex __P ((void)); |
225 | extern char *util_getword __P ((char *, char **)); | 233 | extern char *util_getword __P ((char *, char **)); |
226 | extern char *util_getitem __P ((char *, const char *, char **)); | 234 | extern char *util_getitem __P ((char *, const char *, char **)); |
227 | extern int util_token __P ((char *, size_t, char **)); | 235 | extern int util_token __P ((char *, size_t, char **)); |
... | @@ -257,6 +265,14 @@ int util_type_to_attribute __P((int type, char **attr_str)); | ... | @@ -257,6 +265,14 @@ int util_type_to_attribute __P((int type, char **attr_str)); |
257 | int util_attribute_matches_flag __P((attribute_t attr, const char *item)); | 265 | int util_attribute_matches_flag __P((attribute_t attr, const char *item)); |
258 | int util_uidvalidity __P((mailbox_t smbox, unsigned long *uidvp)); | 266 | int util_uidvalidity __P((mailbox_t smbox, unsigned long *uidvp)); |
259 | 267 | ||
268 | void util_setio __P((int, int)); | ||
269 | void util_flush_output __P((void)); | ||
270 | FILE *util_is_ofile __P((void)); | ||
271 | #ifdef WITH_TLS | ||
272 | int imap4d_init_tls_server __P((void)); | ||
273 | void imap4d_deinit_tls_server __P((void)); | ||
274 | #endif /* WITH_TLS */ | ||
275 | |||
260 | #ifdef __cplusplus | 276 | #ifdef __cplusplus |
261 | } | 277 | } |
262 | #endif | 278 | #endif | ... | ... |
... | @@ -41,7 +41,7 @@ imap4d_signal (int signo) | ... | @@ -41,7 +41,7 @@ imap4d_signal (int signo) |
41 | { | 41 | { |
42 | syslog (LOG_CRIT, _("got signal %s"), strsignal (signo)); | 42 | syslog (LOG_CRIT, _("got signal %s"), strsignal (signo)); |
43 | /* Master process. */ | 43 | /* Master process. */ |
44 | if (!ofile) | 44 | if (!(util_is_ofile())) |
45 | { | 45 | { |
46 | syslog (LOG_CRIT, _("MASTER: exiting on signal")); | 46 | syslog (LOG_CRIT, _("MASTER: exiting on signal")); |
47 | exit (1); /* abort(); */ | 47 | exit (1); /* abort(); */ | ... | ... |
imap4d/starttls.c
0 → 100644
1 | /* GNU Mailutils -- a suite of utilities for electronic mail | ||
2 | Copyright (C) 2003 Free Software Foundation, Inc. | ||
3 | |||
4 | GNU Mailutils is free software; you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Public License as published by | ||
6 | the Free Software Foundation; either version 2, or (at your option) | ||
7 | any later version. | ||
8 | |||
9 | GNU Mailutils is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with GNU Mailutils; if not, write to the Free Software | ||
16 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ | ||
17 | |||
18 | #include "imap4d.h" | ||
19 | |||
20 | #ifdef WITH_TLS | ||
21 | |||
22 | int | ||
23 | imap4d_starttls (struct imap4d_command *command, char *arg) | ||
24 | { | ||
25 | int status; | ||
26 | char *sp = NULL; | ||
27 | |||
28 | if (!tls_available || tls_done) | ||
29 | return util_finish (command, RESP_BAD, "Invalid command"); | ||
30 | |||
31 | if (util_getword (arg, &sp)) | ||
32 | return util_finish (command, RESP_BAD, "Too many args"); | ||
33 | |||
34 | status = util_finish (command, RESP_OK, "Begin TLS negotiation"); | ||
35 | tls_done = imap4d_init_tls_server (); | ||
36 | |||
37 | return status; | ||
38 | } | ||
39 | |||
40 | #endif /* WITH_TLS */ | ||
41 | |||
42 | /* EOF */ |
This diff is collapsed.
Click to expand it.
-
Please register or sign in to post a comment