/** * Get unregistered required actions * * <p>Returns a list of unregistered required actions. */ @Path("unregistered-required-actions") @GET @Produces(MediaType.APPLICATION_JSON) @NoCache public List<Map<String, String>> getUnregisteredRequiredActions() { auth.requireView(); List<ProviderFactory> factories = session.getKeycloakSessionFactory().getProviderFactories(RequiredActionProvider.class); List<Map<String, String>> unregisteredList = new LinkedList<>(); for (ProviderFactory factory : factories) { RequiredActionFactory requiredActionFactory = (RequiredActionFactory) factory; boolean found = false; for (RequiredActionProviderModel model : realm.getRequiredActionProviders()) { if (model.getProviderId().equals(factory.getId())) { found = true; break; } } if (!found) { Map<String, String> data = new HashMap<>(); data.put("name", requiredActionFactory.getDisplayText()); data.put("providerId", requiredActionFactory.getId()); unregisteredList.add(data); } } return unregisteredList; }
public Response processRequireAction(final String code, String action) { event.event(EventType.CUSTOM_REQUIRED_ACTION); event.detail(Details.CUSTOM_REQUIRED_ACTION, action); if (action == null) { logger.error("required action query param was null"); event.error(Errors.INVALID_CODE); throw new WebApplicationException(ErrorPage.error(session, Messages.INVALID_CODE)); } RequiredActionFactory factory = (RequiredActionFactory) session .getKeycloakSessionFactory() .getProviderFactory(RequiredActionProvider.class, action); if (factory == null) { logger.error("required action provider was null"); event.error(Errors.INVALID_CODE); throw new WebApplicationException(ErrorPage.error(session, Messages.INVALID_CODE)); } RequiredActionProvider provider = factory.create(session); Checks checks = new Checks(); if (!checks.verifyCode(code, action)) { return checks.response; } final ClientSessionCode clientCode = checks.clientCode; final ClientSessionModel clientSession = clientCode.getClientSession(); if (clientSession.getUserSession() == null) { logger.error("user session was null"); event.error(Errors.USER_SESSION_NOT_FOUND); throw new WebApplicationException(ErrorPage.error(session, Messages.SESSION_NOT_ACTIVE)); } initEvent(clientSession); event.event(EventType.CUSTOM_REQUIRED_ACTION); RequiredActionContextResult context = new RequiredActionContextResult( clientSession.getUserSession(), clientSession, realm, event, session, request, clientSession.getUserSession().getUser(), factory) { @Override public String generateAccessCode(String action) { String clientSessionAction = clientSession.getAction(); if (action.equals(clientSessionAction)) { clientSession.setTimestamp(Time.currentTime()); return code; } ClientSessionCode code = new ClientSessionCode(getRealm(), getClientSession()); code.setAction(action); return code.getCode(); } @Override public void ignore() { throw new RuntimeException("Cannot call ignore within processAction()"); } }; provider.processAction(context); if (context.getStatus() == RequiredActionContext.Status.SUCCESS) { event.clone().success(); // do both clientSession.removeRequiredAction(factory.getId()); clientSession.getUserSession().getUser().removeRequiredAction(factory.getId()); event.event(EventType.LOGIN); return AuthenticationManager.nextActionAfterAuthentication( session, clientSession.getUserSession(), clientSession, clientConnection, request, uriInfo, event); } if (context.getStatus() == RequiredActionContext.Status.CHALLENGE) { return context.getChallenge(); } if (context.getStatus() == RequiredActionContext.Status.FAILURE) { LoginProtocol protocol = context .getSession() .getProvider(LoginProtocol.class, context.getClientSession().getAuthMethod()); protocol .setRealm(context.getRealm()) .setHttpHeaders(context.getHttpRequest().getHttpHeaders()) .setUriInfo(context.getUriInfo()); event.detail(Details.CUSTOM_REQUIRED_ACTION, action).error(Errors.REJECTED_BY_USER); return protocol.consentDenied(context.getClientSession()); } throw new RuntimeException("Unreachable"); }