/*********************************************************************************** * * Copyright (c) 2015 Kamil Baczkowicz * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v1.0 which accompany this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * * Kamil Baczkowicz - initial API and implementation and/or initial documentation * */ package pl.baczkowicz.mqttspy.ui.controllers.edit; import java.net.URL; import java.util.ResourceBundle; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.control.PasswordField; import javafx.scene.layout.AnchorPane; import pl.baczkowicz.mqttspy.common.generated.SecureSocketSettings; import pl.baczkowicz.mqttspy.configuration.ConfiguredConnectionDetails; import pl.baczkowicz.mqttspy.configuration.generated.UserInterfaceMqttConnectionDetails; import pl.baczkowicz.mqttspy.ui.EditConnectionController; import pl.baczkowicz.spy.common.generated.SecureSocketModeEnum; import pl.baczkowicz.spy.ui.utils.DialogFactory; /** * Controller for editing a single connection - security tab - certificates pane. */ @SuppressWarnings({"unchecked", "rawtypes"}) public class EditConnectionSecurityTlsCertificatesController extends AnchorPane implements Initializable { /** The parent controller. */ private EditConnectionController parent; @FXML private AnchorPane tlsCertificatesPane; // Certificates @FXML private TextField caCertificateFile; @FXML private Button caCertificateFileButton; @FXML private PasswordField clientPassword; @FXML private TextField clientKeyFile; @FXML private Button clientKeyFileButton; @FXML private TextField clientCertificateFile; @FXML private Button clientCertificateFileButton; @FXML private Label clientKeyPasswordLabel; @FXML private Label clientKeyFileLabel; @FXML private Label clientCertificateFileLabel; @FXML private Label clientKeyPemLabel; @FXML private CheckBox clientKeyPemFormatted; // Other fields private final ChangeListener basicOnChangeListener = new ChangeListener() { @Override public void changed(ObservableValue observable, Object oldValue, Object newValue) { onChange(); } }; // =============================== // === Initialisation ============ // =============================== public void initialize(URL location, ResourceBundle resources) { // Set up edit buttons DialogFactory.setUpTextFieldFileOpenButton(caCertificateFile, caCertificateFileButton); DialogFactory.setUpTextFieldFileOpenButton(clientCertificateFile, clientCertificateFileButton); DialogFactory.setUpTextFieldFileOpenButton(clientKeyFile, clientKeyFileButton); // Certificates caCertificateFile.textProperty().addListener(basicOnChangeListener); clientCertificateFile.textProperty().addListener(basicOnChangeListener); clientKeyFile.textProperty().addListener(basicOnChangeListener); clientPassword.textProperty().addListener(basicOnChangeListener); clientKeyPemFormatted.selectedProperty().addListener(basicOnChangeListener); } public void init() { // Nothing to do } // =============================== // === Logic ===================== // =============================== public void onChange() { parent.onChange(); } public void updateSSL(final SecureSocketModeEnum mode) { final boolean certificates = SecureSocketModeEnum.SERVER_ONLY.equals(mode) || SecureSocketModeEnum.SERVER_AND_CLIENT.equals(mode); if (certificates) { final boolean serverAndClient = SecureSocketModeEnum.SERVER_AND_CLIENT.equals(mode); clientPassword.setVisible(serverAndClient); clientKeyFile.setVisible(serverAndClient); clientCertificateFile.setVisible(serverAndClient); clientKeyPasswordLabel.setVisible(serverAndClient); clientKeyFileLabel.setVisible(serverAndClient); clientCertificateFileLabel.setVisible(serverAndClient); clientKeyPemLabel.setVisible(serverAndClient); clientKeyPemFormatted.setVisible(serverAndClient); clientCertificateFileButton.setVisible(serverAndClient); clientKeyFileButton.setVisible(serverAndClient); } } public void readAndSetValues(final SecureSocketModeEnum mode, final UserInterfaceMqttConnectionDetails connection) { if (mode == null || SecureSocketModeEnum.DISABLED.equals(mode)) { connection.setSSL(null); } else { final SecureSocketSettings sslSettings = connection.getSSL(); final boolean certificates = SecureSocketModeEnum.SERVER_ONLY.equals(mode) || SecureSocketModeEnum.SERVER_AND_CLIENT.equals(mode); if (certificates) { sslSettings.setCertificateAuthorityFile(caCertificateFile.getText()); sslSettings.setClientCertificateFile(clientCertificateFile.getText()); sslSettings.setClientKeyFile(clientKeyFile.getText()); sslSettings.setClientKeyPassword(clientPassword.getText()); sslSettings.setClientKeyPEM(clientKeyPemFormatted.isSelected()); } connection.setSSL(sslSettings); } } public void displayConnectionDetails(final ConfiguredConnectionDetails connection) { if (connection.getSSL() != null) { // Certificates caCertificateFile.setText(connection.getSSL().getCertificateAuthorityFile()); clientCertificateFile.setText(connection.getSSL().getClientCertificateFile()); clientKeyFile.setText(connection.getSSL().getClientKeyFile()); clientPassword.setText(connection.getSSL().getClientKeyPassword()); clientKeyPemFormatted.setSelected(Boolean.TRUE.equals(connection.getSSL().isClientKeyPEM())); } } // =============================== // === Setters and getters ======= // =============================== public void setParent(final EditConnectionController controller) { this.parent = controller; } /** * @return the tlsCertificatesPane */ public AnchorPane getTlsCertificatesPane() { return tlsCertificatesPane; } /** * @param tlsCertificatesPane the tlsCertificatesPane to set */ public void setTlsCertificatesPane(AnchorPane tlsCertificatesPane) { this.tlsCertificatesPane = tlsCertificatesPane; } }