| | |
| | | import java.util.Map; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | | import com.gitblit.Constants.AccessPermission; |
| | | import com.gitblit.Keys; |
| | | import com.gitblit.manager.IRuntimeManager; |
| | | import com.google.common.base.Charsets; |
| | | import com.google.common.base.Joiner; |
| | | import com.google.common.io.Files; |
| | | import com.google.inject.Inject; |
| | | |
| | | /** |
| | | * Manages public keys on the filesystem. |
| | |
| | | |
| | | protected final Map<File, Long> lastModifieds; |
| | | |
| | | @Inject |
| | | public FileKeyManager(IRuntimeManager runtimeManager) { |
| | | this.runtimeManager = runtimeManager; |
| | | this.lastModifieds = new ConcurrentHashMap<File, Long>(); |
| | |
| | | @Override |
| | | protected List<SshKey> getKeysImpl(String username) { |
| | | try { |
| | | log.info("loading keystore for {}", username); |
| | | log.info("loading ssh keystore for {}", username); |
| | | File keystore = getKeystore(username); |
| | | if (!keystore.exists()) { |
| | | return null; |
| | |
| | | // skip comments |
| | | continue; |
| | | } |
| | | SshKey key = new SshKey(entry); |
| | | list.add(key); |
| | | String [] parts = entry.split(" ", 2); |
| | | AccessPermission perm = AccessPermission.fromCode(parts[0]); |
| | | if (perm.equals(AccessPermission.NONE)) { |
| | | // ssh-rsa DATA COMMENT |
| | | SshKey key = new SshKey(entry); |
| | | list.add(key); |
| | | } else if (perm.exceeds(AccessPermission.NONE)) { |
| | | // PERMISSION ssh-rsa DATA COMMENT |
| | | SshKey key = new SshKey(parts[1]); |
| | | key.setPermission(perm); |
| | | list.add(key); |
| | | } |
| | | } |
| | | |
| | | if (list.isEmpty()) { |
| | |
| | | return list; |
| | | } |
| | | } catch (IOException e) { |
| | | throw new RuntimeException("Canot read ssh keys", e); |
| | | throw new RuntimeException("Cannot read ssh keys", e); |
| | | } |
| | | return null; |
| | | } |
| | |
| | | @Override |
| | | public boolean addKey(String username, SshKey key) { |
| | | try { |
| | | String newKey = stripCommentFromKey(key.getRawData()); |
| | | boolean replaced = false; |
| | | List<String> lines = new ArrayList<String>(); |
| | | File keystore = getKeystore(username); |
| | |
| | | continue; |
| | | } |
| | | |
| | | String oldKey = stripCommentFromKey(line); |
| | | if (newKey.equals(oldKey)) { |
| | | SshKey oldKey = parseKey(line); |
| | | if (key.equals(oldKey)) { |
| | | // replace key |
| | | lines.add(key.getRawData()); |
| | | lines.add(key.getPermission() + " " + key.getRawData()); |
| | | replaced = true; |
| | | } else { |
| | | // retain key |
| | |
| | | |
| | | if (!replaced) { |
| | | // new key, append |
| | | lines.add(key.getRawData()); |
| | | lines.add(key.getPermission() + " " + key.getRawData()); |
| | | } |
| | | |
| | | // write keystore |
| | |
| | | @Override |
| | | public boolean removeKey(String username, SshKey key) { |
| | | try { |
| | | String rmKey = stripCommentFromKey(key.getRawData()); |
| | | |
| | | File keystore = getKeystore(username); |
| | | if (keystore.exists()) { |
| | | List<String> lines = new ArrayList<String>(); |
| | |
| | | } |
| | | |
| | | // only include keys that are NOT rmKey |
| | | String oldKey = stripCommentFromKey(line); |
| | | if (!rmKey.equals(oldKey)) { |
| | | SshKey oldKey = parseKey(line); |
| | | if (!key.equals(oldKey)) { |
| | | lines.add(entry); |
| | | } |
| | | } |
| | |
| | | return keys; |
| | | } |
| | | |
| | | /* Strips the comment from the key data and eliminates whitespace diffs */ |
| | | protected String stripCommentFromKey(String data) { |
| | | String [] cols = data.split(" ", 3); |
| | | String key = Joiner.on(" ").join(cols[0], cols[1]); |
| | | return key; |
| | | protected SshKey parseKey(String line) { |
| | | String [] parts = line.split(" ", 2); |
| | | AccessPermission perm = AccessPermission.fromCode(parts[0]); |
| | | if (perm.equals(AccessPermission.NONE)) { |
| | | // ssh-rsa DATA COMMENT |
| | | SshKey key = new SshKey(line); |
| | | return key; |
| | | } else { |
| | | // PERMISSION ssh-rsa DATA COMMENT |
| | | SshKey key = new SshKey(parts[1]); |
| | | key.setPermission(perm); |
| | | return key; |
| | | } |
| | | } |
| | | } |