package org.ovirt.engine.core.services;
import java.io.IOException;
import java.net.HttpURLConnection;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.ovirt.engine.core.bll.interfaces.BackendInternal;
import org.ovirt.engine.core.common.businessentities.aaa.DbUser;
import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/*
* This servlet gets a session ID, validates it, checks if the logged in user is administrator, and if so returns its user name
*/
public class GetSessionUser extends HttpServlet {
private static final long serialVersionUID = -6984391651645165467L;
private static final String SESSION_ID_PARAMETER = "sessionID";
private static final int SUCCESS_CODE = HttpURLConnection.HTTP_OK;
private static final int FAILED_CODE = HttpURLConnection.HTTP_INTERNAL_ERROR;
private static final Logger log = LoggerFactory.getLogger(GetSessionUser.class);
@Inject
private BackendInternal backend;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcessRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcessRequest(request, response);
}
private void doProcessRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String sessionID = request.getParameter(SESSION_ID_PARAMETER);
if (runQuery(response, sessionID)) {
response.setStatus(SUCCESS_CODE);
log.debug("Validate Session '{}' succeeded", sessionID);
} else {
response.setStatus(FAILED_CODE);
log.debug("Validate Session '{}' failed", sessionID);
}
}
private boolean runQuery(HttpServletResponse response, String sessionID) {
boolean returnValue = false;
log.debug("Calling ValidateSession query");
VdcQueryReturnValue queryReturnValue = backend.runInternalQuery(VdcQueryType.ValidateSession,
new VdcQueryParametersBase(sessionID));
if (queryReturnValue != null) {
returnValue = queryReturnValue.getSucceeded();
if (returnValue) {
DbUser user = queryReturnValue.getReturnValue();
// We get the user name only in case the validation succeeded, and the user is an administrator
if (user.isAdmin()) {
log.debug("Getting user name");
printUPNToResponse(response, getUPN(user));
} else {
log.error("User '{}' is not authorized to perform operation", user.getLoginName());
returnValue = false;
}
}
} else {
log.error("Got NULL from backend.RunQuery");
}
return returnValue;
}
private void printUPNToResponse(HttpServletResponse response, String upn) {
try {
response.getWriter().print(upn);
} catch (IOException e) {
log.error("Exception while writing user name: {}", e.getMessage());
log.debug("Exception", e);
}
}
private String getUPN(DbUser user) {
String retVal = user.getLoginName();
if (!retVal.contains("@")) {
retVal = retVal + "@" + user.getDomain();
}
return retVal;
}
}