From 9f7faec974b2504e36d5922128c64906805ef8f9 Mon Sep 17 00:00:00 2001 From: Valentina Kiryushkina Date: Mon, 16 Jan 2017 12:06:56 +0300 Subject: [PATCH] PY-14605 Add settings for remote notebook: username and password --- .../ipnb/configuration/IpnbConfigurable.form | 64 ++++++++++++++++++- .../ipnb/configuration/IpnbConfigurable.java | 25 +++++++- .../ipnb/configuration/IpnbSettings.java | 28 ++++++++ 3 files changed, 111 insertions(+), 6 deletions(-) diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.form b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.form index 846a47a6edb9..67992456ffa6 100644 --- a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.form +++ b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.form @@ -1,6 +1,6 @@
- + @@ -11,7 +11,7 @@ - + @@ -41,7 +41,8 @@ - + + @@ -60,6 +61,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.java b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.java index 8ee52ff91456..e9d81469a9d9 100644 --- a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.java +++ b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbConfigurable.java @@ -18,12 +18,13 @@ public class IpnbConfigurable implements SearchableConfigurable { private JBTextField myFieldUrl; private TextFieldWithBrowseButton myWorkingDirField; private JBTextField myArgumentsField; + private JPasswordField myPasswordField; + private JBTextField myUsernameField; @NotNull private final Project myProject; public IpnbConfigurable(@NotNull Project project) { myProject = project; - final FileChooserDescriptor fileChooserDescriptor = FileChooserDescriptorFactory - .createSingleFolderDescriptor(); + final FileChooserDescriptor fileChooserDescriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor(); myWorkingDirField.addBrowseFolderListener("Select Working Directory", null, myProject, fileChooserDescriptor); myFieldUrl.setText(IpnbSettings.getInstance(myProject).getURL()); myWorkingDirField.setText(IpnbSettings.getInstance(myProject).getWorkingDirectory()); @@ -56,7 +57,18 @@ public class IpnbConfigurable implements SearchableConfigurable { final String workingDirectory = StringUtil.notNullize(myWorkingDirField.getText()); final String arguments = StringUtil.notNullize(myArgumentsField.getText()); - return !url.equals(oldUrl) || !workingDirectory.equals(oldWorkingDirectory) || !arguments.equals(oldArguments); + return !url.equals(oldUrl) || !workingDirectory.equals(oldWorkingDirectory) || !arguments.equals(oldArguments) + || isCredentialsModified(); + } + + public boolean isCredentialsModified() { + final String oldUsername = StringUtil.notNullize(IpnbSettings.getInstance(myProject).getUsername()); + final String oldPassword = IpnbSettings.getInstance(myProject).getPassword(); + + final String username = StringUtil.notNullize(myUsernameField.getText()); + final String password = StringUtil.notNullize(String.valueOf(myPasswordField.getPassword())); + + return !oldUsername.equals(username) || !oldPassword.equals(password); } @Override @@ -66,6 +78,11 @@ public class IpnbConfigurable implements SearchableConfigurable { IpnbSettings.getInstance(myProject).setURL(url); IpnbSettings.getInstance(myProject).setWorkingDirectory(myWorkingDirField.getText()); IpnbSettings.getInstance(myProject).setArguments(myArgumentsField.getText()); + + if (isCredentialsModified()) { + IpnbSettings.getInstance(myProject).setUsername(myUsernameField.getText()); + IpnbSettings.getInstance(myProject).setPassword(String.valueOf(myPasswordField.getPassword())); + } } @Override @@ -73,6 +90,8 @@ public class IpnbConfigurable implements SearchableConfigurable { myFieldUrl.setText(IpnbSettings.getInstance(myProject).getURL()); myWorkingDirField.setText(IpnbSettings.getInstance(myProject).getWorkingDirectory()); myArgumentsField.setText(IpnbSettings.getInstance(myProject).getArguments()); + myUsernameField.setText(IpnbSettings.getInstance(myProject).getUsername()); + myPasswordField.setText(IpnbSettings.getInstance(myProject).getPassword()); } @Override diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbSettings.java b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbSettings.java index 91ba8fc79785..33071d3c228c 100644 --- a/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbSettings.java +++ b/python/ipnb/src/org/jetbrains/plugins/ipnb/configuration/IpnbSettings.java @@ -1,9 +1,11 @@ package org.jetbrains.plugins.ipnb.configuration; +import com.intellij.ide.passwordSafe.PasswordSafe; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.components.State; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.xmlb.XmlSerializerUtil; import com.intellij.util.xmlb.annotations.Transient; import org.jetbrains.annotations.NotNull; @@ -11,10 +13,12 @@ import org.jetbrains.annotations.Nullable; @State(name = "IpnbSettings") public class IpnbSettings implements PersistentStateComponent { + private static final String IPNB_PASSWORD_KEY = "IPNB_SSH_SETTINGS_PASSWORD_KEY"; public static final String DEFAULT_URL = "http://127.0.0.1:8888"; public String URL = DEFAULT_URL; private String myWorkingDirectory; private String myArguments = ""; + private String myUsername; public static IpnbSettings getInstance(@NotNull Project project) { return ServiceManager.getService(project, IpnbSettings.class); @@ -45,6 +49,30 @@ public class IpnbSettings implements PersistentStateComponent { public void setArguments(String arguments) { myArguments = arguments; } + + @NotNull + public String getUsername() { + return StringUtil.notNullize(myUsername); + } + + public void setUsername(@Nullable String username) { + myUsername = username; + } + + @Transient + @NotNull + public String getPassword() { + final String username = getUsername(); + if (StringUtil.isEmptyOrSpaces(username)) return ""; + return StringUtil.notNullize(PasswordSafe.getInstance().getPassword(IpnbSettings.class, IPNB_PASSWORD_KEY + username)); + } + + @Transient + public void setPassword(@NotNull String password) { + final String username = getUsername(); + if (password.isEmpty() || username.isEmpty()) return; + PasswordSafe.getInstance().setPassword(IpnbSettings.class, IPNB_PASSWORD_KEY + username, password); + } @Override public IpnbSettings getState() {