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:
ilyaHlevnoy 2023-03-30 19:36:40 +03:00 committed by GitHub
commit 41d4c19d38
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 429 additions and 749 deletions

View File

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

View File

@ -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 );
}
}

View File

@ -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);
}
}

View File

@ -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);
}
/**

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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"));