shithub: patch

Download patch

ref: 3f08c89e1ed7134c6ab952e78455fd764ad99e3f
parent: c1e58188f956f71c5f448ea1c8a6088fa6585969
author: qwx <qwx@sciops.net>
date: Sun Feb 6 12:00:59 EST 2022

add upas-ignore-certs: add flag to stop checking x509 cert hashes

instead of blindly adding new ones anyway.
this is our fault.
includes sirjofri's own patch for upas/smtp.

--- /dev/null
+++ b/upas-ignore-certs
@@ -1,0 +1,116 @@
+diff 251c3cfd610abd169676852d301a2aa1267c0e57 uncommitted
+--- a/sys/src/cmd/upas/fs/dat.h
++++ b/sys/src/cmd/upas/fs/dat.h
+@@ -342,8 +342,10 @@
+ extern int	plumbing;
+ extern ulong	msgallocd;
+ extern ulong	msgfreed;
++extern int	nocertcheck;
+ extern Mailbox	*mbl;
+ extern Message	*root;
++extern char	*logf;
+ 
+ #define	dprint(...)	if(debug) fprint(2, __VA_ARGS__); else {}
+ #define	Topmsg(mb, m)	(m->whole == mb->root)
+--- a/sys/src/cmd/upas/fs/fs.c
++++ b/sys/src/cmd/upas/fs/fs.c
+@@ -114,6 +114,7 @@
+ int	debug;
+ int	plumbing = 1;
+ ulong	cachetarg = Maxcache;
++int	nocertcheck; /* ignore unrecognized certs. Still logged */
+ Mailbox	*mbl;
+ 
+ static	int	messagesize = 8*1024 + IOHDRSZ;
+@@ -203,7 +204,7 @@
+ void
+ usage(void)
+ {
+-	fprint(2, "usage: upas/fs [-DSbdlmnps] [-c cachetarg] [-f mboxfile] [-m mountpoint]\n");
++	fprint(2, "usage: upas/fs [-CDSbdlmnps] [-c cachetarg] [-f mboxfile] [-m mountpoint]\n");
+ 	exits("usage");
+ }
+ 
+@@ -271,6 +272,9 @@
+ 	v = argv;
+ 
+ 	ARGBEGIN{
++	case 'C':
++		nocertcheck = 1;
++		break;
+ 	case 'D':
+ 		Dflag = 1;
+ 		break;
+--- a/sys/src/cmd/upas/fs/mbox.c
++++ b/sys/src/cmd/upas/fs/mbox.c
+@@ -1634,7 +1634,7 @@
+ 	return i;
+ }
+ 
+-static char *logf = "fs";
++char *logf = "fs";
+ 
+ void
+ logmsg(Message *m, char *fmt, ...)
+--- a/sys/src/cmd/upas/fs/tls.c
++++ b/sys/src/cmd/upas/fs/tls.c
+@@ -17,6 +17,10 @@
+ 		close(ofd);
+ 		return -1;
+ 	}
++	if(nocertcheck){
++		syslog(Sflag, logf, "ignoring cert for %s", host);
++		goto skip;
++	}
+ 	thumb = initThumbprints("/sys/lib/tls/mail", "/sys/lib/tls/mail.exclude", "x509");
+ 	if(thumb != nil){
+ 		if(!okCertificate(conn.cert, conn.certlen, thumb)){
+@@ -26,6 +30,7 @@
+ 		}
+ 		freeThumbprints(thumb);
+ 	}
++skip:
+ 	free(conn.cert);
+ 	free(conn.sessionID);
+ 	return fd;
+--- a/sys/src/cmd/upas/smtp/smtp.c
++++ b/sys/src/cmd/upas/smtp/smtp.c
+@@ -46,6 +46,7 @@
+ int	quitting;	/* when error occurs in quit */
+ int	tryauth;	/* Try to authenticate, if supported */
+ int	trysecure;	/* Try to use TLS if the other side supports it */
++int	nocertcheck; /* ignore unrecognized certs. Still logged */
+ 
+ char	*quitrv;	/* deferred return value when in quit */
+ char	ddomain[1024];	/* domain name of destination machine */
+@@ -85,7 +86,7 @@
+ void
+ usage(void)
+ {
+-	fprint(2, "usage: smtp [-aAdfipst] [-b busted-mx] [-g gw] [-h host] "
++	fprint(2, "usage: smtp [-aACdfipst] [-b busted-mx] [-g gw] [-h host] "
+ 		"[-u user] [.domain] net!host[!service] sender rcpt-list\n");
+ 	exits(Giveup);
+ }
+@@ -187,6 +188,9 @@
+ 	case 'u':
+ 		user = EARGF(usage());
+ 		break;
++	case 'C':
++		nocertcheck = 1;
++		break;
+ 	default:
+ 		usage();
+ 		break;
+@@ -415,6 +419,11 @@
+ 	Bterm(&bin);
+ 	Binit(&bin, fd, OREAD);
+ 
++	if (nocertcheck) {
++		syslog(0, "smtp", "ignoring cert for %s", ddomain);
++		err = nil;
++		goto Out;
++	}
+ 	goodcerts = initThumbprints(smtpthumbs, smtpexclthumbs, "x509");
+ 	if (goodcerts == nil) {
+ 		syslog(0, "smtp", "bad thumbprints in %s", smtpthumbs);