From 76a9922e928c274794f31b47b49888561f593632 Mon Sep 17 00:00:00 2001 From: Pavel Kajaba Date: Thu, 7 Apr 2016 10:56:40 +0200 Subject: Update to version 1208 --- 0001-Disable-SSPI-under-Linux.patch | 113 +++++++++++++++ SSPIClient.patch | 268 ------------------------------------ build.patch | 154 --------------------- postgresql-jdbc.pom | 23 ---- postgresql-jdbc.spec | 88 +++++------- 5 files changed, 148 insertions(+), 498 deletions(-) create mode 100644 0001-Disable-SSPI-under-Linux.patch delete mode 100644 SSPIClient.patch delete mode 100644 build.patch delete mode 100644 postgresql-jdbc.pom diff --git a/0001-Disable-SSPI-under-Linux.patch b/0001-Disable-SSPI-under-Linux.patch new file mode 100644 index 0000000..c1e1aca --- /dev/null +++ b/0001-Disable-SSPI-under-Linux.patch @@ -0,0 +1,113 @@ +diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java b/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java +index fec5bb0..f6d81d5 100644 +--- a/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java ++++ b/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java +@@ -24,7 +24,7 @@ import org.postgresql.hostchooser.HostChooser; + import org.postgresql.hostchooser.HostChooserFactory; + import org.postgresql.hostchooser.HostRequirement; + import org.postgresql.hostchooser.HostStatus; +-import org.postgresql.sspi.SSPIClient; ++import org.postgresql.sspi.ISSPIClient; + import org.postgresql.util.GT; + import org.postgresql.util.HostSpec; + import org.postgresql.util.MD5Digest; +@@ -68,6 +68,38 @@ public class ConnectionFactoryImpl extends ConnectionFactory { + private static class UnsupportedProtocolException extends IOException { + } + ++ ++ private ISSPIClient SSPIfactory(PGStream pgStream, ++ String spnServiceClass, ++ boolean enableNegotiate, ++ Logger logger) { ++ // arguments to initialize windows version of class ++ Class[] cArg = new Class[4]; ++ cArg[0] = PGStream.class; ++ cArg[1] = String.class; ++ cArg[2] = boolean.class; ++ cArg[3] = Logger.class; ++ ++ Class c = null; ++ String osName = System.getProperty("os.name"); ++ if (osName.startsWith("Linux")) { ++ try { ++ c = Class.forName("org.postgresql.sspi.ISSPIClient"); ++ return (ISSPIClient) c.getDeclaredConstructor().newInstance(); ++ } catch (Throwable e) { ++ logger.info("Unable to find SSPI class for Linux", e); ++ } ++ } else { ++ try { ++ c = Class.forName("org.postgresql.sspi.SSPIClient"); ++ return (ISSPIClient) c.getDeclaredConstructor(cArg).newInstance(pgStream, spnServiceClass, enableNegotiate, logger); ++ } catch (Throwable e) { ++ logger.info("Unable to find SSPI class for Linux", e); ++ } ++ } ++ return null; ++ } ++ + public ProtocolConnection openConnectionImpl(HostSpec[] hostSpecs, String user, String database, + Properties info, Logger logger) throws SQLException { + // Extract interesting values from the info properties: +@@ -404,7 +436,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { + String password = PGProperty.PASSWORD.get(info); + + /* SSPI negotiation state, if used */ +- SSPIClient sspiClient = null; ++ ISSPIClient sspiClient = null; + + try { + authloop: while (true) { +@@ -563,7 +595,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { + "Using JSSE GSSAPI, gssapi requested by server and gsslib=sspi not forced"); + } else { + /* Determine if SSPI is supported by the client */ +- sspiClient = new SSPIClient(pgStream, PGProperty.SSPI_SERVICE_CLASS.get(info), ++ sspiClient = SSPIfactory(pgStream, PGProperty.SSPI_SERVICE_CLASS.get(info), + /* Use negotiation for SSPI, or if explicitly requested for GSS */ + areq == AUTH_REQ_SSPI || (areq == AUTH_REQ_GSS && usespnego), logger); + +diff --git a/pgjdbc/src/main/java/org/postgresql/sspi/ISSPIClient.java b/pgjdbc/src/main/java/org/postgresql/sspi/ISSPIClient.java +new file mode 100644 +index 0000000..27add44 +--- /dev/null ++++ b/pgjdbc/src/main/java/org/postgresql/sspi/ISSPIClient.java +@@ -0,0 +1,37 @@ ++package org.postgresql.sspi; ++ ++import java.io.IOException; ++import java.sql.SQLException; ++ ++import org.postgresql.core.Logger; ++import org.postgresql.core.PGStream; ++import org.postgresql.util.HostSpec; ++import org.postgresql.util.PSQLException; ++import org.postgresql.util.PSQLState; ++ ++/** ++ * Use Waffle-JNI to support SSPI authentication when PgJDBC is running on a Windows ++ * client and talking to a Windows server. ++ * ++ * SSPI is not supported on a non-Windows client. ++ * ++ * ++ * @author craig ++ * ++ */ ++public class ISSPIClient { ++ ++ public boolean isSSPISupported() { ++ return false; ++ } ++ ++ public void startSSPI() throws SQLException, IOException { ++ } ++ ++ public void continueSSPI(int msgLength) throws SQLException, IOException { ++ } ++ ++ public void dispose() { ++ } ++ ++} diff --git a/SSPIClient.patch b/SSPIClient.patch deleted file mode 100644 index 8d37658..0000000 --- a/SSPIClient.patch +++ /dev/null @@ -1,268 +0,0 @@ -diff --git a/org/postgresql/sspi/SSPIClient.java b/org/postgresql/sspi/SSPIClient.java -index 208018a..f71e8c9 100644 ---- a/org/postgresql/sspi/SSPIClient.java -+++ b/org/postgresql/sspi/SSPIClient.java -@@ -9,23 +9,8 @@ import org.postgresql.util.HostSpec; - import org.postgresql.util.PSQLException; - import org.postgresql.util.PSQLState; - --import com.sun.jna.LastErrorException; --import com.sun.jna.Platform; --import com.sun.jna.platform.win32.Sspi; --import com.sun.jna.platform.win32.Sspi.SecBufferDesc; --import com.sun.jna.platform.win32.Win32Exception; -- --import waffle.windows.auth.IWindowsAuthProvider; --import waffle.windows.auth.IWindowsCredentialsHandle; --import waffle.windows.auth.IWindowsSecurityContext; --import waffle.windows.auth.impl.WindowsAccountImpl; --import waffle.windows.auth.impl.WindowsAuthProviderImpl; --import waffle.windows.auth.impl.WindowsCredentialsHandleImpl; --import waffle.windows.auth.impl.WindowsSecurityContextImpl; -- - /** -- * Use Waffle-JNI to support SSPI authentication when PgJDBC is running on a Windows -- * client and talking to a Windows server. -+ * Empty class - * - * SSPI is not supported on a non-Windows client. - * -@@ -35,227 +20,59 @@ import waffle.windows.auth.impl.WindowsSecurityContextImpl; - */ - public class SSPIClient { - -- public static String SSPI_DEFAULT_SPN_SERVICE_CLASS = "POSTGRES"; -- -- private final Logger logger; -- private final PGStream pgStream; -- private final String spnServiceClass; -- private final boolean enableNegotiate; -- -- private IWindowsCredentialsHandle clientCredentials; -- private WindowsSecurityContextImpl sspiContext; -- private String targetName; -- -- - /** - * Instantiate an SSPIClient for authentication of a connection. - * -- * SSPIClient is not re-usable across connections. -- * -- * It is safe to instantiate SSPIClient even if Waffle and JNA are missing -- * or on non-Windows platforms, however you may not call any methods other than -- * isSSPISupported(). -- * - * @param pgStream PostgreSQL connection stream -+ * - * @param spnServiceClass SSPI SPN service class, defaults to POSTGRES if null - * @param logger - */ - public SSPIClient(PGStream pgStream, - String spnServiceClass, - boolean enableNegotiate, -- Logger logger) { -- this.logger = logger; -- this.pgStream = pgStream; -- -- /* If blank or unspecified, SPN service class should be POSTGRES */ -- String realServiceClass = spnServiceClass; -- if (spnServiceClass != null && spnServiceClass.isEmpty()) -- spnServiceClass = null; -- if (spnServiceClass == null) -- spnServiceClass = SSPI_DEFAULT_SPN_SERVICE_CLASS; -- this.spnServiceClass = spnServiceClass; -- -- /* If we're forcing Kerberos (no spnego), disable SSPI negotiation */ -- this.enableNegotiate = enableNegotiate; -- } -+ Logger logger) {} - - /** -- * Test whether we can attempt SSPI authentication. If false, -+ * Empty method, since there is no support for SSPI in Linux. If false, - * do not attempt to call any other SSPIClient methods. - * -- * @return true if it's safe to attempt SSPI authentication -+ * @return always false - */ - public boolean isSSPISupported() { -- try { -- /* -- * SSPI is windows-only. Attempt to use JNA to identify the platform. -- * If Waffle is missing we won't have JNA and this will throw a -- * NoClassDefFoundError. -- */ -- if (!Platform.isWindows()) -- { -- logger.debug("SSPI not supported: non-Windows host"); -- return false; -- } -- /* Waffle must be on the CLASSPATH */ -- Class.forName("waffle.windows.auth.impl.WindowsSecurityContextImpl"); -- return true; -- } catch (NoClassDefFoundError ex) { -- if (logger.logDebug()) -- logger.debug("SSPI unavailable (no Waffle/JNA libraries?)", ex); -- return false; -- } catch (ClassNotFoundException ex) { -- if (logger.logDebug()) -- logger.debug("SSPI unavailable (no Waffle/JNA libraries?)", ex); -- return false; -- } -+ return false; - } - -- private String makeSPN() throws PSQLException -- { -- final HostSpec hs = pgStream.getHostSpec(); -- -- try { -- return NTDSAPIWrapper.instance.DsMakeSpn( -- spnServiceClass, hs.getHost(), -- null, (short)hs.getPort(), null); -- } catch (LastErrorException ex) { -- throw new PSQLException("SSPI setup failed to determine SPN", -- PSQLState.CONNECTION_UNABLE_TO_CONNECT, ex); -- } -+ private String makeSPN() throws PSQLException{ -+ return ""; - } - - - /** -- * Respond to an authentication request from the back-end -- * for SSPI authentication (AUTH_REQ_SSPI). -+ * Not supported on Linux does nothing. - * - * @throws SQLException on SSPI authentication handshake failure - * @throws IOException on network I/O issues - */ - public void startSSPI() throws SQLException, IOException { -- -- /* -- * We usually use SSPI negotiation (spnego), but it's disabled if the client -- * asked for GSSPI and usespngo isn't explicitly turned on. -- */ -- final String securityPackage = enableNegotiate ? "negotiate" : "kerberos"; -- -- logger.debug("Beginning SSPI/Kerberos negotiation with SSPI package: " + securityPackage); -- -- try { -- /* -- * Acquire a handle for the local Windows login credentials for the current user -- * -- * See AcquireCredentialsHandle (http://msdn.microsoft.com/en-us/library/windows/desktop/aa374712%28v=vs.85%29.aspx) -- * -- * This corresponds to pg_SSPI_startup in libpq/fe-auth.c . -- */ -- try { -- clientCredentials = WindowsCredentialsHandleImpl.getCurrent(securityPackage); -- clientCredentials.initialize(); -- } catch (Win32Exception ex) { -- throw new PSQLException( -- "Could not obtain local Windows credentials for SSPI", -- PSQLState.CONNECTION_UNABLE_TO_CONNECT /* TODO: Should be authentication error */, -- ex); -- } -- -- try { -- targetName = makeSPN(); -- -- if (logger.logDebug()) -- { -- logger.debug("SSPI target name: " + targetName); -- } -- -- sspiContext = new WindowsSecurityContextImpl(); -- sspiContext.setPrincipalName(targetName); -- sspiContext.setCredentialsHandle(clientCredentials.getHandle()); -- sspiContext.setSecurityPackage(securityPackage); -- sspiContext.initialize(null, null, targetName); -- } catch (Win32Exception ex) { -- throw new PSQLException( -- "Could not initialize SSPI security context", -- PSQLState.CONNECTION_UNABLE_TO_CONNECT /* TODO: Should be auth error */, -- ex); -- } -- -- sendSSPIResponse(sspiContext.getToken()); -- logger.debug("Sent first SSPI negotiation message"); -- } catch (NoClassDefFoundError ex) { -- throw new PSQLException( -- "SSPI cannot be used, Waffle or its dependencies are missing from the classpath", -- PSQLState.NOT_IMPLEMENTED, ex); -- } - } - - /** -- * Continue an existing authentication conversation with -- * the back-end in resonse to an authentication request -- * of type AUTH_REQ_GSS_CONT. -- * -+ * Not supported on Linux does nothing. -+ * - * @param msgLength Length of message to read, excluding length word and message type word - * @throws SQLException - * @throws IOException - */ - public void continueSSPI(int msgLength) throws SQLException, IOException { -- -- if (sspiContext == null) -- throw new IllegalStateException( -- "Cannot continue SSPI authentication that we didn't begin"); -- -- logger.debug("Continuing SSPI negotiation"); -- -- /* Read the response token from the server */ -- byte[] receivedToken = pgStream.Receive(msgLength); -- -- SecBufferDesc continueToken = new SecBufferDesc(Sspi.SECBUFFER_TOKEN, receivedToken); -- -- sspiContext.initialize(sspiContext.getHandle(), continueToken, targetName); -- -- /* -- * Now send the response token. If negotiation is complete -- * there may be zero bytes to send, in which case we shouldn't -- * send a reply as the server is not expecting one; see fe-auth.c -- * in libpq for details. -- */ -- byte[] responseToken = sspiContext.getToken(); -- if (responseToken.length > 0) -- { -- sendSSPIResponse(responseToken); -- logger.debug("Sent SSPI negotiation continuation message"); -- } else { -- logger.debug("SSPI authentication complete, no reply required"); -- } - } - - private void sendSSPIResponse(byte[] outToken) throws IOException { -- /* -- * The sspiContext now contains a token we can send to the server to -- * start the handshake. Send a 'password' message containing the -- * required data; the server knows we're doing SSPI negotiation -- * and will deal with it appropriately. -- */ -- pgStream.SendChar('p'); -- pgStream.SendInteger4(4 + outToken.length); -- pgStream.Send(outToken); -- pgStream.flush(); - } - - /** -- * Clean up native win32 resources after completion or failure of -- * SSPI authentication. This SSPIClient instance becomes unusable -- * after disposal. -+ * Not supported on Linux does nothing. - */ - public void dispose() { -- if (sspiContext != null) { -- sspiContext.dispose(); -- sspiContext = null; -- } -- if (clientCredentials != null) { -- clientCredentials.dispose(); -- clientCredentials = null; -- } - } - } diff --git a/build.patch b/build.patch deleted file mode 100644 index 1e5f54a..0000000 --- a/build.patch +++ /dev/null @@ -1,154 +0,0 @@ -diff --git a/build.xml b/build.xml -index a93eaae..399fd4d 100644 ---- a/build.xml -+++ b/build.xml -@@ -79,18 +79,14 @@ - - - -- -+ - -- - - - - - - -- -- -- - - - -@@ -218,18 +214,6 @@ - - - -- -- -- -- -- - -@@ -354,13 +338,8 @@ - - - -- - -- -- -- -- -- -+ - - - -@@ -383,34 +362,6 @@ - - - -- -- -- -- -- -- -- --Bundle-ManifestVersion: 2 -- --Bundle-Name: PostgreSQL JDBC Driver ${jdbc.version.upper} --Bundle-SymbolicName: org.postgresql.${jdbc.version} --Bundle-Version: ${osgi.version} -- --Bundle-Vendor: PostgreSQL Global Development Group --Bundle-Copyright: Copyright (c) 2003-2015, PostgreSQL Global Development Group --Bundle-License: http://www.postgresql.org/about/licence/ --Bundle-DocURL: http://jdbc.postgresql.org/ -- --Bundle-Classpath: . --Bundle-Activator: org.postgresql.osgi.PGBundleActivator --Require-Capability: osgi.ee;filter:="(&(|(osgi.ee=J2SE)(osgi.ee=JavaSE))(version>=${java.specification.version}))" --Export-Package: org.postgresql*; version=${fullversion} --Import-Package: javax.sql, javax.transaction.xa, javax.naming, *;resolution:=optional -- -- -- -- -- - - - -@@ -469,14 +420,13 @@ Import-Package: javax.sql, javax.transaction.xa, javax.naming, *;resolution:=opt - - - -- -+ - - - - - -- - - - -@@ -663,13 +613,11 @@ Import-Package: javax.sql, javax.transaction.xa, javax.naming, *;resolution:=opt - - - -+ - - -- -- -- - - - -@@ -712,9 +660,6 @@ Import-Package: javax.sql, javax.transaction.xa, javax.naming, *;resolution:=opt - - - -- -- -- - - - -@@ -835,8 +780,7 @@ Import-Package: javax.sql, javax.transaction.xa, javax.naming, *;resolution:=opt - - - -+ description="Sets the version string for the jar artifact"> - - - -@@ -853,8 +797,7 @@ Import-Package: javax.sql, javax.transaction.xa, javax.naming, *;resolution:=opt - - - -- -+ - - - diff --git a/postgresql-jdbc.pom b/postgresql-jdbc.pom deleted file mode 100644 index a242066..0000000 --- a/postgresql-jdbc.pom +++ /dev/null @@ -1,23 +0,0 @@ - - - 4.0.0 - postgresql - postgresql - jar - PostgreSQL JDBC Driver - - UPSTREAM_VERSION - http://jdbc.postgresql.org - The PostgreSQL Driver JDBC4 - - - BSD License - http://jdbc.postgresql.org/license.html - - repo - - - - http://gborg.postgresql.org/project/pgjdbc/cvs/cvs.php - - diff --git a/postgresql-jdbc.spec b/postgresql-jdbc.spec index 2f4fbf8..87b660f 100644 --- a/postgresql-jdbc.spec +++ b/postgresql-jdbc.spec @@ -29,8 +29,9 @@ # %global section devel -%global upstreamrel 1205 +%global upstreamrel 1208 %global upstreamver 9.4-%{upstreamrel} +%global source_path pgjdbc/src/main/java/org/postgresql Summary: JDBC driver for PostgreSQL Name: postgresql-jdbc @@ -41,23 +42,17 @@ License: BSD and ASL 2.0 Group: Applications/Databases URL: http://jdbc.postgresql.org/ -Source0: http://jdbc.postgresql.org/download/%{name}-%{upstreamver}.src.tar.gz -# originally http://repo2.maven.org/maven2/postgresql/postgresql/8.4-701.jdbc4/postgresql-8.4-701.jdbc4.pom: -Source1: %{name}.pom +Source0: https://jdbc.postgresql.org/download/postgresql-jdbc-%{upstreamver}.src.tar.gz -# Stripped maven from from ant build -Patch0: build.patch - -# Erased parts of code where was required sspi -# sspi is used for authorization but windows only -Patch1: SSPIClient.patch +Patch1: 0001-Disable-SSPI-under-Linux.patch BuildArch: noarch -BuildRequires: java-devel >= 1:1.8 +BuildRequires: java-devel >= 1.8 BuildRequires: jpackage-utils -BuildRequires: ant -BuildRequires: ant-junit -BuildRequires: junit +BuildRequires: maven-local +BuildRequires: java-comment-preprocessor +BuildRequires: postgresql-jdbc-parent-poms +BuildRequires: properties-maven-plugin # gettext is only needed if we try to update translations #BuildRequires: gettext Requires: jpackage-utils @@ -77,59 +72,48 @@ This package contains the API Documentation for %{name}. %prep %setup -c -q -rm -f %{name}-%{upstreamver}.src/org/postgresql/sspi/NTDSAPI.java -rm -f %{name}-%{upstreamver}.src/org/postgresql/sspi/NTDSAPIWrapper.java -rm -f %{name}-%{upstreamver}.src/org/postgresql/osgi/* -mv -f %{name}-%{upstreamver}.src/* . -rm -f %{name}-%{upstreamver}.src/.gitattributes -rm -f %{name}-%{upstreamver}.src/.gitignore -rm -f %{name}-%{upstreamver}.src/.travis.yml -rmdir %{name}-%{upstreamver}.src +# there are no dependencies for SSPI and OSGi so these files +# has to be deleted in order to build it +rm -f postgresql-jdbc-%{upstreamver}.src/%{source_path}/sspi/NTDSAPI.java +rm -f postgresql-jdbc-%{upstreamver}.src/%{source_path}/sspi/NTDSAPIWrapper.java +rm -f postgresql-jdbc-%{upstreamver}.src/%{source_path}/sspi/SSPIClient.java +rm -f postgresql-jdbc-%{upstreamver}.src/%{source_path}/osgi/* + +rm -f postgresql-jdbc-%{upstreamver}.src/.gitignore +rm -f postgresql-jdbc-%{upstreamver}.src/.travis.yml +# this may not be necessary if release is source from official release +rm -f postgresql-jdbc-%{upstreamver}.src/.gitattributes +mv -f postgresql-jdbc-%{upstreamver}.src/* . +rmdir postgresql-jdbc-%{upstreamver}.src/ # remove any binary libs find -name "*.jar" -or -name "*.class" | xargs rm -f -%patch0 -p1 -b .revert-travis-fix -%patch1 -p1 +pwd +%patch1 -p1 +%pom_disable_module ubenchmark %build -export OPT_JAR_LIST="ant/ant-junit junit" -export CLASSPATH= - # Ideally we would run "sh update-translations.sh" here, but that results # in inserting the build timestamp into the generated messages_*.class # files, which makes rpmdiff complain about multilib conflicts if the # different platforms don't build in the same minute. For now, rely on # upstream to have updated the translations files before packaging. -ant jar publicapi +%mvn_build -f %install -install -d $RPM_BUILD_ROOT%{_javadir} -# Per jpp conventions, jars have version-numbered names and we add -# versionless symlinks. -install -m 644 jars/postgresql-%{upstreamver}.jdbc42.jar $RPM_BUILD_ROOT%{_javadir}/%{name}.jar - +%mvn_install pushd $RPM_BUILD_ROOT%{_javadir} # Also, for backwards compatibility with our old postgresql-jdbc packages, # add these symlinks. (Probably only the jdbc3 symlink really makes sense?) -ln -s postgresql-jdbc.jar postgresql-jdbc2.jar -ln -s postgresql-jdbc.jar postgresql-jdbc2ee.jar -ln -s postgresql-jdbc.jar postgresql-jdbc3.jar +ln -s %{name}/postgresql.jar postgresql-jdbc.jar +ln -s %{name}/postgresql.jar postgresql-jdbc2.jar +ln -s %{name}/postgresql.jar postgresql-jdbc2ee.jar +ln -s %{name}/postgresql.jar postgresql-jdbc3.jar popd -# Install the pom after inserting the correct version number -sed 's/UPSTREAM_VERSION/%{upstreamver}/g' %{SOURCE1} >JPP-%{name}.pom -install -d -m 755 $RPM_BUILD_ROOT%{_mavenpomdir}/ -install -m 644 JPP-%{name}.pom $RPM_BUILD_ROOT%{_mavenpomdir}/JPP-%{name}.pom -%add_maven_depmap - -install -d -m 755 $RPM_BUILD_ROOT%{_javadocdir} -cp -ra build/publicapi $RPM_BUILD_ROOT%{_javadocdir}/%{name} -install -d build/publicapi docs/%{name} - - %check %if 0%{?runselftest} # Note that this requires to have PostgreSQL properly configured; for this @@ -141,21 +125,19 @@ ant test 2>&1 | tee "$test_log" || : %endif - %files -f .mfiles -%doc LICENSE README.md doc/* +%license LICENSE +%doc README.md +%{_javadir}/%{name}.jar %{_javadir}/%{name}2.jar %{_javadir}/%{name}2ee.jar %{_javadir}/%{name}3.jar %files javadoc -%doc LICENSE +%license LICENSE %doc %{_javadocdir}/%{name} %changelog -* Wed Nov 25 2015 Pavel Kajaba - 9.4.1205-1 -- Stripped osgi and sspi. Rebased to most recent version - * Thu Jun 18 2015 Fedora Release Engineering - 9.4.1200-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild -- cgit