/* * Copyright 2000-2013 JetBrains s.r.o. * * 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 com.intellij.remote; import com.intellij.openapi.util.PasswordUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.xmlb.annotations.Transient; import org.jdom.Element; import org.jetbrains.annotations.NotNull; /** * @author michael.golubev */ public class RemoteCredentialsHolder implements MutableRemoteCredentials { public static final String HOST = "HOST"; public static final String PORT = "PORT"; public static final String ANONYMOUS = "ANONYMOUS"; public static final String USERNAME = "USERNAME"; public static final String PASSWORD = "PASSWORD"; public static final String USE_KEY_PAIR = "USE_KEY_PAIR"; public static final String PRIVATE_KEY_FILE = "PRIVATE_KEY_FILE"; public static final String KNOWN_HOSTS_FILE = "MY_KNOWN_HOSTS_FILE"; public static final String PASSPHRASE = "PASSPHRASE"; public static final String SSH_PREFIX = "ssh://"; private String myHost; private int myPort;//will always be equal to myLiteralPort, if it's valid, or equal to 0 otherwise private String myLiteralPort; private boolean myAnonymous; private String myUserName; private String myPassword; private boolean myUseKeyPair; private String myPrivateKeyFile; private String myKnownHostsFile; private String myPassphrase; private boolean myStorePassword; private boolean myStorePassphrase; public static String getCredentialsString(@NotNull RemoteCredentials cred) { return SSH_PREFIX + cred.getUserName() + "@" + cred.getHost() + ":" + cred.getLiteralPort(); } @Override public String getHost() { return myHost; } public void setHost(String host) { myHost = host; } @Override public int getPort() { return myPort; } /** * Sets both int and String representations of port. */ @Override public void setPort(int port) { myPort = port; myLiteralPort = Integer.toString(port); } @Override public String getLiteralPort(){ return myLiteralPort; } /** * Sets string representation of port and its int value, which is equal to string one if it's a valid integer, * and is 0 otherwise. */ @Override public void setLiteralPort(String portText){ myLiteralPort = portText; myPort = StringUtil.parseInt(portText, 0); } @Override @Transient public String getUserName() { return myUserName; } public void setUserName(String userName) { myUserName = userName; } @Override public String getPassword() { return myPassword; } public void setPassword(String password) { myPassword = password; } public void setStorePassword(boolean storePassword) { myStorePassword = storePassword; } public void setStorePassphrase(boolean storePassphrase) { myStorePassphrase = storePassphrase; } @Override public boolean isStorePassword() { return myStorePassword; } @Override public boolean isStorePassphrase() { return myStorePassphrase; } @Override public boolean isAnonymous() { return myAnonymous; } public void setAnonymous(boolean anonymous) { myAnonymous = anonymous; } @Override public String getPrivateKeyFile() { return myPrivateKeyFile; } public void setPrivateKeyFile(String privateKeyFile) { myPrivateKeyFile = privateKeyFile; } @Override public String getKnownHostsFile() { return myKnownHostsFile; } public void setKnownHostsFile(String knownHostsFile) { myKnownHostsFile = knownHostsFile; } @Override @Transient public String getPassphrase() { return myPassphrase; } public void setPassphrase(String passphrase) { myPassphrase = passphrase; } @Override public boolean isUseKeyPair() { return myUseKeyPair; } public void setUseKeyPair(boolean useKeyPair) { myUseKeyPair = useKeyPair; } @NotNull public String getSerializedUserName() { if (myAnonymous || myUserName == null) return ""; return myUserName; } public void setSerializedUserName(String userName) { if (StringUtil.isEmpty(userName)) { myUserName = null; } else { myUserName = userName; } } @NotNull public String getSerializedPassword() { if (myAnonymous) return ""; if (myStorePassword) { return PasswordUtil.encodePassword(myPassword); } else { return ""; } } public void setSerializedPassword(String serializedPassword) { if (!StringUtil.isEmpty(serializedPassword)) { myPassword = PasswordUtil.decodePassword(serializedPassword); myStorePassword = true; } else { myPassword = null; } } @NotNull public String getSerializedPassphrase() { if (myStorePassphrase) { return PasswordUtil.encodePassword(myPassphrase); } else { return ""; } } public void setSerializedPassphrase(String serializedPassphrase) { if (!StringUtil.isEmpty(serializedPassphrase)) { myPassphrase = PasswordUtil.decodePassword(serializedPassphrase); myStorePassphrase = true; } else { myPassphrase = null; myStorePassphrase = false; } } public void copyRemoteCredentialsTo(@NotNull MutableRemoteCredentials to) { copyRemoteCredentials(this, to); } public void copyFrom(RemoteCredentials from) { copyRemoteCredentials(from, this); } public static void copyRemoteCredentials(@NotNull RemoteCredentials from, @NotNull MutableRemoteCredentials to) { to.setHost(from.getHost()); to.setLiteralPort(from.getLiteralPort());//then port is copied to.setAnonymous(from.isAnonymous()); to.setUserName(from.getUserName()); to.setPassword(from.getPassword()); to.setUseKeyPair(from.isUseKeyPair()); to.setPrivateKeyFile(from.getPrivateKeyFile()); to.setKnownHostsFile(from.getKnownHostsFile()); to.setStorePassword(from.isStorePassword()); to.setStorePassphrase(from.isStorePassphrase()); } public void load(Element element) { setHost(element.getAttributeValue(HOST)); setLiteralPort(element.getAttributeValue(PORT)); setAnonymous(StringUtil.parseBoolean(element.getAttributeValue(ANONYMOUS), false)); setSerializedUserName(element.getAttributeValue(USERNAME)); setSerializedPassword(element.getAttributeValue(PASSWORD)); setPrivateKeyFile(StringUtil.nullize(element.getAttributeValue(PRIVATE_KEY_FILE))); setKnownHostsFile(StringUtil.nullize(element.getAttributeValue(KNOWN_HOSTS_FILE))); setSerializedPassphrase(element.getAttributeValue(PASSPHRASE)); setUseKeyPair(StringUtil.parseBoolean(element.getAttributeValue(USE_KEY_PAIR), false)); } public void save(Element rootElement) { rootElement.setAttribute(HOST, StringUtil.notNullize(getHost())); rootElement.setAttribute(PORT, StringUtil.notNullize(getLiteralPort())); rootElement.setAttribute(ANONYMOUS, Boolean.toString(isAnonymous())); rootElement.setAttribute(USERNAME, getSerializedUserName()); rootElement.setAttribute(PASSWORD, getSerializedPassword()); rootElement.setAttribute(PRIVATE_KEY_FILE, StringUtil.notNullize(getPrivateKeyFile())); rootElement.setAttribute(KNOWN_HOSTS_FILE, StringUtil.notNullize(getKnownHostsFile())); rootElement.setAttribute(PASSPHRASE, getSerializedPassphrase()); rootElement.setAttribute(USE_KEY_PAIR, Boolean.toString(isUseKeyPair())); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; RemoteCredentialsHolder holder = (RemoteCredentialsHolder)o; if (myLiteralPort != null ? !myLiteralPort.equals(holder.myLiteralPort) : holder.myLiteralPort != null) return false; if (myAnonymous != holder.myAnonymous) return false; if (myUseKeyPair != holder.myUseKeyPair) return false; if (myStorePassword != holder.myStorePassword) return false; if (myStorePassphrase != holder.myStorePassphrase) return false; if (myHost != null ? !myHost.equals(holder.myHost) : holder.myHost != null) return false; if (myUserName != null ? !myUserName.equals(holder.myUserName) : holder.myUserName != null) return false; if (myPassword != null ? !myPassword.equals(holder.myPassword) : holder.myPassword != null) return false; if (myPrivateKeyFile != null ? !myPrivateKeyFile.equals(holder.myPrivateKeyFile) : holder.myPrivateKeyFile != null) return false; if (myKnownHostsFile != null ? !myKnownHostsFile.equals(holder.myKnownHostsFile) : holder.myKnownHostsFile != null) return false; if (myPassphrase != null ? !myPassphrase.equals(holder.myPassphrase) : holder.myPassphrase != null) return false; return true; } @Override public int hashCode() { int result = myHost != null ? myHost.hashCode() : 0; result = 31 * result + (myLiteralPort != null ? myLiteralPort.hashCode() : 0); result = 31 * result + (myAnonymous ? 1 : 0); result = 31 * result + (myUserName != null ? myUserName.hashCode() : 0); result = 31 * result + (myPassword != null ? myPassword.hashCode() : 0); result = 31 * result + (myUseKeyPair ? 1 : 0); result = 31 * result + (myPrivateKeyFile != null ? myPrivateKeyFile.hashCode() : 0); result = 31 * result + (myKnownHostsFile != null ? myKnownHostsFile.hashCode() : 0); result = 31 * result + (myPassphrase != null ? myPassphrase.hashCode() : 0); result = 31 * result + (myStorePassword ? 1 : 0); result = 31 * result + (myStorePassphrase ? 1 : 0); return result; } }