s/qmail 4.3.20
Next generation secure email transport
Loading...
Searching...
No Matches
srsreverse.c
Go to the documentation of this file.
1#include <unistd.h>
2#include <sys/types.h>
3#include "control.h"
4#include "sig.h"
5#include "constmap.h"
6#include "readwrite.h"
7#include "exit.h"
8#include "env.h"
9#include "qmail.h"
10#include "auto_qmail.h"
11#include "auto_break.h"
12#include "buffer.h"
13#include "case.h"
14#include "str.h"
15#include "fmt.h"
16#include "stralloc.h"
17#include "logmsg.h"
18#include "srs2.h"
19#include "qmail.h"
20
21#define WHO "srsreverse"
22
23void die_nomem() { logmsg(WHO,111,FATAL,"out of memory"); }
24void die_control() { logmsg(WHO,110,FATAL,"Unable to read control files"); }
25
26struct qmail qqt;
27char *vdomainuser = 0;
28stralloc vdomains = {0};
30char *srsdomaininfo = 0;
31stralloc srsdomains = {0};
33stralloc srserror = {0};
34stralloc srshost = {0};
35
44static int srserror_str(int code) {
45 if (!stralloc_copys(&srserror,"SRS: ")) die_nomem();
46 if (!stralloc_cats(&srserror,srs_strerror(code))) die_nomem();
47 if (!stralloc_0(&srserror)) die_nomem();
48 return -3;
49}
50
51ssize_t mywrite(int fd,char *buf,int len)
52{
53 qmail_put(&qqt,buf,len);
54 return len;
55}
56
59buffer bi = BUFFER_INIT(buffer_unixread,0,inbuf,sizeof(inbuf));
60buffer bo = BUFFER_INIT(mywrite,-1,outbuf,sizeof(outbuf));
61
62char num[FMT_ULONG];
63
64int main()
65{
66 int i, j, r;
67 char *recipient;
68 char *sender;
69 char *dtline;
70 char *qqx;
71 srs_t *srs;
72 stralloc cookie = {0};
73 char separator = '=';
74 char srsrecipient[BUFSIZE_AUTH];
75 char *host = 0;
76
77 sig_pipeignore();
78
79 recipient = env_get("RECIPIENT");
80 if (!recipient)
81 logmsg(WHO,100,FATAL,"RECIPIENT not set");
82 sender = env_get("SENDER");
83 if (!sender)
84 logmsg(WHO,100,FATAL,"SENDER not set");
85 dtline = env_get("DTLINE");
86 if (!dtline)
87 logmsg(WHO,100,FATAL,"DTLINE not set");
88 host = env_get("HOST");
89 if (!host)
90 logmsg(WHO,100,FATAL,"HOST not set");
91
92 if (chdir(auto_qmail) == -1)
93 logmsg(WHO,111,FATAL,B("unable to chdir to: ",auto_qmail));
94
95 /* Check for particular virtual SRS domain user */
96
97 switch (control_readfile(&vdomains,"control/virtualdomains",0)) {
98 case -1: die_control();
99 case 0: if (!constmap_init(&mapvdomains,"",0,1)) die_nomem(); break;
100 case 1: if (!constmap_init(&mapvdomains,vdomains.s,vdomains.len,1)) die_nomem(); break;
101 }
102
103 j = str_len(host);
104 for (i = 0; i <= j; ++i)
105 if ((i == 0) || (host[i] == '.')) {
106 if (!stralloc_copys(&srshost,"")) die_nomem();
107 if (!stralloc_catb(&srshost,host + i,j - i)) die_nomem();
108 if ((srsdomaininfo = constmap(&mapvdomains,srshost.s,srshost.len)) != 0) goto SRSDOMAINS;
109 }
111
112 SRSDOMAINS:
113
114 switch (control_readfile(&srsdomains,"control/srsdomains",0)) {
115 case -1: die_control();
116 case 0: if (!constmap_init(&mapsrsdomains,"",0,1)) die_nomem(); break;
117 case 1: if (!constmap_init(&mapsrsdomains,srsdomains.s,srsdomains.len,1)) die_nomem(); break;
118 }
120 if ((srsdomaininfo = constmap(&mapsrsdomains,"*",1)) == 0) return 0;
121
122 if (*srsdomaininfo) {
123 i = str_chr(srsdomaininfo,'|'); // multiple cookies; separated by ' '
124 if (srsdomaininfo[i] == '|') {
125 srsdomaininfo[i] = 0;
126 separator = srsdomaininfo[i+1];
127 }
128 if (!stralloc_copys(&cookie,srsdomaininfo)) die_nomem();
129 if (!stralloc_0(&cookie)) die_nomem();
130 }
131
132 /* strip virtual user from recipient */
133
135 i = str_chr(recipient,*auto_break);
136 if (!case_diffb(recipient,i - 1,vdomainuser)) recipient += i + 1;
137 }
138
139 /* Let's go SRS reverse */
140
141 srs = srs_new();
142
143 if (separator == '-' || separator == '+' || separator == '=') { // '=' is default
144 r = srs_set_separator(srs,separator);
145 if (r != SRS_SUCCESS) return srserror_str(r);
146 }
147
148 for (j = 0, i = 0; j < cookie.len; j++) {
149 if (cookie.s[j] == ' ' || cookie.s[j] == '\0' ) {
150 cookie.s[j] = '\0';
151 r = srs_add_secret(srs,cookie.s + i);
152 if (r != SRS_SUCCESS) return srserror_str(r);
153 i = j + 1;
154 if (cookie.s[i] == ' ') { j++; continue; }
155 }
156 }
157
158 switch ((r = srs_reverse(srs,srsrecipient,sizeof(srsrecipient),recipient))) {
159 case SRS_SUCCESS: break;
161 logmsg(WHO,99,INFO,B("unable to reverse and mail bounced to: ",sender)); break;
162 default: logmsg(WHO,100,FATAL,B("unable to reverse: ",recipient," ",srs_strerror(r)));
163 }
164
165 if (qmail_open(&qqt) == -1)
166 logmsg(WHO,111,FATAL,"unable to fork: ");
168 if (buffer_copy(&bo,&bi) != 0)
169 logmsg(WHO,111,FATAL,"unable to read message: ");
170 buffer_flush(&bo);
171
172 num[fmt_ulong(num,qmail_qp(&qqt))] = 0;
173
174 qmail_from(&qqt,"");
175 qmail_to(&qqt,srsrecipient);
176 qqx = qmail_close(&qqt);
177 if (*qqx) logmsg(WHO,*qqx == 'D' ? 100 : 111,FATAL,qqx + 1);
178 logmsg(WHO,0,LOG,B(srsrecipient,": qp ",num));
179
180}
char auto_break[]
char auto_qmail[]
int constmap_init(struct constmap *cm, char *s, int len, int flagcolon)
Definition: constmap.c:35
int control_readfile(stralloc *sa, char *fn, int flagme)
Definition: control.c:87
int stralloc_copys(stralloc *, char const *)
stralloc sender
Definition: fastforward.c:71
char * dtline
Definition: fastforward.c:70
stralloc recipient
Definition: fastforward.c:274
char buf[100+FMT_ULONG]
Definition: hier.c:11
char host[256]
Definition: hostname.c:5
int fd
unsigned long code
Definition: qmail-remote.c:603
int j
Definition: qmail-send.c:926
void qmail_to(struct qmail *, char *)
Definition: qmail.c:83
#define BUFSIZE_MESS
Definition: qmail.h:7
#define BUFSIZE_LINE
Definition: qmail.h:8
void qmail_from(struct qmail *, char *)
Definition: qmail.c:73
void qmail_put(struct qmail *, char *, int)
Definition: qmail.c:63
char * qmail_close(struct qmail *)
Definition: qmail.c:90
unsigned long qmail_qp(struct qmail *)
Definition: qmail.c:53
void qmail_puts(struct qmail *, char *)
Definition: qmail.c:68
#define BUFSIZE_AUTH
Definition: qmail.h:9
int qmail_open(struct qmail *)
Definition: qmail.c:21
int srs_set_separator(srs_t *srs, char value)
Definition: srs2.c:161
int srs_add_secret(srs_t *, const char *)
Definition: srs2.c:137
int srs_reverse(srs_t *, char *, int, const char *)
Definition: srs2.c:599
srs_t * srs_new()
Definition: srs2.c:107
#define SRS_SUCCESS
Definition: srs2.h:40
const char * srs_strerror(int)
Definition: srs2.c:74
#define SRS_ENOTSRSADDRESS
Definition: srs2.h:41
void die_control()
Definition: srsreverse.c:24
ssize_t mywrite(int fd, char *buf, int len)
Definition: srsreverse.c:51
void die_nomem()
Definition: srsreverse.c:23
char * vdomainuser
Definition: srsreverse.c:27
stralloc vdomains
Definition: srsreverse.c:28
struct constmap mapvdomains
Definition: srsreverse.c:29
struct qmail qqt
Definition: srsreverse.c:26
stralloc srshost
Definition: srsreverse.c:34
stralloc srserror
Definition: srsreverse.c:33
char outbuf[BUFSIZE_LINE]
Definition: srsreverse.c:58
char inbuf[BUFSIZE_MESS]
Definition: srsreverse.c:57
char num[FMT_ULONG]
Definition: srsreverse.c:62
buffer bi
Definition: srsreverse.c:59
char * srsdomaininfo
Definition: srsreverse.c:30
buffer bo
Definition: srsreverse.c:60
#define WHO
Definition: srsreverse.c:21
int main()
Definition: srsreverse.c:64
stralloc srsdomains
Definition: srsreverse.c:31
struct constmap mapsrsdomains
Definition: srsreverse.c:32
Definition: srs2.h:79
Definition: qmail.h:14