James Moger
2014-03-30 413e9b486b1a84960d4c8ddac130e87280f64c6a
src/main/java/com/gitblit/transport/ssh/FileKeyManager.java
@@ -17,16 +17,11 @@
import java.io.File;
import java.io.IOException;
import java.security.PublicKey;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.codec.binary.Base64;
import org.apache.sshd.common.util.Buffer;
import org.eclipse.jgit.lib.Constants;
import com.gitblit.Keys;
import com.gitblit.manager.IRuntimeManager;
@@ -92,7 +87,7 @@
   }
   @Override
   protected List<PublicKey> getKeysImpl(String username) {
   protected List<SshKey> getKeysImpl(String username) {
      try {
         log.info("loading keystore for {}", username);
         File keystore = getKeystore(username);
@@ -100,7 +95,7 @@
            return null;
         }
         if (keystore.exists()) {
            List<PublicKey> list = new ArrayList<PublicKey>();
            List<SshKey> list = new ArrayList<SshKey>();
            for (String entry : Files.readLines(keystore, Charsets.ISO_8859_1)) {
               if (entry.trim().length() == 0) {
                  // skip blanks
@@ -110,9 +105,8 @@
                  // skip comments
                  continue;
               }
               final String[] parts = entry.split(" ");
               final byte[] bin = Base64.decodeBase64(Constants.encodeASCII(parts[1]));
               list.add(new Buffer(bin).getRawPublicKey());
               SshKey key = new SshKey(entry);
               list.add(key);
            }
            if (list.isEmpty()) {
@@ -133,10 +127,10 @@
    * by disregarding the comment/description field during key comparisons.
    */
   @Override
   public boolean addKey(String username, String data) {
   public boolean addKey(String username, SshKey key) {
      try {
         String newKey = stripCommentFromKey(data);
         String newKey = stripCommentFromKey(key.getRawData());
         boolean replaced = false;
         List<String> lines = new ArrayList<String>();
         File keystore = getKeystore(username);
         if (keystore.exists()) {
@@ -153,16 +147,22 @@
                  continue;
               }
               // only add keys that do not match the new key
               String oldKey = stripCommentFromKey(line);
               if (!newKey.equals(oldKey)) {
               if (newKey.equals(oldKey)) {
                  // replace key
                  lines.add(key.getRawData());
                  replaced = true;
               } else {
                  // retain key
                  lines.add(entry);
               }
            }
         }
         // add new key
         lines.add(data);
         if (!replaced) {
            // new key, append
            lines.add(key.getRawData());
         }
         // write keystore
         String content = Joiner.on("\n").join(lines).trim().concat("\n");
@@ -177,12 +177,12 @@
   }
   /**
    * Removes a key from the keystore.
    * Removes the specified key from the keystore.
    */
   @Override
   public boolean removeKey(String username, String data) {
   public boolean removeKey(String username, SshKey key) {
      try {
         String rmKey = stripCommentFromKey(data);
         String rmKey = stripCommentFromKey(key.getRawData());
         File keystore = getKeystore(username);
         if (keystore.exists()) {
@@ -244,7 +244,7 @@
   /* Strips the comment from the key data and eliminates whitespace diffs */
   protected String stripCommentFromKey(String data) {
      String [] cols = data.split(" ");
      String [] cols = data.split(" ", 3);
      String key = Joiner.on(" ").join(cols[0], cols[1]);
      return key;
   }