From 656ae3db884b62b3576f24741cf18c6dc53226c5 Mon Sep 17 00:00:00 2001 From: Arnt Gulbrandsen Date: Tue, 15 Nov 2016 14:20:37 +0000 Subject: mail-mta/netqmail: Add SMTPUTF8 support for qmail SMTPUTF8 (RFCs 6531 and 6532, plus several that aren't relevant to qmail) allows using unencoded UTF8 almost everywhere in email, including in localparts, domains, subjects and message bodies. Thanks to cnnic.cn for sponsoring this work. (cherry picked from commit 5116b83a9bf93f59fb7b7d3fcd286f7b2c4da438) Signed-off-by: Robin H. Johnson --- mail-mta/netqmail/Manifest | 1 + mail-mta/netqmail/files/qmail-smtputf8.patch | 242 +++++++++++++++++++++++++++ mail-mta/netqmail/netqmail-1.06-r5.ebuild | 183 ++++++++++++++++++++ 3 files changed, 426 insertions(+) create mode 100644 mail-mta/netqmail/files/qmail-smtputf8.patch create mode 100644 mail-mta/netqmail/netqmail-1.06-r5.ebuild (limited to 'mail-mta/netqmail') diff --git a/mail-mta/netqmail/Manifest b/mail-mta/netqmail/Manifest index cedd87fa66ed..39e82f2228b2 100644 --- a/mail-mta/netqmail/Manifest +++ b/mail-mta/netqmail/Manifest @@ -5,3 +5,4 @@ DIST netqmail-1.06.tar.gz 260941 SHA256 8e7d98d15211fc9f9c28109e942e2268f42a6672 DIST qmail-103.patch 2104 SHA256 4cad53c7a6628a600c74c36bfee327db5052ca24c222d4013e4dfcd7f427653d SHA512 b81062bb0b0023f474c0b6af40601926e1c04ad395de480d114809e48a8060c06d99bdbdeb6f44d9e24ae1acedabb094b979193d305371aed958f18fc6eee354 WHIRLPOOL 5785684b98b9d9732ed14aa1b53910746bd09aa93514e0e6ef3d74831c3df8ed0a55f257057488f34a3d462e485b7a4417ed255f66abaff6dd63d881b9230063 DIST qmail-spp-0.42.tar.gz 18689 SHA256 1518e7e82d10fbbb8ecc520f51daf503edeb9c3a9fb935be65a8185e7b53808d SHA512 03449862886a0ca20fbadab4c94b34b55d185f8df3261bd68aea99e9ded9edfab4477c6b38a8e0295e9b38b0045615da8b1a906a458f28745eadd3c4d882bcbf WHIRLPOOL 2f8525bb264fbec4b057bad6d92968e29085fdf10b8538b8e572d81ea8793e74c07c6093d0cc2a34de00b629e797b048007b30e3845dce76829037fdb44f527c DIST vu555316.patch 617 SHA256 cc7b2876ecb183fe55c280404c1c825a6bd1f6ccc87db67e7cfc8bc6336f9b0f SHA512 5d7810360e5eaa8e8ee141fe92c765d9458aa12198a8d0ac702e0630e08d060ad4a1d33690d434f20f5aff79eb200cd8173bebc334c411e340c0198b5d8d1a65 WHIRLPOOL 2564d5622576b89918e247de5dd830011e8ef18a50fd03e6f48e98ebf4a53db2f4994eb0fb22a76c4cd0cbb35b457ac2a5507e05159130a72685866137c5ebc1 +DIST qmail-smtputf8.patch 6693 SHA256 cf3a802d439fe53e9cecbeb82a6ce6ff5c71b5fcd0b053eac5a19df918724cfa SHA512 8cafdf1a4f1fd41e6b11ee2abddac5c3da4a1d2ab17b5d3847433875a91f867a26eb358ae8c41791f1e77758e5a2c311134a286d888ccd23fbede6d9f0b475c4 WHIRLPOOL 36d2a822cf42efbe34e0e95da6e171a3394c049cfbcf2a3b68efe789b4199f00fcdb942d1e93268283a4eec15ad3ead7a58df31a327ade517c218fb18f8a7801 diff --git a/mail-mta/netqmail/files/qmail-smtputf8.patch b/mail-mta/netqmail/files/qmail-smtputf8.patch new file mode 100644 index 000000000000..5b656b9dbd9d --- /dev/null +++ b/mail-mta/netqmail/files/qmail-smtputf8.patch @@ -0,0 +1,242 @@ +This patch adds EAI support to qmail; EAI allows UTF8 almost everywhere in +email. + +Thanks for CNNIC for sponsoring this work. + +--- /dev/null ++++ netqmail-1.06/Makefile +@@ -1446,7 +1446,7 @@ substdio.a error.a str.a fs.a auto_qmail.o dns.lib socket.lib + 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 `cat dns.lib` `cat socket.lib` -lidn2 + + qmail-remote.0: \ + qmail-remote.8 +--- /dev/null ++++ netqmail-1.06/qmail-remote.c +@@ -2,6 +2,7 @@ + #include + #include + #include ++#include + #include "sig.h" + #include "stralloc.h" + #include "substdio.h" +@@ -42,6 +43,7 @@ + stralloc routes = {0}; + struct constmap maproutes; + stralloc host = {0}; ++stralloc asciihost = {0}; + stralloc sender = {0}; + + saa reciplist = {0}; +@@ -53,12 +55,13 @@ + # include "tls.h" + # include "ssl_timeoutio.h" + # include +-# define EHLO 1 + + int tls_init(); + const char *ssl_err_str = 0; + #endif + ++# define EHLO 1 ++ + void out(s) char *s; { if (substdio_puts(subfdoutsmall,s) == -1) _exit(0); } + void zero() { if (substdio_put(subfdoutsmall,"\0",1) == -1) _exit(0); } + void zerodie() { zero(); substdio_flush(subfdoutsmall); _exit(0); } +@@ -156,6 +159,7 @@ + substdio smtpfrom = SUBSTDIO_FDBUF(saferead,-1,smtpfrombuf,sizeof smtpfrombuf); + + stralloc smtptext = {0}; ++stralloc firstpart = {0}; + + void get(ch) + char *ch; +@@ -308,6 +312,8 @@ + int r; + char ch; + ++ substdio_put(&smtpto,firstpart.s,firstpart.len); ++ + for (;;) { + r = substdio_get(&ssin,&ch,1); + if (r == 0) break; +@@ -518,6 +524,88 @@ + + stralloc recip = {0}; + ++int containsutf8(p, l) unsigned char * p; int l; ++{ ++ int i = 0; ++ while (i 127) return 1; ++ return 0; ++} ++ ++int utf8message; ++ ++void checkutf8message() ++{ ++ int pos; ++ int i; ++ int r; ++ char ch; ++ int state; ++ ++ if (containsutf8(sender.s, sender.len)) { utf8message = 1; return; } ++ for (i = 0;i < reciplist.len;++i) ++ if (containsutf8(reciplist.sa[i].s, reciplist.sa[i].len)) { ++ utf8message = 1; ++ return; ++ } ++ ++ state = 0; ++ pos = 0; ++ for (;;) { ++ r = substdio_get(&ssin,&ch,1); ++ if (r == 0) break; ++ if (r == -1) temp_read(); ++ ++ if (!stralloc_append(&firstpart,&ch)) temp_nomem(); ++ ++ if (ch == '\r') ++ continue; ++ if (ch == '\t') ++ ch = ' '; ++ ++ switch (state) { ++ case 6: /* in Received, at LF but before WITH clause */ ++ if (ch == ' ') { state = 3; pos = 1; continue; } ++ state = 0; ++ /* FALL THROUGH */ ++ ++ case 0: /* start of header field */ ++ if (ch == '\n') return; ++ state = 1; ++ pos = 0; ++ /* FALL THROUGH */ ++ ++ case 1: /* partway through "Received:" */ ++ if (ch != "RECEIVED:"[pos] && ch != "received:"[pos]) { state = 2; continue; } ++ if (++pos == 9) { state = 3; pos = 0; } ++ continue; ++ ++ case 2: /* other header field */ ++ if (ch == '\n') state = 0; ++ continue; ++ ++ case 3: /* in Received, before WITH clause or partway though " with " */ ++ if (ch == '\n') { state = 6; continue; } ++ if (ch != " WITH "[pos] && ch != " with "[pos]) { pos = 0; continue; } ++ if (++pos == 6) { state = 4; pos = 0; } ++ continue; ++ ++ case 4: /* in Received, having seen with, before the argument */ ++ if (pos == 0 && (ch == ' ' || ch == '\t')) continue; ++ if (ch != "UTF8"[pos] && ch != "utf8"[pos]) { state = 5; continue; } ++ if(++pos == 4) { utf8message = 1; state = 5; continue; } ++ continue; ++ ++ case 5: /* after the RECEIVED WITH argument */ ++ /* blast() assumes that it copies whole lines */ ++ if (ch == '\n') return; ++ state = 1; ++ pos = 0; ++ continue; ++ } ++ } ++} ++ + void smtp() + { + unsigned long code; +@@ -571,9 +659,12 @@ + } + #endif + ++ checkutf8message(); + substdio_puts(&smtpto,"MAIL FROM:<"); + substdio_put(&smtpto,sender.s,sender.len); +- substdio_puts(&smtpto,">\r\n"); ++ substdio_puts(&smtpto,">"); ++ if (utf8message) substdio_puts(&smtpto," SMTPUTF8"); ++ substdio_puts(&smtpto,"\r\n"); + substdio_flush(&smtpto); + code = smtpcode(); + if (code >= 500) quit("DConnected to "," but sender was rejected"); +@@ -702,9 +793,17 @@ + relayhost[i] = 0; + } + if (!stralloc_copys(&host,relayhost)) temp_nomem(); ++ } else { ++ char * ascii = 0; ++ host.s[host.len] = '\0'; ++ switch (idn2_lookup_u8(host.s, (uint8_t**)&ascii, IDN2_NFC_INPUT)) { ++ case IDN2_OK: break; ++ case IDN2_MALLOC: temp_nomem(); ++ default: perm_dns(); ++ } ++ if (!stralloc_copys(&asciihost, ascii)) temp_nomem(); + } + +- + addrmangle(&sender,argv[2],&flagalias,0); + + if (!saa_readyplus(&reciplist,0)) temp_nomem(); +@@ -723,7 +822,7 @@ + + + random = now() + (getpid() << 16); +- switch (relayhost ? dns_ip(&ip,&host) : dns_mxip(&ip,&host,random)) { ++ switch (relayhost ? dns_ip(&ip,&host) : dns_mxip(&ip,&asciihost,random)) { + case DNS_MEM: temp_nomem(); + case DNS_SOFT: temp_dns(); + case DNS_HARD: perm_dns(); +--- /dev/null ++++ netqmail-1.06/qmail-smtpd.c +@@ -273,6 +273,7 @@ + stralloc rcptto = {0}; + stralloc fuser = {0}; + stralloc mfparms = {0}; ++int smtputf8 = 0; + + int mailfrom_size(arg) char *arg; + { +@@ -323,6 +324,7 @@ + while (len) { + arg++; len--; + if (*arg == ' ' || *arg == '\0' ) { ++ if (case_starts(mfparms.s,"SMTPUTF8")) smtputf8 = 1; + if (case_starts(mfparms.s,"SIZE=")) if (mailfrom_size(mfparms.s+5)) { flagsize = 1; return; } + if (case_starts(mfparms.s,"AUTH=")) mailfrom_auth(mfparms.s+5,mfparms.len-5); + if (!stralloc_copys(&mfparms,"")) die_nomem; +@@ -351,7 +353,7 @@ + out("\r\n250-STARTTLS"); + #endif + size[fmt_ulong(size,(unsigned int) databytes)] = 0; +- out("\r\n250-PIPELINING\r\n250-8BITMIME\r\n"); ++ out("\r\n250-PIPELINING\r\n250-SMTPUTF8\r\n250-8BITMIME\r\n"); + out("250-SIZE "); out(size); out("\r\n"); + #ifdef CRAM_MD5 + out("250 AUTH LOGIN PLAIN CRAM-MD5\r\n"); +@@ -516,7 +518,15 @@ + if (qmail_open(&qqt) == -1) { err_qqt(); return; } + qp = qmail_qp(&qqt); + out("354 go ahead\r\n"); +- ++ ++ if (smtputf8) { ++ stralloc utf8proto = {0}; ++ if ('E' == *protocol) protocol++; ++ if (!stralloc_copys(&utf8proto, "UTF8")) die_nomem(); ++ if (!stralloc_cats(&utf8proto, protocol)) die_nomem(); ++ utf8proto.s[utf8proto.len] = '\0'; ++ protocol = utf8proto.s; ++ } + received(&qqt,protocol,local,remoteip,remotehost,remoteinfo,fakehelo); + blast(&hops); + hops = (hops >= MAXHOPS); + diff --git a/mail-mta/netqmail/netqmail-1.06-r5.ebuild b/mail-mta/netqmail/netqmail-1.06-r5.ebuild new file mode 100644 index 000000000000..6609bf6a4c19 --- /dev/null +++ b/mail-mta/netqmail/netqmail-1.06-r5.ebuild @@ -0,0 +1,183 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +EAPI=5 + +GENQMAIL_PV=20080406 +QMAIL_SPP_PV=0.42 + +QMAIL_TLS_PV=20070417 +QMAIL_TLS_F=${PN}-1.05-tls-smtpauth-${QMAIL_TLS_PV}.patch +QMAIL_TLS_CVE=vu555316.patch + +QMAIL_BIGTODO_PV=103 +QMAIL_BIGTODO_F=big-todo.${QMAIL_BIGTODO_PV}.patch + +QMAIL_LARGE_DNS='qmail-103.patch' + +QMAIL_SMTPUTF8='qmail-smtputf8.patch' + +inherit eutils qmail + +DESCRIPTION="qmail -- a secure, reliable, efficient, simple message transfer agent" +HOMEPAGE=" + http://netqmail.org + http://cr.yp.to/qmail.html + http://qmail.org +" +SRC_URI="mirror://qmail/${P}.tar.gz + https://dev.gentoo.org/~hollow/distfiles/${GENQMAIL_F} + http://www.ckdhr.com/ckd/${QMAIL_LARGE_DNS} + http://inoa.net/qmail-tls/${QMAIL_TLS_CVE} + http://arnt.gulbrandsen.priv.no/qmail/qmail-smtputf8.patch + !vanilla? ( + highvolume? ( mirror://qmail/${QMAIL_BIGTODO_F} ) + qmail-spp? ( mirror://sourceforge/qmail-spp/${QMAIL_SPP_F} ) + ssl? ( http://shupp.org/patches/${QMAIL_TLS_F} ) + ) +" + +LICENSE="public-domain" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~mips ~ppc ~ppc64 ~x86" +IUSE="authcram gencertdaily highvolume libressl qmail-spp ssl vanilla" +REQUIRED_USE='vanilla? ( !ssl !qmail-spp !highvolume )' +RESTRICT="test" + +DEPEND=" + !mail-mta/qmail + net-mail/queue-repair + ssl? ( + !libressl? ( dev-libs/openssl:0 ) + libressl? ( dev-libs/libressl ) + ) + sys-apps/gentoo-functions + sys-apps/groff + net-dns/libidn2 +" +RDEPEND=" + !mail-mta/courier + !mail-mta/esmtp + !mail-mta/exim + !mail-mta/mini-qmail + !mail-mta/msmtp[mta] + !mail-mta/nullmailer + !mail-mta/postfix + !mail-mta/qmail-ldap + !mail-mta/sendmail + !=mail-mta/ssmtp-2.64-r2[mta] + >=sys-apps/ucspi-tcp-0.88-r17 + ssl? ( >=sys-apps/ucspi-ssl-0.70-r1 ) + virtual/daemontools + >=net-mail/dot-forward-0.71-r3 + virtual/checkpassword + authcram? ( >=net-mail/cmd5checkpw-0.30 ) + ${DEPEND} +" + +pkg_setup() { + if [[ -n "${QMAIL_PATCH_DIR}" ]]; then + eerror + eerror "The QMAIL_PATCH_DIR variable for custom patches" + eerror "has been removed from ${PN}. If you need custom patches" + eerror "you should create a copy of this ebuild in an overlay." + eerror + die "QMAIL_PATCH_DIR is not supported anymore" + fi + + qmail_create_users +} + +src_unpack() { + genqmail_src_unpack + use qmail-spp && qmail_spp_src_unpack + + unpack ${P}.tar.gz +} + +src_prepare() { + epatch "${FILESDIR}"/${PV}-exit.patch + epatch "${FILESDIR}"/${PV}-readwrite.patch + epatch "${DISTDIR}"/${QMAIL_LARGE_DNS} + epatch "${FILESDIR}"/${PV}-fbsd-utmpx.patch + + ht_fix_file Makefile* + + if ! use vanilla; then + # This patch contains relative paths and needs to be cleaned up. + sed 's~^--- ../../~--- ~g' \ + <"${DISTDIR}"/${QMAIL_TLS_F} \ + >"${T}"/${QMAIL_TLS_F} || die + use ssl && epatch "${T}"/${QMAIL_TLS_F} + use ssl && epatch "${DISTDIR}"/${QMAIL_TLS_CVE} + use highvolume && epatch "${DISTDIR}"/${QMAIL_BIGTODO_F} + + if use qmail-spp; then + if use ssl; then + epatch "${QMAIL_SPP_S}"/qmail-spp-smtpauth-tls-20060105.diff + else + epatch "${QMAIL_SPP_S}"/netqmail-spp.diff + fi + cd "${WORKDIR}" || die + epatch "${FILESDIR}"/genqmail-20080406-ldflags.patch + cd - || die + fi + fi + + cd "${WORKDIR}" || die + epatch "${FILESDIR}"/use-new-path-for-functions.sh.patch + epatch "${FILESDIR}"/qmail-smtputf8.patch + cd - || die + + qmail_src_postunpack + + # Fix bug #33818 but for netqmail (Bug 137015) + if ! use authcram; then + einfo "Disabled CRAM_MD5 support" + sed -e 's,^#define CRAM_MD5$,/*&*/,' -i "${S}"/qmail-smtpd.c || die + else + einfo "Enabled CRAM_MD5 support" + fi +} + +src_compile() { + qmail_src_compile + use qmail-spp && qmail_spp_src_compile +} + +src_install() { + qmail_src_install +} + +pkg_postinst() { + qmail_queue_setup + qmail_rootmail_fixup + qmail_tcprules_build + + qmail_config_notice + qmail_supervise_config_notice + elog + elog "If you are looking for documentation, check those links:" + elog "https://www.gentoo.org/doc/en/qmail-howto.xml" + elog " -- qmail/vpopmail Virtual Mail Hosting System Guide" + elog "http://www.lifewithqmail.com/" + elog " -- Life with qmail" + elog +} + +pkg_preinst() { + qmail_tcprules_fixup +} + +pkg_config() { + # avoid some weird locale problems + export LC_ALL=C + + qmail_config_fast + qmail_tcprules_config + qmail_tcprules_build + + use ssl && qmail_ssl_generate +} -- cgit v1.2.3-18-g5258