/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * 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 org.jkiss.dbeaver.ui.dialogs.net; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.model.impl.net.SSHConstants; import org.jkiss.dbeaver.model.net.DBWHandlerConfiguration; import org.jkiss.dbeaver.ui.controls.TextWithOpen; import org.jkiss.dbeaver.ui.controls.TextWithOpenFile; import org.jkiss.dbeaver.ui.IObjectPropertyConfigurator; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.utils.CommonUtils; import java.util.Map; /** * SSH tunnel configuration */ public class SSHTunnelConfiguratorUI implements IObjectPropertyConfigurator<DBWHandlerConfiguration> { private Text hostText; private Spinner portText; private Text userNameText; private Combo authMethodCombo; private TextWithOpen privateKeyText; private Label pwdLabel; private Composite pwdControlGroup; private Text passwordText; private Button savePasswordCheckbox; private Label privateKeyLabel; private Composite pkControlGroup; private Spinner keepAliveText; private Spinner tunnelTimeout; @Override public void createControl(Composite parent) { final Composite composite = new Composite(parent, SWT.NONE); GridData gd = new GridData(GridData.FILL_BOTH); gd.minimumHeight = 200; composite.setLayoutData(gd); composite.setLayout(new GridLayout(2, false)); hostText = UIUtils.createLabelText(composite, CoreMessages.model_ssh_configurator_label_host_ip, null); //$NON-NLS-2$ hostText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); portText = UIUtils.createLabelSpinner(composite, CoreMessages.model_ssh_configurator_label_port, SSHConstants.DEFAULT_SSH_PORT, 0, 65535); userNameText = UIUtils.createLabelText(composite, CoreMessages.model_ssh_configurator_label_user_name, null); //$NON-NLS-2$ userNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); authMethodCombo = UIUtils.createLabelCombo(composite, CoreMessages.model_ssh_configurator_combo_auth_method, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(GridData.FILL_HORIZONTAL); gd.minimumWidth = 130; authMethodCombo.setLayoutData(gd); authMethodCombo.add(CoreMessages.model_ssh_configurator_combo_password); authMethodCombo.add(CoreMessages.model_ssh_configurator_combo_pub_key); privateKeyLabel = UIUtils.createControlLabel(composite, CoreMessages.model_ssh_configurator_label_private_key); privateKeyLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); pkControlGroup = UIUtils.createPlaceholder(composite, 1); gd = new GridData(GridData.FILL_HORIZONTAL); gd.minimumWidth = 130; pkControlGroup.setLayoutData(gd); privateKeyText = new TextWithOpenFile( pkControlGroup, CoreMessages.model_ssh_configurator_dialog_choose_private_key, new String[] {"*", "*.ssh", "*.pem", "*.*"}); privateKeyText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); pwdLabel = UIUtils.createControlLabel(composite, CoreMessages.model_ssh_configurator_label_password); pwdControlGroup = UIUtils.createPlaceholder(composite, 3); gd = new GridData(GridData.FILL_HORIZONTAL); gd.minimumWidth = 200; pwdControlGroup.setLayoutData(gd); passwordText = new Text(pwdControlGroup, SWT.BORDER | SWT.PASSWORD); new Label(pwdControlGroup, SWT.NONE).setText(" "); savePasswordCheckbox = UIUtils.createCheckbox(pwdControlGroup, CoreMessages.model_ssh_configurator_checkbox_save_pass, false); keepAliveText = UIUtils.createLabelSpinner(composite, CoreMessages.model_ssh_configurator_label_keep_alive, 0, 0, Integer.MAX_VALUE); tunnelTimeout = UIUtils.createLabelSpinner(composite, CoreMessages.model_ssh_configurator_label_tunnel_timeout, SSHConstants.DEFAULT_CONNECT_TIMEOUT, 0, 300000); authMethodCombo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { updatePrivateKeyVisibility(); composite.layout(); } }); } @Override public void loadSettings(DBWHandlerConfiguration configuration) { hostText.setText(CommonUtils.notEmpty(configuration.getProperties().get(SSHConstants.PROP_HOST))); String portString = configuration.getProperties().get(SSHConstants.PROP_PORT); if (!CommonUtils.isEmpty(portString)) { portText.setSelection(CommonUtils.toInt(portString)); } userNameText.setText(CommonUtils.notEmpty(configuration.getUserName())); SSHConstants.AuthType authType = SSHConstants.AuthType.PASSWORD; String authTypeName = configuration.getProperties().get(SSHConstants.PROP_AUTH_TYPE); if (!CommonUtils.isEmpty(authTypeName)) { authType = SSHConstants.AuthType.valueOf(authTypeName); } authMethodCombo.select(authType == SSHConstants.AuthType.PASSWORD ? 0 : 1); privateKeyText.setText(CommonUtils.notEmpty(configuration.getProperties().get(SSHConstants.PROP_KEY_PATH))); passwordText.setText(CommonUtils.notEmpty(configuration.getPassword())); savePasswordCheckbox.setSelection(configuration.isSavePassword()); String kaString = configuration.getProperties().get(SSHConstants.PROP_ALIVE_INTERVAL); if (!CommonUtils.isEmpty(kaString)) { keepAliveText.setSelection(Integer.parseInt(kaString)); } String timeoutString = configuration.getProperties().get(SSHConstants.PROP_CONNECT_TIMEOUT); if (!CommonUtils.isEmpty(timeoutString)) { tunnelTimeout.setSelection(CommonUtils.toInt(timeoutString)); } updatePrivateKeyVisibility(); } @Override public void saveSettings(DBWHandlerConfiguration configuration) { Map<String,String> properties = configuration.getProperties(); properties.clear(); properties.put(SSHConstants.PROP_HOST, hostText.getText()); properties.put(SSHConstants.PROP_PORT, portText.getText()); properties.put(SSHConstants.PROP_AUTH_TYPE, authMethodCombo.getSelectionIndex() == 0 ? SSHConstants.AuthType.PASSWORD.name() : SSHConstants.AuthType.PUBLIC_KEY.name()); properties.put(SSHConstants.PROP_KEY_PATH, privateKeyText.getText()); configuration.setUserName(userNameText.getText()); configuration.setPassword(passwordText.getText()); configuration.setSavePassword(savePasswordCheckbox.getSelection()); int kaInterval = keepAliveText.getSelection(); if (kaInterval <= 0) { properties.remove(SSHConstants.PROP_ALIVE_INTERVAL); } else { properties.put(SSHConstants.PROP_ALIVE_INTERVAL, String.valueOf(kaInterval)); } properties.put(SSHConstants.PROP_CONNECT_TIMEOUT, tunnelTimeout.getText()); } private void updatePrivateKeyVisibility() { boolean isPassword = authMethodCombo.getSelectionIndex() == 0; ((GridData)pkControlGroup.getLayoutData()).exclude = isPassword; pkControlGroup.setVisible(!isPassword); ((GridData)privateKeyLabel.getLayoutData()).exclude = isPassword; privateKeyLabel.setVisible(!isPassword); // pwdControlGroup.setVisible(isPassword); // ((GridData)pwdControlGroup.getLayoutData()).exclude = !isPassword; // pwdLabel.setVisible(isPassword); // ((GridData)pwdLabel.getLayoutData()).exclude = !isPassword; // // if (!isPassword) { // savePasswordCheckbox.setSelection(true); // } pwdLabel.setText(isPassword ? CoreMessages.model_ssh_configurator_label_password : CoreMessages.model_ssh_configurator_label_passphrase); } @Override public boolean isComplete() { return false; } }