package org.jboss.seam.security.external.openid; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.enterprise.inject.Instance; 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.jboss.solder.logging.Logger; import org.jboss.seam.security.external.InvalidRequestException; import org.jboss.seam.security.external.ResponseHandler; /** * @author Marcel Kolsteren */ public class OpenIdServlet extends HttpServlet { private static final long serialVersionUID = -3058316157797375740L; // TODO: use injection as soon as Jira issue SOLDER-63 has been solved // @Inject private Logger log = Logger.getLogger(OpenIdServlet.class); @Inject private ResponseHandler responseHandler; @Inject private OpenIdProviderAuthenticationService openIdProviderAuthenticationService; @Inject private OpenIdRpAuthenticationService openIdRpAuthenticationService; @Inject private Instance<OpenIdRpBeanApi> rpBean; @Inject private Instance<OpenIdProviderBeanApi> opBean; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGetOrPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGetOrPost(request, response); } private void doGetOrPost(HttpServletRequest request, HttpServletResponse response) throws IOException { try { handleMessage(request, response); } catch (InvalidRequestException e) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getDescription()); log.infof("Bad request received from %s: %s", request.getRemoteHost(), e.getDescription()); } } private void handleMessage(HttpServletRequest httpRequest, HttpServletResponse response) throws InvalidRequestException { Matcher matcher = Pattern.compile("/(OP|RP)/([^/]*?)$").matcher(httpRequest.getRequestURI()); boolean found = matcher.find(); if (!found) { responseHandler.sendError(HttpServletResponse.SC_NOT_FOUND, "No service endpoint exists for this URL.", response); return; } OpenIdProviderOrRelyingParty opOrRp = OpenIdProviderOrRelyingParty.valueOf(matcher.group(1)); OpenIdService service = OpenIdService.getByName(matcher.group(2)); if (service == null) { responseHandler.sendError(HttpServletResponse.SC_NOT_FOUND, "No service endpoint exists for this URL.", response); return; } switch (service) { case OPEN_ID_SERVICE: if (opOrRp == OpenIdProviderOrRelyingParty.OP) { openIdProviderAuthenticationService.handleIncomingMessage(httpRequest, response); } else { openIdRpAuthenticationService.handleIncomingMessage(httpRequest, response); } break; case XRDS_SERVICE: if (opOrRp == OpenIdProviderOrRelyingParty.OP) { opBean.get().writeOpIdentifierXrds(responseHandler.getWriter("application/xrds+xml", response)); } else { rpBean.get().writeRpXrds(responseHandler.getWriter("application/xrds+xml", response)); } break; default: throw new RuntimeException("Unsupported service " + service); } } public void destroy() { } }