--- Makefile.orig 2011-07-21 16:02:30.000000000 +0200 +++ Makefile 2011-07-21 15:37:55.000000000 +0200 @@ -1445,13 +1445,13 @@ 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 \ tls.o ssl_timeoutio.o -L/usr/local/ssl/lib -lssl -lcrypto \ 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 --- qmail-remote.c.orig 2011-07-21 16:02:16.000000000 +0200 +++ qmail-remote.c 2011-07-21 16:04:50.000000000 +0200 @@ -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}; @@ -523,6 +525,8 @@ unsigned long code; int flagbother; int i; + stralloc slop = {0}; + #ifndef PORT_SMTP /* the qmtpc patch uses smtp_port and undefines PORT_SMTP */ @@ -571,10 +575,41 @@ } #endif - substdio_puts(&smtpto,"MAIL FROM:<"); - substdio_put(&smtpto,sender.s,sender.len); - substdio_puts(&smtpto,">\r\n"); - substdio_flush(&smtpto); + 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"); @@ -672,7 +707,7 @@ char **argv; { static ipalloc ip = {0}; - int i; + int i,j; unsigned long random; char **recips; unsigned long prefme; @@ -688,6 +723,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] == '.')) @@ -696,6 +734,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);