Index: jdbc/build.xml =================================================================== RCS file: /cvsroot/pgsql-server/src/interfaces/jdbc/build.xml,v retrieving revision 1.31 diff -c -r1.31 build.xml *** jdbc/build.xml 11 Dec 2002 12:27:47 -0000 1.31 --- jdbc/build.xml 27 Feb 2003 05:38:30 -0000 *************** *** 22,27 **** --- 22,28 ---- + *************** *** 47,52 **** --- 48,54 ---- + *************** *** 160,171 **** ! --- 162,188 ---- + + + + + + + + + + + + + + ! + *************** *** 181,187 **** tofile="${package}/Driver.java" filtering="yes" /> ! --- 198,204 ---- tofile="${package}/Driver.java" filtering="yes" /> ! Index: jdbc/org/postgresql/Driver.java.in =================================================================== RCS file: /cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/Driver.java.in,v retrieving revision 1.24 diff -c -r1.24 Driver.java.in *** jdbc/org/postgresql/Driver.java.in 9 Feb 2003 23:45:45 -0000 1.24 --- jdbc/org/postgresql/Driver.java.in 27 Feb 2003 05:38:31 -0000 *************** *** 1,5 **** --- 1,6 ---- package org.postgresql; + import java.io.*; import java.sql.*; import java.util.*; *************** *** 66,80 **** * * user - (optional) The user to connect as * password - (optional) The password for the user * charSet - (optional) The character set to be used for converting * to/from the database to unicode. If multibyte is enabled on the * server then the character set of the database is used as the default, * otherwise the jvm character encoding is used as the default. ! * loglevel - (optional) Enable logging of messages from the driver. ! * The value is an integer from 1 to 2 where: ! * INFO = 1, DEBUG = 2 ! * The output is sent to DriverManager.getPrintWriter() if set, ! * otherwise it is sent to System.out. * compatible - (optional) This is used to toggle * between different functionality as it changes across different releases * of the jdbc driver code. The values here are versions of the jdbc --- 67,83 ---- * * user - (optional) The user to connect as * password - (optional) The password for the user + * ssl - (optional) Use SSL when connecting to the server * charSet - (optional) The character set to be used for converting * to/from the database to unicode. If multibyte is enabled on the * server then the character set of the database is used as the default, * otherwise the jvm character encoding is used as the default. ! * This value is only used when connecting to a 7.2 or older server. ! * loglevel - (optional) Enable logging of messages from the driver. ! * The value is an integer from 1 to 2 where: ! * INFO = 1, DEBUG = 2 ! * The output is sent to DriverManager.getPrintWriter() if set, ! * otherwise it is sent to System.out. * compatible - (optional) This is used to toggle * between different functionality as it changes across different releases * of the jdbc driver code. The values here are versions of the jdbc *************** *** 136,143 **** } catch (Exception ex2) { ! if (Driver.logDebug) Driver.debug("error", ex2); throw new PSQLException("postgresql.unusual", ex2); } } --- 139,147 ---- } catch (Exception ex2) { ! if (Driver.logDebug) { Driver.debug("error", ex2); + } throw new PSQLException("postgresql.unusual", ex2); } } *************** *** 211,217 **** */ public static String getVersion() { ! return "@VERSION@ jdbc driver build " + m_buildNumber; } /* --- 215,221 ---- */ public static String getVersion() { ! return "@VERSION@ (build " + m_buildNumber + ")"; } /* *************** *** 248,254 **** String key = ""; String value = ""; ! StringTokenizer st = new StringTokenizer(url, ":/;=&?", true); for (int count = 0; (st.hasMoreTokens()); count++) { String token = st.nextToken(); --- 252,268 ---- String key = ""; String value = ""; ! String l_urlServer = url; ! String l_urlArgs = ""; ! ! int l_qPos = url.indexOf('?'); ! if (l_qPos != -1) { ! l_urlServer = url.substring(0,l_qPos); ! l_urlArgs = url.substring(l_qPos+1); ! } ! ! //parse the server part of the url ! StringTokenizer st = new StringTokenizer(l_urlServer, ":/", true); for (int count = 0; (st.hasMoreTokens()); count++) { String token = st.nextToken(); *************** *** 318,342 **** urlProps.put("PGDBNAME", token); state = -2; } ! else if (state <= -2 && (count % 2) == 1) ! { ! // PM Aug 2 1997 - added tests for ? and & ! if (token.equals(";") || token.equals("?") || token.equals("&") ) ! state = -3; ! else if (token.equals("=")) ! state = -5; ! } ! else if (state <= -2 && (count % 2) == 0) ! { ! if (state == -3) ! key = token; ! else if (state == -5) ! { ! value = token; ! urlProps.put(key, value); ! state = -2; ! } ! } } } --- 332,350 ---- urlProps.put("PGDBNAME", token); state = -2; } ! } ! } ! ! //parse the args part of the url ! StringTokenizer qst = new StringTokenizer(l_urlArgs, "&"); ! for (int count = 0; (qst.hasMoreTokens()); count++) ! { ! String token = qst.nextToken(); ! int l_pos = token.indexOf('='); ! if (l_pos == -1) { ! urlProps.put(token, ""); ! } else { ! urlProps.put(token.substring(0,l_pos), token.substring(l_pos+1)); } } *************** *** 419,425 **** { if (logDebug) { ! DriverManager.println(msg + ex != null ? ex.getMessage() : "null Exception"); } } /* --- 427,436 ---- { if (logDebug) { ! DriverManager.println(msg); ! if(ex != null) { ! DriverManager.println(ex.toString()); ! } } } /* *************** *** 441,449 **** { if (logInfo) { ! DriverManager.println(msg + ex != null ? ex.getMessage() : "null Exception"); } } //The build number should be incremented for every new build private static int m_buildNumber = 201; --- 452,480 ---- { if (logInfo) { ! DriverManager.println(msg); ! if(ex != null) { ! DriverManager.println(ex.toString()); ! } } } + + + public static void makeSSL(PG_Stream p_stream) throws IOException { + @SSL@ if (logDebug) + @SSL@ debug("converting regular socket connection to ssl"); + @SSL@ javax.net.ssl.SSLSocketFactory factory = (javax.net.ssl.SSLSocketFactory) javax.net.ssl.SSLSocketFactory.getDefault(); + @SSL@ p_stream.connection = (javax.net.ssl.SSLSocket) factory.createSocket(p_stream.connection,p_stream.host,p_stream.port,true); + @SSL@ p_stream.pg_input = new BufferedInputStream(p_stream.connection.getInputStream(), 8192); + @SSL@ p_stream.pg_output = new BufferedOutputStream(p_stream.connection.getOutputStream(), 8192); + } + + public static boolean sslEnabled() { + boolean l_return = false; + @SSL@ l_return = true; + return l_return; + } + //The build number should be incremented for every new build private static int m_buildNumber = 201; Index: jdbc/org/postgresql/PG_Stream.java =================================================================== RCS file: /cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/PG_Stream.java,v retrieving revision 1.17 diff -c -r1.17 PG_Stream.java *** jdbc/org/postgresql/PG_Stream.java 20 Aug 2002 04:26:02 -0000 1.17 --- jdbc/org/postgresql/PG_Stream.java 27 Feb 2003 05:38:31 -0000 *************** *** 20,28 **** // This class handles all the Streamed I/O for a org.postgresql connection public class PG_Stream { ! private Socket connection; ! private InputStream pg_input; ! private BufferedOutputStream pg_output; private byte[] byte_buf = new byte[8*1024]; /* --- 20,30 ---- // This class handles all the Streamed I/O for a org.postgresql connection public class PG_Stream { ! public String host; ! public int port; ! public Socket connection; ! public InputStream pg_input; ! public BufferedOutputStream pg_output; private byte[] byte_buf = new byte[8*1024]; /* *************** *** 33,40 **** * @param port the port number that the postmaster is sitting on * @exception IOException if an IOException occurs below it. */ ! public PG_Stream(String host, int port) throws IOException { connection = new Socket(host, port); // Submitted by Jason Venner adds a 10x speed --- 35,44 ---- * @param port the port number that the postmaster is sitting on * @exception IOException if an IOException occurs below it. */ ! public PG_Stream(String p_host, int p_port) throws IOException { + host = p_host; + port = p_port; connection = new Socket(host, port); // Submitted by Jason Venner adds a 10x speed Index: jdbc/org/postgresql/errors.properties =================================================================== RCS file: /cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/errors.properties,v retrieving revision 1.17 diff -c -r1.17 errors.properties *** jdbc/org/postgresql/errors.properties 12 Feb 2003 06:13:04 -0000 1.17 --- jdbc/org/postgresql/errors.properties 27 Feb 2003 05:38:31 -0000 *************** *** 19,24 **** --- 19,26 ---- postgresql.con.pass:The password property is missing. It is mandatory. postgresql.con.refused:Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. postgresql.con.setup:Protocol error. Session setup failed. + postgresql.con.sslfail:An error occured while getting setting up the SSL connection. + postgresql.con.sslnotsupported:The server does not support SSL postgresql.con.strobj:The object could not be stored. Check that any tables required have already been created in the database. postgresql.con.strobjex:Failed to store object - {0} postgresql.con.toolong:The SQL Statement is too long - {0} Index: jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java =================================================================== RCS file: /cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java,v retrieving revision 1.15 diff -c -r1.15 AbstractJdbc1Connection.java *** jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java 5 Feb 2003 11:12:39 -0000 1.15 --- jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java 27 Feb 2003 05:38:32 -0000 *************** *** 34,39 **** --- 34,40 ---- protected String PG_DATABASE; protected boolean PG_STATUS; protected String compatible; + protected boolean useSSL; // The PID an cancellation key we get from the backend process protected int pid; *************** *** 100,106 **** * @exception SQLException if a database access error occurs */ public void openConnection(String host, int port, Properties info, String database, String url, org.postgresql.Driver d) throws SQLException ! { firstWarning = null; // Throw an exception if the user or password properties are missing --- 101,107 ---- * @exception SQLException if a database access error occurs */ public void openConnection(String host, int port, Properties info, String database, String url, org.postgresql.Driver d) throws SQLException ! { firstWarning = null; // Throw an exception if the user or password properties are missing *************** *** 121,126 **** --- 122,136 ---- PG_HOST = host; PG_STATUS = CONNECTION_BAD; + if (info.getProperty("ssl") != null && this_driver.sslEnabled()) + { + useSSL = true; + } + else + { + useSSL = false; + } + if (info.getProperty("compatible") == null) { compatible = d.getMajorVersion() + "." + d.getMinorVersion(); *************** *** 156,161 **** --- 166,176 ---- //Print out the driver version number if (org.postgresql.Driver.logInfo) org.postgresql.Driver.info(org.postgresql.Driver.getVersion()); + if (org.postgresql.Driver.logDebug) { + org.postgresql.Driver.debug(" ssl = " + useSSL); + org.postgresql.Driver.debug(" compatible = " + compatible); + org.postgresql.Driver.debug(" loglevel = " + l_logLevel); + } // Now make the initial connection try *************** *** 173,178 **** --- 188,243 ---- { throw new PSQLException ("postgresql.con.failed", e); } + + // Now we need to construct and send an ssl startup packet + try + { + if (useSSL) { + if (org.postgresql.Driver.logDebug) + org.postgresql.Driver.debug("Asking server if it supports ssl"); + pg_stream.SendInteger(8,4); + pg_stream.SendInteger(80877103,4); + + // now flush the ssl packets to the backend + pg_stream.flush(); + + // Now get the response from the backend, either an error message + // or an authentication request + int beresp = pg_stream.ReceiveChar(); + if (org.postgresql.Driver.logDebug) + org.postgresql.Driver.debug("Server response was (S=Yes,N=No): "+(char)beresp); + switch (beresp) + { + case 'E': + // An error occured, so pass the error message to the + // user. + // + // The most common one to be thrown here is: + // "User authentication failed" + // + throw new PSQLException("postgresql.con.misc", pg_stream.ReceiveString(encoding)); + + case 'N': + // Server does not support ssl + throw new PSQLException("postgresql.con.sslnotsupported"); + + case 'S': + // Server supports ssl + if (org.postgresql.Driver.logDebug) + org.postgresql.Driver.debug("server does support ssl"); + org.postgresql.Driver.makeSSL(pg_stream); + break; + + default: + throw new PSQLException("postgresql.con.sslfail"); + } + } + } + catch (IOException e) + { + throw new PSQLException("postgresql.con.failed", e); + } + // Now we need to construct and send a startup packet try Index: jdbc/org/postgresql/util/PSQLException.java =================================================================== RCS file: /cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/util/PSQLException.java,v retrieving revision 1.7 diff -c -r1.7 PSQLException.java *** jdbc/org/postgresql/util/PSQLException.java 19 Nov 2001 22:33:39 -0000 1.7 --- jdbc/org/postgresql/util/PSQLException.java 27 Feb 2003 05:38:33 -0000 *************** *** 27,33 **** */ public PSQLException(String error, Object[] args) { ! //super(); translate(error, args); } --- 27,33 ---- */ public PSQLException(String error, Object[] args) { ! super(); translate(error, args); }