Kaynağa Gözat

Added SSL support to Parser. (Trusts ALL certificates at present, this can be worked on)

No longer waits for first line from server before sending NICK/USER/PASS (this can be overridden by setting 
waitForFirst in the ServerInfo object)


git-svn-id: http://svn.dmdirc.com/trunk@239 00569f92-eb28-0410-84fd-f71c24880f
tags/0.2
Shane Mc Cormack 17 yıl önce
ebeveyn
işleme
a460cd1c22

+ 50
- 13
src/uk/org/ownage/dmdirc/parser/IRCParser.java Dosyayı Görüntüle

@@ -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) {

+ 3
- 0
src/uk/org/ownage/dmdirc/parser/ServerInfo.java Dosyayı Görüntüle

@@ -41,6 +41,9 @@ public class ServerInfo {
41 41
 	public int nPort = 6667;
42 42
 	/** Is this an ssl-enabled server (Default: false). */
43 43
 	public boolean bSSL = false;	
44
+	/** Do we need to wait for input before sending Nick/User/Pass (Default: false). */
45
+	public boolean waitForFirst = false;
46
+	
44 47
 	
45 48
 	/** Constructor using Default values. */
46 49
 	public ServerInfo () { }

Loading…
İptal
Kaydet