/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.security.concurrent;
import java.io.IOException;
import java.security.Key;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import javax.crypto.SecretKey;
import org.geoserver.platform.resource.Resource;
import org.geoserver.security.GeoServerSecurityManager;
import org.geoserver.security.KeyStoreProvider;
/**
* Locking wrapper for {@link KeyStoreProviderImpl}
*
* @author christian
*
*/
public class LockingKeyStoreProvider implements KeyStoreProvider {
protected final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);
protected final Lock readLock = readWriteLock.readLock();
protected final Lock writeLock = readWriteLock.writeLock();
protected KeyStoreProvider provider;
/**
* get a read lock
*/
protected void readLock() {
readLock.lock();
}
/**
* free read lock
*/
protected void readUnLock() {
readLock.unlock();
}
/**
* get a write lock
*/
protected void writeLock() {
writeLock.lock();
}
/**
* free write lock
*/
protected void writeUnLock() {
writeLock.unlock();
}
public LockingKeyStoreProvider(KeyStoreProvider prov) {
this.provider=prov;
}
@Override
public void setSecurityManager(GeoServerSecurityManager securityManager) {
provider.setSecurityManager(securityManager);
}
@Override
public Resource getResource() {
return provider.getResource();
}
public void reloadKeyStore() throws IOException {
writeLock();
try {
provider.reloadKeyStore();
} finally {
writeUnLock();
}
}
public Key getKey(String alias) throws IOException {
readLock();
try {
return provider.getKey(alias);
} finally {
readUnLock();
}
}
public byte[] getConfigPasswordKey() throws IOException {
readLock();
try {
return provider.getConfigPasswordKey();
} finally {
readUnLock();
}
}
public boolean hasConfigPasswordKey() throws IOException {
readLock();
try {
return provider.hasConfigPasswordKey();
} finally {
readUnLock();
}
}
public boolean containsAlias(String alias) throws IOException {
readLock();
try {
return provider.containsAlias(alias);
} finally {
readUnLock();
}
}
public byte[] getUserGroupKey(String serviceName) throws IOException {
readLock();
try {
return provider.getUserGroupKey(serviceName);
} finally {
readUnLock();
}
}
public boolean hasUserGroupKey(String serviceName) throws IOException {
readLock();
try {
return provider.hasUserGroupKey(serviceName);
} finally {
readUnLock();
}
}
public SecretKey getSecretKey(String name) throws IOException {
readLock();
try {
return provider.getSecretKey(name);
} finally {
readUnLock();
}
}
public PublicKey getPublicKey(String name) throws IOException {
readLock();
try {
return provider.getPublicKey(name);
} finally {
readUnLock();
}
}
public PrivateKey getPrivateKey(String name) throws IOException {
readLock();
try {
return provider.getPrivateKey(name);
} finally {
readUnLock();
}
}
public String aliasForGroupService(String serviceName) {
return provider.aliasForGroupService(serviceName);
}
public boolean isKeyStorePassword(char[] password) throws IOException {
readLock();
try {
return provider.isKeyStorePassword(password);
} finally {
readUnLock();
}
}
public void setSecretKey(String alias, char[] key) throws IOException {
writeLock();
try {
provider.setSecretKey(alias, key);
} finally {
writeUnLock();
}
}
public void setUserGroupKey(String serviceName, char[] password) throws IOException {
writeLock();
try {
provider.setUserGroupKey(serviceName, password);
} finally {
writeUnLock();
}
}
public void removeKey(String alias) throws IOException {
writeLock();
try {
provider.removeKey(alias);
} finally {
writeUnLock();
}
}
public void storeKeyStore() throws IOException {
writeLock();
try {
provider.storeKeyStore();
} finally {
writeUnLock();
}
}
public void prepareForMasterPasswordChange(char[] oldPassword , char[] newPassword)
throws IOException {
writeLock();
try {
provider.prepareForMasterPasswordChange(oldPassword, newPassword);
} finally {
writeUnLock();
}
}
public void abortMasterPasswordChange() {
writeLock();
try {
provider.abortMasterPasswordChange();
} finally {
writeUnLock();
}
}
public void commitMasterPasswordChange() throws IOException {
writeLock();
try {
provider.commitMasterPasswordChange();
} finally {
writeUnLock();
}
}
}