| /* | |
| * Copyright 2014 gitblit.com. | |
| * | |
| * 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 com.gitblit.transport.ssh; | |
| import java.text.MessageFormat; | |
| import java.util.Collections; | |
| import java.util.List; | |
| import java.util.concurrent.ExecutionException; | |
| import java.util.concurrent.TimeUnit; | |
| import org.slf4j.Logger; | |
| import org.slf4j.LoggerFactory; | |
| import com.gitblit.manager.IManager; | |
| import com.gitblit.models.UserModel; | |
| import com.google.common.cache.CacheBuilder; | |
| import com.google.common.cache.CacheLoader; | |
| import com.google.common.cache.CacheLoader.InvalidCacheLoadException; | |
| import com.google.common.cache.LoadingCache; | |
| /** | |
| * Parent class for ssh public key managers. | |
| * | |
| * @author James Moger | |
| * | |
| */ | |
| public abstract class IPublicKeyManager implements IManager { | |
| protected final Logger log = LoggerFactory.getLogger(getClass()); | |
| protected final LoadingCache<String, List<SshKey>> keyCache = CacheBuilder | |
| .newBuilder(). | |
| expireAfterAccess(15, TimeUnit.MINUTES). | |
| maximumSize(100) | |
| .build(new CacheLoader<String, List<SshKey>>() { | |
| @Override | |
| public List<SshKey> load(String username) { | |
| List<SshKey> keys = getKeysImpl(username); | |
| if (keys == null) { | |
| return Collections.emptyList(); | |
| } | |
| return Collections.unmodifiableList(keys); | |
| } | |
| }); | |
| @Override | |
| public abstract IPublicKeyManager start(); | |
| public abstract boolean isReady(); | |
| @Override | |
| public abstract IPublicKeyManager stop(); | |
| public final List<SshKey> getKeys(String username) { | |
| try { | |
| if (isStale(username)) { | |
| keyCache.invalidate(username); | |
| } | |
| return keyCache.get(username); | |
| } catch (InvalidCacheLoadException e) { | |
| if (e.getMessage() == null || !e.getMessage().contains("returned null")) { | |
| log.error(MessageFormat.format("failed to retrieve keys for {0}", username), e); | |
| } | |
| } catch (ExecutionException e) { | |
| log.error(MessageFormat.format("failed to retrieve keys for {0}", username), e); | |
| } | |
| return null; | |
| } | |
| public final void renameUser(String oldName, String newName) { | |
| List<SshKey> keys = getKeys(oldName); | |
| if (keys == null || keys.isEmpty()) { | |
| return; | |
| } | |
| removeAllKeys(oldName); | |
| for (SshKey key : keys) { | |
| addKey(newName, key); | |
| } | |
| } | |
| protected abstract boolean isStale(String username); | |
| protected abstract List<SshKey> getKeysImpl(String username); | |
| public abstract boolean addKey(String username, SshKey key); | |
| public abstract boolean removeKey(String username, SshKey key); | |
| public abstract boolean removeAllKeys(String username); | |
| public boolean supportsWritingKeys(UserModel user) { | |
| return (user != null); | |
| } | |
| public boolean supportsCommentChanges(UserModel user) { | |
| return (user != null); | |
| } | |
| public boolean supportsPermissionChanges(UserModel user) { | |
| return (user != null); | |
| } | |
| } |