|
@@ -24,7 +24,6 @@
|
24
|
24
|
|
25
|
25
|
package uk.org.ownage.dmdirc.parser;
|
26
|
26
|
|
27
|
|
-
|
28
|
27
|
import uk.org.ownage.dmdirc.parser.callbacks.interfaces.*;
|
29
|
28
|
import uk.org.ownage.dmdirc.parser.callbacks.*;
|
30
|
29
|
import java.io.BufferedReader;
|
|
@@ -33,7 +32,11 @@ import java.io.InputStreamReader;
|
33
|
32
|
import java.io.PrintWriter;
|
34
|
33
|
import java.net.Socket;
|
35
|
34
|
import java.net.UnknownHostException;
|
|
35
|
+import javax.net.ssl.SSLContext;
|
36
|
36
|
import javax.net.ssl.SSLSocketFactory;
|
|
37
|
+import javax.net.ssl.SSLSocket;
|
|
38
|
+import javax.net.ssl.X509TrustManager;
|
|
39
|
+import javax.net.ssl.TrustManager;
|
37
|
40
|
import javax.net.SocketFactory;
|
38
|
41
|
import java.util.ArrayList;
|
39
|
42
|
import java.util.Arrays;
|
|
@@ -91,6 +94,8 @@ public class IRCParser implements Runnable {
|
91
|
94
|
|
92
|
95
|
/** This is the socket used for reading from/writing to the IRC server. */
|
93
|
96
|
private Socket socket = null;
|
|
97
|
+ /** This is the socket used for reading from/writing to the IRC server when using SSL. */
|
|
98
|
+ private SSLSocket sslSocket = null;
|
94
|
99
|
/** Used for writing to the server. */
|
95
|
100
|
private PrintWriter out = null;
|
96
|
101
|
/** Used for reading from the server. */
|
|
@@ -765,28 +770,64 @@ public class IRCParser implements Runnable {
|
765
|
770
|
nNextKeyCMBool = 1;
|
766
|
771
|
nNextKeyUser = 1;
|
767
|
772
|
}
|
|
773
|
+
|
768
|
774
|
|
769
|
775
|
/** Connect to IRC. */
|
770
|
776
|
private void connect() throws Exception {
|
771
|
777
|
try {
|
772
|
778
|
resetState();
|
773
|
779
|
callDebugInfo(ndSocket,"Connecting to "+server.sHost+":"+server.nPort);
|
774
|
|
-
|
|
780
|
+
|
775
|
781
|
if (server.bSSL) {
|
776
|
|
- SocketFactory socketFactory = SSLSocketFactory.getDefault();
|
777
|
|
- socket = socketFactory.createSocket(server.sHost,server.nPort);
|
|
782
|
+ callDebugInfo(ndSocket,"Server is SSL.");
|
|
783
|
+
|
|
784
|
+ // Create a trust manager that does not validate certificate chains
|
|
785
|
+ TrustManager[] trustAllCerts = new TrustManager[]{
|
|
786
|
+ new X509TrustManager() {
|
|
787
|
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
|
|
788
|
+ return null;
|
|
789
|
+ }
|
|
790
|
+ public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
|
|
791
|
+ }
|
|
792
|
+ public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
|
|
793
|
+ }
|
|
794
|
+ }
|
|
795
|
+ };
|
|
796
|
+
|
|
797
|
+ SSLContext sc = SSLContext.getInstance("SSL");
|
|
798
|
+ sc.init(null, trustAllCerts, new java.security.SecureRandom());
|
|
799
|
+
|
|
800
|
+ SocketFactory socketFactory = sc.getSocketFactory();
|
|
801
|
+ sslSocket = (SSLSocket)socketFactory.createSocket(server.sHost,server.nPort);
|
|
802
|
+ //sslSocket.startHandshake();
|
|
803
|
+
|
|
804
|
+ socket = sslSocket;
|
778
|
805
|
} else {
|
779
|
806
|
socket = new Socket(server.sHost,server.nPort);
|
780
|
807
|
}
|
|
808
|
+
|
781
|
809
|
if (bDebug) { doDebug("\t\t-> 1\n"); }
|
782
|
810
|
out = new PrintWriter(socket.getOutputStream(), true);
|
783
|
811
|
nSocketState = stateOpen;
|
784
|
812
|
if (bDebug) { doDebug("\t\t-> 2\n"); }
|
785
|
813
|
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
786
|
814
|
if (bDebug) { doDebug("\t\t-> 3\n"); }
|
|
815
|
+
|
787
|
816
|
} catch (Exception e) { throw e; }
|
788
|
817
|
}
|
789
|
818
|
|
|
819
|
+ /**
|
|
820
|
+ * Send server connection strings (NICK/USER/PASS)
|
|
821
|
+ */
|
|
822
|
+ private void sendConnectionStrings() {
|
|
823
|
+ if (!server.sPassword.equals("")) {
|
|
824
|
+ sendString("PASS "+server.sPassword);
|
|
825
|
+ }
|
|
826
|
+ setNickname(me.sNickname);
|
|
827
|
+ sendString("USER "+me.sUsername.toLowerCase()+" * * :"+me.sRealname);
|
|
828
|
+ IsFirst = false;
|
|
829
|
+ }
|
|
830
|
+
|
790
|
831
|
/**
|
791
|
832
|
* Begin execution.
|
792
|
833
|
* Connect to server, and start parsing incomming lines
|
|
@@ -795,8 +836,11 @@ public class IRCParser implements Runnable {
|
795
|
836
|
callDebugInfo(ndInfo,"Begin Thread Execution");
|
796
|
837
|
if (HasBegan) { return; } else { HasBegan = true; }
|
797
|
838
|
try { connect(); } catch (Exception e) { callDebugInfo(ndSocket,"Error Connecting, Aborted"); return; }
|
798
|
|
- // :HACK: While true loops really really suck.
|
|
839
|
+
|
799
|
840
|
callDebugInfo(ndSocket,"Socket Connected");
|
|
841
|
+
|
|
842
|
+ if (!server.waitForFirst) { sendConnectionStrings(); }
|
|
843
|
+
|
800
|
844
|
String line = "";
|
801
|
845
|
while(true) {
|
802
|
846
|
try {
|
|
@@ -806,14 +850,7 @@ public class IRCParser implements Runnable {
|
806
|
850
|
nSocketState = stateClosed;
|
807
|
851
|
break;
|
808
|
852
|
} else {
|
809
|
|
- if (IsFirst) {
|
810
|
|
- if (!server.sPassword.equals("")) {
|
811
|
|
- sendString("PASS "+server.sPassword);
|
812
|
|
- }
|
813
|
|
- setNickname(me.sNickname);
|
814
|
|
- sendString("USER "+me.sUsername.toLowerCase()+" * * :"+me.sRealname);
|
815
|
|
- IsFirst = false;
|
816
|
|
- }
|
|
853
|
+ if (IsFirst) { sendConnectionStrings(); }
|
817
|
854
|
processLine(line);
|
818
|
855
|
}
|
819
|
856
|
} catch (IOException e) {
|