package org.ovirt.engine.api.restapi.util; import java.util.UUID; import org.ovirt.engine.api.common.security.auth.Principal; import org.ovirt.engine.api.common.invocation.Current; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; public class SessionHelper { private Current current; private static ThreadLocal<String> sessionIdHolder = new ThreadLocal<String>(); public void setCurrent(Current current) { this.current = current; } public Current getCurrent() { return current; } public <P extends VdcQueryParametersBase> P sessionize(P parameters) { Principal principal = current.get(Principal.class); if (principal != null) { parameters.setSessionId(getSessionId(principal)); } return parameters; } public <P extends VdcActionParametersBase> P sessionize(P parameters) { Principal principal = current.get(Principal.class); return sessionize(parameters, principal); } public <P extends VdcActionParametersBase> P sessionize(P parameters, Principal principal) { if (principal != null) { parameters.setSessionId(getSessionId(principal)); } return parameters; } /** * Fabricate a session ID. * * @param principal * the current principal * @return a session ID to use for the short-lived login session */ public static synchronized String getSessionId(Principal principal) { if (sessionIdHolder.get() == null) { String sessionId = UUID.randomUUID() + "_" + principal.getUser() + "\\" + principal.getDomain(); sessionIdHolder.set(sessionId); } return sessionIdHolder.get(); } /** * Clean sessionId on Logout */ public void clean() { sessionIdHolder.remove(); } }