/* * 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.util.List; import javax.swing.*; import javax.swing.border.*; import net.java.otr4j.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.plugin.otr.*; import net.java.sip.communicator.service.protocol.*; /** * A special {@link Panel} that manages the OTR configuration. * * @author George Politis */ @SuppressWarnings("serial") public class OtrConfigurationPanel extends TransparentPanel { /** * Creates the <tt>OtrConfigurationPanel</tt> */ public OtrConfigurationPanel() { this.initComponents(); } /** * A special {@link Panel} for Private Keys display. * * @author George Politis */ private static class PrivateKeysPanel extends TransparentPanel { private AccountsComboBox cbAccounts; private JTextField lblFingerprint; private JButton btnGenerate; public PrivateKeysPanel() { super(new BorderLayout()); this.initComponents(); this.openAccount(cbAccounts.getSelectedAccountID()); } /** * A special {@link JComboBox} for {@link AccountID} enumeration. * * @author George Politis */ private static class AccountsComboBox extends JComboBox { /** * A class hosted in an {@link AccountsComboBox} that holds a single * {@link AccountID}. * * @author George Politis */ private static class AccountsComboBoxItem { public final AccountID accountID; public AccountsComboBoxItem(AccountID accountID) { this.accountID = accountID; } @Override public String toString() { return accountID.getDisplayName(); } } public AccountsComboBox() { List<AccountID> accountIDs = OtrActivator.getAllAccountIDs(); if (accountIDs == null) return; for (AccountID accountID : accountIDs) this.addItem(new AccountsComboBoxItem(accountID)); } /** * Gets the selected {@link AccountID} for this * {@link AccountsComboBox}. * * @return the selected account id */ public AccountID getSelectedAccountID() { Object selectedItem = this.getSelectedItem(); if (selectedItem instanceof AccountsComboBoxItem) return ((AccountsComboBoxItem) selectedItem).accountID; else return null; } } /** * Sets up the {@link PrivateKeysPanel} components so that they reflect * the {@link AccountID} param. * * @param account the {@link AccountID} to setup the components for. */ private void openAccount(AccountID account) { if (account == null) { lblFingerprint.setEnabled(false); btnGenerate.setEnabled(false); lblFingerprint.setText(OtrActivator.resourceService .getI18NString("plugin.otr.configform.NO_KEY_PRESENT")); btnGenerate.setText(OtrActivator.resourceService .getI18NString("plugin.otr.configform.GENERATE")); } else { lblFingerprint.setEnabled(true); btnGenerate.setEnabled(true); String fingerprint = OtrActivator.scOtrKeyManager .getLocalFingerprint(account); if (fingerprint == null || fingerprint.length() < 1) { lblFingerprint.setText(OtrActivator.resourceService .getI18NString("plugin.otr.configform.NO_KEY_PRESENT")); btnGenerate.setText(OtrActivator.resourceService .getI18NString("plugin.otr.configform.GENERATE")); } else { lblFingerprint.setText(fingerprint); btnGenerate.setText(OtrActivator.resourceService .getI18NString("plugin.otr.configform.REGENERATE")); } } } /** * Initializes the {@link PrivateKeysPanel} components. */ private void initComponents() { this.setBorder(BorderFactory.createTitledBorder(BorderFactory .createEtchedBorder(EtchedBorder.LOWERED), OtrActivator.resourceService .getI18NString("plugin.otr.configform.MY_PRIVATE_KEYS"))); JPanel labelsPanel = new TransparentPanel(new GridLayout(0, 1)); labelsPanel.add(new JLabel(OtrActivator.resourceService .getI18NString("service.gui.ACCOUNT") + ": ")); labelsPanel.add(new JLabel( OtrActivator.resourceService .getI18NString("plugin.otr.configform.FINGERPRINT") + ": ")); JPanel valuesPanel = new TransparentPanel(new GridLayout(0, 1)); cbAccounts = new AccountsComboBox(); cbAccounts.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { openAccount(((AccountsComboBox) e.getSource()) .getSelectedAccountID()); } }); valuesPanel.add(cbAccounts); lblFingerprint = new JTextField(); lblFingerprint.setEditable(false); lblFingerprint.setOpaque(false); lblFingerprint.setBorder(BorderFactory.createEmptyBorder()); valuesPanel.add(lblFingerprint); JPanel buttonPanel = new TransparentPanel(new FlowLayout(FlowLayout.LEADING, 0, 0)); btnGenerate = new JButton(); buttonPanel.add(btnGenerate); btnGenerate.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { AccountID account = cbAccounts.getSelectedAccountID(); if (account == null) return; OtrActivator.scOtrKeyManager .generateKeyPair(account); openAccount(account); } }); add(labelsPanel, BorderLayout.WEST); add(valuesPanel, BorderLayout.CENTER); add(buttonPanel, BorderLayout.EAST); } } /** * A special {@link Panel} for OTR policy display. * * @author George Politis */ private static class DefaultOtrPolicyPanel extends TransparentPanel { // TODO We should listen for configuration value changes. public DefaultOtrPolicyPanel() { this.initComponents(); this.loadPolicy(); } /** * Sets up the {@link DefaultOtrPolicyPanel} components so that they * reflect the global OTR policy. * */ public void loadPolicy() { OtrPolicy otrPolicy = OtrActivator.scOtrEngine.getGlobalPolicy(); boolean otrEnabled = otrPolicy.getEnableManual(); cbEnable.setSelected(otrEnabled); cbAutoInitiate.setEnabled(otrEnabled); cbRequireOtr.setEnabled(otrEnabled); boolean isAutoInit = otrPolicy.getEnableAlways(); cbAutoInitiate.setSelected(isAutoInit); String otrMandatoryPropValue = OtrActivator.configService.getString( OtrActivator.OTR_MANDATORY_PROP); String defaultOtrPropValue = OtrActivator.resourceService.getSettingsString( OtrActivator.OTR_MANDATORY_PROP); boolean isMandatory = otrPolicy.getRequireEncryption(); if (otrMandatoryPropValue != null) isMandatory = Boolean.parseBoolean(otrMandatoryPropValue); else if (!isMandatory && defaultOtrPropValue != null) isMandatory = Boolean.parseBoolean(defaultOtrPropValue); cbRequireOtr.setSelected(isMandatory); } private SIPCommCheckBox cbEnable; private SIPCommCheckBox cbAutoInitiate; private SIPCommCheckBox cbRequireOtr; /** * Initializes the {@link DefaultOtrPolicyPanel} components. */ private void initComponents() { this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); cbEnable = new SIPCommCheckBox(OtrActivator.resourceService .getI18NString("plugin.otr.configform.CB_ENABLE")); cbEnable.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { OtrPolicy otrPolicy = OtrActivator.scOtrEngine .getGlobalPolicy(); otrPolicy.setEnableManual(((JCheckBox) e.getSource()) .isSelected()); OtrActivator.scOtrEngine.setGlobalPolicy(otrPolicy); DefaultOtrPolicyPanel.this.loadPolicy(); } }); this.add(cbEnable); cbAutoInitiate = new SIPCommCheckBox(OtrActivator.resourceService .getI18NString("plugin.otr.configform.CB_AUTO")); cbAutoInitiate.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { OtrPolicy otrPolicy = OtrActivator.scOtrEngine .getGlobalPolicy(); boolean isAutoInit = ((JCheckBox) e.getSource()).isSelected(); otrPolicy.setSendWhitespaceTag(isAutoInit); OtrActivator.scOtrEngine.setGlobalPolicy(otrPolicy); DefaultOtrPolicyPanel.this.loadPolicy(); } }); this.add(cbAutoInitiate); cbRequireOtr = new SIPCommCheckBox(OtrActivator.resourceService .getI18NString("plugin.otr.configform.CB_REQUIRE")); cbRequireOtr.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { OtrPolicy otrPolicy = OtrActivator.scOtrEngine.getGlobalPolicy(); boolean isRequired = ((JCheckBox) e.getSource()).isSelected(); otrPolicy.setRequireEncryption(isRequired); OtrActivator.configService.setProperty( OtrActivator.OTR_MANDATORY_PROP, Boolean.toString(isRequired)); OtrActivator.scOtrEngine.setGlobalPolicy(otrPolicy); DefaultOtrPolicyPanel.this.loadPolicy(); } }); this.add(cbRequireOtr); } } /** * Initializes all 3 panels of the {@link OtrConfigurationPanel} */ private void initComponents() { this.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.HORIZONTAL; c.weightx = 1.0; c.insets = new Insets(0, 0, 10, 0); c.anchor = GridBagConstraints.PAGE_START; JPanel pnlPrivateKeys = new PrivateKeysPanel(); c.gridy = 0; this.add(pnlPrivateKeys, c); JPanel pnlFingerprints = new KnownFingerprintsPanel(); pnlFingerprints.setMinimumSize(new Dimension(Short.MAX_VALUE, 160)); c.weighty = 1.0; c.gridy = 1; this.add(pnlFingerprints, c); JPanel pnlPolicy = new DefaultOtrPolicyPanel(); c.gridy = 2; this.add(pnlPolicy, c); } }