|
@@ -47,6 +47,7 @@ import password.pwm.http.PwmURL;
|
|
|
import password.pwm.http.bean.NewUserBean;
|
|
|
import password.pwm.http.servlet.AbstractPwmServlet;
|
|
|
import password.pwm.http.servlet.ControlledPwmServlet;
|
|
|
+import password.pwm.http.servlet.PwmServlet;
|
|
|
import password.pwm.http.servlet.PwmServletDefinition;
|
|
|
import password.pwm.i18n.Message;
|
|
|
import password.pwm.ldap.UserInfo;
|
|
@@ -69,6 +70,7 @@ import javax.servlet.annotation.WebServlet;
|
|
|
import java.io.IOException;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.time.Instant;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
|
import java.util.Collection;
|
|
|
import java.util.Collections;
|
|
@@ -183,6 +185,12 @@ public class NewUserServlet extends ControlledPwmServlet {
|
|
|
final NewUserBean newUserBean = getNewUserBean(pwmRequest);
|
|
|
final PwmApplication pwmApplication = pwmRequest.getPwmApplication();
|
|
|
final PwmSession pwmSession = pwmRequest.getPwmSession();
|
|
|
+ final NewUserProfile newUserProfile = getNewUserProfile(pwmRequest);
|
|
|
+
|
|
|
+ if (newUserBean.getCreateStartTime() != null) {
|
|
|
+ forwardToWait(pwmRequest, newUserProfile);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
if (newUserBean.getProfileID() == null) {
|
|
|
final Set<String> newUserProfileIDs = pwmApplication.getConfig().getNewUserProfiles().keySet();
|
|
@@ -202,14 +210,22 @@ public class NewUserServlet extends ControlledPwmServlet {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- final NewUserProfile newUserProfile = getNewUserProfile(pwmRequest);
|
|
|
-
|
|
|
// try to read the new user policy to make sure it's readable, that way an exception is thrown here instead of by the jsp
|
|
|
newUserProfile.getNewUserPasswordPolicy(pwmApplication, pwmSession.getSessionStateBean().getLocale());//
|
|
|
|
|
|
- if (newUserBean.getNewUserForm() == null) {
|
|
|
- forwardToFormPage(pwmRequest, newUserBean);
|
|
|
- return;
|
|
|
+ if (!newUserBean.isFormPassed()) {
|
|
|
+ if (showFormPage(newUserProfile)) {
|
|
|
+ forwardToFormPage(pwmRequest, newUserBean);
|
|
|
+ return;
|
|
|
+ } else {
|
|
|
+ NewUserFormUtils.injectRemoteValuesIntoForm(newUserBean, newUserProfile);
|
|
|
+ try {
|
|
|
+ verifyForm(pwmRequest, newUserBean.getNewUserForm(), false);
|
|
|
+ } catch (PwmDataValidationException e) {
|
|
|
+ throw new PwmUnrecoverableException(e.getErrorInformation());
|
|
|
+ }
|
|
|
+ newUserBean.setFormPassed(true);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
final TokenVerificationProgress tokenVerificationProgress = newUserBean.getTokenVerificationProgress();
|
|
@@ -237,7 +253,7 @@ public class NewUserServlet extends ControlledPwmServlet {
|
|
|
|
|
|
final String newUserAgreementText = newUserProfile.readSettingAsLocalizedString(PwmSetting.NEWUSER_AGREEMENT_MESSAGE,
|
|
|
pwmSession.getSessionStateBean().getLocale());
|
|
|
- if (newUserAgreementText != null && !newUserAgreementText.isEmpty()) {
|
|
|
+ if (!StringUtil.isEmpty(newUserAgreementText)) {
|
|
|
if (!newUserBean.isAgreementPassed()) {
|
|
|
final MacroMachine macroMachine = NewUserUtils.createMacroMachineForNewUser(
|
|
|
pwmApplication,
|
|
@@ -251,17 +267,13 @@ public class NewUserServlet extends ControlledPwmServlet {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (!newUserBean.isFormPassed()) {
|
|
|
- forwardToFormPage(pwmRequest, newUserBean);
|
|
|
- }
|
|
|
-
|
|
|
// success so create the new user.
|
|
|
final String newUserDN = NewUserUtils.determineUserDN(pwmRequest, newUserBean.getNewUserForm());
|
|
|
|
|
|
try {
|
|
|
NewUserUtils.createUser(newUserBean.getNewUserForm(), pwmRequest, newUserDN);
|
|
|
newUserBean.setCreateStartTime(Instant.now());
|
|
|
- pwmRequest.forwardToJsp(JspUrl.NEW_USER_WAIT);
|
|
|
+ forwardToWait(pwmRequest, newUserProfile);
|
|
|
} catch (PwmOperationalException e) {
|
|
|
LOGGER.error(pwmRequest, "error during user creation: " + e.getMessage());
|
|
|
if (newUserProfile.readSettingAsBoolean(PwmSetting.NEWUSER_DELETE_ON_FAIL)) {
|
|
@@ -272,6 +284,18 @@ public class NewUserServlet extends ControlledPwmServlet {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private boolean showFormPage(final NewUserProfile profile) {
|
|
|
+ final boolean promptForPassword = profile.readSettingAsBoolean(PwmSetting.NEWUSER_PROMPT_FOR_PASSWORD);
|
|
|
+ boolean formNeedsShowing = false;
|
|
|
+ final List<FormConfiguration> formConfigurations = profile.readSettingAsForm(PwmSetting.NEWUSER_FORM);
|
|
|
+ for (final FormConfiguration formConfiguration : formConfigurations) {
|
|
|
+ if (formConfiguration.getType() != FormConfiguration.Type.hidden) {
|
|
|
+ formNeedsShowing = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return formNeedsShowing || promptForPassword;
|
|
|
+ }
|
|
|
+
|
|
|
private boolean readProfileFromUrl(final PwmRequest pwmRequest, final NewUserBean newUserBean)
|
|
|
throws PwmUnrecoverableException, ServletException, IOException
|
|
|
{
|
|
@@ -350,12 +374,17 @@ public class NewUserServlet extends ControlledPwmServlet {
|
|
|
final Map<FormConfiguration,String> formValueData = FormUtility.readFormValuesFromMap(newUserForm.getFormData(), formDefinition, locale);
|
|
|
|
|
|
FormUtility.validateFormValues(pwmApplication.getConfig(), formValueData, locale);
|
|
|
+ final List<FormUtility.ValidationFlag> validationFlags = new ArrayList<>();
|
|
|
+ validationFlags.add(FormUtility.ValidationFlag.checkReadOnlyAndHidden);
|
|
|
+ if (allowResultCaching) {
|
|
|
+ validationFlags.add(FormUtility.ValidationFlag.allowResultCaching);
|
|
|
+ }
|
|
|
FormUtility.validateFormValueUniqueness(
|
|
|
pwmApplication,
|
|
|
formValueData,
|
|
|
locale,
|
|
|
Collections.emptyList(),
|
|
|
- allowResultCaching
|
|
|
+ validationFlags.toArray(new FormUtility.ValidationFlag[validationFlags.size()])
|
|
|
);
|
|
|
final UserInfo uiBean = UserInfoBean.builder()
|
|
|
.cachedPasswordRuleAttributes(FormUtility.asStringMap(formValueData))
|
|
@@ -568,7 +597,7 @@ public class NewUserServlet extends ControlledPwmServlet {
|
|
|
pwmRequest.getPwmApplication().getSessionStateService().clearBean(pwmRequest, NewUserBean.class);
|
|
|
pwmRequest.sendRedirectToContinue();
|
|
|
|
|
|
- return ProcessStatus.Continue;
|
|
|
+ return ProcessStatus.Halt;
|
|
|
}
|
|
|
|
|
|
@ActionHandler(action = "complete")
|
|
@@ -598,7 +627,7 @@ public class NewUserServlet extends ControlledPwmServlet {
|
|
|
pwmRequest.getPwmApplication().getSessionStateService().clearBean(pwmRequest, NewUserBean.class);
|
|
|
|
|
|
final String configuredRedirectUrl = newUserProfile.readSettingAsString(PwmSetting.NEWUSER_REDIRECT_URL);
|
|
|
- if (!StringUtil.isEmpty(configuredRedirectUrl)) {
|
|
|
+ if (!StringUtil.isEmpty(configuredRedirectUrl) && StringUtil.isEmpty(pwmRequest.getPwmSession().getSessionStateBean().getForwardURL())) {
|
|
|
final MacroMachine macroMachine = pwmRequest.getPwmSession().getSessionManager().getMacroMachine(pwmRequest.getPwmApplication());
|
|
|
final String macroedUrl = macroMachine.expandMacros(configuredRedirectUrl);
|
|
|
pwmRequest.sendRedirect(macroedUrl);
|
|
@@ -623,6 +652,23 @@ public class NewUserServlet extends ControlledPwmServlet {
|
|
|
return pwmRequest.getConfig().getNewUserProfiles().get(profileID);
|
|
|
}
|
|
|
|
|
|
+ private void forwardToWait(final PwmRequest pwmRequest, final NewUserProfile newUserProfile)
|
|
|
+ throws ServletException, PwmUnrecoverableException, IOException
|
|
|
+ {
|
|
|
+ final long pauseSeconds = newUserProfile.readSettingAsLong(PwmSetting.NEWUSER_MINIMUM_WAIT_TIME);
|
|
|
+ if (pauseSeconds > 0) {
|
|
|
+ pwmRequest.forwardToJsp(JspUrl.NEW_USER_WAIT);
|
|
|
+ } else {
|
|
|
+ final String newUserServletUrl = pwmRequest.getContextPath() + PwmServletDefinition.NewUser.servletUrl();
|
|
|
+ final String redirectUrl = PwmURL.appendAndEncodeUrlParameters(
|
|
|
+ newUserServletUrl,
|
|
|
+ Collections.singletonMap(PwmConstants.PARAM_ACTION_REQUEST,NewUserAction.complete.name())
|
|
|
+ );
|
|
|
+ pwmRequest.sendRedirect(redirectUrl);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
private void forwardToFormPage(final PwmRequest pwmRequest, final NewUserBean newUserBean)
|
|
|
throws ServletException, PwmUnrecoverableException, IOException
|
|
|
{
|