From 932ed3db5c3cd18902908c520505523ecf6a1166 Mon Sep 17 00:00:00 2001 From: Alexander Lehmann Date: Sat, 29 Apr 2023 03:15:48 +0200 Subject: [PATCH] chat for a single user actually works --- pom.xml | 7 +- .../lehmann/gemini/gemini/MainVerticle.java | 67 ++++++++++++++----- 2 files changed, 57 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index 8d7b185..d048f2c 100644 --- a/pom.xml +++ b/pom.xml @@ -61,9 +61,12 @@ io.netty netty-tcnative-boringssl-static - 2.0.59.Final - + + javax.xml.bind + jaxb-api + 2.4.0-b180830.0359 + diff --git a/src/main/java/cx/lehmann/gemini/gemini/MainVerticle.java b/src/main/java/cx/lehmann/gemini/gemini/MainVerticle.java index 66d3fed..4b5891c 100644 --- a/src/main/java/cx/lehmann/gemini/gemini/MainVerticle.java +++ b/src/main/java/cx/lehmann/gemini/gemini/MainVerticle.java @@ -1,6 +1,10 @@ package cx.lehmann.gemini.gemini; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.security.cert.Certificate; +import java.security.cert.CertificateEncodingException; +import java.security.cert.X509Certificate; import java.util.List; import javax.net.ssl.SSLPeerUnverifiedException; @@ -9,20 +13,27 @@ import io.vertx.core.AbstractVerticle; import io.vertx.core.Promise; import io.vertx.core.http.ClientAuth; import io.vertx.core.net.NetServerOptions; +import io.vertx.core.net.NetSocket; //import io.vertx.core.net.OpenSSLEngineOptions; import io.vertx.core.net.PemKeyCertOptions; import io.vertx.core.net.PemTrustOptions; import io.vertx.core.net.TrustOptions; +import javax.xml.bind.DatatypeConverter; + +//import sun.security.x509.X509Cert; + public class MainVerticle extends AbstractVerticle { + NetSocket conn2=null; + @Override public void start(Promise startPromise) throws Exception { NetServerOptions options=new NetServerOptions(); String certPath="c:/temp/cert.pem"; - TrustOptions trustOptions=new PemTrustOptions(); +// TrustOptions trustOptions=new PemTrustOptions(); options.setPemKeyCertOptions(new PemKeyCertOptions() .setCertPath(certPath) .setKeyPath(certPath)) @@ -31,6 +42,7 @@ public class MainVerticle extends AbstractVerticle { // .setOpenSslEngineOptions(new OpenSSLEngineOptions()) .setClientAuth(ClientAuth.REQUIRED); + vertx.createNetServer(options).connectHandler(conn -> { conn.handler(event -> { System.out.println("accepted connection:"+conn.remoteAddress()); @@ -40,20 +52,35 @@ public class MainVerticle extends AbstractVerticle { conn.close(); } else { url=url.substring(0, url.length()-2); -// conn.write("60 cert required\r\n"); - conn.write("20 text/gemini\r\n"); - conn.write("url:"+url); - conn.write("\n"); - try { - List certs=conn.peerCertificates(); - System.out.println("get certs"); - System.out.println("number of certs:"+certs.size()); - Certificate cert=certs.get(0); - conn.write(cert.toString()); - } catch (SSLPeerUnverifiedException ex) { - ex.printStackTrace(); + System.out.println("url:"+url); + String path=url.substring(18); + System.out.println("path:"+path); + if (path.startsWith("/post")) { + System.out.println("post"); + try { + List certs = conn.peerCertificates(); + Certificate cert = certs.get(0); + X509Certificate certX509 = (X509Certificate) cert; + String clientHash = getThumbprint(certX509); + System.out.println("cert"); + if (!url.contains("?")) { + conn.write("10 please enter your chat message\r\n"); + } else { + String message = url.substring(url.indexOf('?') + 1); + conn.write("20 text/gemini\r\n"); + conn.write("message was sent\n"); + conn.write("=> /post post another message\n"); + conn2.write(clientHash+":"+message+"\n"); + } + } catch (SSLPeerUnverifiedException | CertificateEncodingException | NoSuchAlgorithmException ex) { + ex.printStackTrace(); + } + conn.close(); + } else { + System.out.println("conn2"); + conn2=conn; + conn2.write("20 text/gemini\r\n"); } - conn.close(); } } ); @@ -66,4 +93,14 @@ public class MainVerticle extends AbstractVerticle { } }); } - } + + private static String getThumbprint(X509Certificate cert) + throws NoSuchAlgorithmException, CertificateEncodingException { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] der = cert.getEncoded(); + md.update(der); + byte[] digest = md.digest(); + String digestHex = DatatypeConverter.printHexBinary(digest); + return digestHex.toLowerCase(); + } +}