package org.jivesoftware.spark.otrplug.pref;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import net.java.otr4j.session.SessionID;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.otrplug.OTRManager;
import org.jivesoftware.spark.otrplug.impl.MyOtrKeyManager;
import org.jivesoftware.spark.otrplug.util.OTRProperties;
import org.jivesoftware.spark.otrplug.util.OTRResources;
/**
*
* OTR preference panel for Spark Preferences
*
* @author Bergund Holger
*
*/
public class OTRPrefPanel extends JPanel {
private static final long serialVersionUID = -7125162190413040003L;
private OTRManager _manager;
private JCheckBox _enableOTR;
private JCheckBox _closeSessionOff;
private JCheckBox _closeSessionOnWindowClose;
private JLabel _currentKeyLabel;
private JButton _renewPrivateKey;
private OTRKeyTable _keytable;
private JTextField _privateKey;
private MyOtrKeyManager _keyManager;
private OTRProperties _properties;
public OTRPrefPanel() {
_manager = OTRManager.getInstance();
_keyManager = _manager.getKeyManager();
_properties = OTRProperties.getInstance();
setLayout(new GridBagLayout());
init();
buildGUI();
OtrEnableSwitch();
}
private void OtrEnableSwitch() {
if (!_enableOTR.isSelected()) {
_closeSessionOff.setEnabled(false);
_closeSessionOnWindowClose.setEnabled(false);
_renewPrivateKey.setEnabled(false);
_keytable.setEnabled(false);
} else {
_closeSessionOff.setEnabled(true);
_closeSessionOnWindowClose.setEnabled(true);
_renewPrivateKey.setEnabled(true);
_keytable.setEnabled(true);
}
}
private void init() {
_enableOTR = new JCheckBox();
_enableOTR.setText(OTRResources.getString("otr.enable"));
_enableOTR.setSelected(_properties.getIsOTREnabled());
_enableOTR.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
OtrEnableSwitch();
}
});
_closeSessionOff = new JCheckBox();
_closeSessionOff.setText(OTRResources.getString("otr.close.session.on.contact.off"));
_closeSessionOff.setSelected(_properties.getOTRCloseOnDisc());
_closeSessionOnWindowClose = new JCheckBox();
_closeSessionOnWindowClose.setText(OTRResources.getString("otr.close.session.on.window.close"));
_closeSessionOnWindowClose.setSelected(_properties.getOTRCloseOnChatClose());
_currentKeyLabel = new JLabel();
_currentKeyLabel.setText(OTRResources.getString("current.priv.key"));
_renewPrivateKey = new JButton();
_renewPrivateKey.setText(OTRResources.getString("renew.current.key"));
_renewPrivateKey.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SessionID mySession = new SessionID(SparkManager.getConnection().getUser(), "no one", "Scytale");
_manager.getKeyManager().generateLocalKeyPair(mySession);
_privateKey.setText(getCurrentLocalKey());
}
});
_privateKey = new JTextField();
_privateKey.setEditable(false);
_privateKey.setText(getCurrentLocalKey());
_keytable = new OTRKeyTable();
loadRemoteKeys();
}
private void loadRemoteKeys() {
for (RosterEntry entry : SparkManager.getConnection().getRoster().getEntries()) {
SessionID curSession = new SessionID(SparkManager.getConnection().getUser(), entry.getUser(), "Scytale");
String remoteKey = _keyManager.getRemoteFingerprint(curSession);
if (remoteKey != null) {
boolean isVerified = _keyManager.isVerified(curSession);
_keytable.addEntry(entry.getUser(), remoteKey, isVerified);
}
}
_keytable.addTableChangeListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
int col = e.getColumn();
int row = e.getFirstRow();
if (col == 2) {
boolean selection = (Boolean) _keytable.getValueAt(row, col);
String JID = (String) _keytable.getValueAt(row, 0);
SessionID curSelectedSession = new SessionID(SparkManager.getConnection().getUser(), JID, "Scytale");
if (!selection) {
_keyManager.verify(curSelectedSession);
} else {
_keyManager.unverify(curSelectedSession);
}
}
}
});
}
private void buildGUI() {
this.setBorder(BorderFactory.createTitledBorder(OTRResources.getString("otr.settings")));
this.add(_enableOTR, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
this.add(_closeSessionOff, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(10, 0, 0, 0), 0, 0));
this.add(_closeSessionOnWindowClose,
new GridBagConstraints(0, 2, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
this.add(_currentKeyLabel, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(10, 5, 0, 0), 0, 0));
this.add(_privateKey, new GridBagConstraints(1, 3, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(10, 0, 0, 5), 0, 0));
this.add(_renewPrivateKey, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHEAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 5), 0, 0));
this.add(_keytable, new GridBagConstraints(0, 5, 2, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(20, 5, 10, 5), 0, 0));
}
private String getCurrentLocalKey() {
SessionID mySession = new SessionID(SparkManager.getConnection().getUser(), "no one", "Scytale");
String myKey = _keyManager.getLocalFingerprint(mySession);
return myKey;
}
public JComponent getGUI() {
_keytable = new OTRKeyTable();
loadRemoteKeys();
return this;
}
public boolean isOTREnabled() {
return _enableOTR.isSelected();
}
public boolean isCloseOnDisc() {
return _closeSessionOff.isSelected();
}
public boolean isCloseOnChatClose() {
return _closeSessionOnWindowClose.isSelected();
}
}