aboutsummaryrefslogtreecommitdiffstats
path: root/src/org/connectbot/service/TerminalManager.java
diff options
context:
space:
mode:
authorKenny Root <kenny@the-b.org>2009-06-25 22:46:30 +0000
committerKenny Root <kenny@the-b.org>2009-06-25 22:46:30 +0000
commit12c1e528b5c5dc325d2b3887104f0cf277b83d0b (patch)
tree64d509ba6704f4d6937b48e248d106d8378c33e5 /src/org/connectbot/service/TerminalManager.java
parent93d7a03dc05cb6bc230fff3b1d0b124263f00320 (diff)
downloadconnectbot-12c1e528b5c5dc325d2b3887104f0cf277b83d0b.tar.gz
connectbot-12c1e528b5c5dc325d2b3887104f0cf277b83d0b.tar.bz2
connectbot-12c1e528b5c5dc325d2b3887104f0cf277b83d0b.zip
Add authentication agent forwarding
git-svn-id: https://connectbot.googlecode.com/svn/trunk/connectbot@331 df292f66-193f-0410-a5fc-6d59da041ff2
Diffstat (limited to 'src/org/connectbot/service/TerminalManager.java')
-rw-r--r--src/org/connectbot/service/TerminalManager.java72
1 files changed, 62 insertions, 10 deletions
diff --git a/src/org/connectbot/service/TerminalManager.java b/src/org/connectbot/service/TerminalManager.java
index 74bc180..1b0955a 100644
--- a/src/org/connectbot/service/TerminalManager.java
+++ b/src/org/connectbot/service/TerminalManager.java
@@ -21,12 +21,14 @@ package org.connectbot.service;
import java.io.IOException;
import java.security.PrivateKey;
import java.security.PublicKey;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
+import java.util.Map.Entry;
import org.connectbot.ConsoleActivity;
import org.connectbot.R;
@@ -83,7 +85,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
public Handler disconnectHandler = null;
- public HashMap<String, Object> loadedPubkeys = new HashMap<String, Object>();
+ public Map<String, KeyHolder> loadedKeypairs = new HashMap<String, KeyHolder>();
public Resources res;
@@ -137,8 +139,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
PublicKey pubKey = PubkeyUtils.decodePublic(pubkey.getPublicKey(), pubkey.getType());
Object trileadKey = PubkeyUtils.convertToTrilead(privKey, pubKey);
- loadedPubkeys.put(pubkey.getNickname(), trileadKey);
- Log.d(TAG, String.format("Added key '%s' to in-memory cache", pubkey.getNickname()));
+ addKey(pubkey.getNickname(), trileadKey);
} catch (Exception e) {
Log.d(TAG, String.format("Problem adding key '%s' to in-memory cache", pubkey.getNickname()), e);
}
@@ -312,27 +313,73 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
}
public boolean isKeyLoaded(String nickname) {
- return loadedPubkeys.containsKey(nickname);
+ return loadedKeypairs.containsKey(nickname);
}
public void addKey(String nickname, Object trileadKey) {
- loadedPubkeys.remove(nickname);
- loadedPubkeys.put(nickname, trileadKey);
+ removeKey(nickname);
+
+ byte[] sshPubKey = PubkeyUtils.extractOpenSSHPublic(trileadKey);
+
+ KeyHolder keyHolder = new KeyHolder();
+ keyHolder.trileadKey = trileadKey;
+ keyHolder.openSSHPubkey = sshPubKey;
+
+ loadedKeypairs.put(nickname, keyHolder);
+
+ Log.d(TAG, String.format("Added key '%s' to in-memory cache", nickname));
+ }
+
+ public boolean removeKey(String nickname) {
+ Log.d(TAG, String.format("Removed key '%s' to in-memory cache", nickname));
+ return loadedKeypairs.remove(nickname) != null;
}
- public void removeKey(String nickname) {
- loadedPubkeys.remove(nickname);
+ public boolean removeKey(byte[] publicKey) {
+ String nickname = null;
+ for (Entry<String,KeyHolder> entry : loadedKeypairs.entrySet()) {
+ if (Arrays.equals(entry.getValue().openSSHPubkey, publicKey)) {
+ nickname = entry.getKey();
+ break;
+ }
+ }
+
+ if (nickname != null) {
+ Log.d(TAG, String.format("Removed key '%s' to in-memory cache", nickname));
+ return removeKey(nickname);
+ } else
+ return false;
}
public Object getKey(String nickname) {
- return loadedPubkeys.get(nickname);
+ if (loadedKeypairs.containsKey(nickname)) {
+ KeyHolder keyHolder = loadedKeypairs.get(nickname);
+ return keyHolder.trileadKey;
+ } else
+ return null;
+ }
+
+ public Object getKey(byte[] publicKey) {
+ for (KeyHolder keyHolder : loadedKeypairs.values()) {
+ if (Arrays.equals(keyHolder.openSSHPubkey, publicKey))
+ return keyHolder.trileadKey;
+ }
+ return null;
+ }
+
+ public String getKeyNickname(byte[] publicKey) {
+ for (Entry<String,KeyHolder> entry : loadedKeypairs.entrySet()) {
+ if (Arrays.equals(entry.getValue().openSSHPubkey, publicKey))
+ return entry.getKey();
+ }
+ return null;
}
private void stopWithDelay() {
// TODO add in a way to check whether keys loaded are encrypted and only
// set timer when we have an encrypted key loaded
- if (loadedPubkeys.size() > 0) {
+ if (loadedKeypairs.size() > 0) {
synchronized (this) {
if (idleTimer == null)
idleTimer = new Timer(true);
@@ -535,4 +582,9 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
public boolean isResizeAllowed() {
return resizeAllowed;
}
+
+ public class KeyHolder {
+ public Object trileadKey;
+ public byte[] openSSHPubkey;
+ }
}