/** * */ package at.knowcenter.wag.egov.egiz.web.servlets; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import at.knowcenter.wag.egov.egiz.PdfASID; import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; import at.knowcenter.wag.egov.egiz.framework.Signator; import at.knowcenter.wag.egov.egiz.framework.SignatorFactory; import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder; import at.knowcenter.wag.egov.egiz.sig.SignatureResponse; import at.knowcenter.wag.egov.egiz.sig.connectors.ConnectorChooser; import at.knowcenter.wag.egov.egiz.sig.connectors.LocalConnector; import at.knowcenter.wag.egov.egiz.sig.connectors.bku.BKUPostConnection; import at.knowcenter.wag.egov.egiz.sig.connectors.bku.EnvelopedBase64BKUConnector; import at.knowcenter.wag.egov.egiz.sig.connectors.bku.LocRefDetachedBKUConnector; import at.knowcenter.wag.egov.egiz.web.FormFields; import at.knowcenter.wag.egov.egiz.web.LocalRequest; import at.knowcenter.wag.egov.egiz.web.SessionAttributes; import at.knowcenter.wag.egov.egiz.web.SessionInformation; /** * @author wprinz * */ public class DataURLServlet extends HttpServlet { /** * SVUID. */ private static final long serialVersionUID = -5846618335843762752L; /** * The log. */ private static Log log = LogFactory.getLog(DataURLServlet.class); protected void dispatch(HttpServletRequest request, HttpServletResponse response, String resource) throws ServletException, IOException { dispatch(request, response, resource, getServletContext()); } protected static void dispatch(HttpServletRequest request, HttpServletResponse response, String resource, ServletContext context) throws ServletException, IOException { response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); RequestDispatcher disp = context.getRequestDispatcher(resource); disp.forward(request, response); } protected void dispatchToResults(List results, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("results", results); dispatch(request, response, "/jsp/results.jsp"); } /** * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { log.debug("Data URL is accessed."); //$NON-NLS-1$ HttpSession session = request.getSession(false); if (session == null) { String msg = "There is no session associated with this request."; //$NON-NLS-1$ log.error(msg); throw new ServletException(msg); } SessionInformation si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION); if (si == null) { String msg = "The session is not found or no longer valid."; //$NON-NLS-1$ log.error(msg); throw new ServletException(msg); } try { log.debug("Request character encoding = " + request.getCharacterEncoding()); //$NON-NLS-1$ if (request.getCharacterEncoding() == null || request.getCharacterEncoding().equals("UTF-8")) //$NON-NLS-1$ { log.error("The BKU didn't set a character encoding for the request."); //$NON-NLS-1$ log.warn("Manually setting character encoding to UTF-8"); //$NON-NLS-1$ request.setCharacterEncoding("UTF-8"); //$NON-NLS-1$ } String xml_response = request.getParameter("XMLResponse"); //$NON-NLS-1$ log.debug("xml_response = " + xml_response); //$NON-NLS-1$ if (isNullResponse(xml_response)) { log.debug("Received a NullOperationResponse -> answering with the first request."); //$NON-NLS-1$ assert si.current_operation == 0; } else { log.debug("Recieved a normal response -> storing the response."); //$NON-NLS-1$ Properties response_properties = new Properties(); response_properties.setProperty(BKUPostConnection.RESPONSE_STRING_KEY, xml_response); si.response_properties[si.current_operation] = response_properties; si.current_operation++; } if (si.current_operation < si.requests.length) { log.debug("There are still requests to be performed -> answering with request #" + si.current_operation); //$NON-NLS-1$ LocalRequest local_request = si.requests[si.current_operation]; String request_string = local_request.getRequestString(); response.setContentType("text/xml"); response.setCharacterEncoding("UTF-8"); response.getWriter().println(request_string); } else { log.debug("All requests have been processed -> processing the responses."); //$NON-NLS-1$ if (si.application.equals("sign")) { // Sign if (si.sign_result == null) { LocalConnector c = ConnectorChooser.chooseLocalConnectorForSign(si.connector, si.type, "loc ref content not needed here"); //$NON-NLS-1$ si.iui.signed_signature_object = c.analyzeSignResponse(si.response_properties[0]); PdfASID algorithm = FormFields.translateSignatureModeToPdfASID(si.mode); Signator signator = SignatorFactory.createSignator(algorithm); si.sign_result = signator.finishSign(si.iui); } SignServlet.returnSignResponse(si, response); } else { // Verify List results = new ArrayList(); for (int i = 0; i < si.response_properties.length; i++) { SignatureHolder sh = (SignatureHolder) si.signature_holders.get(i); PdfASID sig_kz = sh.getSignatureObject().getKZ(); String sig_id = sh.getSignatureObject().getSignationIds(); LocalConnector c = ConnectorChooser.chooseLocalConnectorForVerify(si.connector, sig_kz, sig_id, si.type, "loc ref content not needed here"); //$NON-NLS-1$ SignatureResponse sig_resp = c.analyzeVerifyResponse(si.response_properties[i]); results.add(sig_resp); } dispatchToResults(results, request, response); } } } catch (PresentableException e) { log.error(e); SignServlet.prepareDispatchToErrorPage(e, request); dispatch(request, response, "/jsp/error.jsp"); } log.debug("DataURL access finished."); //$NON-NLS-1$ } protected boolean isNullResponse(String xml_response) { return xml_response.indexOf("NullOperationResponse") >= 0; } }