package org.ovirt.engine.core.services; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.ovirt.engine.core.utils.PKIResources; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PKIResourceServlet extends HttpServlet { private static final Logger log = LoggerFactory.getLogger(PKIResourceServlet.class); private static boolean resourcesInitialized = false; private static Map<String, PKIResources.Resource> resources; private static Map<String, PKIResources.Format> formats; private static synchronized void initResources() { if (!resourcesInitialized) { resources = new HashMap<>(); resources.put("ca-certificate", PKIResources.getCaCertificate()); resources.put("engine-certificate", PKIResources.getEngineCertificate()); formats = new HashMap<>(); formats.put("X509-PEM", PKIResources.Format.X509_PEM); formats.put("X509-PEM-CA", PKIResources.Format.X509_PEM_CA); formats.put("OPENSSH-PUBKEY", PKIResources.Format.OPENSSH_PUBKEY); resourcesInitialized = true; } } private String getMyParameter(String name, HttpServletRequest request) { String value; value = request.getParameter(name); if (value == null) { value = (String)request.getAttribute(name); } if (value == null) { value = getInitParameter(name); } return value; } @Override public void init() throws ServletException { super.init(); if (!resourcesInitialized) { try { initResources(); } catch (NullPointerException ex) { throw new ServletException( "Certificate is not available yet, as engine startup has not yet finished", ex); } } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String resourceStr = getMyParameter("resource", request); String formatStr = getMyParameter("format", request); String alias = getMyParameter("alias", request); try { if (resourceStr == null) { throw new IllegalArgumentException("Missing resource name"); } PKIResources.Resource resource = resources.get(resourceStr); if (resource == null) { throw new IllegalArgumentException(String.format("Resource '%1$s' is invalid", resourceStr)); } PKIResources.Format format = null; if (formatStr != null) { format = formats.get(formatStr); if (format == null) { throw new IllegalArgumentException(String.format("Format '%1$s' is invalid", formatStr)); } } try (PrintWriter out = response.getWriter()) { response.setContentType(resource.getContentType(format)); out.print(resource.toString(format, alias)); } } catch(Exception e) { log.error("Cannot send public key resource '{}' format '{}': {}", resourceStr, formatStr, e.getMessage()); log.debug("Exception", e); response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage()); } } }