/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* 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 net.java.sip.communicator.plugin.otr.authdialog;
import java.awt.*;
import java.awt.event.*;
import java.security.*;
import javax.swing.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.plugin.otr.*;
import net.java.sip.communicator.plugin.otr.OtrContactManager.OtrContact;
import net.java.sip.communicator.plugin.otr.authdialog.FingerprintAuthenticationPanel.ActionComboBoxItem;
import net.java.sip.communicator.service.protocol.*;
/**
* @author George Politis
* @author Marin Dzhigarov
*/
@SuppressWarnings("serial")
public class OtrBuddyAuthenticationDialog
extends SIPCommDialog
{
private final OtrContact contact;
/**
* The {@link OtrBuddyAuthenticationDialog} ctor.
*
* @param contact The {@link Contact} this
* {@link OtrBuddyAuthenticationDialog} refers to.
*/
public OtrBuddyAuthenticationDialog(OtrContact contact)
{
super(false);
this.contact = contact;
initComponents();
}
/**
* Initializes the {@link OtrBuddyAuthenticationDialog} components.
*/
private void initComponents()
{
this.setTitle(OtrActivator.resourceService
.getI18NString("plugin.otr.authbuddydialog.TITLE"));
TransparentPanel mainPanel = new TransparentPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
mainPanel.setPreferredSize(new Dimension(350, 400));
JTextArea generalInformation = new CustomTextArea();
generalInformation.setText(OtrActivator.resourceService
.getI18NString("plugin.otr.authbuddydialog.AUTHENTICATION_INFO"));
mainPanel.add(generalInformation);
mainPanel.add(Box.createVerticalStrut(10));
// Add authentication method label and combo box.
final String am[] = new String[]{
OtrActivator.resourceService.getI18NString(
"plugin.otr.authbuddydialog.AUTHENTICATION_METHOD_QUESTION"),
OtrActivator.resourceService.getI18NString(
"plugin.otr.authbuddydialog.AUTHENTICATION_METHOD_SECRET"),
OtrActivator.resourceService.getI18NString(
"plugin.otr.authbuddydialog.AUTHENTICATION_METHOD_FINGERPRINT")};
final JComboBox authenticationMethodComboBox =
new JComboBox(am);
JTextArea authMethodLabel = new CustomTextArea();
authMethodLabel.setText(
OtrActivator.resourceService.getI18NString(
"plugin.otr.authbuddydialog.AUTHENTICATION_METHOD"));
mainPanel.add(authMethodLabel);
mainPanel.add(authenticationMethodComboBox);
mainPanel.add(Box.createVerticalStrut(10));
// Add authentication panels in a card layout so that the user can
// use the combo box to switch between authentication methods.
final JPanel authenticationPanel =
new TransparentPanel(new CardLayout());
final FingerprintAuthenticationPanel fingerprintPanel =
new FingerprintAuthenticationPanel(contact);
final SecretQuestionAuthenticationPanel secretQuestionPanel =
new SecretQuestionAuthenticationPanel();
final SharedSecretAuthenticationPanel sharedSecretPanel =
new SharedSecretAuthenticationPanel();
authenticationPanel.add(secretQuestionPanel, am[0]);
authenticationPanel.add(sharedSecretPanel, am[1]);
authenticationPanel.add(fingerprintPanel, am[2]);
authenticationMethodComboBox.addItemListener(new ItemListener()
{
@Override
public void itemStateChanged(ItemEvent e)
{
if (e.getStateChange() == ItemEvent.SELECTED)
{
CardLayout cl =
(CardLayout) (authenticationPanel.getLayout());
cl.show(authenticationPanel, (String)e.getItem());
}
}
});
authenticationMethodComboBox.setSelectedIndex(0);
mainPanel.add(authenticationPanel);
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(5, 5, 5, 5);
c.weightx = 1.0;
c.gridwidth = 1;
// Buttons panel.
JPanel buttonPanel = new TransparentPanel(new GridBagLayout());
buttonPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5));
JButton helpButton =
new JButton(OtrActivator.resourceService
.getI18NString("plugin.otr.authbuddydialog.HELP"));
helpButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
OtrActivator.scOtrEngine.launchHelp();
}
});
buttonPanel.add(helpButton, c);
// Provide space between help and the other two button, not sure if this
// is optimal..
c.weightx = 1.0;
buttonPanel.add(new JLabel(), c);
c.weightx = 0.0;
JButton cancelButton =
new JButton(OtrActivator.resourceService
.getI18NString("plugin.otr.authbuddydialog.CANCEL"));
cancelButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
dispose();
}
});
buttonPanel.add(cancelButton, c);
JButton authenticateButton =
new JButton(OtrActivator.resourceService
.getI18NString("plugin.otr.authbuddydialog.AUTHENTICATE_BUDDY"));
authenticateButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String authenticationMethod =
(String)authenticationMethodComboBox.getSelectedItem();
if (authenticationMethod.equals(am[0]))
{
String secret = secretQuestionPanel.getSecret();
String question = secretQuestionPanel.getQuestion();
OtrActivator.scOtrEngine.initSmp(contact, question, secret);
dispose();
}
else if (authenticationMethod.equals(am[1]))
{
String secret = sharedSecretPanel.getSecret();
String question = null;
OtrActivator.scOtrEngine.initSmp(contact, question, secret);
dispose();
}
else if (authenticationMethod.equals(am[2]))
{
ActionComboBoxItem actionItem =
(ActionComboBoxItem) fingerprintPanel.
getCbAction().getSelectedItem();
PublicKey pubKey =
OtrActivator.scOtrEngine.getRemotePublicKey(contact);
String fingerprint =
OtrActivator.scOtrKeyManager.
getFingerprintFromPublicKey(pubKey);
switch (actionItem.action)
{
case I_HAVE:
OtrActivator.scOtrKeyManager.verify(
contact, fingerprint);
break;
case I_HAVE_NOT:
OtrActivator.scOtrKeyManager.unverify(
contact, fingerprint);
break;
}
dispose();
}
}
});
buttonPanel.add(authenticateButton, c);
this.getContentPane().add(mainPanel, BorderLayout.NORTH);
this.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
this.pack();
}
}