mirror of https://github.com/sipwise/jitsi.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
319 lines
8.6 KiB
319 lines
8.6 KiB
/*
|
|
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
|
|
*
|
|
* Distributable under LGPL license.
|
|
* See terms of license at gnu.org.
|
|
*/
|
|
package net.java.sip.communicator.plugin.desktoputil;
|
|
|
|
import java.awt.*;
|
|
import java.awt.event.*;
|
|
import java.security.cert.*;
|
|
|
|
import javax.swing.*;
|
|
import javax.swing.border.*;
|
|
|
|
import net.java.sip.communicator.service.certificate.*;
|
|
import net.java.sip.communicator.util.*;
|
|
import org.jitsi.service.resources.*;
|
|
|
|
/**
|
|
* Dialog that is shown to the user when a certificate verification failed.
|
|
* @author Damian Minkov
|
|
*/
|
|
class VerifyCertificateDialogImpl
|
|
extends SIPCommDialog
|
|
implements VerifyCertificateDialogService.VerifyCertificateDialog
|
|
{
|
|
/**
|
|
* Our logger.
|
|
*/
|
|
private static final Logger logger =
|
|
Logger.getLogger(VerifyCertificateDialogImpl.class);
|
|
|
|
/**
|
|
* Serial version UID.
|
|
*/
|
|
private static final long serialVersionUID = 0L;
|
|
|
|
/**
|
|
* The resource service.
|
|
*/
|
|
private ResourceManagementService R = DesktopUtilActivator.getResources();
|
|
|
|
/**
|
|
* The maximum width that we allow message dialogs to have.
|
|
*/
|
|
private static final int MAX_MSG_PANE_WIDTH = 600;
|
|
|
|
/**
|
|
* The maximum height that we allow message dialogs to have.
|
|
*/
|
|
private static final int MAX_MSG_PANE_HEIGHT = 800;
|
|
|
|
/**
|
|
* The certificates to show.
|
|
*/
|
|
Certificate[] certs;
|
|
|
|
/**
|
|
* A text that describes why the verification failed.
|
|
*/
|
|
String message;
|
|
|
|
/**
|
|
* The certificate panel.
|
|
*/
|
|
TransparentPanel certPanel;
|
|
|
|
/**
|
|
* This dialog content pane.
|
|
*/
|
|
TransparentPanel contentPane;
|
|
|
|
/**
|
|
* Whether certificate description is shown.
|
|
*/
|
|
boolean certOpened = false;
|
|
|
|
/**
|
|
* The button to show certificate description.
|
|
*/
|
|
JButton certButton;
|
|
|
|
/**
|
|
* The check box if checked permanently stored the certificate
|
|
* which will be always trusted.
|
|
*/
|
|
SIPCommCheckBox alwaysTrustCheckBox = new SIPCommCheckBox(
|
|
R.getI18NString("service.gui.ALWAYS_TRUST"),
|
|
false);
|
|
|
|
/**
|
|
* Whether the user trusts this certificate.
|
|
*/
|
|
boolean isTrusted = false;
|
|
|
|
/**
|
|
* Creates the dialog.
|
|
*
|
|
* @param certs the certificates list
|
|
* @param title The title of the dialog; when null the resource
|
|
* <tt>service.gui.CERT_DIALOG_TITLE</tt> is loaded.
|
|
* @param message A text that describes why the verification failed.
|
|
*/
|
|
public VerifyCertificateDialogImpl(Certificate[] certs,
|
|
String title, String message)
|
|
{
|
|
super(false);
|
|
|
|
setTitle(title != null ? title :
|
|
R.getI18NString("service.gui.CERT_DIALOG_TITLE"));
|
|
setModal(true);
|
|
|
|
this.certs = certs;
|
|
this.message = message;
|
|
|
|
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
|
|
|
init();
|
|
|
|
setLocationRelativeTo(getParent());
|
|
}
|
|
|
|
/**
|
|
* Inits the dialog initial display.
|
|
*/
|
|
private void init()
|
|
{
|
|
this.getContentPane().setLayout(new BorderLayout());
|
|
|
|
contentPane =
|
|
new TransparentPanel(new BorderLayout(5, 5));
|
|
|
|
TransparentPanel northPanel =
|
|
new TransparentPanel(new BorderLayout(5, 5));
|
|
northPanel.setBorder(BorderFactory.createEmptyBorder(10, 5, 5, 5));
|
|
|
|
JLabel imgLabel = new JLabel(
|
|
R.getImage("service.gui.icons.CERTIFICATE_WARNING"));
|
|
imgLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
|
|
northPanel.add(imgLabel, BorderLayout.WEST);
|
|
|
|
StyledHTMLEditorPane descriptionPane = new StyledHTMLEditorPane();
|
|
descriptionPane.setOpaque(false);
|
|
descriptionPane.setEditable(false);
|
|
descriptionPane.setContentType("text/html");
|
|
descriptionPane.setText(message);
|
|
descriptionPane.setSize(
|
|
new Dimension(MAX_MSG_PANE_WIDTH, MAX_MSG_PANE_HEIGHT));
|
|
int height = descriptionPane.getPreferredSize().height;
|
|
descriptionPane.setPreferredSize(
|
|
new Dimension(MAX_MSG_PANE_WIDTH, height));
|
|
|
|
northPanel.add(descriptionPane, BorderLayout.CENTER);
|
|
contentPane.add(northPanel, BorderLayout.NORTH);
|
|
|
|
certPanel = new TransparentPanel();
|
|
contentPane.add(certPanel, BorderLayout.CENTER);
|
|
|
|
TransparentPanel southPanel =
|
|
new TransparentPanel(new BorderLayout());
|
|
contentPane.add(southPanel, BorderLayout.SOUTH);
|
|
|
|
certButton = new JButton();
|
|
certButton.setText(R.getI18NString("service.gui.SHOW_CERT"));
|
|
certButton.addActionListener(new ActionListener() {
|
|
|
|
public void actionPerformed(ActionEvent e)
|
|
{
|
|
actionShowCertificate();
|
|
}
|
|
});
|
|
TransparentPanel firstButonPanel =
|
|
new TransparentPanel(new FlowLayout(FlowLayout.LEFT));
|
|
firstButonPanel.add(certButton);
|
|
southPanel.add(firstButonPanel, BorderLayout.WEST);
|
|
|
|
TransparentPanel secondButonPanel =
|
|
new TransparentPanel(new FlowLayout(FlowLayout.RIGHT));
|
|
JButton cancelButton = new JButton(
|
|
R.getI18NString("service.gui.CANCEL"));
|
|
|
|
cancelButton.addActionListener(new ActionListener() {
|
|
|
|
public void actionPerformed(ActionEvent e)
|
|
{
|
|
actionCancel();
|
|
}
|
|
});
|
|
JButton continueButton = new JButton(
|
|
R.getI18NString("service.gui.CONTINUE_ANYWAY"));
|
|
|
|
continueButton.addActionListener(new ActionListener() {
|
|
|
|
public void actionPerformed(ActionEvent e)
|
|
{
|
|
actionContinue();
|
|
}
|
|
});
|
|
secondButonPanel.add(continueButton);
|
|
secondButonPanel.add(cancelButton);
|
|
southPanel.add(secondButonPanel, BorderLayout.EAST);
|
|
|
|
this.getContentPane().add(contentPane, BorderLayout.CENTER);
|
|
|
|
pack();
|
|
}
|
|
|
|
/**
|
|
* Action when shoe certificate button is clicked.
|
|
*/
|
|
private void actionShowCertificate()
|
|
{
|
|
if(certOpened)
|
|
{
|
|
certPanel.removeAll();
|
|
certButton.setText(R.getI18NString("service.gui.SHOW_CERT"));
|
|
|
|
certPanel.revalidate();
|
|
certPanel.repaint();
|
|
pack();
|
|
certOpened = false;
|
|
setLocationRelativeTo(getParent());
|
|
return;
|
|
}
|
|
|
|
certPanel.setLayout(new BorderLayout(5, 5));
|
|
certPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
|
|
certPanel.add(alwaysTrustCheckBox, BorderLayout.NORTH);
|
|
|
|
certPanel.add(new X509CertificatePanel(certs), BorderLayout.CENTER);
|
|
|
|
certButton.setText(R.getI18NString("service.gui.HIDE_CERT"));
|
|
|
|
certPanel.revalidate();
|
|
certPanel.repaint();
|
|
// restore default values for prefered size,
|
|
// as we have resized its components let it calculate
|
|
// that size
|
|
setPreferredSize(null);
|
|
pack();
|
|
certOpened = true;
|
|
setLocationRelativeTo(getParent());
|
|
}
|
|
|
|
/**
|
|
* Action when cancel button is clicked.
|
|
*/
|
|
private void actionCancel()
|
|
{
|
|
isTrusted = false;
|
|
dispose();
|
|
}
|
|
|
|
/**
|
|
* Action when continue is clicked.
|
|
*/
|
|
private void actionContinue()
|
|
{
|
|
isTrusted = true;
|
|
dispose();
|
|
}
|
|
|
|
/**
|
|
* Called when dialog closed or escape pressed.
|
|
* @param isEscaped is escape button pressed.
|
|
*/
|
|
@Override
|
|
protected void close(boolean isEscaped)
|
|
{
|
|
actionCancel();
|
|
}
|
|
|
|
/**
|
|
* Whether the user has accepted the certificate or not.
|
|
* @return whether the user has accepted the certificate or not.
|
|
*/
|
|
public boolean isTrusted()
|
|
{
|
|
return this.isTrusted;
|
|
}
|
|
|
|
/**
|
|
* Whether the user has selected to note the certificate so we always
|
|
* trust it.
|
|
* @return whether the user has selected to note the certificate so
|
|
* we always trust it.
|
|
*/
|
|
public boolean isAlwaysTrustSelected()
|
|
{
|
|
return this.alwaysTrustCheckBox.isSelected();
|
|
}
|
|
|
|
/**
|
|
* Shows or hides the dialog and waits for user response.
|
|
* @param isVisible whether we should show or hide the dialog.
|
|
*/
|
|
@Override
|
|
public void setVisible(boolean isVisible)
|
|
{
|
|
try
|
|
{
|
|
// show the dialog in the swing thread and wait for the user
|
|
// choice
|
|
SwingUtilities.invokeAndWait(new Runnable()
|
|
{
|
|
public void run()
|
|
{
|
|
VerifyCertificateDialogImpl.super.setVisible(true);
|
|
}
|
|
});
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
logger.error("Cannot show certificate verification dialog", e);
|
|
}
|
|
}
|
|
}
|