diff options
author | Kenny Root <kenny@the-b.org> | 2009-06-25 22:46:30 +0000 |
---|---|---|
committer | Kenny Root <kenny@the-b.org> | 2009-06-25 22:46:30 +0000 |
commit | 12c1e528b5c5dc325d2b3887104f0cf277b83d0b (patch) | |
tree | 64d509ba6704f4d6937b48e248d106d8378c33e5 /src/org/connectbot/service | |
parent | 93d7a03dc05cb6bc230fff3b1d0b124263f00320 (diff) | |
download | connectbot-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')
-rw-r--r-- | src/org/connectbot/service/TerminalBridge.java | 3 | ||||
-rw-r--r-- | src/org/connectbot/service/TerminalManager.java | 72 |
2 files changed, 64 insertions, 11 deletions
diff --git a/src/org/connectbot/service/TerminalBridge.java b/src/org/connectbot/service/TerminalBridge.java index b0d4dbe..efb35b3 100644 --- a/src/org/connectbot/service/TerminalBridge.java +++ b/src/org/connectbot/service/TerminalBridge.java @@ -272,8 +272,9 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener { transport.setManager(manager); transport.setHost(host); - // Should be more abstract? + // TODO make this more abstract so we don't litter on AbsTransport transport.setCompression(host.getCompression()); + transport.setUseAuthAgent(host.getUseAuthAgent()); transport.setEmulation(emulation); if (transport.canForwardPorts()) { 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; + } } |