mirror of
https://github.com/igniterealtime/Spark.git
synced 2025-10-29 11:47:01 +00:00
Merge pull request #817 from guusdk/SPARK-2326_Upgrade-httpclient
SPARK-2326: Upgrade Apache HttpClient from 3.1 to 5.2.1
This commit is contained in:
commit
41d4c19d38
@ -164,9 +164,9 @@
|
||||
<version>2.1.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-httpclient</groupId>
|
||||
<artifactId>commons-httpclient</artifactId>
|
||||
<version>3.1</version>
|
||||
<groupId>org.apache.httpcomponents.client5</groupId>
|
||||
<artifactId>httpclient5</artifactId>
|
||||
<version>5.2.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
|
||||
@ -15,9 +15,12 @@
|
||||
*/
|
||||
package org.jivesoftware.sparkimpl.plugin.viewer;
|
||||
|
||||
import org.apache.commons.httpclient.HttpClient;
|
||||
import org.apache.commons.httpclient.methods.GetMethod;
|
||||
import org.apache.commons.httpclient.protocol.Protocol;
|
||||
import org.apache.hc.client5.http.classic.methods.HttpGet;
|
||||
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
|
||||
import org.apache.hc.client5.http.impl.classic.HttpClients;
|
||||
import org.apache.hc.core5.http.HttpEntity;
|
||||
import org.apache.hc.core5.http.HttpHost;
|
||||
import org.apache.hc.core5.http.io.entity.EntityUtils;
|
||||
import org.dom4j.Document;
|
||||
import org.dom4j.DocumentException;
|
||||
import org.dom4j.Element;
|
||||
@ -42,7 +45,7 @@ import org.jivesoftware.sparkimpl.plugin.manager.Enterprise;
|
||||
import org.jivesoftware.sparkimpl.settings.JiveInfo;
|
||||
import org.jivesoftware.sparkimpl.settings.local.LocalPreferences;
|
||||
import org.jivesoftware.sparkimpl.settings.local.SettingsManager;
|
||||
import org.jivesoftware.sparkimpl.updater.EasySSLProtocolSocketFactory;
|
||||
import org.jivesoftware.sparkimpl.updater.AcceptAllCertsConnectionManager;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import javax.swing.*;
|
||||
@ -300,47 +303,41 @@ public class PluginViewer extends JPanel implements Plugin
|
||||
@Override
|
||||
public Object construct()
|
||||
{
|
||||
// Prepare HTTP post
|
||||
final GetMethod post = new GetMethod( retrieveListURL );
|
||||
|
||||
// Get HTTP client
|
||||
Protocol.registerProtocol( "https", new Protocol( "https", new EasySSLProtocolSocketFactory(), 443 ) );
|
||||
final HttpClient httpclient = new HttpClient();
|
||||
final HttpGet request = new HttpGet(retrieveListURL);
|
||||
|
||||
HttpHost proxy = null;
|
||||
if ( Default.getBoolean( Default.PLUGIN_REPOSITORY_USE_PROXY ) )
|
||||
{
|
||||
String proxyHost = System.getProperty( "http.proxyHost" );
|
||||
String proxyPort = System.getProperty( "http.proxyPort" );
|
||||
if ( ModelUtil.hasLength( proxyHost ) && ModelUtil.hasLength( proxyPort ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
httpclient.getHostConfiguration().setProxy( proxyHost, Integer.parseInt( proxyPort ) );
|
||||
}
|
||||
catch ( NumberFormatException e )
|
||||
{
|
||||
if ( ModelUtil.hasLength( proxyHost ) && ModelUtil.hasLength(proxyPort) ) {
|
||||
try{
|
||||
proxy = new HttpHost(proxyHost, Integer.parseInt(proxyPort));
|
||||
} catch ( NumberFormatException e ) {
|
||||
Log.error( e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Execute request
|
||||
|
||||
try
|
||||
{
|
||||
int result = httpclient.executeMethod( post );
|
||||
if ( result != 200 )
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
pluginList = getPluginList( post.getResponseBodyAsStream() );
|
||||
try (final CloseableHttpClient httpClient =
|
||||
HttpClients.custom()
|
||||
.setConnectionManager(AcceptAllCertsConnectionManager.getInstance())
|
||||
.setProxy(proxy)
|
||||
.build();
|
||||
) {
|
||||
return httpClient.execute(request, response -> {
|
||||
if (response.getCode() != 200) {
|
||||
return null;
|
||||
}
|
||||
final HttpEntity entity = response.getEntity();
|
||||
pluginList = getPluginList( entity.getContent() );
|
||||
EntityUtils.consume(entity);
|
||||
return "ok";
|
||||
});
|
||||
} catch (Exception e) {
|
||||
Log.error(e);
|
||||
return e.getMessage();
|
||||
}
|
||||
catch ( Exception ex )
|
||||
{
|
||||
// Nothing to do
|
||||
}
|
||||
return "ok";
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -383,126 +380,107 @@ public class PluginViewer extends JPanel implements Plugin
|
||||
|
||||
private void downloadPlugin( final PublicPlugin plugin )
|
||||
{
|
||||
// Prepare HTTP post
|
||||
final GetMethod post = new GetMethod( plugin.getDownloadURL() );
|
||||
|
||||
// Get HTTP client
|
||||
Protocol.registerProtocol( "https", new Protocol( "https", new EasySSLProtocolSocketFactory(), 443 ) );
|
||||
final HttpClient httpclient = new HttpClient();
|
||||
String proxyHost = System.getProperty( "http.proxyHost" );
|
||||
String proxyPort = System.getProperty( "http.proxyPort" );
|
||||
final HttpGet request = new HttpGet(plugin.getDownloadURL());
|
||||
|
||||
HttpHost proxy = null;
|
||||
if ( Default.getBoolean( Default.PLUGIN_REPOSITORY_USE_PROXY ) )
|
||||
{
|
||||
if ( ModelUtil.hasLength( proxyHost )
|
||||
&& ModelUtil.hasLength( proxyPort ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
httpclient.getHostConfiguration().setProxy( proxyHost,
|
||||
Integer.parseInt( proxyPort ) );
|
||||
}
|
||||
catch ( NumberFormatException e )
|
||||
{
|
||||
String proxyHost = System.getProperty( "http.proxyHost" );
|
||||
String proxyPort = System.getProperty( "http.proxyPort" );
|
||||
if ( ModelUtil.hasLength( proxyHost ) && ModelUtil.hasLength(proxyPort) ) {
|
||||
try{
|
||||
proxy = new HttpHost(proxyHost, Integer.parseInt(proxyPort));
|
||||
} catch ( NumberFormatException e ) {
|
||||
Log.error( e );
|
||||
}
|
||||
}
|
||||
}
|
||||
// Execute request
|
||||
|
||||
try (final CloseableHttpClient httpClient =
|
||||
HttpClients.custom()
|
||||
.setConnectionManager(AcceptAllCertsConnectionManager.getInstance())
|
||||
.setProxy(proxy)
|
||||
.build();
|
||||
) {
|
||||
httpClient.execute(request, response -> {
|
||||
if (response.getCode() != 200) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final HttpEntity entity = response.getEntity();
|
||||
|
||||
progressBar = new JProgressBar( 0, (int) entity.getContentLength());
|
||||
|
||||
final JFrame frame = new JFrame( Res.getString( "message.downloading", plugin.getName() ) );
|
||||
|
||||
frame.setIconImage( SparkRes.getImageIcon( SparkRes.SMALL_MESSAGE_IMAGE ).getImage() );
|
||||
|
||||
try
|
||||
{
|
||||
Thread.sleep( 2000 );
|
||||
InputStream stream = entity.getContent();
|
||||
|
||||
URL url = new URL( plugin.getDownloadURL() );
|
||||
String name1 = URLFileSystem.getFileName( url );
|
||||
String directoryName = URLFileSystem.getName( url );
|
||||
|
||||
File pluginDownload = new File( PluginManager.PLUGINS_DIRECTORY, name1 );
|
||||
|
||||
FileOutputStream out = new FileOutputStream( pluginDownload );
|
||||
copy( stream, out );
|
||||
out.close();
|
||||
|
||||
frame.dispose();
|
||||
|
||||
// Remove SparkPlugUI
|
||||
// Clear all selections
|
||||
Component[] comps = availablePanel.getComponents();
|
||||
for ( Component comp : comps )
|
||||
{
|
||||
if ( comp instanceof SparkPlugUI )
|
||||
{
|
||||
SparkPlugUI sparkPlug = (SparkPlugUI) comp;
|
||||
if ( sparkPlug.getPlugin().getDownloadURL().equals( plugin.getDownloadURL() ) )
|
||||
{
|
||||
availablePanel.remove( sparkPlug );
|
||||
|
||||
_deactivatedPlugins.remove( sparkPlug.getPlugin().getName() );
|
||||
_prefs.setDeactivatedPlugins( _deactivatedPlugins );
|
||||
|
||||
PluginManager.getInstance().addPlugin( sparkPlug.getPlugin() );
|
||||
|
||||
sparkPlug.showOperationButton();
|
||||
installedPanel.add( sparkPlug );
|
||||
sparkPlug.getPlugin().setPluginDir( new File( PluginManager.PLUGINS_DIRECTORY, directoryName ) );
|
||||
installedPanel.invalidate();
|
||||
installedPanel.repaint();
|
||||
availablePanel.invalidate();
|
||||
availablePanel.invalidate();
|
||||
availablePanel.validate();
|
||||
availablePanel.repaint();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch ( Exception ex )
|
||||
{
|
||||
// Nothing to do
|
||||
Log.error(ex);
|
||||
}
|
||||
|
||||
frame.getContentPane().setLayout( new GridBagLayout() );
|
||||
frame.getContentPane().add( new JLabel( Res.getString( "message.downloading.spark.plug" ) ), new GridBagConstraints( 0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets( 5, 5, 5, 5 ), 0, 0 ) );
|
||||
frame.getContentPane().add( progressBar, new GridBagConstraints( 0, 1, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets( 5, 5, 5, 5 ), 0, 0 ) );
|
||||
frame.pack();
|
||||
frame.setSize( 400, 100 );
|
||||
GraphicUtils.centerWindowOnComponent( frame, this );
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
int result = httpclient.executeMethod( post );
|
||||
if ( result != 200 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
frame.setVisible( true );
|
||||
|
||||
long length = post.getResponseContentLength();
|
||||
int contentLength = (int) length;
|
||||
|
||||
progressBar = new JProgressBar( 0, contentLength );
|
||||
|
||||
final JFrame frame = new JFrame( Res.getString( "message.downloading", plugin.getName() ) );
|
||||
|
||||
frame.setIconImage( SparkRes.getImageIcon( SparkRes.SMALL_MESSAGE_IMAGE ).getImage() );
|
||||
|
||||
final Thread thread = new Thread( () ->
|
||||
{
|
||||
try
|
||||
{
|
||||
Thread.sleep( 2000 );
|
||||
InputStream stream = post.getResponseBodyAsStream();
|
||||
|
||||
URL url = new URL( plugin.getDownloadURL() );
|
||||
String name1 = URLFileSystem.getFileName( url );
|
||||
String directoryName = URLFileSystem.getName( url );
|
||||
|
||||
File pluginDownload = new File( PluginManager.PLUGINS_DIRECTORY, name1 );
|
||||
|
||||
FileOutputStream out = new FileOutputStream( pluginDownload );
|
||||
copy( stream, out );
|
||||
out.close();
|
||||
|
||||
frame.dispose();
|
||||
|
||||
// Remove SparkPlugUI
|
||||
// Clear all selections
|
||||
Component[] comps = availablePanel.getComponents();
|
||||
for ( Component comp : comps )
|
||||
{
|
||||
if ( comp instanceof SparkPlugUI )
|
||||
{
|
||||
SparkPlugUI sparkPlug = (SparkPlugUI) comp;
|
||||
if ( sparkPlug.getPlugin().getDownloadURL().equals( plugin.getDownloadURL() ) )
|
||||
{
|
||||
availablePanel.remove( sparkPlug );
|
||||
|
||||
_deactivatedPlugins.remove( sparkPlug.getPlugin().getName() );
|
||||
_prefs.setDeactivatedPlugins( _deactivatedPlugins );
|
||||
|
||||
PluginManager.getInstance().addPlugin( sparkPlug.getPlugin() );
|
||||
|
||||
sparkPlug.showOperationButton();
|
||||
installedPanel.add( sparkPlug );
|
||||
sparkPlug.getPlugin().setPluginDir( new File( PluginManager.PLUGINS_DIRECTORY, directoryName ) );
|
||||
installedPanel.invalidate();
|
||||
installedPanel.repaint();
|
||||
availablePanel.invalidate();
|
||||
availablePanel.invalidate();
|
||||
availablePanel.validate();
|
||||
availablePanel.repaint();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch ( Exception ex )
|
||||
{
|
||||
// Nothing to do
|
||||
}
|
||||
finally
|
||||
{
|
||||
// Release current connection to the connection pool once you are done
|
||||
post.releaseConnection();
|
||||
}
|
||||
} );
|
||||
|
||||
|
||||
frame.getContentPane().setLayout( new GridBagLayout() );
|
||||
frame.getContentPane().add( new JLabel( Res.getString( "message.downloading.spark.plug" ) ), new GridBagConstraints( 0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets( 5, 5, 5, 5 ), 0, 0 ) );
|
||||
frame.getContentPane().add( progressBar, new GridBagConstraints( 0, 1, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets( 5, 5, 5, 5 ), 0, 0 ) );
|
||||
frame.pack();
|
||||
frame.setSize( 400, 100 );
|
||||
GraphicUtils.centerWindowOnComponent( frame, this );
|
||||
|
||||
|
||||
frame.setVisible( true );
|
||||
thread.start();
|
||||
|
||||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
return null;
|
||||
});
|
||||
} catch (Exception e) {
|
||||
Log.error( e );
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,73 @@
|
||||
/**
|
||||
* Copyright (C) 2023 Ignite Realtime Foundation. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.jivesoftware.sparkimpl.updater;
|
||||
|
||||
import org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager;
|
||||
import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
|
||||
import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
|
||||
import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
|
||||
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
|
||||
import org.apache.hc.core5.http.config.Registry;
|
||||
import org.apache.hc.core5.http.config.RegistryBuilder;
|
||||
import org.apache.hc.core5.ssl.SSLContexts;
|
||||
import org.apache.hc.core5.ssl.TrustStrategy;
|
||||
|
||||
import javax.net.ssl.SSLContext;
|
||||
import java.security.KeyManagementException;
|
||||
import java.security.KeyStoreException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
|
||||
/**
|
||||
* A HTTP Client connection manager that knowingly by-passes all verification of TLS certificates.
|
||||
*
|
||||
* This SHOULD NOT be used for productive systems due to security reasons, unless it is a conscious decision and you are
|
||||
* perfectly aware of security implications of accepting self-signed certificates.
|
||||
*
|
||||
* Usage example:
|
||||
* <code>
|
||||
* AcceptAllCertsConnectionManager connectionManager = AcceptAllCertsConnectionManager.getInstance();
|
||||
* try( CloseableHttpClient httpClient = HttpClients.custom()
|
||||
* .setConnectionManager(connectionManager)
|
||||
* .build();
|
||||
*
|
||||
* CloseableHttpResponse response = (CloseableHttpResponse) httpClient
|
||||
* .execute(getMethod, new CustomHttpClientResponseHandler())) {
|
||||
*
|
||||
* final int statusCode = response.getCode();
|
||||
* assertThat(statusCode, equalTo(HttpStatus.SC_OK));
|
||||
* };
|
||||
* </code>
|
||||
* @author Guus der Kinderen, guus.der.kinderen@gmail.com
|
||||
*/
|
||||
public class AcceptAllCertsConnectionManager extends BasicHttpClientConnectionManager
|
||||
{
|
||||
public static BasicHttpClientConnectionManager getInstance() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException
|
||||
{
|
||||
// Taken from https://www.baeldung.com/httpclient-ssl
|
||||
final TrustStrategy acceptingTrustStrategy = (cert, authType) -> true;
|
||||
final SSLContext sslContext = SSLContexts.custom()
|
||||
.loadTrustMaterial(null, acceptingTrustStrategy)
|
||||
.build();
|
||||
final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
|
||||
final Registry<ConnectionSocketFactory> socketFactoryRegistry =
|
||||
RegistryBuilder.<ConnectionSocketFactory> create()
|
||||
.register("https", sslsf)
|
||||
.register("http", new PlainConnectionSocketFactory())
|
||||
.build();
|
||||
|
||||
return new BasicHttpClientConnectionManager(socketFactoryRegistry);
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
|
||||
* Copyright (C) 2004-2011 Jive Software, 2023 Ignite Realtime Foundation. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@ -17,14 +17,21 @@
|
||||
package org.jivesoftware.sparkimpl.updater;
|
||||
|
||||
import com.thoughtworks.xstream.XStream;
|
||||
import org.apache.commons.httpclient.HttpClient;
|
||||
import org.apache.commons.httpclient.methods.GetMethod;
|
||||
import org.apache.commons.httpclient.methods.PostMethod;
|
||||
import org.apache.commons.httpclient.protocol.Protocol;
|
||||
import org.apache.hc.client5.http.classic.methods.HttpGet;
|
||||
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
|
||||
import org.apache.hc.client5.http.impl.classic.HttpClients;
|
||||
import org.apache.hc.core5.http.ClassicHttpRequest;
|
||||
import org.apache.hc.core5.http.HttpEntity;
|
||||
import org.apache.hc.core5.http.HttpHost;
|
||||
import org.apache.hc.core5.http.io.entity.EntityUtils;
|
||||
import org.apache.hc.core5.http.io.support.ClassicRequestBuilder;
|
||||
import org.jivesoftware.Spark;
|
||||
import org.jivesoftware.resource.Res;
|
||||
import org.jivesoftware.resource.SparkRes;
|
||||
import org.jivesoftware.smack.*;
|
||||
import org.jivesoftware.smack.SmackException;
|
||||
import org.jivesoftware.smack.StanzaCollector;
|
||||
import org.jivesoftware.smack.XMPPConnection;
|
||||
import org.jivesoftware.smack.XMPPException;
|
||||
import org.jivesoftware.smack.filter.IQReplyFilter;
|
||||
import org.jivesoftware.smack.packet.IQ;
|
||||
import org.jivesoftware.smack.provider.ProviderManager;
|
||||
@ -33,36 +40,20 @@ import org.jivesoftware.spark.SparkManager;
|
||||
import org.jivesoftware.spark.component.ConfirmDialog;
|
||||
import org.jivesoftware.spark.component.ConfirmDialog.ConfirmListener;
|
||||
import org.jivesoftware.spark.component.TitlePanel;
|
||||
import org.jivesoftware.spark.util.BrowserLauncher;
|
||||
import org.jivesoftware.spark.util.ByteFormat;
|
||||
import org.jivesoftware.spark.util.GraphicUtils;
|
||||
import org.jivesoftware.spark.util.ModelUtil;
|
||||
import org.jivesoftware.spark.util.SwingWorker;
|
||||
import org.jivesoftware.spark.util.*;
|
||||
import org.jivesoftware.spark.util.log.Log;
|
||||
import org.jivesoftware.sparkimpl.settings.JiveInfo;
|
||||
import org.jivesoftware.sparkimpl.settings.local.LocalPreferences;
|
||||
import org.jivesoftware.sparkimpl.settings.local.SettingsManager;
|
||||
import org.jxmpp.jid.impl.JidCreate;
|
||||
|
||||
import javax.swing.JEditorPane;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JProgressBar;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.*;
|
||||
import javax.swing.text.html.HTMLEditorKit;
|
||||
import javax.swing.UIManager;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
import java.awt.Insets;
|
||||
import java.awt.*;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.*;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.TimerTask;
|
||||
@ -123,54 +114,61 @@ public class CheckUpdates {
|
||||
* @return true if there is a new build available for download.
|
||||
*/
|
||||
public SparkVersion isNewBuildAvailableFromJivesoftware() {
|
||||
PostMethod post = new PostMethod(mainUpdateURL);
|
||||
|
||||
HttpHost proxy = null;
|
||||
String proxyHost = System.getProperty( "http.proxyHost" );
|
||||
String proxyPort = System.getProperty( "http.proxyPort" );
|
||||
if ( ModelUtil.hasLength( proxyHost ) && ModelUtil.hasLength(proxyPort) ) {
|
||||
try{
|
||||
proxy = new HttpHost(proxyHost, Integer.parseInt(proxyPort));
|
||||
} catch ( NumberFormatException e ) {
|
||||
Log.error( e );
|
||||
}
|
||||
}
|
||||
|
||||
final String os;
|
||||
if (Spark.isWindows()) {
|
||||
post.addParameter("os", "windows");
|
||||
os = "windows";
|
||||
}
|
||||
else if (Spark.isMac()) {
|
||||
post.addParameter("os", "mac");
|
||||
os = "mac";
|
||||
}
|
||||
else {
|
||||
post.addParameter("os", "linux");
|
||||
os = "linux";
|
||||
}
|
||||
|
||||
// Properties isBetaCheckingEnabled is now used to indicate if updates are allowed
|
||||
// // Check to see if the beta should be included.
|
||||
// LocalPreferences pref = SettingsManager.getLocalPreferences();
|
||||
// boolean isBetaCheckingEnabled = pref.isBetaCheckingEnabled();
|
||||
// if (isBetaCheckingEnabled) {
|
||||
// post.addParameter("beta", "true");
|
||||
// }
|
||||
// Properties isBetaCheckingEnabled is now used to indicate if updates are allowed
|
||||
// // Check to see if the beta should be included.
|
||||
// LocalPreferences pref = SettingsManager.getLocalPreferences();
|
||||
// boolean isBetaCheckingEnabled = pref.isBetaCheckingEnabled();
|
||||
// if (isBetaCheckingEnabled) {
|
||||
// post.addParameter("beta", "true");
|
||||
// }
|
||||
try (final CloseableHttpClient httpClient =
|
||||
HttpClients.custom()
|
||||
.setConnectionManager(AcceptAllCertsConnectionManager.getInstance())
|
||||
.setProxy(proxy)
|
||||
.build()
|
||||
) {
|
||||
final ClassicHttpRequest request = ClassicRequestBuilder.post(mainUpdateURL)
|
||||
.addParameter("os", os)
|
||||
.setHeader("User-Agent", "Spark HttpFileUpload")
|
||||
.build();
|
||||
|
||||
return httpClient.execute(request, httpResponse -> {
|
||||
final int statusCode = httpResponse.getCode();
|
||||
if ((statusCode >= 200) && (statusCode <= 202)) {
|
||||
String xml = EntityUtils.toString(httpResponse.getEntity());
|
||||
|
||||
Protocol.registerProtocol("https", new Protocol("https", new EasySSLProtocolSocketFactory(), 443));
|
||||
HttpClient httpclient = new HttpClient();
|
||||
String proxyHost = System.getProperty("http.proxyHost");
|
||||
String proxyPort = System.getProperty("http.proxyPort");
|
||||
if (ModelUtil.hasLength(proxyHost) && ModelUtil.hasLength(proxyPort)) {
|
||||
try {
|
||||
httpclient.getHostConfiguration().setProxy(proxyHost, Integer.parseInt(proxyPort));
|
||||
}
|
||||
catch (NumberFormatException e) {
|
||||
Log.error(e);
|
||||
}
|
||||
}
|
||||
try {
|
||||
int result = httpclient.executeMethod(post);
|
||||
if (result != 200) {
|
||||
// Server Version
|
||||
SparkVersion serverVersion = (SparkVersion)xstream.fromXML(xml);
|
||||
if (isGreater(serverVersion.getVersion(), JiveInfo.getVersion())) {
|
||||
return serverVersion;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
String xml = post.getResponseBodyAsString();
|
||||
|
||||
// Server Version
|
||||
SparkVersion serverVersion = (SparkVersion)xstream.fromXML(xml);
|
||||
if (isGreater(serverVersion.getVersion(), JiveInfo.getVersion())) {
|
||||
return serverVersion;
|
||||
}
|
||||
}
|
||||
catch (IOException e) {
|
||||
});
|
||||
} catch (Exception e) {
|
||||
Log.error(e);
|
||||
}
|
||||
return null;
|
||||
@ -180,154 +178,152 @@ public class CheckUpdates {
|
||||
public void downloadUpdate(final File downloadedFile, final SparkVersion version) {
|
||||
final java.util.Timer timer = new java.util.Timer();
|
||||
|
||||
// Prepare HTTP post
|
||||
final GetMethod post = new GetMethod(version.getDownloadURL());
|
||||
final HttpGet request = new HttpGet(version.getDownloadURL());
|
||||
|
||||
// Get HTTP client
|
||||
Protocol.registerProtocol("https", new Protocol("https", new EasySSLProtocolSocketFactory(), 443));
|
||||
final HttpClient httpclient = new HttpClient();
|
||||
String proxyHost = System.getProperty("http.proxyHost");
|
||||
String proxyPort = System.getProperty("http.proxyPort");
|
||||
if (ModelUtil.hasLength(proxyHost) && ModelUtil.hasLength(proxyPort)) {
|
||||
try {
|
||||
httpclient.getHostConfiguration().setProxy(proxyHost, Integer.parseInt(proxyPort));
|
||||
}
|
||||
catch (NumberFormatException e) {
|
||||
Log.error(e);
|
||||
HttpHost proxy = null;
|
||||
String proxyHost = System.getProperty( "http.proxyHost" );
|
||||
String proxyPort = System.getProperty( "http.proxyPort" );
|
||||
if ( ModelUtil.hasLength( proxyHost ) && ModelUtil.hasLength(proxyPort) ) {
|
||||
try{
|
||||
proxy = new HttpHost(proxyHost, Integer.parseInt(proxyPort));
|
||||
} catch ( NumberFormatException e ) {
|
||||
Log.error( e );
|
||||
}
|
||||
}
|
||||
|
||||
// Execute request
|
||||
try (final CloseableHttpClient httpClient =
|
||||
HttpClients.custom()
|
||||
.setConnectionManager(AcceptAllCertsConnectionManager.getInstance())
|
||||
.setProxy(proxy)
|
||||
.build();
|
||||
) {
|
||||
httpClient.execute(request, response -> {
|
||||
if (response.getCode() != 200) {
|
||||
return null;
|
||||
}
|
||||
final HttpEntity entity = response.getEntity();
|
||||
int contentLength = (int) entity.getContentLength();
|
||||
|
||||
try {
|
||||
int result = httpclient.executeMethod(post);
|
||||
if (result != 200) {
|
||||
return;
|
||||
}
|
||||
bar = new JProgressBar(0, contentLength);
|
||||
|
||||
long length = post.getResponseContentLength();
|
||||
int contentLength = (int)length;
|
||||
final JFrame frame = new JFrame(Res.getString("title.downloading.im.client"));
|
||||
|
||||
bar = new JProgressBar(0, contentLength);
|
||||
}
|
||||
catch (IOException e) {
|
||||
Log.error(e);
|
||||
}
|
||||
frame.setIconImage(SparkRes.getImageIcon(SparkRes.SMALL_MESSAGE_IMAGE).getImage());
|
||||
|
||||
final JFrame frame = new JFrame(Res.getString("title.downloading.im.client"));
|
||||
titlePanel = new TitlePanel(Res.getString("title.upgrading.client"), Res.getString("message.version", version.getVersion()), SparkRes.getImageIcon(SparkRes.SEND_FILE_24x24), true);
|
||||
|
||||
frame.setIconImage(SparkRes.getImageIcon(SparkRes.SMALL_MESSAGE_IMAGE).getImage());
|
||||
|
||||
titlePanel = new TitlePanel(Res.getString("title.upgrading.client"), Res.getString("message.version", version.getVersion()), SparkRes.getImageIcon(SparkRes.SEND_FILE_24x24), true);
|
||||
|
||||
final Thread thread = new Thread( () -> {
|
||||
try {
|
||||
InputStream stream = post.getResponseBodyAsStream();
|
||||
long size = post.getResponseContentLength();
|
||||
ByteFormat formater = new ByteFormat();
|
||||
sizeText = formater.format(size);
|
||||
titlePanel.setDescription(Res.getString("message.version", version.getVersion()) + " \n" + Res.getString("message.file.size", sizeText));
|
||||
final Thread thread = new Thread( () -> {
|
||||
try {
|
||||
InputStream stream = entity.getContent();
|
||||
long size = entity.getContentLength();
|
||||
ByteFormat formater = new ByteFormat();
|
||||
sizeText = formater.format(size);
|
||||
titlePanel.setDescription(Res.getString("message.version", version.getVersion()) + " \n" + Res.getString("message.file.size", sizeText));
|
||||
|
||||
|
||||
downloadedFile.getParentFile().mkdirs();
|
||||
downloadedFile.getParentFile().mkdirs();
|
||||
|
||||
FileOutputStream out = new FileOutputStream(downloadedFile);
|
||||
copy(stream, out);
|
||||
out.close();
|
||||
FileOutputStream out = new FileOutputStream(downloadedFile);
|
||||
copy(stream, out);
|
||||
out.close();
|
||||
|
||||
if (!cancel) {
|
||||
downloadComplete = true;
|
||||
promptForInstallation(downloadedFile, Res.getString("title.download.complete"), Res.getString("message.restart.spark"));
|
||||
if (!cancel) {
|
||||
downloadComplete = true;
|
||||
promptForInstallation(downloadedFile, Res.getString("title.download.complete"), Res.getString("message.restart.spark"));
|
||||
}
|
||||
else {
|
||||
out.close();
|
||||
downloadedFile.delete();
|
||||
}
|
||||
|
||||
|
||||
UPDATING = false;
|
||||
frame.dispose();
|
||||
}
|
||||
catch (Exception ex) {
|
||||
// Nothing to do
|
||||
}
|
||||
finally {
|
||||
timer.cancel();
|
||||
// Release current connection to the connection pool once you are done
|
||||
}
|
||||
} );
|
||||
|
||||
|
||||
frame.getContentPane().setLayout(new GridBagLayout());
|
||||
frame.getContentPane().add(titlePanel, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
|
||||
frame.getContentPane().add(bar, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
|
||||
|
||||
JEditorPane pane = new JEditorPane();
|
||||
boolean displayContentPane = version.getChangeLogURL() != null || version.getDisplayMessage() != null;
|
||||
|
||||
try {
|
||||
pane.setEditable(false);
|
||||
if (version.getChangeLogURL() != null) {
|
||||
pane.setEditorKit(new HTMLEditorKit());
|
||||
pane.setPage(version.getChangeLogURL());
|
||||
}
|
||||
else if (version.getDisplayMessage() != null) {
|
||||
pane.setText(version.getDisplayMessage());
|
||||
}
|
||||
|
||||
if (displayContentPane) {
|
||||
frame.getContentPane().add(new JScrollPane(pane), new GridBagConstraints(0, 2, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
|
||||
}
|
||||
}
|
||||
catch (IOException e) {
|
||||
Log.error(e);
|
||||
}
|
||||
|
||||
frame.getContentPane().setBackground(Color.WHITE);
|
||||
frame.pack();
|
||||
if (displayContentPane) {
|
||||
frame.setSize(600, 400);
|
||||
}
|
||||
else {
|
||||
out.close();
|
||||
downloadedFile.delete();
|
||||
frame.setSize(400, 100);
|
||||
}
|
||||
frame.setLocationRelativeTo(SparkManager.getMainWindow());
|
||||
GraphicUtils.centerWindowOnScreen(frame);
|
||||
frame.addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(WindowEvent windowEvent) {
|
||||
thread.interrupt();
|
||||
cancel = true;
|
||||
|
||||
UPDATING = false;
|
||||
|
||||
if (!downloadComplete) {
|
||||
UIManager.put("OptionPane.okButtonText", Res.getString("ok"));
|
||||
JOptionPane.showMessageDialog(SparkManager.getMainWindow(), Res.getString("message.updating.cancelled"), Res.getString("title.cancelled"), JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
frame.setVisible(true);
|
||||
thread.start();
|
||||
|
||||
|
||||
UPDATING = false;
|
||||
frame.dispose();
|
||||
}
|
||||
catch (Exception ex) {
|
||||
// Nothing to do
|
||||
}
|
||||
finally {
|
||||
timer.cancel();
|
||||
// Release current connection to the connection pool once you are done
|
||||
post.releaseConnection();
|
||||
}
|
||||
} );
|
||||
timer.scheduleAtFixedRate(new TimerTask() {
|
||||
int seconds = 1;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
ByteFormat formatter = new ByteFormat();
|
||||
long value = bar.getValue();
|
||||
long average = value / seconds;
|
||||
String text = formatter.format(average) + "/Sec";
|
||||
|
||||
frame.getContentPane().setLayout(new GridBagLayout());
|
||||
frame.getContentPane().add(titlePanel, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
|
||||
frame.getContentPane().add(bar, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
|
||||
|
||||
JEditorPane pane = new JEditorPane();
|
||||
boolean displayContentPane = version.getChangeLogURL() != null || version.getDisplayMessage() != null;
|
||||
|
||||
try {
|
||||
pane.setEditable(false);
|
||||
if (version.getChangeLogURL() != null) {
|
||||
pane.setEditorKit(new HTMLEditorKit());
|
||||
pane.setPage(version.getChangeLogURL());
|
||||
}
|
||||
else if (version.getDisplayMessage() != null) {
|
||||
pane.setText(version.getDisplayMessage());
|
||||
}
|
||||
|
||||
if (displayContentPane) {
|
||||
frame.getContentPane().add(new JScrollPane(pane), new GridBagConstraints(0, 2, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
|
||||
}
|
||||
}
|
||||
catch (IOException e) {
|
||||
String total = formatter.format(value);
|
||||
titlePanel.setDescription(Res.getString("message.version", version.getVersion()) + " \n" + Res.getString("message.file.size", sizeText) + "\n" + Res.getString("message.transfer.rate") + ": " + text + "\n" + Res.getString("message.total.downloaded") + ": " + total);
|
||||
seconds++;
|
||||
}
|
||||
}, 1000, 1000);
|
||||
return null;
|
||||
});
|
||||
} catch (Exception e) {
|
||||
Log.error(e);
|
||||
}
|
||||
|
||||
frame.getContentPane().setBackground(Color.WHITE);
|
||||
frame.pack();
|
||||
if (displayContentPane) {
|
||||
frame.setSize(600, 400);
|
||||
}
|
||||
else {
|
||||
frame.setSize(400, 100);
|
||||
}
|
||||
frame.setLocationRelativeTo(SparkManager.getMainWindow());
|
||||
GraphicUtils.centerWindowOnScreen(frame);
|
||||
frame.addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(WindowEvent windowEvent) {
|
||||
thread.interrupt();
|
||||
cancel = true;
|
||||
|
||||
UPDATING = false;
|
||||
|
||||
if (!downloadComplete) {
|
||||
UIManager.put("OptionPane.okButtonText", Res.getString("ok"));
|
||||
JOptionPane.showMessageDialog(SparkManager.getMainWindow(), Res.getString("message.updating.cancelled"), Res.getString("title.cancelled"), JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
frame.setVisible(true);
|
||||
thread.start();
|
||||
|
||||
|
||||
timer.scheduleAtFixedRate(new TimerTask() {
|
||||
int seconds = 1;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
ByteFormat formatter = new ByteFormat();
|
||||
long value = bar.getValue();
|
||||
long average = value / seconds;
|
||||
String text = formatter.format(average) + "/Sec";
|
||||
|
||||
String total = formatter.format(value);
|
||||
titlePanel.setDescription(Res.getString("message.version", version.getVersion()) + " \n" + Res.getString("message.file.size", sizeText) + "\n" + Res.getString("message.transfer.rate") + ": " + text + "\n" + Res.getString("message.total.downloaded") + ": " + total);
|
||||
seconds++;
|
||||
}
|
||||
}, 1000, 1000);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -1,242 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jivesoftware.sparkimpl.updater;
|
||||
/*
|
||||
* $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//httpclient/src/contrib/org/apache/commons/httpclient/contrib/ssl/EasySSLProtocolSocketFactory.java,v 1.7 2004/06/11 19:26:27 olegk Exp $
|
||||
*
|
||||
* ====================================================================
|
||||
*
|
||||
* Copyright 2002-2004 The Apache Software Foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
import javax.net.ssl.SSLContext;
|
||||
import javax.net.ssl.TrustManager;
|
||||
import org.apache.commons.httpclient.ConnectTimeoutException;
|
||||
import org.apache.commons.httpclient.HttpClientError;
|
||||
import org.apache.commons.httpclient.params.HttpConnectionParams;
|
||||
import org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory;
|
||||
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
|
||||
import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.Socket;
|
||||
import java.net.UnknownHostException;
|
||||
|
||||
/**
|
||||
* <p/>
|
||||
* EasySSLProtocolSocketFactory can be used to creats SSL {@link Socket}s
|
||||
* that accept self-signed certificates.
|
||||
* </p>
|
||||
* <p/>
|
||||
* This socket factory SHOULD NOT be used for productive systems
|
||||
* due to security reasons, unless it is a concious decision and
|
||||
* you are perfectly aware of security implications of accepting
|
||||
* self-signed certificates
|
||||
* </p>
|
||||
* <p/>
|
||||
* <p/>
|
||||
* Example of using custom protocol socket factory for a specific host:
|
||||
* <pre>
|
||||
* Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
|
||||
* <p/>
|
||||
* HttpClient client = new HttpClient();
|
||||
* client.getHostConfiguration().setHost("localhost", 443, easyhttps);
|
||||
* // use relative url only
|
||||
* GetMethod httpget = new GetMethod("/");
|
||||
* client.executeMethod(httpget);
|
||||
* </pre>
|
||||
* </p>
|
||||
* <p/>
|
||||
* Example of using custom protocol socket factory per default instead of the standard one:
|
||||
* <pre>
|
||||
* Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
|
||||
* Protocol.registerProtocol("https", easyhttps);
|
||||
* <p/>
|
||||
* HttpClient client = new HttpClient();
|
||||
* GetMethod httpget = new GetMethod("https://localhost/");
|
||||
* client.executeMethod(httpget);
|
||||
* </pre>
|
||||
* </p>
|
||||
*
|
||||
* @author <a href="mailto:oleg -at- ural.ru">Oleg Kalnichevski</a>
|
||||
* <p/>
|
||||
* <p/>
|
||||
* DISCLAIMER: HttpClient developers DO NOT actively support this component.
|
||||
* The component is provided as a reference material, which may be inappropriate
|
||||
* for use without additional customization.
|
||||
* </p>
|
||||
*/
|
||||
|
||||
public class EasySSLProtocolSocketFactory implements ProtocolSocketFactory {
|
||||
|
||||
/**
|
||||
* Log object for this class.
|
||||
*/
|
||||
private static final Log LOG = LogFactory.getLog(EasySSLProtocolSocketFactory.class);
|
||||
|
||||
private SSLContext sslcontext = null;
|
||||
|
||||
/**
|
||||
* Constructor for EasySSLProtocolSocketFactory.
|
||||
*/
|
||||
public EasySSLProtocolSocketFactory() {
|
||||
super();
|
||||
}
|
||||
|
||||
private static SSLContext createEasySSLContext() {
|
||||
try {
|
||||
SSLContext context = SSLContext.getInstance("SSL");
|
||||
context.init(
|
||||
null,
|
||||
new TrustManager[]{new EasyX509TrustManager(null)},
|
||||
null);
|
||||
return context;
|
||||
}
|
||||
catch (Exception e) {
|
||||
LOG.error(e.getMessage(), e);
|
||||
throw new HttpClientError(e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private SSLContext getSSLContext() {
|
||||
if (this.sslcontext == null) {
|
||||
this.sslcontext = createEasySSLContext();
|
||||
}
|
||||
return this.sslcontext;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see SecureProtocolSocketFactory#createSocket(java.lang.String,int,java.net.InetAddress,int)
|
||||
*/
|
||||
@Override
|
||||
public Socket createSocket(
|
||||
String host,
|
||||
int port,
|
||||
InetAddress clientHost,
|
||||
int clientPort)
|
||||
throws IOException {
|
||||
|
||||
return getSSLContext().getSocketFactory().createSocket(
|
||||
host,
|
||||
port,
|
||||
clientHost,
|
||||
clientPort
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to get a new socket connection to the given host within the given time limit.
|
||||
* <p/>
|
||||
* To circumvent the limitations of older JREs that do not support connect timeout a
|
||||
* controller thread is executed. The controller thread attempts to create a new socket
|
||||
* within the given limit of time. If socket constructor does not return until the
|
||||
* timeout expires, the controller terminates and throws an {@link ConnectTimeoutException}
|
||||
* </p>
|
||||
*
|
||||
* @param host the host name/IP
|
||||
* @param port the port on the host
|
||||
* @param params {@link HttpConnectionParams Http connection parameters}
|
||||
* @return Socket a new socket
|
||||
* @throws IOException if an I/O error occurs while creating the socket
|
||||
* @throws UnknownHostException if the IP address of the host cannot be
|
||||
* determined
|
||||
*/
|
||||
@Override
|
||||
public Socket createSocket(
|
||||
final String host,
|
||||
final int port,
|
||||
final InetAddress localAddress,
|
||||
final int localPort,
|
||||
final HttpConnectionParams params
|
||||
) throws IOException {
|
||||
if (params == null) {
|
||||
throw new IllegalArgumentException("Parameters may not be null");
|
||||
}
|
||||
int timeout = params.getConnectionTimeout();
|
||||
if (timeout == 0) {
|
||||
return createSocket(host, port, localAddress, localPort);
|
||||
}
|
||||
else {
|
||||
// To be eventually deprecated when migrated to Java 1.4 or above
|
||||
return ControllerThreadSocketFactory.createSocket(
|
||||
this, host, port, localAddress, localPort, timeout);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @see SecureProtocolSocketFactory#createSocket(java.lang.String,int)
|
||||
*/
|
||||
@Override
|
||||
public Socket createSocket(String host, int port)
|
||||
throws IOException {
|
||||
return getSSLContext().getSocketFactory().createSocket(
|
||||
host,
|
||||
port
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see SecureProtocolSocketFactory#createSocket(java.net.Socket, String, int, boolean)
|
||||
*/
|
||||
public Socket createSocket(
|
||||
Socket socket,
|
||||
String host,
|
||||
int port,
|
||||
boolean autoClose)
|
||||
throws IOException {
|
||||
return getSSLContext().getSocketFactory().createSocket(
|
||||
socket,
|
||||
host,
|
||||
port,
|
||||
autoClose
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
return ((obj != null) && obj.getClass().equals(EasySSLProtocolSocketFactory.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return EasySSLProtocolSocketFactory.class.hashCode();
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,125 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.jivesoftware.sparkimpl.updater;
|
||||
|
||||
import javax.net.ssl.TrustManager;
|
||||
import javax.net.ssl.TrustManagerFactory;
|
||||
import javax.net.ssl.X509TrustManager;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import java.security.KeyStore;
|
||||
import java.security.KeyStoreException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.X509Certificate;
|
||||
|
||||
/**
|
||||
* <p/>
|
||||
* EasyX509TrustManager unlike default {@link X509TrustManager} accepts
|
||||
* self-signed certificates.
|
||||
* </p>
|
||||
* <p/>
|
||||
* This trust manager SHOULD NOT be used for productive systems
|
||||
* due to security reasons, unless it is a conscious decision and
|
||||
* you are perfectly aware of security implications of accepting
|
||||
* self-signed certificates
|
||||
* </p>
|
||||
*
|
||||
* @author <a href="mailto:adrian.sutton@ephox.com">Adrian Sutton</a>
|
||||
* @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
|
||||
* <p/>
|
||||
* <p/>
|
||||
* DISCLAIMER: HttpClient developers DO NOT actively support this component.
|
||||
* The component is provided as a reference material, which may be inappropriate
|
||||
* for use without additional customization.
|
||||
* </p>
|
||||
*/
|
||||
|
||||
public class EasyX509TrustManager implements X509TrustManager {
|
||||
private final X509TrustManager standardTrustManager;
|
||||
|
||||
/**
|
||||
* Log object for this class.
|
||||
*/
|
||||
private static final Log LOG = LogFactory.getLog(EasyX509TrustManager.class);
|
||||
|
||||
public EasyX509TrustManager(KeyStore keystore) throws NoSuchAlgorithmException, KeyStoreException {
|
||||
super();
|
||||
TrustManagerFactory factory = TrustManagerFactory.getInstance("SunX509");
|
||||
factory.init(keystore);
|
||||
TrustManager[] trustmanagers = factory.getTrustManagers();
|
||||
if (trustmanagers.length == 0) {
|
||||
throw new NoSuchAlgorithmException("SunX509 trust manager not supported");
|
||||
}
|
||||
this.standardTrustManager = (X509TrustManager)trustmanagers[0];
|
||||
}
|
||||
|
||||
public boolean isClientTrusted(X509Certificate[] certificates) {
|
||||
try {
|
||||
this.standardTrustManager.checkClientTrusted(certificates, null);
|
||||
return true;
|
||||
}
|
||||
catch (CertificateException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isServerTrusted(X509Certificate[] certificates) {
|
||||
if ((certificates != null) && LOG.isDebugEnabled()) {
|
||||
LOG.debug("Server certificate chain:");
|
||||
for (int i = 0; i < certificates.length; i++) {
|
||||
LOG.debug("X509Certificate[" + i + "]=" + certificates[i]);
|
||||
}
|
||||
}
|
||||
if ((certificates != null) && (certificates.length == 1)) {
|
||||
X509Certificate certificate = certificates[0];
|
||||
try {
|
||||
certificate.checkValidity();
|
||||
}
|
||||
catch (CertificateException e) {
|
||||
LOG.error(e.toString());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
try {
|
||||
this.standardTrustManager.checkServerTrusted(certificates, null);
|
||||
return true;
|
||||
}
|
||||
catch (CertificateException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @see javax.net.ssl.X509TrustManager#getAcceptedIssuers()
|
||||
*/
|
||||
@Override
|
||||
public X509Certificate[] getAcceptedIssuers() {
|
||||
return this.standardTrustManager.getAcceptedIssuers();
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (C) 2004-2010 Jive Software. All rights reserved.
|
||||
* Copyright (C) 2004-2010 Jive Software. 2023 Ignite Realtime Foundation. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@ -16,32 +16,30 @@
|
||||
|
||||
package org.jivesoftware.spark.plugin.fileupload;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
|
||||
import java.awt.*;
|
||||
import javax.swing.*;
|
||||
|
||||
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
|
||||
import org.apache.hc.client5.http.impl.classic.HttpClients;
|
||||
import org.apache.hc.core5.http.ClassicHttpRequest;
|
||||
import org.apache.hc.core5.http.ContentType;
|
||||
import org.apache.hc.core5.http.io.entity.FileEntity;
|
||||
import org.apache.hc.core5.http.io.support.ClassicRequestBuilder;
|
||||
import org.jivesoftware.resource.Res;
|
||||
import org.jivesoftware.resource.SparkRes;
|
||||
import org.jivesoftware.smack.packet.IQ;
|
||||
import org.jivesoftware.smack.packet.Message;
|
||||
import org.jivesoftware.spark.SparkManager;
|
||||
import org.jivesoftware.spark.component.RolloverButton;
|
||||
import org.jivesoftware.spark.ui.ChatRoom;
|
||||
import org.jivesoftware.spark.util.*;
|
||||
import org.jivesoftware.spark.util.log.*;
|
||||
import org.jivesoftware.smack.packet.*;
|
||||
import org.jivesoftware.spark.util.GraphicUtils;
|
||||
import org.jivesoftware.spark.util.log.Log;
|
||||
import org.jivesoftware.sparkimpl.updater.AcceptAllCertsConnectionManager;
|
||||
import org.jxmpp.jid.EntityBareJid;
|
||||
|
||||
import org.apache.commons.httpclient.HttpClient;
|
||||
import org.apache.commons.httpclient.methods.FileRequestEntity;
|
||||
import org.apache.commons.httpclient.methods.PutMethod;
|
||||
import org.apache.commons.httpclient.methods.RequestEntity;
|
||||
import org.apache.commons.httpclient.protocol.Protocol;
|
||||
|
||||
import org.jivesoftware.sparkimpl.updater.EasySSLProtocolSocketFactory;
|
||||
|
||||
import org.jxmpp.jid.impl.JidCreate;
|
||||
import javax.xml.bind.DatatypeConverter;
|
||||
import org.jivesoftware.resource.SparkRes;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.io.File;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
|
||||
public class ChatRoomDecorator
|
||||
{
|
||||
@ -127,31 +125,33 @@ public class ChatRoomDecorator
|
||||
{
|
||||
Log.debug("About to upload file for room " + room.getBareJid() + " via HTTP PUT to URL " + response.putUrl);
|
||||
|
||||
try {
|
||||
PutMethod put = new PutMethod(response.putUrl);
|
||||
int port = put.getURI().getPort();
|
||||
if (port > 0)
|
||||
{
|
||||
Protocol.registerProtocol( "https", new Protocol( "https", new EasySSLProtocolSocketFactory(), port ) );
|
||||
}
|
||||
|
||||
HttpClient client = new HttpClient();
|
||||
RequestEntity entity = new FileRequestEntity(file, "application/binary");
|
||||
put.setRequestEntity(entity);
|
||||
put.setRequestHeader("User-Agent", "Spark HttpFileUpload");
|
||||
client.executeMethod(put);
|
||||
|
||||
int statusCode = put.getStatusCode();
|
||||
String responseBody = put.getResponseBodyAsString();
|
||||
|
||||
if ((statusCode >= 200) && (statusCode <= 202))
|
||||
{
|
||||
Log.debug("Upload file success. HTTP response: " + statusCode + " " + responseBody);
|
||||
broadcastUploadUrl(room.getBareJid(), response.getUrl, type);
|
||||
} else {
|
||||
Log.error("Failed to upload file. HTTP response: " + statusCode + " " + responseBody);
|
||||
}
|
||||
try (final CloseableHttpClient httpClient =
|
||||
HttpClients.custom()
|
||||
.setConnectionManager(AcceptAllCertsConnectionManager.getInstance())
|
||||
.build()
|
||||
) {
|
||||
final ClassicHttpRequest request = ClassicRequestBuilder.put(response.putUrl)
|
||||
.setEntity(new FileEntity(file, ContentType.create("application/binary")))
|
||||
.setHeader("User-Agent", "Spark HttpFileUpload")
|
||||
.build();
|
||||
|
||||
httpClient.execute(request, httpResponse -> {
|
||||
try {
|
||||
final int statusCode = httpResponse.getCode();
|
||||
final String reasonPhrase = httpResponse.getReasonPhrase();
|
||||
if ((statusCode >= 200) && (statusCode <= 202)) {
|
||||
Log.debug("Upload file success. HTTP response: " + statusCode + " " + reasonPhrase);
|
||||
broadcastUploadUrl(room.getBareJid(), response.getUrl, type);
|
||||
} else {
|
||||
throw new IllegalStateException("Server responded to upload request with: " + statusCode + ": " + reasonPhrase);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.error("Error encountered whilst uploading the file", e);
|
||||
UIManager.put("OptionPane.okButtonText", Res.getString("ok"));
|
||||
JOptionPane.showMessageDialog(room, "Upload failed: " + e.getMessage(), "Http File Upload Plugin", JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
return null;
|
||||
});
|
||||
} catch (Exception e) {
|
||||
Log.error("Error encountered whilst uploading the file", e);
|
||||
UIManager.put("OptionPane.okButtonText", Res.getString("ok"));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user