authorization-utils/src/main/java/org/gcube/common/authorization/utils/manager/SecretManager.java

103 lines
2.6 KiB
Java

package org.gcube.common.authorization.utils.manager;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedSet;
import org.gcube.common.authorization.utils.provider.GCubeSecretProvider;
import org.gcube.common.authorization.utils.provider.SecretProvider;
import org.gcube.common.authorization.utils.secret.JWTSecret;
import org.gcube.common.authorization.utils.secret.Secret;
/**
* @author Luca Frosini (ISTI - CNR)
*/
public class SecretManager {
public static final InheritableThreadLocal<SecretManager> instance = new InheritableThreadLocal<SecretManager>() {
@Override
protected SecretManager initialValue() {
return new SecretManager();
}
};
private List<SecretProvider> secretProviders;
private SecretHolder initialSecretHolder;
private SecretHolder currentSecretHolder;
private SecretManager(){
initialSecretHolder = new SecretHolder();
currentSecretHolder = initialSecretHolder;
initSecretProviders();
}
protected void initSecretProviders() {
secretProviders = new ArrayList<>();
@SuppressWarnings("unchecked")
Class<SecretProvider>[] classes = new Class[]{
JWTSecret.class, GCubeSecretProvider.class
};
for(Class<SecretProvider> clz : classes) {
try {
SecretProvider authorizationSecretProvider = clz.newInstance();
addSecretProvider(authorizationSecretProvider);
} catch (Exception e) {
}
}
}
public List<SecretProvider> getSecretProviders(){
return secretProviders;
}
public void addSecretProvider(SecretProvider secretProvider) {
secretProviders.add(secretProvider);
Secret secret = secretProvider.getSecret();
initialSecretHolder.addSecret(secret);
}
public synchronized void startSession(Secret secret) throws Exception {
if(currentSecretHolder!=initialSecretHolder) {
throw new Exception("You are already in a session. You must terminate the session first.");
}
currentSecretHolder = new SecretHolder(secret);
currentSecretHolder.set();
}
public synchronized void startSession(SortedSet<Secret> secrets) throws Exception {
currentSecretHolder = new SecretHolder(secrets);
currentSecretHolder.set();
}
public synchronized void endSession() throws Exception {
if(currentSecretHolder!=initialSecretHolder) {
initialSecretHolder.set();
currentSecretHolder = initialSecretHolder;
}
}
public String getUsername() {
return currentSecretHolder.getUsername();
}
public String getContext() {
return currentSecretHolder.getContext();
}
public void reset() {
initialSecretHolder.reset();
if(initialSecretHolder!=currentSecretHolder) {
currentSecretHolder.reset();
}
instance.remove();
}
}