git: 9front

Download patch

ref: 565ed7c34228b4cd4aef21b0e39c0631da623bc8
parent: 53d447b9f92c1308f0b76f435684919902aea610
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Oct 30 20:12:36 EDT 2021

acmed: handle international domain names

--- a/sys/src/cmd/auth/acmed.c
+++ b/sys/src/cmd/auth/acmed.c
@@ -741,9 +741,9 @@
 static void
 getcert(char *csrpath)
 {
-	char *csr, *dom[64], name[2048];
+	char *csr, *dom[64], subj[2048];
 	uchar *der;
-	int nder, ndom, fd;
+	int nder, i, ndom, fd;
 	RSApub *rsa;
 	Hdr loc = { "location" };
 	JSON *o;
@@ -752,24 +752,39 @@
 		sysfatal("open %s: %r", csrpath);
 	if((der = slurp(fd, &nder)) == nil)
 		sysfatal("read %s: %r", csrpath);
-	if((rsa = X509reqtoRSApub(der, nder, name, sizeof(name))) == nil)
+	close(fd);
+
+	if((rsa = X509reqtoRSApub(der, nder, subj, sizeof(subj))) == nil)
 		sysfatal("decode csr: %r");
+	rsapubfree(rsa);
 	if((csr = encurl64(der, nder)) == nil)
 		sysfatal("encode %s: %r", csrpath);
-	if((ndom = getfields(name, dom, nelem(dom), 1, ", ")) == nelem(dom))
-		sysfatal("too man domains");
-	rsapubfree(rsa);
-	close(fd);
 	free(der);
 
+	dprint("subject: %s\n", subj);
+	if((ndom = getfields(subj, dom, nelem(dom), 1, ", ")) == nelem(dom))
+		sysfatal("too man domains");
+
+	for(i = 0; i < ndom; i++){
+		char buf[256], *s = dom[i];
+		if(utf2idn(s, buf, sizeof(buf)) >= 0)
+			s = buf;
+		dprint("dom[%d]: %s\n", i, s);
+		dom[i] = strdup(s);
+	}
+
 	if((o = submitorder(dom, ndom, &loc)) == nil)
 		sysfatal("order: %r");
 	if(dochallenges(dom, ndom, o) == -1)
 		sysfatal("challenge: %r");
+
 	if(submitcsr(o, csr) == -1)
 		sysfatal("signing cert: %r");
 	if(fetchcert(loc.val) == -1)
 		sysfatal("saving cert: %r");
+
+	for(i = 0; i < ndom; i++)
+		free(dom[i]);
 	free(csr);
 }
 
--