annotate src/smtp_in.c @ 209:10da50168dab

replaced the MD5 implementation with the one of Solar Designer Until now, the sample code of RFC 1321 was used. It had an ugly license. Now we use the implementation of Solar Designer, which is in the Public Domain. http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
author meillo@marmaro.de
date Sun, 18 Jul 2010 21:58:15 +0200
parents 3708b655a371
children 794071925a22
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
1 /* MasqMail
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
2 Copyright (C) 1999-2001 Oliver Kurth
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
3 Copyright (C) 2010 markus schnalke <meillo@marmaro.de>
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
4
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
5 This program is free software; you can redistribute it and/or modify
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
7 the Free Software Foundation; either version 2 of the License, or
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
8 (at your option) any later version.
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
9
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
13 GNU General Public License for more details.
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
14
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
16 along with this program; if not, write to the Free Software
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
18 */
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
19
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
20 #include "masqmail.h"
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
21 #include "readsock.h"
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
22
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
23 /*
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
24 I always forget these rfc numbers:
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
25 RFC 821 (SMTP)
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
26 RFC 1869 (ESMTP)
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
27 RFC 1870 (ESMTP SIZE)
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
28 RFC 2197 (ESMTP PIPELINE)
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
29 RFC 2554 (ESMTP AUTH)
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
30 */
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
31
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
32
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
33 smtp_cmd smtp_cmds[] = {
15
f671821d8222 code beautifying; 0 -> \0 if appropriate
meillo@marmaro.de
parents: 10
diff changeset
34 {SMTP_HELO, "HELO",},
f671821d8222 code beautifying; 0 -> \0 if appropriate
meillo@marmaro.de
parents: 10
diff changeset
35 {SMTP_EHLO, "EHLO",},
f671821d8222 code beautifying; 0 -> \0 if appropriate
meillo@marmaro.de
parents: 10
diff changeset
36 {SMTP_MAIL_FROM, "MAIL FROM:",},
f671821d8222 code beautifying; 0 -> \0 if appropriate
meillo@marmaro.de
parents: 10
diff changeset
37 {SMTP_RCPT_TO, "RCPT TO:",},
f671821d8222 code beautifying; 0 -> \0 if appropriate
meillo@marmaro.de
parents: 10
diff changeset
38 {SMTP_DATA, "DATA",},
f671821d8222 code beautifying; 0 -> \0 if appropriate
meillo@marmaro.de
parents: 10
diff changeset
39 {SMTP_QUIT, "QUIT",},
f671821d8222 code beautifying; 0 -> \0 if appropriate
meillo@marmaro.de
parents: 10
diff changeset
40 {SMTP_RSET, "RSET",},
f671821d8222 code beautifying; 0 -> \0 if appropriate
meillo@marmaro.de
parents: 10
diff changeset
41 {SMTP_NOOP, "NOOP",},
f671821d8222 code beautifying; 0 -> \0 if appropriate
meillo@marmaro.de
parents: 10
diff changeset
42 {SMTP_HELP, "HELP"},
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
43 };
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
44
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
45 static smtp_cmd_id
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
46 get_id(const gchar * line)
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
47 {
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
48 gint i;
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
49 for (i = 0; i < SMTP_NUM_IDS; i++) {
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
50 if (strncasecmp(smtp_cmds[i].cmd, line, strlen(smtp_cmds[i].cmd)) == 0) {
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
51 return (smtp_cmd_id) i;
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
52 }
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
53 }
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
54 return SMTP_ERROR;
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
55 }
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
56
117
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
57 static gboolean
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
58 get_size(gchar *line, unsigned long *msize) {
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
59 gchar *s = NULL;
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
60
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
61 /* hope we need not to handle cases like SiZe= ...*/
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
62 s = strstr(line, "SIZE=");
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
63 if (!s) {
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
64 /* try it in lowercase too */
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
65 if (!(s = strstr(line, "size="))) {
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
66 return FALSE;
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
67 }
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
68 }
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
69 s += 5;
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
70 *msize = atol(s);
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
71 DEBUG(5) debugf("get_size(): line=%s, msize=%ld\n", line, *msize);
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
72
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
73 return TRUE;
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
74 }
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
75
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
76
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
77 /* this is a quick hack: we expect the address to be syntactically correct
117
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
78 and containing the mailbox only, though we first check for size in
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
79 smtp_in().
136
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
80 Return false if address is too long.
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
81 */
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
82 static gboolean
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
83 get_address(gchar * line, gchar * addr)
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
84 {
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
85 gchar *p = line;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
86 gchar *q = addr;
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
87
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
88 /* skip MAIL FROM: and RCPT TO: */
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
89 while (*p && (*p != ':')) {
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
90 p++;
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
91 }
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
92 p++;
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
93
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
94 /* skip spaces: */
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
95 while (*p && isspace(*p)) {
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
96 p++;
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
97 }
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
98
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
99 /* get address: */
136
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
100 while (*p && !isspace(*p)) {
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
101 if (q >= addr + MAX_ADDRESS-1) {
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
102 *q = '\0';
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
103 return FALSE;
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
104 }
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
105 *(q++) = *(p++);
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
106 }
136
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
107 *q = '\0';
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
108
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
109 return TRUE;
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
110 }
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
111
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
112 static smtp_connection*
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
113 create_base(gchar * remote_host)
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
114 {
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
115 smtp_connection *base = g_malloc(sizeof(smtp_connection));
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
116 if (!base) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
117 return NULL;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
118 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
119
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
120 base->remote_host = g_strdup(remote_host);
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
121
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
122 base->prot = PROT_SMTP;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
123 base->next_id = 0;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
124 base->helo_seen = 0;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
125 base->from_seen = 0;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
126 base->rcpt_seen = 0;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
127 base->msg = NULL;
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
128
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
129 return base;
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
130 }
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
131
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
132 static void
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
133 smtp_printf(FILE * out, gchar * fmt, ...)
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
134 {
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
135 va_list args;
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
136 va_start(args, fmt);
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
137
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
138 DEBUG(4) {
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
139 gchar buf[256];
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
140 va_list args_copy;
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
141
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
142 va_copy(args_copy, args);
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
143 vsnprintf(buf, 255, fmt, args_copy);
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
144 va_end(args_copy);
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
145
208
3708b655a371 added newlines to the end of log and debug messages where missing
meillo@marmaro.de
parents: 204
diff changeset
146 debugf(">>>%s\n", buf);
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
147 }
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
148
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
149 vfprintf(out, fmt, args);
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
150 fflush(out);
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
151
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
152 va_end(args);
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
153 }
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
154
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
155 void
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
156 smtp_in(FILE * in, FILE * out, gchar * remote_host, gchar * ident)
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
157 {
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
158 gchar *buffer;
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
159 smtp_cmd_id cmd_id;
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
160 message *msg = NULL;
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
161 smtp_connection *psc;
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
162 int len;
117
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
163 unsigned long size, msize;
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
164
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
165 DEBUG(5) debugf("smtp_in entered, remote_host = %s\n", remote_host);
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
166
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
167 psc = create_base(remote_host);
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
168 psc->msg = msg;
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
169
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
170 buffer = (gchar *) g_malloc(BUF_LEN);
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
171 if (!buffer) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
172 /* this check is actually unneccessary as g_malloc()
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
173 aborts on failure */
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
174 return;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
175 }
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
176
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
177 /* send greeting string, containing ESMTP: */
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
178 smtp_printf(out, "220 %s MasqMail %s ESMTP\r\n", conf.host_name, VERSION);
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
179
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
180 while ((len = read_sockline(in, buffer, BUF_LEN, 5 * 60, READSOCKL_CHUG)) >= 0) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
181 cmd_id = get_id(buffer);
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
182
135
b072426cc6bb fixed defer_all code
meillo@marmaro.de
parents: 128
diff changeset
183 if (conf.defer_all) {
b072426cc6bb fixed defer_all code
meillo@marmaro.de
parents: 128
diff changeset
184 /* I need this to debug delivery failures */
127
05fe7500149d refactored SMTP_HELO and SMTP_EHLO cases
meillo@marmaro.de
parents: 121
diff changeset
185 smtp_printf(out, "421 %s service temporarily unavailable.\r\n", conf.host_name);
135
b072426cc6bb fixed defer_all code
meillo@marmaro.de
parents: 128
diff changeset
186 destroy_message(msg);
b072426cc6bb fixed defer_all code
meillo@marmaro.de
parents: 128
diff changeset
187 msg = NULL;
b072426cc6bb fixed defer_all code
meillo@marmaro.de
parents: 128
diff changeset
188 return;
127
05fe7500149d refactored SMTP_HELO and SMTP_EHLO cases
meillo@marmaro.de
parents: 121
diff changeset
189 }
05fe7500149d refactored SMTP_HELO and SMTP_EHLO cases
meillo@marmaro.de
parents: 121
diff changeset
190
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
191 switch (cmd_id) {
127
05fe7500149d refactored SMTP_HELO and SMTP_EHLO cases
meillo@marmaro.de
parents: 121
diff changeset
192 case SMTP_HELO:
05fe7500149d refactored SMTP_HELO and SMTP_EHLO cases
meillo@marmaro.de
parents: 121
diff changeset
193 psc->prot = PROT_SMTP;
05fe7500149d refactored SMTP_HELO and SMTP_EHLO cases
meillo@marmaro.de
parents: 121
diff changeset
194 psc->helo_seen = TRUE;
05fe7500149d refactored SMTP_HELO and SMTP_EHLO cases
meillo@marmaro.de
parents: 121
diff changeset
195 smtp_printf(out, "250 %s pretty old mailer, huh?\r\n", conf.host_name);
05fe7500149d refactored SMTP_HELO and SMTP_EHLO cases
meillo@marmaro.de
parents: 121
diff changeset
196 break;
05fe7500149d refactored SMTP_HELO and SMTP_EHLO cases
meillo@marmaro.de
parents: 121
diff changeset
197
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
198 case SMTP_EHLO:
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
199 psc->prot = PROT_ESMTP;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
200 psc->helo_seen = TRUE;
127
05fe7500149d refactored SMTP_HELO and SMTP_EHLO cases
meillo@marmaro.de
parents: 121
diff changeset
201 smtp_printf(out, "250-%s Nice to meet you with ESMTP\r\n", conf.host_name);
05fe7500149d refactored SMTP_HELO and SMTP_EHLO cases
meillo@marmaro.de
parents: 121
diff changeset
202 smtp_printf(out, "250-SIZE %d\r\n", conf.max_msg_size);
05fe7500149d refactored SMTP_HELO and SMTP_EHLO cases
meillo@marmaro.de
parents: 121
diff changeset
203 smtp_printf(out, "250-PIPELINING\r\n");
05fe7500149d refactored SMTP_HELO and SMTP_EHLO cases
meillo@marmaro.de
parents: 121
diff changeset
204 smtp_printf(out, "250 HELP\r\n");
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
205 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
206
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
207 case SMTP_MAIL_FROM:
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
208 {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
209 gchar buf[MAX_ADDRESS];
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
210 address *addr;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
211
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
212 if (!psc->helo_seen) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
213 smtp_printf(out, "503 need HELO or EHLO\r\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
214 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
215 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
216 if (psc->from_seen) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
217 smtp_printf(out, "503 MAIL FROM: already given.\r\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
218 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
219 }
128
f9d5469cb648 moved the SIZE check to a better location
meillo@marmaro.de
parents: 127
diff changeset
220 if (get_size(buffer, &msize)) {
f9d5469cb648 moved the SIZE check to a better location
meillo@marmaro.de
parents: 127
diff changeset
221 DEBUG(5) debugf("smtp_in(): get_size: msize=%ld, conf.mms=%d\n",
f9d5469cb648 moved the SIZE check to a better location
meillo@marmaro.de
parents: 127
diff changeset
222 msize, conf.max_msg_size);
f9d5469cb648 moved the SIZE check to a better location
meillo@marmaro.de
parents: 127
diff changeset
223 if (conf.max_msg_size && (msize > conf.max_msg_size)) {
f9d5469cb648 moved the SIZE check to a better location
meillo@marmaro.de
parents: 127
diff changeset
224 smtp_printf(out, "552 Message size exceeds fixed limit.\r\n");
f9d5469cb648 moved the SIZE check to a better location
meillo@marmaro.de
parents: 127
diff changeset
225 break;
f9d5469cb648 moved the SIZE check to a better location
meillo@marmaro.de
parents: 127
diff changeset
226 }
f9d5469cb648 moved the SIZE check to a better location
meillo@marmaro.de
parents: 127
diff changeset
227 }
136
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
228 if (!get_address(buffer, buf)) {
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
229 smtp_printf(out, "553 Address too long.\r\n");
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
230 break;
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
231 }
128
f9d5469cb648 moved the SIZE check to a better location
meillo@marmaro.de
parents: 127
diff changeset
232
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
233 msg = create_message();
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
234 msg->received_host = remote_host ? g_strdup(remote_host) : NULL;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
235 msg->received_prot = psc->prot;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
236 msg->ident = ident ? g_strdup(ident) : NULL;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
237 /* get transfer id and increment for next one */
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
238 msg->transfer_id = (psc->next_id)++;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
239
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
240 if (remote_host) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
241 addr = create_address(buf, TRUE);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
242 } else {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
243 addr = create_address_qualified(buf, TRUE, conf.host_name);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
244 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
245 if (!addr) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
246 smtp_printf(out, "501 %s: syntax error.\r\n", buf);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
247 } else if (!addr->domain) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
248 smtp_printf(out, "501 return path must be qualified.\r\n", buf);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
249 } else {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
250 psc->from_seen = TRUE;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
251 msg->return_path = addr;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
252 smtp_printf(out, "250 OK %s is a nice guy.\r\n", addr->address);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
253 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
254 }
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
255 break;
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
256
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
257 case SMTP_RCPT_TO:
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
258 {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
259 char buf[MAX_ADDRESS];
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
260 address *addr;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
261
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
262 if (!psc->helo_seen) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
263 smtp_printf(out, "503 need HELO or EHLO.\r\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
264 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
265 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
266 if (!psc->from_seen) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
267 smtp_printf(out, "503 need MAIL FROM: before RCPT TO:\r\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
268 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
269 }
136
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
270 if (!get_address(buffer, buf)) {
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
271 smtp_printf(out, "553 Address too long.\r\n");
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
272 break;
6b78aaced5e1 check max length of addresses in SMTP dialog
meillo@marmaro.de
parents: 135
diff changeset
273 }
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
274
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
275 if (remote_host) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
276 addr = create_address(buf, TRUE);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
277 } else {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
278 addr = create_address_qualified(buf, TRUE, conf.host_name);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
279 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
280 if (!addr) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
281 smtp_printf(out, "501 %s: syntax error in address.\r\n", buf);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
282 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
283 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
284 if (addr->local_part[0] == '|') {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
285 smtp_printf(out, "501 %s: no pipe allowed for SMTP connections\r\n", buf);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
286 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
287 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
288 if (!addr->domain) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
289 smtp_printf(out, "501 recipient address must be qualified.\r\n", buf);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
290 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
291 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
292 gboolean do_relay = conf.do_relay;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
293 if (!do_relay) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
294 do_relay = addr_is_local(msg->return_path);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
295 if (!do_relay) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
296 do_relay = addr_is_local(addr);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
297 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
298 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
299 if (!do_relay) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
300 smtp_printf(out, "550 relaying to %s denied.\r\n", addr_string(addr));
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
301 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
302 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
303 psc->rcpt_seen = TRUE;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
304 msg->rcpt_list = g_list_append(msg->rcpt_list, addr);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
305 smtp_printf(out, "250 OK %s is our friend.\r\n", addr->address);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
306 }
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
307 break;
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
308
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
309 case SMTP_DATA:
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
310 if (!psc->helo_seen) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
311 smtp_printf(out, "503 need HELO or EHLO.\r\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
312 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
313 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
314 if (!psc->rcpt_seen) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
315 smtp_printf(out, "503 need RCPT TO: before DATA\r\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
316 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
317 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
318 accept_error err;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
319
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
320 smtp_printf(out, "354 okay, and do not forget the dot\r\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
321
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
322 err = accept_message(in, msg, conf.do_save_envelope_to ? ACC_SAVE_ENVELOPE_TO : 0);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
323 if (err != AERR_OK) {
117
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
324 switch (err) {
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
325 case AERR_TIMEOUT:
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
326 case AERR_EOF:
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
327 return;
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
328 case AERR_SIZE:
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
329 smtp_printf(out, "552 Error: message too large.\r\n");
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
330 return;
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
331 default:
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
332 /* should never happen: */
5ec5e6637049 added server-side SMTP SIZE support (patch by Paolo)
meillo@marmaro.de
parents: 81
diff changeset
333 smtp_printf(out, "451 Unknown error\r\n");
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
334 return;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
335 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
336 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
337
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
338
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
339 if (!spool_write(msg, TRUE)) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
340 smtp_printf(out, "451 Could not write spool file\r\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
341 return;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
342 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
343 pid_t pid;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
344 smtp_printf(out, "250 OK id=%s\r\n", msg->uid);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
345
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
346 if (remote_host != NULL) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
347 logwrite(LOG_NOTICE, "%s <= <%s@%s> host=%s with %s\n", msg->uid,
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
348 msg->return_path->local_part, msg->return_path->domain,
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
349 remote_host, prot_names[psc->prot]);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
350 } else {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
351 logwrite(LOG_NOTICE, "%s <= <%s@%s> with %s\n", msg->uid,
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
352 msg->return_path->local_part, msg->return_path->domain,
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
353 prot_names[psc->prot]);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
354 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
355
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
356 if (conf.do_queue) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
357 DEBUG(1) debugf("queuing forced by configuration or option.\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
358 } else {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
359 pid = fork();
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
360 if (pid == 0) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
361 _exit(deliver(msg));
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
362 } else if (pid < 0) {
208
3708b655a371 added newlines to the end of log and debug messages where missing
meillo@marmaro.de
parents: 204
diff changeset
363 logwrite(LOG_ALERT, "could not fork for delivery, id = %s\n", msg->uid);
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
364 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
365 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
366 psc->rcpt_seen = psc->from_seen = FALSE;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
367 destroy_message(msg);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
368 msg = NULL;
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
369 break;
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
370
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
371 case SMTP_QUIT:
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
372 smtp_printf(out, "221 goodbye\r\n");
81
71ce3a1568e9 moved check for NULL into destroy_message()
meillo@marmaro.de
parents: 80
diff changeset
373 destroy_message(msg);
71ce3a1568e9 moved check for NULL into destroy_message()
meillo@marmaro.de
parents: 80
diff changeset
374 msg = NULL;
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
375 return;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
376
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
377 case SMTP_RSET:
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
378 psc->from_seen = psc->rcpt_seen = FALSE;
81
71ce3a1568e9 moved check for NULL into destroy_message()
meillo@marmaro.de
parents: 80
diff changeset
379 destroy_message(msg);
71ce3a1568e9 moved check for NULL into destroy_message()
meillo@marmaro.de
parents: 80
diff changeset
380 msg = NULL;
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
381 smtp_printf(out, "250 OK\r\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
382 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
383
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
384 case SMTP_NOOP:
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
385 smtp_printf(out, "250 OK\r\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
386 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
387
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
388 case SMTP_HELP:
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
389 {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
390 int i;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
391
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
392 smtp_printf(out, "214-supported commands:\r\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
393 for (i = 0; i < SMTP_NUM_IDS - 1; i++) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
394 smtp_printf(out, "214-%s\r\n", smtp_cmds[i].cmd);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
395 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
396 smtp_printf(out, "214 %s\r\n", smtp_cmds[i].cmd);
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
397 }
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
398 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
399
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
400 default:
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
401 smtp_printf(out, "501 command not recognized\r\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
402 DEBUG(1) debugf("command not recognized, was '%s'\n", buffer);
10
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
403 break;
26e34ae9a3e3 changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents: 0
diff changeset
404 }
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
405 }
80
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
406 switch (len) {
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
407 case -3:
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
408 logwrite(LOG_NOTICE, "connection timed out\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
409 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
410 case -2:
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
411 logwrite(LOG_NOTICE, "line overflow\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
412 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
413 case -1:
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
414 logwrite(LOG_NOTICE, "received EOF\n");
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
415 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
416 default:
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
417 break;
e5090ac234cf refactoring plus one small bugfix
meillo@marmaro.de
parents: 15
diff changeset
418 }
0
08114f7dcc23 this is masqmail-0.2.21 from oliver kurth
meillo@marmaro.de
parents:
diff changeset
419 }