package org.apereo.cas.web.flow;
import org.apereo.cas.authentication.Authentication;
import org.apereo.cas.authentication.UsernamePasswordCredential;
import org.apereo.cas.authentication.principal.Principal;
import org.apereo.cas.scim.api.ScimProvisioner;
import org.apereo.cas.web.support.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.webflow.action.AbstractAction;
import org.springframework.webflow.execution.Event;
import org.springframework.webflow.execution.RequestContext;
/**
* This is {@link PrincipalScimProvisionerAction}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
public class PrincipalScimProvisionerAction extends AbstractAction {
private static final Logger LOGGER = LoggerFactory.getLogger(PrincipalScimProvisionerAction.class);
private final ScimProvisioner scimProvisioner;
public PrincipalScimProvisionerAction(final ScimProvisioner scimProvisioner) {
this.scimProvisioner = scimProvisioner;
}
@Override
protected Event doExecute(final RequestContext requestContext) throws Exception {
final UsernamePasswordCredential c = (UsernamePasswordCredential) WebUtils.getCredential(requestContext);
if (c == null) {
LOGGER.debug("No credential found in the request context to provision");
return success();
}
final Authentication authentication = WebUtils.getAuthentication(requestContext);
if (authentication == null) {
LOGGER.debug("No authentication found in the request context to provision");
return success();
}
final Principal p = authentication.getPrincipal();
LOGGER.debug("Starting to provision principal [{}]", p);
final boolean res = this.scimProvisioner.create(p, c);
if (res) {
LOGGER.debug("Provisioning of principal [{}] executed successfully", p);
} else {
LOGGER.warn("Provisioning of principal [{}] has failed", p);
}
return success();
}
}