浏览代码

refactor FormDataRequest api

Jason Rivard 8 年之前
父节点
当前提交
b1e35f8a21

+ 20 - 0
src/main/java/password/pwm/config/Configuration.java

@@ -55,12 +55,14 @@ import password.pwm.config.value.LocalizedStringValue;
 import password.pwm.config.value.NamedSecretValue;
 import password.pwm.config.value.NumericValue;
 import password.pwm.config.value.PasswordValue;
+import password.pwm.config.value.RemoteWebServiceValue;
 import password.pwm.config.value.StringArrayValue;
 import password.pwm.config.value.StringValue;
 import password.pwm.config.value.UserPermissionValue;
 import password.pwm.config.value.data.ActionConfiguration;
 import password.pwm.config.value.data.FormConfiguration;
 import password.pwm.config.value.data.NamedSecretData;
+import password.pwm.config.value.data.RemoteWebServiceConfiguration;
 import password.pwm.config.value.data.UserPermission;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
@@ -191,6 +193,10 @@ public class Configuration implements Serializable, SettingReader {
         return JavaTypeConverter.valueToString(readStoredValue(setting));
     }
 
+    public List<RemoteWebServiceConfiguration> readSettingAsRemoteWebService(final PwmSetting pwmSetting) {
+        return JavaTypeConverter.valueToRemoteWebServiceConfiguration(readStoredValue(pwmSetting));
+    }
+
     public PasswordData readSettingAsPassword(final PwmSetting setting)
     {
         return JavaTypeConverter.valueToPassword(readStoredValue(setting));
@@ -251,6 +257,20 @@ public class Configuration implements Serializable, SettingReader {
             return (Map<String,NamedSecretData>)nativeObject;
         }
 
+        public static List<RemoteWebServiceConfiguration> valueToRemoteWebServiceConfiguration(final StoredValue value) {
+            if (value == null) {
+                return null;
+            }
+            if ((!(value instanceof RemoteWebServiceValue))) {
+                throw new IllegalArgumentException("setting value is not readable as named password");
+            }
+            final Object nativeObject = value.toNativeObject();
+            if (nativeObject == null) {
+                return null;
+            }
+            return (List<RemoteWebServiceConfiguration>)nativeObject;
+        }
+
         public static List<ActionConfiguration> valueToAction(final PwmSetting setting, final StoredValue storedValue) {
             if (PwmSettingSyntax.ACTION != setting.getSyntax()) {
                 throw new IllegalArgumentException("may not read ACTION value for setting: " + setting.toString());

+ 6 - 4
src/main/java/password/pwm/http/servlet/newuser/NewUserFormUtils.java

@@ -140,10 +140,12 @@ class NewUserFormUtils {
         final Map<String,String> ldapData = new LinkedHashMap<>();
         final List<FormConfiguration> formConfigurations = newUserProfile.readSettingAsForm(PwmSetting.NEWUSER_FORM);
         for (final FormConfiguration formConfiguration : formConfigurations) {
-            final String attrName = formConfiguration.getName();
-            final String value = newUserForm.getFormData().get(attrName);
-            if (!StringUtil.isEmpty(value)) {
-                ldapData.put(attrName, value);
+            if (formConfiguration.getSource() == FormConfiguration.Source.ldap) {
+                final String attrName = formConfiguration.getName();
+                final String value = newUserForm.getFormData().get(attrName);
+                if (!StringUtil.isEmpty(value)) {
+                    ldapData.put(attrName, value);
+                }
             }
         }
         return ldapData;

+ 5 - 1
src/main/java/password/pwm/http/servlet/newuser/NewUserServlet.java

@@ -132,7 +132,7 @@ public class NewUserServlet extends ControlledPwmServlet {
     }
 
 
-    private static NewUserBean getNewUserBean(final PwmRequest pwmRequest) throws PwmUnrecoverableException {
+    static NewUserBean getNewUserBean(final PwmRequest pwmRequest) throws PwmUnrecoverableException {
         return pwmRequest.getPwmApplication().getSessionStateService().getBean(pwmRequest, NewUserBean.class);
     }
 
@@ -351,6 +351,7 @@ public class NewUserServlet extends ControlledPwmServlet {
             }
             final RestCheckPasswordServer.JsonData jsonData = RestCheckPasswordServer.JsonData.fromPasswordCheckInfo(
                     passwordCheckInfo);
+
             final RestResultBean restResultBean = new RestResultBean();
             restResultBean.setData(jsonData);
             pwmRequest.outputJsonResult(restResultBean);
@@ -389,6 +390,9 @@ public class NewUserServlet extends ControlledPwmServlet {
                 Collections.emptyList(),
                 validationFlags.toArray(new FormUtility.ValidationFlag[validationFlags.size()])
         );
+
+        NewUserUtils.remoteVerifyFormData(pwmRequest, newUserForm);
+
         final UserInfo uiBean = UserInfoBean.builder()
                 .cachedPasswordRuleAttributes(FormUtility.asStringMap(formValueData))
                 .passwordPolicy(newUserProfile.getNewUserPasswordPolicy(pwmApplication, locale))

+ 76 - 0
src/main/java/password/pwm/http/servlet/newuser/NewUserUtils.java

@@ -45,6 +45,7 @@ import password.pwm.config.profile.LdapProfile;
 import password.pwm.config.profile.NewUserProfile;
 import password.pwm.config.profile.PwmPasswordPolicy;
 import password.pwm.error.ErrorInformation;
+import password.pwm.error.PwmDataValidationException;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmUnrecoverableException;
@@ -73,6 +74,9 @@ import password.pwm.util.macro.MacroMachine;
 import password.pwm.util.operations.ActionExecutor;
 import password.pwm.util.operations.PasswordUtility;
 import password.pwm.ws.client.rest.RestTokenDataClient;
+import password.pwm.ws.client.rest.form.FormDataRequestBean;
+import password.pwm.ws.client.rest.form.FormDataResponseBean;
+import password.pwm.ws.client.rest.form.RestFormDataClient;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -253,6 +257,9 @@ class NewUserUtils {
 
         NewUserUtils.LOGGER.trace(pwmSession, "new user ldap creation process complete, now authenticating user");
 
+        // write data to remote web service
+        remoteWriteFormData(pwmRequest, newUserForm);
+
         //authenticate the user to pwm
         final UserIdentity userIdentity = new UserIdentity(newUserDN, pwmApplication.getConfig().getDefaultLdapProfile().getIdentifier());
         final SessionAuthenticator sessionAuthenticator = new SessionAuthenticator(pwmApplication, pwmSession, PwmAuthenticationSource.NEW_USER_REGISTRATION);
@@ -573,4 +580,73 @@ class NewUserUtils {
         }
         return Collections.unmodifiableMap(returnMap);
     }
+
+    static void remoteVerifyFormData(
+            final PwmRequest pwmRequest,
+            final NewUserForm newUserForm
+
+    )
+            throws PwmUnrecoverableException, PwmDataValidationException
+    {
+        remoteSendFormData(
+                pwmRequest,
+                newUserForm,
+                FormDataRequestBean.Mode.verify
+        );
+    }
+
+    static void remoteWriteFormData(
+            final PwmRequest pwmRequest,
+            final NewUserForm newUserForm
+
+    )
+            throws PwmUnrecoverableException, PwmDataValidationException
+    {
+        remoteSendFormData(
+                pwmRequest,
+                newUserForm,
+                FormDataRequestBean.Mode.write
+        );
+    }
+
+    private static void remoteSendFormData(
+            final PwmRequest pwmRequest,
+            final NewUserForm newUserForm,
+            final FormDataRequestBean.Mode mode
+
+    )
+            throws PwmUnrecoverableException, PwmDataValidationException
+    {
+        final RestFormDataClient restFormDataClient = new RestFormDataClient(pwmRequest.getPwmApplication());
+        if (!restFormDataClient.isEnabled()) {
+            return;
+        }
+
+        final NewUserBean newUserBean = NewUserServlet.getNewUserBean(pwmRequest);
+        final NewUserProfile newUserProfile = NewUserServlet.getNewUserProfile(pwmRequest);
+
+        final FormDataRequestBean.FormInfo formInfo = FormDataRequestBean.FormInfo.builder()
+                .mode(mode)
+                .moduleProfileID(newUserBean.getProfileID())
+                .sessionID(pwmRequest.getPwmSession().getLoginInfoBean().getGuid())
+                .module(FormDataRequestBean.FormType.NewUser)
+                .build();
+
+        final FormDataRequestBean formDataRequestBean = FormDataRequestBean.builder()
+                .formInfo(formInfo)
+                .formConfigurations(newUserProfile.readSettingAsForm(PwmSetting.NEWUSER_FORM))
+                .formValues(newUserForm.getFormData())
+                .build();
+
+        final FormDataResponseBean formDataResponseBean = restFormDataClient.invoke(formDataRequestBean, pwmRequest.getLocale());
+        if (formDataResponseBean.isError()) {
+            final ErrorInformation error = new ErrorInformation(
+                    PwmError.ERROR_REMOTE_ERROR_VALUE,
+                    formDataResponseBean.getErrorDetail(),
+                    new String[]{formDataResponseBean.getErrorMessage()}
+            );
+            throw new PwmDataValidationException(error);
+        }
+    }
+
 }

+ 40 - 0
src/main/java/password/pwm/ws/client/rest/form/FormDataRequestBean.java

@@ -0,0 +1,40 @@
+package password.pwm.ws.client.rest.form;
+
+import lombok.Builder;
+import lombok.Getter;
+import password.pwm.config.value.data.FormConfiguration;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+@Getter
+@Builder
+public class FormDataRequestBean implements Serializable{
+
+    @Getter
+    @Builder
+    public static class FormInfo {
+        private FormType module;
+        private String moduleProfileID;
+        private Mode mode;
+        private String sessionID;
+    }
+
+    private FormInfo formInfo;
+    private String userDN;
+    private String ldapProfileID;
+
+    public enum FormType {
+        NewUser,
+    }
+
+    public enum Mode {
+        read,
+        verify,
+        write,
+    }
+
+    private Map<String,String> formValues;
+    private List<FormConfiguration> formConfigurations;
+}

+ 17 - 0
src/main/java/password/pwm/ws/client/rest/form/FormDataResponseBean.java

@@ -0,0 +1,17 @@
+package password.pwm.ws.client.rest.form;
+
+import lombok.Builder;
+import lombok.Getter;
+
+import java.io.Serializable;
+import java.util.Map;
+
+@Getter
+@Builder
+public class FormDataResponseBean implements Serializable {
+    private boolean error;
+    private String errorMessage;
+    private String errorDetail;
+    private Map<String,String> formValues;
+
+}

+ 103 - 0
src/main/java/password/pwm/ws/client/rest/form/RestFormDataClient.java

@@ -0,0 +1,103 @@
+/*
+ * Password Management Servlets (PWM)
+ * http://www.pwm-project.org
+ *
+ * Copyright (c) 2006-2009 Novell, Inc.
+ * Copyright (c) 2009-2017 The PWM Project
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+package password.pwm.ws.client.rest.form;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.util.EntityUtils;
+import password.pwm.PwmApplication;
+import password.pwm.PwmConstants;
+import password.pwm.config.PwmSetting;
+import password.pwm.config.value.data.RemoteWebServiceConfiguration;
+import password.pwm.error.ErrorInformation;
+import password.pwm.error.PwmError;
+import password.pwm.error.PwmUnrecoverableException;
+import password.pwm.http.client.PwmHttpClient;
+import password.pwm.util.java.JsonUtil;
+import password.pwm.util.logging.PwmLogger;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Locale;
+
+public class RestFormDataClient {
+
+    private static final PwmLogger LOGGER = PwmLogger.forClass(RestFormDataClient.class);
+
+    private final PwmApplication pwmApplication;
+    private RemoteWebServiceConfiguration remoteWebServiceConfiguration;
+
+    public RestFormDataClient(final PwmApplication pwmApplication)
+    {
+        this.pwmApplication = pwmApplication;
+        final List<RemoteWebServiceConfiguration> values = pwmApplication.getConfig().readSettingAsRemoteWebService(PwmSetting.EXTERNAL_REMOTE_DATA_URL);
+        if (values != null && !values.isEmpty()) {
+            remoteWebServiceConfiguration = values.iterator().next();
+        }
+    }
+
+    public boolean isEnabled() {
+        return remoteWebServiceConfiguration != null;
+    }
+
+    public FormDataResponseBean invoke(
+            final FormDataRequestBean formDataRequestBean,
+            final Locale locale
+    )
+            throws PwmUnrecoverableException
+    {
+        final HttpPost httpPost = new HttpPost(remoteWebServiceConfiguration.getUrl());
+        httpPost.setHeader("Accept", PwmConstants.AcceptValue.json.getHeaderValue());
+        if (locale != null) {
+            httpPost.setHeader("Accept-Locale", locale.toString());
+        }
+        httpPost.setHeader("Content-Type", PwmConstants.ContentTypeValue.json.getHeaderValue());
+
+        final String jsonRequestBody = JsonUtil.serialize(formDataRequestBean);
+
+        final HttpResponse httpResponse;
+        try {
+            final StringEntity stringEntity = new StringEntity(jsonRequestBody);
+            stringEntity.setContentType(PwmConstants.AcceptValue.json.getHeaderValue());
+            httpPost.setEntity(stringEntity);
+            LOGGER.debug("beginning external rest call to: " + httpPost.toString() + ", body: " + jsonRequestBody);
+            httpResponse = PwmHttpClient.getHttpClient(pwmApplication.getConfig()).execute(httpPost);
+            final String responseBody = EntityUtils.toString(httpResponse.getEntity());
+            LOGGER.trace("external rest call returned: " + httpResponse.getStatusLine().toString() + ", body: " + responseBody);
+            if (httpResponse.getStatusLine().getStatusCode() != 200) {
+                final String errorMsg = "received non-200 response code (" + httpResponse.getStatusLine().getStatusCode() + ") when executing web-service";
+                LOGGER.error(errorMsg);
+                throw new PwmUnrecoverableException(new ErrorInformation(PwmError.ERROR_SERVICE_UNREACHABLE, errorMsg));
+            }
+            final FormDataResponseBean formDataResponseBean = JsonUtil.deserialize(responseBody, FormDataResponseBean.class);
+            return formDataResponseBean;
+        } catch (IOException e) {
+            final String errorMsg = "http response error while executing external rest call, error: " + e.getMessage();
+            LOGGER.error(errorMsg);
+            throw new PwmUnrecoverableException(new ErrorInformation(PwmError.ERROR_SERVICE_UNREACHABLE, errorMsg),e);
+        }
+
+    }
+
+}

文件差异内容过多而无法显示
+ 0 - 0
src/main/resources/password/pwm/i18n/PwmSetting.properties


部分文件因为文件数量过多而无法显示