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

103 lines
2.6 KiB
Java
Raw Normal View History

2021-11-30 17:39:26 +01:00
package org.gcube.common.authorization.utils.manager;
import java.util.ArrayList;
import java.util.List;
2021-12-01 11:48:22 +01:00
import java.util.SortedSet;
2021-11-30 17:39:26 +01:00
import org.gcube.common.authorization.utils.provider.GCubeSecretProvider;
2021-12-01 11:48:22 +01:00
import org.gcube.common.authorization.utils.provider.SecretProvider;
2021-11-30 17:39:26 +01:00
import org.gcube.common.authorization.utils.secret.JWTSecret;
2021-12-01 11:48:22 +01:00
import org.gcube.common.authorization.utils.secret.Secret;
2021-11-30 17:39:26 +01:00
/**
* @author Luca Frosini (ISTI - CNR)
*/
public class SecretManager {
public static final InheritableThreadLocal<SecretManager> instance = new InheritableThreadLocal<SecretManager>() {
2021-12-02 13:16:03 +01:00
2021-11-30 17:39:26 +01:00
@Override
protected SecretManager initialValue() {
return new SecretManager();
}
};
2021-12-01 17:12:52 +01:00
private List<SecretProvider> secretProviders;
private SecretHolder initialSecretHolder;
private SecretHolder currentSecretHolder;
2021-11-30 17:39:26 +01:00
private SecretManager(){
2021-12-01 17:12:52 +01:00
initialSecretHolder = new SecretHolder();
currentSecretHolder = initialSecretHolder;
initSecretProviders();
2021-11-30 17:39:26 +01:00
}
2021-12-01 17:12:52 +01:00
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) {
2021-11-30 17:39:26 +01:00
}
}
}
2021-12-01 17:12:52 +01:00
public List<SecretProvider> getSecretProviders(){
return secretProviders;
2021-11-30 17:39:26 +01:00
}
2021-12-01 17:12:52 +01:00
public void addSecretProvider(SecretProvider secretProvider) {
secretProviders.add(secretProvider);
Secret secret = secretProvider.getSecret();
initialSecretHolder.addSecret(secret);
2021-11-30 17:39:26 +01:00
}
2021-12-01 17:12:52 +01:00
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);
2021-12-02 15:43:58 +01:00
currentSecretHolder.set();
2021-11-30 17:39:26 +01:00
}
2021-12-01 17:12:52 +01:00
public synchronized void startSession(SortedSet<Secret> secrets) throws Exception {
currentSecretHolder = new SecretHolder(secrets);
2021-12-02 15:43:58 +01:00
currentSecretHolder.set();
2021-12-01 17:12:52 +01:00
}
public synchronized void endSession() throws Exception {
if(currentSecretHolder!=initialSecretHolder) {
2021-12-02 15:43:58 +01:00
initialSecretHolder.set();
2021-12-01 17:12:52 +01:00
currentSecretHolder = initialSecretHolder;
}
2021-11-30 17:39:26 +01:00
}
2021-12-01 17:12:52 +01:00
public String getUsername() {
return currentSecretHolder.getUsername();
}
public String getContext() {
return currentSecretHolder.getContext();
}
2021-12-02 13:16:03 +01:00
public void reset() {
initialSecretHolder.reset();
if(initialSecretHolder!=currentSecretHolder) {
currentSecretHolder.reset();
}
instance.remove();
}
2021-11-30 17:39:26 +01:00
}