s/qmail 4.4.13
Next generation secure email transport
Loading...
Searching...
No Matches
received.c
Go to the documentation of this file.
1#include "fmt.h"
2#include "qmail.h"
3#include "now.h"
4#include "datetime.h"
5#include "date822fmt.h"
6#include "received.h"
7#include "str.h"
8#include "stralloc.h"
9#include "byte.h"
10#include "str.h"
11
12static int issafe(char ch)
13{
14 if (ch == ' ') return 1; /* accept empty spaces */
15 if (ch == '.') return 1;
16 if (ch == '@') return 1;
17 if (ch == '%') return 1;
18 if (ch == '+') return 1;
19 if (ch == '/') return 1;
20 if (ch == '=') return 1;
21 if (ch == ':') return 1;
22 if (ch == '-') return 1;
23 if ((ch >= 'a') && (ch <= 'z')) return 1;
24 if ((ch >= 'A') && (ch <= 'Z')) return 1;
25 if ((ch >= '0') && (ch <= '9')) return 1;
26 return 0;
27}
28
29void safeput(struct qmail *qqt,char *s)
30{
31 char ch;
32 while ((ch = *s++)) {
33 if (!issafe(ch)) ch = '?';
34 qmail_put(qqt,&ch,1);
35 }
36}
37
38static char buf[DATE822FMT];
39
40/* "Received: from relay1.uu.net ([E]HELO uunet.uu.net) (user@192.48.96.5)" /or/ */
41/* "Received: from relay1.uu.net ([E]HELO uunet.uu.net) (originator authenticated from 192.48.96.5)" */
42/* " for <smtprecipient>" */
43/* " de/crypted with tls-version: cipher [used/perm] DN=dn" */
44/* " by silverton.berkeley.edu with [UTF8][E]SMTP[SA]; 26 Sep 1995 04:46:54 -0000" */
45/* "X-RBL-Info: http://www.spamhaus.org/query/bl?ip=127.0.0.2 */
46
47void received(struct qmail *qqt,char *protocol,char *local,char *remoteip,char *remotehost,char *remoteinfo,char *helo,char *tlsinfo,char *rblinfo, char *mailto)
48{
49 struct datetime dt;
50 int i;
51
52 qmail_puts(qqt,"Received: from ");
54 if (helo) {
55 qmail_puts(qqt," (HELO ");
56 safeput(qqt,helo);
57 qmail_puts(qqt,")\n");
58 }
59 qmail_puts(qqt," (");
60 if (remoteinfo) {
61 if (*remoteinfo == '@')
62 qmail_puts(qqt,"originator authenticated from ");
63 else {
65 qmail_puts(qqt,"@");
66 }
67 }
69 qmail_puts(qqt,")\n");
70
71 if (mailto) {
72 qmail_puts(qqt," for <");
74 qmail_puts(qqt,">\n");
75 }
76 if (tlsinfo) {
77 qmail_puts(qqt," de/crypted with ");
79 qmail_puts(qqt,"\n");
80 }
81 qmail_puts(qqt," by ");
83 qmail_puts(qqt," with ");
85 qmail_puts(qqt,"; ");
88
89 if (rblinfo) {
90 i = str_chr(rblinfo,']');
91 if (rblinfo[i] == ']') {
92 qmail_puts(qqt,"X-RBL-Info: ");
93 qmail_puts(qqt,rblinfo + i + 2);
94 qmail_puts(qqt,"\n");
95 }
96 }
97}
98
99/* "Received-SPF: pass (Helogreeting: domain of Identity " */
100/* " designates Clientip as permitted sender) receiver=Hostname " */
101/* " client-ip=Clientip; envelope-from=Mailfrom; " */
102
103void spfheader(struct qmail *qqt,char *spfinfo,char *local,char *remoteip,char *helohost,char *mailfrom)
104{
105 char *result = 0;
106 char *identity = 0;
107 char *clientip = 0;
108 char *helo = 0;
109 char *envelopefrom = 0;
110 char *receiver = 0;
111 char *problem = 0;
112 char *mechanism = 0;
113 int i, j = 0;
114 int len;
115
116 len = str_len(spfinfo);
117 if (!len) return;
118
119 for (i = 0; i < len; i++)
120 if (spfinfo[i] == ' ') spfinfo[i] = '\0';
121
122 for (i = 0; i < len; i++) {
123 if (spfinfo[i] == '\0') {
124 switch (spfinfo[i + 1]) {
125 case 'S': clientip = spfinfo + i + 3; break;
126 case 'O': envelopefrom = spfinfo + i + 3; break;
127 case 'C': identity = spfinfo + i + 3; break;
128 case 'H': helo = spfinfo + i + 3; break;
129 case 'T': receiver = spfinfo + i + 3; break;
130 case 'P': problem = spfinfo + i + 3; break;
131 case 'M': if ((j = str_chr(spfinfo + i,'='))) spfinfo[i + j] = '\0';
132 mechanism = spfinfo + i + 1; break;
133 case 'R': result = spfinfo + i + 3; break;
134 default: break;
135 }
136 }
137 }
138
139 if (!result || *result == 0) result = "o";
140 if (!clientip || *clientip == 0) clientip = remoteip;
141 if (!helo || *helo == 0) helo = helohost;
142 if (!envelopefrom || *envelopefrom == 0) envelopefrom = mailfrom;
143 if (!receiver || *receiver == 0) receiver = local;
144 if (!problem || *problem == 0) problem = "unknown";
145 if (!mechanism || *mechanism == 0) mechanism = "unknown";
146 if (!identity || *identity == 0) {
147 j = str_rchr(envelopefrom,'@');
148 if (envelopefrom[j] == '@') identity = envelopefrom + j + 1;
149 else identity = "unknown";
150 }
151
152 qmail_puts(qqt,"Received-SPF: ");
153 switch (*result) {
154 case '+': qmail_puts(qqt," pass ("); safeput(qqt,helo);
155 qmail_puts(qqt,": domain of "); safeput(qqt,identity); qmail_puts(qqt,"\n");
156 qmail_puts(qqt," designates "); safeput(qqt,clientip); qmail_puts(qqt," as permitted sender)\n");
157 qmail_puts(qqt," receiver="); safeput(qqt,receiver);
158 qmail_puts(qqt,"; client-ip="); safeput(qqt,clientip); qmail_puts(qqt,"\n");
159 qmail_puts(qqt," envelope-from="); safeput(qqt,envelopefrom); qmail_puts(qqt,";\n"); break;
160 case '-': qmail_puts(qqt," fail ("); safeput(qqt,helo);
161 qmail_puts(qqt,": domain of "); safeput(qqt,identity); qmail_puts(qqt,"\n");
162 qmail_puts(qqt," does not designate "); safeput(qqt,clientip); qmail_puts(qqt," as permitted sender)\n"); break;
163 case '~': qmail_puts(qqt," softfail ("); safeput(qqt,helo);
164 qmail_puts(qqt,": domain of transitioning "); safeput(qqt,identity); qmail_puts(qqt,"\n");
165 qmail_puts(qqt," does not designate "); safeput(qqt,clientip); qmail_puts(qqt," as permitted sender)\n"); break;
166 case '?': qmail_puts(qqt," neutral ("); safeput(qqt,helo); qmail_puts(qqt,"; client-ip="); safeput(qqt,clientip);
167 qmail_puts(qqt," is neither permitted \n"); qmail_puts(qqt," nor denied by domain of "); safeput(qqt,identity),
168 qmail_puts(qqt,")\n"); break;
169 case 'o': qmail_puts(qqt," none ("); safeput(qqt,helo);
170 qmail_puts(qqt,": domain of "); safeput(qqt,identity); qmail_puts(qqt," does\n");
171 qmail_puts(qqt," not designate permitted sender hosts)\n"); break;
172 case 't': qmail_puts(qqt," temperror ("); safeput(qqt,helo);
173 qmail_puts(qqt,": domain of "); safeput(qqt,identity); qmail_puts(qqt," evaluated\n");
174 qmail_puts(qqt," with error: "); safeput(qqt,problem); qmail_puts(qqt," for mechanism: "); safeput(qqt,mechanism);
175 qmail_puts(qqt,")\n"); break;
176 case 'e': qmail_puts(qqt," permerror ("); safeput(qqt,helo);
177 qmail_puts(qqt,": domain of "); safeput(qqt,identity); qmail_puts(qqt," evaluated\n");
178 qmail_puts(qqt," with error: "); safeput(qqt,problem); qmail_puts(qqt," for mechanism: "); safeput(qqt,mechanism);
179 qmail_puts(qqt,")\n"); break;
180 default: qmail_puts(qqt," unknown (results for "); safeput(qqt,helo);
181 qmail_puts(qqt,": domain of "); safeput(qqt,identity);
182 qmail_puts(qqt," follow an unknown mechanism: "); safeput(qqt,mechanism); qmail_puts(qqt,")\n"); break;
183 }
184}
struct qmail qqt
Definition: condredirect.c:14
unsigned int date822fmt(char *s, struct datetime *dt)
Definition: date822fmt.c:9
#define DATE822FMT
Definition: date822fmt.h:5
void datetime_tai(struct datetime *dt, datetime_sec t)
Definition: datetime.c:4
char buf[100+FMT_ULONG]
Definition: hier.c:11
datetime_sec now()
Definition: now.c:5
char * local
Definition: qmail-getpw.c:18
stralloc protocol
Definition: qmail-popup.c:70
char * remoteip
Definition: qmail-popup.c:73
stralloc tlsinfo
Definition: qmail-qmtpd.c:96
char * remoteinfo
Definition: qmail-qmtpd.c:88
struct datetime dt
Definition: qmail-queue.c:53
char * received
Definition: qmail-queue.c:91
stralloc helohost
Definition: qmail-remote.c:77
int j
Definition: qmail-send.c:926
stralloc mailto
Definition: qmail-smtpd.c:268
stralloc mailfrom
Definition: qmail-smtpd.c:532
stralloc rblinfo
Definition: qmail-smtpd.c:271
void qmail_put(struct qmail *, char *, int)
Definition: qmail.c:63
void qmail_puts(struct qmail *, char *)
Definition: qmail.c:68
int issafe(char)
Definition: qsutil.c:64
void safeput(struct qmail *qqt, char *s)
Definition: received.c:29
void spfheader(struct qmail *qqt, char *spfinfo, char *local, char *remoteip, char *helohost, char *mailfrom)
Definition: received.c:103
stralloc identity
Definition: spf.c:35
stralloc spfinfo
Definition: spf.c:17
Definition: qmail.h:14
stralloc remotehost
Definition: qmail-popup.c:74