aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/org/connectbot/bean
diff options
context:
space:
mode:
authorKenny Root <kenny@the-b.org>2014-10-01 23:04:51 +0100
committerKenny Root <kenny@the-b.org>2014-10-01 12:48:19 +0100
commit49b779dcaf03e3598d2709b321e20ea029b25163 (patch)
tree05af547b1f1433d7dd6f7373d0b25a455e053a03 /app/src/main/java/org/connectbot/bean
parentd64786d9197090c74072b648e487e3d34817bb57 (diff)
downloadconnectbot-49b779dcaf03e3598d2709b321e20ea029b25163.tar.gz
connectbot-49b779dcaf03e3598d2709b321e20ea029b25163.tar.bz2
connectbot-49b779dcaf03e3598d2709b321e20ea029b25163.zip
Convert to gradle build system
Diffstat (limited to 'app/src/main/java/org/connectbot/bean')
-rw-r--r--app/src/main/java/org/connectbot/bean/AbstractBean.java49
-rw-r--r--app/src/main/java/org/connectbot/bean/HostBean.java317
-rw-r--r--app/src/main/java/org/connectbot/bean/PortForwardBean.java239
-rw-r--r--app/src/main/java/org/connectbot/bean/PubkeyBean.java234
-rw-r--r--app/src/main/java/org/connectbot/bean/SelectionArea.java201
5 files changed, 1040 insertions, 0 deletions
diff --git a/app/src/main/java/org/connectbot/bean/AbstractBean.java b/app/src/main/java/org/connectbot/bean/AbstractBean.java
new file mode 100644
index 0000000..7f55785
--- /dev/null
+++ b/app/src/main/java/org/connectbot/bean/AbstractBean.java
@@ -0,0 +1,49 @@
+/*
+ * ConnectBot: simple, powerful, open-source SSH client for Android
+ * Copyright 2007 Kenny Root, Jeffrey Sharkey
+ *
+ * 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.connectbot.bean;
+
+import java.util.Map.Entry;
+
+import org.connectbot.util.XmlBuilder;
+
+import android.content.ContentValues;
+
+/**
+ * @author Kenny Root
+ *
+ */
+abstract class AbstractBean {
+ public abstract ContentValues getValues();
+ public abstract String getBeanName();
+
+ public String toXML() {
+ XmlBuilder xml = new XmlBuilder();
+
+ xml.append(String.format("<%s>", getBeanName()));
+
+ ContentValues values = getValues();
+ for (Entry<String, Object> entry : values.valueSet()) {
+ Object value = entry.getValue();
+ if (value != null)
+ xml.append(entry.getKey(), value);
+ }
+ xml.append(String.format("</%s>", getBeanName()));
+
+ return xml.toString();
+ }
+}
diff --git a/app/src/main/java/org/connectbot/bean/HostBean.java b/app/src/main/java/org/connectbot/bean/HostBean.java
new file mode 100644
index 0000000..2fd7bfb
--- /dev/null
+++ b/app/src/main/java/org/connectbot/bean/HostBean.java
@@ -0,0 +1,317 @@
+/*
+ * ConnectBot: simple, powerful, open-source SSH client for Android
+ * Copyright 2007 Kenny Root, Jeffrey Sharkey
+ *
+ * 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.connectbot.bean;
+
+import org.connectbot.util.HostDatabase;
+
+import android.content.ContentValues;
+import android.net.Uri;
+
+/**
+ * @author Kenny Root
+ *
+ */
+public class HostBean extends AbstractBean {
+ public static final String BEAN_NAME = "host";
+
+ /* Database fields */
+ private long id = -1;
+ private String nickname = null;
+ private String username = null;
+ private String hostname = null;
+ private int port = 22;
+ private String protocol = "ssh";
+ private String hostKeyAlgo = null;
+ private byte[] hostKey = null;
+ private long lastConnect = -1;
+ private String color;
+ private boolean useKeys = true;
+ private String useAuthAgent = HostDatabase.AUTHAGENT_NO;
+ private String postLogin = null;
+ private long pubkeyId = -1;
+ private boolean wantSession = true;
+ private String delKey = HostDatabase.DELKEY_DEL;
+ private int fontSize = -1;
+ private boolean compression = false;
+ private String encoding = HostDatabase.ENCODING_DEFAULT;
+ private boolean stayConnected = false;
+
+ public HostBean() {
+
+ }
+
+ @Override
+ public String getBeanName() {
+ return BEAN_NAME;
+ }
+
+ public HostBean(String nickname, String protocol, String username, String hostname, int port) {
+ this.nickname = nickname;
+ this.protocol = protocol;
+ this.username = username;
+ this.hostname = hostname;
+ this.port = port;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+ public long getId() {
+ return id;
+ }
+ public void setNickname(String nickname) {
+ this.nickname = nickname;
+ }
+ public String getNickname() {
+ return nickname;
+ }
+ public void setUsername(String username) {
+ this.username = username;
+ }
+ public String getUsername() {
+ return username;
+ }
+ public void setHostname(String hostname) {
+ this.hostname = hostname;
+ }
+ public String getHostname() {
+ return hostname;
+ }
+ public void setPort(int port) {
+ this.port = port;
+ }
+ public int getPort() {
+ return port;
+ }
+
+ public void setProtocol(String protocol) {
+ this.protocol = protocol;
+ }
+
+ public String getProtocol() {
+ return protocol;
+ }
+
+ public void setHostKeyAlgo(String hostKeyAlgo) {
+ this.hostKeyAlgo = hostKeyAlgo;
+ }
+ public String getHostKeyAlgo() {
+ return hostKeyAlgo;
+ }
+ public void setHostKey(byte[] hostKey) {
+ if (hostKey == null)
+ this.hostKey = null;
+ else
+ this.hostKey = hostKey.clone();
+ }
+ public byte[] getHostKey() {
+ if (hostKey == null)
+ return null;
+ else
+ return hostKey.clone();
+ }
+ public void setLastConnect(long lastConnect) {
+ this.lastConnect = lastConnect;
+ }
+ public long getLastConnect() {
+ return lastConnect;
+ }
+ public void setColor(String color) {
+ this.color = color;
+ }
+ public String getColor() {
+ return color;
+ }
+ public void setUseKeys(boolean useKeys) {
+ this.useKeys = useKeys;
+ }
+ public boolean getUseKeys() {
+ return useKeys;
+ }
+ public void setUseAuthAgent(String useAuthAgent) {
+ this.useAuthAgent = useAuthAgent;
+ }
+ public String getUseAuthAgent() {
+ return useAuthAgent;
+ }
+ public void setPostLogin(String postLogin) {
+ this.postLogin = postLogin;
+ }
+ public String getPostLogin() {
+ return postLogin;
+ }
+ public void setPubkeyId(long pubkeyId) {
+ this.pubkeyId = pubkeyId;
+ }
+ public long getPubkeyId() {
+ return pubkeyId;
+ }
+ public void setWantSession(boolean wantSession) {
+ this.wantSession = wantSession;
+ }
+ public boolean getWantSession() {
+ return wantSession;
+ }
+ public void setDelKey(String delKey) {
+ this.delKey = delKey;
+ }
+ public String getDelKey() {
+ return delKey;
+ }
+ public void setFontSize(int fontSize) {
+ this.fontSize = fontSize;
+ }
+ public int getFontSize() {
+ return fontSize;
+ }
+ public void setCompression(boolean compression) {
+ this.compression = compression;
+ }
+ public boolean getCompression() {
+ return compression;
+ }
+
+ public void setEncoding(String encoding) {
+ this.encoding = encoding;
+ }
+
+ public String getEncoding() {
+ return this.encoding;
+ }
+
+ public void setStayConnected(boolean stayConnected) {
+ this.stayConnected = stayConnected;
+ }
+
+ public boolean getStayConnected() {
+ return stayConnected;
+ }
+
+ public String getDescription() {
+ String description = String.format("%s@%s", username, hostname);
+
+ if (port != 22)
+ description += String.format(":%d", port);
+
+ return description;
+ }
+
+ @Override
+ public ContentValues getValues() {
+ ContentValues values = new ContentValues();
+
+ values.put(HostDatabase.FIELD_HOST_NICKNAME, nickname);
+ values.put(HostDatabase.FIELD_HOST_PROTOCOL, protocol);
+ values.put(HostDatabase.FIELD_HOST_USERNAME, username);
+ values.put(HostDatabase.FIELD_HOST_HOSTNAME, hostname);
+ values.put(HostDatabase.FIELD_HOST_PORT, port);
+ values.put(HostDatabase.FIELD_HOST_HOSTKEYALGO, hostKeyAlgo);
+ values.put(HostDatabase.FIELD_HOST_HOSTKEY, hostKey);
+ values.put(HostDatabase.FIELD_HOST_LASTCONNECT, lastConnect);
+ values.put(HostDatabase.FIELD_HOST_COLOR, color);
+ values.put(HostDatabase.FIELD_HOST_USEKEYS, Boolean.toString(useKeys));
+ values.put(HostDatabase.FIELD_HOST_USEAUTHAGENT, useAuthAgent);
+ values.put(HostDatabase.FIELD_HOST_POSTLOGIN, postLogin);
+ values.put(HostDatabase.FIELD_HOST_PUBKEYID, pubkeyId);
+ values.put(HostDatabase.FIELD_HOST_WANTSESSION, Boolean.toString(wantSession));
+ values.put(HostDatabase.FIELD_HOST_DELKEY, delKey);
+ values.put(HostDatabase.FIELD_HOST_FONTSIZE, fontSize);
+ values.put(HostDatabase.FIELD_HOST_COMPRESSION, Boolean.toString(compression));
+ values.put(HostDatabase.FIELD_HOST_ENCODING, encoding);
+ values.put(HostDatabase.FIELD_HOST_STAYCONNECTED, stayConnected);
+
+ return values;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == null || !(o instanceof HostBean))
+ return false;
+
+ HostBean host = (HostBean)o;
+
+ if (id != -1 && host.getId() != -1)
+ return host.getId() == id;
+
+ if (nickname == null) {
+ if (host.getNickname() != null)
+ return false;
+ } else if (!nickname.equals(host.getNickname()))
+ return false;
+
+ if (protocol == null) {
+ if (host.getProtocol() != null)
+ return false;
+ } else if (!protocol.equals(host.getProtocol()))
+ return false;
+
+ if (username == null) {
+ if (host.getUsername() != null)
+ return false;
+ } else if (!username.equals(host.getUsername()))
+ return false;
+
+ if (hostname == null) {
+ if (host.getHostname() != null)
+ return false;
+ } else if (!hostname.equals(host.getHostname()))
+ return false;
+
+ if (port != host.getPort())
+ return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 7;
+
+ if (id != -1)
+ return (int)id;
+
+ hash = 31 * hash + (null == nickname ? 0 : nickname.hashCode());
+ hash = 31 * hash + (null == protocol ? 0 : protocol.hashCode());
+ hash = 31 * hash + (null == username ? 0 : username.hashCode());
+ hash = 31 * hash + (null == hostname ? 0 : hostname.hashCode());
+ hash = 31 * hash + port;
+
+ return hash;
+ }
+
+ /**
+ * @return URI identifying this HostBean
+ */
+ public Uri getUri() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(protocol)
+ .append("://");
+
+ if (username != null)
+ sb.append(Uri.encode(username))
+ .append('@');
+
+ sb.append(Uri.encode(hostname))
+ .append(':')
+ .append(port)
+ .append("/#")
+ .append(nickname);
+ return Uri.parse(sb.toString());
+ }
+
+}
diff --git a/app/src/main/java/org/connectbot/bean/PortForwardBean.java b/app/src/main/java/org/connectbot/bean/PortForwardBean.java
new file mode 100644
index 0000000..2bdaf20
--- /dev/null
+++ b/app/src/main/java/org/connectbot/bean/PortForwardBean.java
@@ -0,0 +1,239 @@
+/*
+ * ConnectBot: simple, powerful, open-source SSH client for Android
+ * Copyright 2007 Kenny Root, Jeffrey Sharkey
+ *
+ * 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.connectbot.bean;
+
+import org.connectbot.util.HostDatabase;
+
+import android.content.ContentValues;
+
+
+/**
+ * @author Kenny Root
+ *
+ */
+public class PortForwardBean extends AbstractBean {
+ public static final String BEAN_NAME = "portforward";
+
+ /* Database fields */
+ private long id = -1;
+ private long hostId = -1;
+ private String nickname = null;
+ private String type = null;
+ private int sourcePort = -1;
+ private String destAddr = null;
+ private int destPort = -1;
+
+ /* Transient values */
+ private boolean enabled = false;
+ private Object identifier = null;
+
+ /**
+ * @param id database ID of port forward
+ * @param nickname Nickname to use to identify port forward
+ * @param type One of the port forward types from {@link HostDatabase}
+ * @param sourcePort Source port number
+ * @param destAddr Destination hostname or IP address
+ * @param destPort Destination port number
+ */
+ public PortForwardBean(long id, long hostId, String nickname, String type, int sourcePort, String destAddr, int destPort) {
+ this.id = id;
+ this.hostId = hostId;
+ this.nickname = nickname;
+ this.type = type;
+ this.sourcePort = sourcePort;
+ this.destAddr = destAddr;
+ this.destPort = destPort;
+ }
+
+ /**
+ * @param type One of the port forward types from {@link HostDatabase}
+ * @param source Source port number
+ * @param dest Destination is "host:port" format
+ */
+ public PortForwardBean(long hostId, String nickname, String type, String source, String dest) {
+ this.hostId = hostId;
+ this.nickname = nickname;
+ this.type = type;
+ this.sourcePort = Integer.parseInt(source);
+
+ setDest(dest);
+ }
+
+ public String getBeanName() {
+ return BEAN_NAME;
+ }
+
+ /**
+ * @param id the id to set
+ */
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ /**
+ * @return the id
+ */
+ public long getId() {
+ return id;
+ }
+
+ /**
+ * @param nickname the nickname to set
+ */
+ public void setNickname(String nickname) {
+ this.nickname = nickname;
+ }
+
+ /**
+ * @return the nickname
+ */
+ public String getNickname() {
+ return nickname;
+ }
+
+ /**
+ * @param type the type to set
+ */
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ /**
+ * @return the type
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * @param sourcePort the sourcePort to set
+ */
+ public void setSourcePort(int sourcePort) {
+ this.sourcePort = sourcePort;
+ }
+
+ /**
+ * @return the sourcePort
+ */
+ public int getSourcePort() {
+ return sourcePort;
+ }
+
+ /**
+ * @param dest The destination in "host:port" format
+ */
+ public final void setDest(String dest) {
+ String[] destSplit = dest.split(":");
+ this.destAddr = destSplit[0];
+ if (destSplit.length > 1)
+ this.destPort = Integer.parseInt(destSplit[1]);
+ }
+
+ /**
+ * @param destAddr the destAddr to set
+ */
+ public void setDestAddr(String destAddr) {
+ this.destAddr = destAddr;
+ }
+
+ /**
+ * @return the destAddr
+ */
+ public String getDestAddr() {
+ return destAddr;
+ }
+
+ /**
+ * @param destPort the destPort to set
+ */
+ public void setDestPort(int destPort) {
+ this.destPort = destPort;
+ }
+
+ /**
+ * @return the destPort
+ */
+ public int getDestPort() {
+ return destPort;
+ }
+
+ /**
+ * @param enabled the enabled to set
+ */
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ /**
+ * @return the enabled
+ */
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ /**
+ * @param identifier the identifier of this particular type to set
+ */
+ public void setIdentifier(Object identifier) {
+ this.identifier = identifier;
+ }
+
+ /**
+ * @return the identifier used by this particular type
+ */
+ public Object getIdentifier() {
+ return identifier;
+ }
+
+ /**
+ * @return human readable description of the port forward
+ */
+ public CharSequence getDescription() {
+ String description = "Unknown type";
+
+ if (HostDatabase.PORTFORWARD_LOCAL.equals(type)) {
+ description = String.format("Local port %d to %s:%d", sourcePort, destAddr, destPort);
+ } else if (HostDatabase.PORTFORWARD_REMOTE.equals(type)) {
+ description = String.format("Remote port %d to %s:%d", sourcePort, destAddr, destPort);
+/* I don't think we need the SOCKS4 type.
+ } else if (HostDatabase.PORTFORWARD_DYNAMIC4.equals(type)) {
+ description = String.format("Dynamic port %d (SOCKS4)", sourcePort);
+*/
+ } else if (HostDatabase.PORTFORWARD_DYNAMIC5.equals(type)) {
+ description = String.format("Dynamic port %d (SOCKS)", sourcePort);
+ }
+
+ return description;
+ }
+
+ /**
+ * @return
+ */
+ public ContentValues getValues() {
+ ContentValues values = new ContentValues();
+
+ values.put(HostDatabase.FIELD_PORTFORWARD_HOSTID, hostId);
+ values.put(HostDatabase.FIELD_PORTFORWARD_NICKNAME, nickname);
+ values.put(HostDatabase.FIELD_PORTFORWARD_TYPE, type);
+ values.put(HostDatabase.FIELD_PORTFORWARD_SOURCEPORT, sourcePort);
+ values.put(HostDatabase.FIELD_PORTFORWARD_DESTADDR, destAddr);
+ values.put(HostDatabase.FIELD_PORTFORWARD_DESTPORT, destPort);
+
+ return values;
+ }
+}
diff --git a/app/src/main/java/org/connectbot/bean/PubkeyBean.java b/app/src/main/java/org/connectbot/bean/PubkeyBean.java
new file mode 100644
index 0000000..656c6af
--- /dev/null
+++ b/app/src/main/java/org/connectbot/bean/PubkeyBean.java
@@ -0,0 +1,234 @@
+/*
+ * ConnectBot: simple, powerful, open-source SSH client for Android
+ * Copyright 2007 Kenny Root, Jeffrey Sharkey
+ *
+ * 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.connectbot.bean;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.interfaces.ECPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+
+import org.connectbot.util.PubkeyDatabase;
+import org.connectbot.util.PubkeyUtils;
+
+import android.content.ContentValues;
+
+/**
+ * @author Kenny Root
+ *
+ */
+public class PubkeyBean extends AbstractBean {
+ public static final String BEAN_NAME = "pubkey";
+
+ private static final String KEY_TYPE_RSA = "RSA";
+
+ private static final String KEY_TYPE_DSA = "DSA";
+
+ private static final String KEY_TYPE_EC = "EC";
+
+ /* Database fields */
+ private long id;
+ private String nickname;
+ private String type;
+ private byte[] privateKey;
+ private byte[] publicKey;
+ private boolean encrypted = false;
+ private boolean startup = false;
+ private boolean confirmUse = false;
+ private int lifetime = 0;
+
+ /* Transient values */
+ private transient boolean unlocked = false;
+ private transient Object unlockedPrivate = null;
+ private transient String description;
+
+ @Override
+ public String getBeanName() {
+ return BEAN_NAME;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setNickname(String nickname) {
+ this.nickname = nickname;
+ }
+
+ public String getNickname() {
+ return nickname;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setPrivateKey(byte[] privateKey) {
+ if (privateKey == null)
+ this.privateKey = null;
+ else
+ this.privateKey = privateKey.clone();
+ }
+
+ public byte[] getPrivateKey() {
+ if (privateKey == null)
+ return null;
+ else
+ return privateKey.clone();
+ }
+
+ public void setPublicKey(byte[] encoded) {
+ if (encoded == null)
+ publicKey = null;
+ else
+ publicKey = encoded.clone();
+ }
+
+ public byte[] getPublicKey() {
+ if (publicKey == null)
+ return null;
+ else
+ return publicKey.clone();
+ }
+
+ public void setEncrypted(boolean encrypted) {
+ this.encrypted = encrypted;
+ }
+
+ public boolean isEncrypted() {
+ return encrypted;
+ }
+
+ public void setStartup(boolean startup) {
+ this.startup = startup;
+ }
+
+ public boolean isStartup() {
+ return startup;
+ }
+
+ public void setConfirmUse(boolean confirmUse) {
+ this.confirmUse = confirmUse;
+ }
+
+ public boolean isConfirmUse() {
+ return confirmUse;
+ }
+
+ public void setLifetime(int lifetime) {
+ this.lifetime = lifetime;
+ }
+
+ public int getLifetime() {
+ return lifetime;
+ }
+
+ public void setUnlocked(boolean unlocked) {
+ this.unlocked = unlocked;
+ }
+
+ public boolean isUnlocked() {
+ return unlocked;
+ }
+
+ public void setUnlockedPrivate(Object unlockedPrivate) {
+ this.unlockedPrivate = unlockedPrivate;
+ }
+
+ public Object getUnlockedPrivate() {
+ return unlockedPrivate;
+ }
+
+ public String getDescription() {
+ if (description == null) {
+ final StringBuilder sb = new StringBuilder();
+ try {
+ final PublicKey pubKey = PubkeyUtils.decodePublic(privateKey, type);
+ if (PubkeyDatabase.KEY_TYPE_RSA.equals(type)) {
+ int bits = ((RSAPublicKey) pubKey).getModulus().bitLength();
+ sb.append("RSA ");
+ sb.append(bits);
+ sb.append("-bit");
+ } else if (PubkeyDatabase.KEY_TYPE_DSA.equals(type)) {
+ sb.append("DSA 1024-bit");
+ } else if (PubkeyDatabase.KEY_TYPE_EC.equals(type)) {
+ int bits = ((ECPublicKey) pubKey).getParams().getCurve().getField()
+ .getFieldSize();
+ sb.append("EC ");
+ sb.append(bits);
+ sb.append("-bit");
+ } else {
+ sb.append("Unknown Key Type");
+ }
+ } catch (NoSuchAlgorithmException e) {
+ sb.append("Unknown Key Type");
+ } catch (InvalidKeySpecException e) {
+ sb.append("Unknown Key Type");
+ }
+
+ if (encrypted)
+ sb.append(" (encrypted)");
+
+ description = sb.toString();
+ }
+ return description;
+ }
+
+ /* (non-Javadoc)
+ * @see org.connectbot.bean.AbstractBean#getValues()
+ */
+ @Override
+ public ContentValues getValues() {
+ ContentValues values = new ContentValues();
+
+ values.put(PubkeyDatabase.FIELD_PUBKEY_NICKNAME, nickname);
+ values.put(PubkeyDatabase.FIELD_PUBKEY_TYPE, type);
+ values.put(PubkeyDatabase.FIELD_PUBKEY_PRIVATE, privateKey);
+ values.put(PubkeyDatabase.FIELD_PUBKEY_PUBLIC, publicKey);
+ values.put(PubkeyDatabase.FIELD_PUBKEY_ENCRYPTED, encrypted ? 1 : 0);
+ values.put(PubkeyDatabase.FIELD_PUBKEY_STARTUP, startup ? 1 : 0);
+ values.put(PubkeyDatabase.FIELD_PUBKEY_CONFIRMUSE, confirmUse ? 1 : 0);
+ values.put(PubkeyDatabase.FIELD_PUBKEY_LIFETIME, lifetime);
+
+ return values;
+ }
+
+ public boolean changePassword(String oldPassword, String newPassword) throws Exception {
+ PrivateKey priv;
+
+ try {
+ priv = PubkeyUtils.decodePrivate(getPrivateKey(), getType(), oldPassword);
+ } catch (Exception e) {
+ return false;
+ }
+
+ setPrivateKey(PubkeyUtils.getEncodedPrivate(priv, newPassword));
+ setEncrypted(newPassword.length() > 0);
+
+ return true;
+ }
+}
diff --git a/app/src/main/java/org/connectbot/bean/SelectionArea.java b/app/src/main/java/org/connectbot/bean/SelectionArea.java
new file mode 100644
index 0000000..4e6207d
--- /dev/null
+++ b/app/src/main/java/org/connectbot/bean/SelectionArea.java
@@ -0,0 +1,201 @@
+/*
+ * ConnectBot: simple, powerful, open-source SSH client for Android
+ * Copyright 2007 Kenny Root, Jeffrey Sharkey
+ *
+ * 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.connectbot.bean;
+
+import de.mud.terminal.VDUBuffer;
+
+/**
+ * @author Kenny Root
+ * Keep track of a selection area for the terminal copying mechanism.
+ * If the orientation is flipped one way, swap the bottom and top or
+ * left and right to keep it in the correct orientation.
+ */
+public class SelectionArea {
+ private int top;
+ private int bottom;
+ private int left;
+ private int right;
+ private int maxColumns;
+ private int maxRows;
+ private boolean selectingOrigin;
+
+ public SelectionArea() {
+ reset();
+ }
+
+ public final void reset() {
+ top = left = bottom = right = 0;
+ selectingOrigin = true;
+ }
+
+ /**
+ * @param columns
+ * @param rows
+ */
+ public void setBounds(int columns, int rows) {
+ maxColumns = columns - 1;
+ maxRows = rows - 1;
+ }
+
+ private int checkBounds(int value, int max) {
+ if (value < 0)
+ return 0;
+ else if (value > max)
+ return max;
+ else
+ return value;
+ }
+
+ public boolean isSelectingOrigin() {
+ return selectingOrigin;
+ }
+
+ public void finishSelectingOrigin() {
+ selectingOrigin = false;
+ }
+
+ public void decrementRow() {
+ if (selectingOrigin)
+ setTop(top - 1);
+ else
+ setBottom(bottom - 1);
+ }
+
+ public void incrementRow() {
+ if (selectingOrigin)
+ setTop(top + 1);
+ else
+ setBottom(bottom + 1);
+ }
+
+ public void setRow(int row) {
+ if (selectingOrigin)
+ setTop(row);
+ else
+ setBottom(row);
+ }
+
+ private void setTop(int top) {
+ this.top = bottom = checkBounds(top, maxRows);
+ }
+
+ public int getTop() {
+ return Math.min(top, bottom);
+ }
+
+ private void setBottom(int bottom) {
+ this.bottom = checkBounds(bottom, maxRows);
+ }
+
+ public int getBottom() {
+ return Math.max(top, bottom);
+ }
+
+ public void decrementColumn() {
+ if (selectingOrigin)
+ setLeft(left - 1);
+ else
+ setRight(right - 1);
+ }
+
+ public void incrementColumn() {
+ if (selectingOrigin)
+ setLeft(left + 1);
+ else
+ setRight(right + 1);
+ }
+
+ public void setColumn(int column) {
+ if (selectingOrigin)
+ setLeft(column);
+ else
+ setRight(column);
+ }
+
+ private void setLeft(int left) {
+ this.left = right = checkBounds(left, maxColumns);
+ }
+
+ public int getLeft() {
+ return Math.min(left, right);
+ }
+
+ private void setRight(int right) {
+ this.right = checkBounds(right, maxColumns);
+ }
+
+ public int getRight() {
+ return Math.max(left, right);
+ }
+
+ public String copyFrom(VDUBuffer vb) {
+ int size = (getRight() - getLeft() + 1) * (getBottom() - getTop() + 1);
+
+ StringBuffer buffer = new StringBuffer(size);
+
+ for(int y = getTop(); y <= getBottom(); y++) {
+ int lastNonSpace = buffer.length();
+
+ for (int x = getLeft(); x <= getRight(); x++) {
+ // only copy printable chars
+ char c = vb.getChar(x, y);
+
+ if (!Character.isDefined(c) ||
+ (Character.isISOControl(c) && c != '\t'))
+ c = ' ';
+
+ if (c != ' ')
+ lastNonSpace = buffer.length();
+
+ buffer.append(c);
+ }
+
+ // Don't leave a bunch of spaces in our copy buffer.
+ if (buffer.length() > lastNonSpace)
+ buffer.delete(lastNonSpace + 1, buffer.length());
+
+ if (y != bottom)
+ buffer.append("\n");
+ }
+
+ return buffer.toString();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder buffer = new StringBuilder();
+
+ buffer.append("SelectionArea[top=");
+ buffer.append(top);
+ buffer.append(", bottom=");
+ buffer.append(bottom);
+ buffer.append(", left=");
+ buffer.append(left);
+ buffer.append(", right=");
+ buffer.append(right);
+ buffer.append(", maxColumns=");
+ buffer.append(maxColumns);
+ buffer.append(", maxRows=");
+ buffer.append(maxRows);
+ buffer.append(", isSelectingOrigin=");
+ buffer.append(isSelectingOrigin());
+ buffer.append("]");
+
+ return buffer.toString();
+ }
+}