--- qmail-remote.c.orig 2013-12-29 00:14:52.121231962 +0100 +++ qmail-remote.c 2013-12-29 01:32:19.031320981 +0100 @@ -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,7 @@ unsigned long code; int flagbother; int i; + stralloc slop = {0}; #ifndef PORT_SMTP /* the qmtpc patch uses smtp_port and undefines PORT_SMTP */ @@ -570,11 +573,42 @@ #ifdef EHLO } #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,auth_smtp_user.s,auth_smtp_user.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 +706,7 @@ char **argv; { static ipalloc ip = {0}; - int i; + int i,j; unsigned long random; char **recips; unsigned long prefme; @@ -687,6 +721,8 @@ 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) @@ -696,6 +732,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.orig 2013-12-29 00:14:52.081231961 +0100 +++ Makefile 2013-12-29 00:28:05.461247159 +0100 @@ -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