diff --git a/net/infordata/em/Main.java b/net/infordata/em/Main.java index 273194e..45e1d8b 100644 --- a/net/infordata/em/Main.java +++ b/net/infordata/em/Main.java @@ -42,7 +42,7 @@ public class Main { private static void usageError(String msg) { System.err.println(msg); System.err.println("Usage: [-3dFX] /*[-PSHBTNCHC]*/ [-STRPCCMD] [-altFKeyRemap]" + - " [-maximized] [-cp codepage] [-devName name]" + + " [-maximized] [-cp codepage] [-devName name] [-useSSL|noSSL]" + " [-autoLogon ;;;;]" + " host-name"); System.err.println("Supported code pages:"); @@ -86,6 +86,7 @@ public class Main { boolean pUse3dFX = false; boolean pAltFKeyRemap = false; + int pUseSSL = -1; //boolean pPSHBTNCHC = false; boolean pSTRPCCMD = false; boolean pMaximized = false; @@ -111,6 +112,10 @@ public class Main { pMaximized = true; else if ("-altFKeyRemap".equalsIgnoreCase(arg)) pAltFKeyRemap = true; + else if ("-noSSL".equalsIgnoreCase(arg)) + pUseSSL = 0; + else if ("-useSSL".equalsIgnoreCase(arg)) + pUseSSL = 1; else if ("-cp".equalsIgnoreCase(arg)) expectCP = true; else if ("-devName".equalsIgnoreCase(arg)) @@ -150,6 +155,7 @@ public class Main { usageError("A code page is expected"); final boolean altFKeyRemap = pAltFKeyRemap; + final int useSSL = pUseSSL; final boolean use3dFX = pUse3dFX; // final boolean enablePSHBTNCHC = pPSHBTNCHC; final boolean enableSTRPCCMD = pSTRPCCMD; @@ -187,6 +193,7 @@ public class Main { em.setStrPcCmdEnabled(enableSTRPCCMD); em.setAltFKeyRemap(altFKeyRemap); + em.setUseSSL(useSSL); em.setCodePage(codePage); if (deviceName != null) diff --git a/net/infordata/em/tn5250/XI5250Emulator.java b/net/infordata/em/tn5250/XI5250Emulator.java index c42337a..b80ea91 100644 --- a/net/infordata/em/tn5250/XI5250Emulator.java +++ b/net/infordata/em/tn5250/XI5250Emulator.java @@ -345,6 +345,7 @@ public class XI5250Emulator extends XI5250Crt implements Serializable { private String ivHost; private boolean ivAltFKeyRemap; + private int ivUseSSL; private boolean ivStrPcCmdEnabled; private boolean ivReceivedStrPcCmd; @@ -590,11 +591,19 @@ public class XI5250Emulator extends XI5250Crt implements Serializable { ivAltFKeyRemap = value; firePropertyChange(ALTFKEY_REMAP, old, ivAltFKeyRemap); } + + public void setUseSSL(int value) { + ivUseSSL = value; + } public boolean getAltFKeyRemap() { return ivAltFKeyRemap; } + public int getUseSSL() { + return ivUseSSL; + } + /** * @param value - if true the STRPCCMD order is enabled. */ @@ -770,6 +779,8 @@ public class XI5250Emulator extends XI5250Crt implements Serializable { if (ivTelnetEnv != null) ivTelnet.setEnvironment(ivTelnetEnv); + ivTelnet.setUseSSL(ivUseSSL); + ivTelnet.setLocalReqFlag(XITelnet.TELOPT_BINARY, true); ivTelnet.setLocalReqFlag(XITelnet.TELOPT_TTYPE, true); ivTelnet.setLocalReqFlag(XITelnet.TELOPT_EOR, true); diff --git a/net/infordata/em/tnprot/XITelnet.java b/net/infordata/em/tnprot/XITelnet.java index 00b9b97..dfbbaf9 100644 --- a/net/infordata/em/tnprot/XITelnet.java +++ b/net/infordata/em/tnprot/XITelnet.java @@ -35,6 +35,12 @@ import java.io.InputStream; import java.io.InterruptedIOException; import java.io.OutputStream; import java.net.Socket; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import javax.net.ssl.SSLSocketFactory; +import java.security.cert.X509Certificate; import java.util.NoSuchElementException; import java.util.StringTokenizer; import java.util.logging.Level; @@ -163,6 +169,7 @@ public class XITelnet { private String ivTermType; private String ivEnvironment; + private int ivUseSSL; transient private int ivIACParserStatus = SIAC_START; @@ -301,7 +308,15 @@ public class XITelnet { ivEnvironment = aEnv; } + public void setUseSSL(int aUseSSL) { + ivUseSSL = aUseSSL; + } + public int getUseSSL() { + if ((ivUseSSL == -1) && (ivPort == 992)) + return 1; + return ivUseSSL; + } /** */ public String getEnvironment() { @@ -354,6 +369,22 @@ public class XITelnet { return ivRemoteFlags[flag]; } + public SSLSocketFactory getTrustAllFactory() throws Exception { + // 1. Créer un TrustManager qui ne vérifie rien + TrustManager[] trustAllCerts = new TrustManager[] { + new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { return null; } + public void checkClientTrusted(X509Certificate[] certs, String authType) {} + public void checkServerTrusted(X509Certificate[] certs, String authType) {} + } + }; + + // 2. Initialiser le contexte SSL avec ce TrustManager + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + + return sc.getSocketFactory(); +} /** * Tryes to establish a telnet connection. @@ -368,7 +399,13 @@ public class XITelnet { connecting(); try { - ivSocket = new Socket(ivFirstHost, ivPort); + if (getUseSSL() == 1) { + SSLSocketFactory factory = getTrustAllFactory(); //(SSLSocketFactory) SSLSocketFactory.getDefault(); + ivSocket = factory.createSocket(ivFirstHost, ivPort); + ((SSLSocket)ivSocket).startHandshake(); // Déclenche le chiffrement + } else { + ivSocket = new Socket(ivFirstHost, ivPort); + } ivSocket.setKeepAlive(true); ivIn = ivSocket.getInputStream(); @@ -396,6 +433,11 @@ public class XITelnet { catch (IOException ex) { catchedIOException(ex); } + catch (Exception e) { + System.err.println("Erreur connexion l429 " + e.getMessage()); + e.printStackTrace(); + return; + } }