-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathqmail-remote-auth.patch
More file actions
129 lines (121 loc) · 4.68 KB
/
qmail-remote-auth.patch
File metadata and controls
129 lines (121 loc) · 4.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
--- qmail-remote.c.orig Mon Jun 15 03:52:55 1998
+++ qmail-remote.c Sat Nov 20 21:37:47 2004
@@ -43,6 +43,8 @@
struct constmap maproutes;
stralloc host = {0};
stralloc sender = {0};
+stralloc auth_smtp_user = {0};
+stralloc auth_smtp_pass = {0};
saa reciplist = {0};
@@ -221,19 +223,55 @@
unsigned long code;
int flagbother;
int i;
+ stralloc slop = {0};
if (smtpcode() != 220) quit("ZConnected to "," but greeting failed");
-
- substdio_puts(&smtpto,"HELO ");
+
+ substdio_puts(&smtpto,"EHLO ");
substdio_put(&smtpto,helohost.s,helohost.len);
substdio_puts(&smtpto,"\r\n");
substdio_flush(&smtpto);
- if (smtpcode() != 250) quit("ZConnected to "," but my name was rejected");
-
- substdio_puts(&smtpto,"MAIL FROM:<");
- substdio_put(&smtpto,sender.s,sender.len);
- substdio_puts(&smtpto,">\r\n");
- substdio_flush(&smtpto);
+ if (smtpcode() != 250) {
+ substdio_puts(&smtpto,"HELO ");
+ substdio_put(&smtpto,helohost.s,helohost.len);
+ substdio_puts(&smtpto,"\r\n");
+ substdio_flush(&smtpto);
+ if (smtpcode() != 250) quit("ZConnected to "," but my name was rejected");
+ }
+ i = 0;
+ while((i += str_chr(smtptext.s+i,'\n') + 1) && (i+14 < smtptext.len) &&
+ str_diffn(smtptext.s+i+4,"AUTH LOGIN\n",11) &&
+ str_diffn(smtptext.s+i+4,"AUTH LOGIN ",11) &&
+ str_diffn(smtptext.s+i+4,"AUTH PLAIN LOGIN\n",17) &&
+ str_diffn(smtptext.s+i+4,"AUTH PLAIN LOGIN ",17) &&
+ str_diffn(smtptext.s+i+4,"AUTH=LOGIN\n",11) &&
+ str_diffn(smtptext.s+i+4,"AUTH=LOGIN ",11));
+ if ((i+14 < smtptext.len) && auth_smtp_user.len && auth_smtp_pass.len) {
+ substdio_puts(&smtpto,"AUTH LOGIN\r\n");
+ substdio_flush(&smtpto);
+ if (smtpcode() != 334) quit("ZConnected to "," but authentication was rejected (AUTH LOGIN)");
+ if (b64encode(&auth_smtp_user,&slop) < 0) temp_nomem();
+ substdio_put(&smtpto,slop.s,slop.len);
+ substdio_puts(&smtpto,"\r\n");
+ substdio_flush(&smtpto);
+ if (smtpcode() != 334) quit("ZConnected to "," but authentication was rejected (username)");
+ if (b64encode(&auth_smtp_pass,&slop) < 0) temp_nomem();
+ substdio_put(&smtpto,slop.s,slop.len);
+ substdio_puts(&smtpto,"\r\n");
+ substdio_flush(&smtpto);
+ if (smtpcode() != 235) quit("ZConnected to "," but authentication was rejected (password)");
+ substdio_puts(&smtpto,"MAIL FROM:<");
+ substdio_put(&smtpto,sender.s,sender.len);
+ substdio_puts(&smtpto,"> AUTH=<");
+ substdio_put(&smtpto,sender.s,sender.len);
+ substdio_puts(&smtpto,">\r\n");
+ substdio_flush(&smtpto);
+ } else {
+ substdio_puts(&smtpto,"MAIL FROM:<");
+ substdio_put(&smtpto,sender.s,sender.len);
+ substdio_puts(&smtpto,">\r\n");
+ substdio_flush(&smtpto);
+ }
code = smtpcode();
if (code >= 500) quit("DConnected to "," but sender was rejected");
if (code >= 400) quit("ZConnected to "," but sender was rejected");
@@ -331,7 +367,7 @@
char **argv;
{
static ipalloc ip = {0};
- int i;
+ int i,j;
unsigned long random;
char **recips;
unsigned long prefme;
@@ -347,6 +383,9 @@
if (!stralloc_copys(&host,argv[1])) temp_nomem();
+ if (!stralloc_copys(&auth_smtp_user,"")) temp_nomem();
+ if (!stralloc_copys(&auth_smtp_pass,"")) temp_nomem();
+
relayhost = 0;
for (i = 0;i <= host.len;++i)
if ((i == 0) || (i == host.len) || (host.s[i] == '.'))
@@ -355,6 +394,16 @@
if (relayhost && !*relayhost) relayhost = 0;
if (relayhost) {
+ i = str_chr(relayhost,' ');
+ if (relayhost[i]) {
+ j = str_chr(relayhost + i + 1,' ');
+ if (relayhost[j]) {
+ relayhost[i] = 0;
+ relayhost[i + j + 1] = 0;
+ if (!stralloc_copys(&auth_smtp_user,relayhost + i + 1)) temp_nomem();
+ if (!stralloc_copys(&auth_smtp_pass,relayhost + i + j + 2)) temp_nomem();
+ }
+ }
i = str_chr(relayhost,':');
if (relayhost[i]) {
scan_ulong(relayhost + i + 1,&port);
--- Makefile~ Thu Apr 17 02:55:05 2003
+++ Makefile Thu Apr 17 03:02:06 2003
@@ -1445,12 +1445,12 @@
load qmail-remote.o control.o constmap.o timeoutread.o timeoutwrite.o \
timeoutconn.o tcpto.o now.o dns.o ip.o ipalloc.o ipme.o quote.o \
ndelay.a case.a sig.a open.a lock.a seek.a getln.a stralloc.a alloc.a \
-substdio.a error.a str.a fs.a auto_qmail.o dns.lib socket.lib
+substdio.a error.a str.a fs.a auto_qmail.o base64.o dns.lib socket.lib
./load qmail-remote control.o constmap.o timeoutread.o \
timeoutwrite.o timeoutconn.o tcpto.o now.o dns.o ip.o \
ipalloc.o ipme.o quote.o ndelay.a case.a sig.a open.a \
lock.a seek.a getln.a stralloc.a alloc.a substdio.a error.a \
- str.a fs.a auto_qmail.o `cat dns.lib` `cat socket.lib`
+ str.a fs.a auto_qmail.o base64.o `cat dns.lib` `cat socket.lib`
qmail-remote.0: \
qmail-remote.8