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 instance = new InheritableThreadLocal() { @Override protected SecretManager initialValue() { return new SecretManager(); } }; private List secretProviders; private SecretHolder initialSecretHolder; private SecretHolder currentSecretHolder; private SecretManager(){ initialSecretHolder = new SecretHolder(); currentSecretHolder = initialSecretHolder; initSecretProviders(); } protected void initSecretProviders() { secretProviders = new ArrayList<>(); @SuppressWarnings("unchecked") Class[] classes = new Class[]{ JWTSecret.class, GCubeSecretProvider.class }; for(Class clz : classes) { try { SecretProvider authorizationSecretProvider = clz.newInstance(); addSecretProvider(authorizationSecretProvider); } catch (Exception e) { } } } public List 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 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(); } }