package gw.servlet uses java.lang.StringBuilder uses javax.servlet.http.HttpServletResponse uses javax.servlet.http.HttpServletRequest uses javax.servlet.http.HttpServlet uses com.guidewire.pl.system.logging.PLLoggerCategory uses gw.servlet.ServletUtils uses gw.api.webservice.exception.LoginException uses gw.servlet.Servlet uses gw.api.system.server.ServerUtil /** * This servlet, when added to servlets.xml, permits using a single sign on within the AuthenticationServicePlugin to authenticate the user. * If the user authenticates successfully it will redirect to the home page and avoid csrfToken issue. * * SEE PLWEB-2080 */ @Servlet("/customauth") class CustomAuthServlet extends HttpServlet { static var logger = PLLoggerCategory.SECURITY; override function doGet(req: HttpServletRequest, resp: HttpServletResponse) { doIt(req, resp) } override function doPost(req: HttpServletRequest, resp: HttpServletResponse) { doIt(req, resp) } private function doIt(req: HttpServletRequest, resp: HttpServletResponse) { try { if (ServletUtils.login(req) != null) { redirectToIndex(req, resp); } else { respondUnauthorized(resp); } } catch (e : LoginException) { respondUnauthorized(resp, e); } } private function respondUnauthorized(resp:HttpServletResponse, error:LoginException) { logger.warn("Custom authorization (/service/customauth) failed. User is unauthorized", error); resp.sendError(HttpServletResponse.SC_UNAUTHORIZED); } private function respondUnauthorized(resp:HttpServletResponse) { logger.warn("Custom authorization (/service/customauth) failed. User is unauthorized"); resp.sendError(HttpServletResponse.SC_UNAUTHORIZED); } private function redirectToIndex(req:HttpServletRequest, resp:HttpServletResponse) { logger.debug("User is authorized. Send to index page"); resp.sendRedirect(buildUrl(req, ServerUtil.Product.ProductName)); } private function buildUrl(req:HttpServletRequest, productName:String):String { var buffer:StringBuilder = new StringBuilder(); var scheme:String = req.Scheme; var port = req.ServerPort; buffer.append(scheme); buffer.append("://"); buffer.append(req.ServerName); if (!canOmitPort(scheme, port)) { buffer.append(":"); buffer.append(port); } buffer.append(req.ContextPath); buffer.append("/"); buffer.append(productName); buffer.append(".do"); return buffer.toString(); } private function canOmitPort(scheme:String, port:int):boolean { return ("http".equalsIgnoreCase(scheme) && port == 80) || ("https".equalsIgnoreCase(scheme) && port == 443); } }