]> git.mxchange.org Git - jjobs-war.git/commitdiff
Please cherry-pick:
authorRoland Häder <roland@mxchange.org>
Thu, 22 Jun 2017 20:52:09 +0000 (22:52 +0200)
committerRoland Häder <roland@mxchange.org>
Fri, 23 Jun 2017 18:27:20 +0000 (20:27 +0200)
- New feature to allow users on registration entering no password. The
  application will then generate a random password for the user and also sends
  it in clear-text to the EJB (HTTPS is not meant here) so the bean can deliver
  it to the user.
- user registration page will now show proper messages for above feature
- removed obsolete template (seems to be still around?)
- ifBothPasswordsEmptyAllowed() implemented
- added missing i18n strings

Signed-off-by: Roland Häder <roland@mxchange.org>
12 files changed:
src/java/org/mxchange/jjobs/beans/contact/JobsAdminContactWebRequestBean.java
src/java/org/mxchange/jjobs/beans/contact/JobsContactWebSessionBean.java
src/java/org/mxchange/jjobs/beans/user/JobsUserWebSessionBean.java
src/java/org/mxchange/jjobs/beans/user/JobsUserWebSessionController.java
src/java/org/mxchange/jjobs/beans/user/register/JobsUserRegisterWebSessionBean.java
src/java/org/mxchange/localization/bundle_de_DE.properties
src/java/org/mxchange/localization/bundle_en_US.properties
web/WEB-INF/templates/guest/user/guest_registration_form.tpl [deleted file]
web/WEB-INF/templates/guest/user/register/guest_form_register_page1.tpl
web/WEB-INF/templates/guest/user/register/guest_form_register_single.tpl
web/WEB-INF/web.xml
web/guest/user/user_register.xhtml

index 97477755d7421b274cded389e9d13e54a550f5ae..fce1821cc880f72421fb40080a2768a81694cd24 100644 (file)
@@ -35,7 +35,7 @@ import org.mxchange.jcontacts.contact.Contact;
 import org.mxchange.jcontacts.contact.ContactSessionBeanRemote;
 import org.mxchange.jcontacts.contact.UserContact;
 import org.mxchange.jcontacts.contact.title.PersonalTitle;
-import org.mxchange.jcontacts.contact.utils.ContactUtils;
+import org.mxchange.jcontacts.contact.ContactUtils;
 import org.mxchange.jcontacts.events.contact.add.AdminAddedContactEvent;
 import org.mxchange.jcontacts.events.contact.add.ObservableAdminAddedContactEvent;
 import org.mxchange.jcontacts.events.contact.update.AdminUpdatedContactEvent;
index 3a1967f9d70b2f0468d18fe501571e68f633be24..25102c5d14653b804685037419e36b4fb6db7ec3 100644 (file)
@@ -36,7 +36,7 @@ import org.mxchange.jcontacts.contact.Contact;
 import org.mxchange.jcontacts.contact.ContactSessionBeanRemote;
 import org.mxchange.jcontacts.contact.UserContact;
 import org.mxchange.jcontacts.contact.title.PersonalTitle;
-import org.mxchange.jcontacts.contact.utils.ContactUtils;
+import org.mxchange.jcontacts.contact.ContactUtils;
 import org.mxchange.jcontacts.events.contact.add.ObservableAdminAddedContactEvent;
 import org.mxchange.jcontacts.events.contact.update.ObservableAdminUpdatedContactEvent;
 import org.mxchange.jcontacts.exceptions.ContactNotFoundException;
index bfe5eee7a246971c508496572c9baf76517d93fc..888d61d4c67c35e9cf30aa0d2c62498f550b32ad 100644 (file)
@@ -660,6 +660,14 @@ public class JobsUserWebSessionBean extends BaseJobsController implements JobsUs
                this.userProfileMode = userProfileMode;
        }
 
+       @Override
+       public boolean ifBothPasswordsEmptyAllowed () {
+               // Check feature first
+               return ((this.featureController.isFeatureEnabled("allow_user_registration_empty_password")) &&
+                               ((this.getUserPassword() == null) || (this.getUserPassword().isEmpty())) &&
+                               ((this.getUserPasswordRepeat() == null) || (this.getUserPasswordRepeat().isEmpty())));
+       }
+
        /**
         * Post-initialization of this class
         */
index e3a64f8dc9c2c4c4a5717a73af5982d468fc9d72..9ca38edacfea705633b36f9c3040dc58aa85a106 100644 (file)
@@ -36,6 +36,16 @@ public interface JobsUserWebSessionController extends Serializable {
         */
        public static final Integer MINIMUM_PASSWORD_LENGTH = 5;
 
+       /**
+        * Checks if both user passwords are left empty and if this is enabled
+        * (allowed) in context parameter. If true, the calling bean should create a
+        * random password (preferable with UserUtils.createRandomPassword() and set
+        * it in both user password fields.
+        * <p>
+        * @return Whether empty passwords are allowed
+        */
+       boolean ifBothPasswordsEmptyAllowed ();
+
        /**
         * All users
         * <p>
index 4e1e7750e91c4abe9c94880b95c7482aa674b649..9dedb00f47a73fa1b5e72d95227da1dd5b104676 100644 (file)
@@ -40,9 +40,9 @@ import org.mxchange.jusercore.events.registration.UserRegisteredEvent;
 import org.mxchange.jusercore.exceptions.DataRepeatMismatchException;
 import org.mxchange.jusercore.exceptions.EmailAddressAlreadyRegisteredException;
 import org.mxchange.jusercore.exceptions.UserNameAlreadyRegisteredException;
-import org.mxchange.jusercore.model.register.UserRegistrationSessionBeanRemote;
 import org.mxchange.jusercore.model.user.User;
 import org.mxchange.jusercore.model.user.UserUtils;
+import org.mxchange.jusercore.model.user.register.UserRegistrationSessionBeanRemote;
 import org.mxchange.jusercore.model.user.status.UserAccountStatus;
 
 /**
@@ -114,6 +114,9 @@ public class JobsUserRegisterWebSessionBean extends BaseJobsController implement
                // Get user instance
                User user = this.userController.createUserInstance(true);
 
+               // Null random password means registration requires user-entered password
+               String randomPassword = null;
+
                // Is the user already used?
                if (null == user) {
                        // user must be set
@@ -157,8 +160,18 @@ public class JobsUserRegisterWebSessionBean extends BaseJobsController implement
                                return ""; //NOI18N
                        }
                } else if (!this.userController.isSamePasswordEntered()) {
-                       // Not same password entered
-                       throw new FaceletException(new DataRepeatMismatchException("Passwords not matching.")); //NOI18N
+                       // Is multi-page enabled?
+                       if (this.featureController.isFeatureEnabled("user_register_multiple_page")) { //NOI18N
+                               // Not same password entered, should no longer happen here
+                               throw new FaceletException(new DataRepeatMismatchException("Passwords not matching.")); //NOI18N
+                       } else if (this.userController.ifBothPasswordsEmptyAllowed()) {
+                               // Both passwords are left empty and is allowed, then generate a random password
+                               randomPassword = UserUtils.createRandomPassword(JobsUserWebSessionController.MINIMUM_PASSWORD_LENGTH);
+
+                               // Set it in both fields
+                               this.userController.setUserPassword(randomPassword);
+                               this.userController.setUserPasswordRepeat(randomPassword);
+                       }
                }
 
                // Encrypt password
@@ -187,7 +200,7 @@ public class JobsUserRegisterWebSessionBean extends BaseJobsController implement
                        String baseUrl = FacesUtils.generateBaseUrl();
 
                        // Call bean
-                       User registeredUser = this.registerBean.registerUser(user, baseUrl);
+                       User registeredUser = this.registerBean.registerUser(user, baseUrl, randomPassword);
 
                        // The id number should be set
                        assert (registeredUser.getUserId() instanceof Long) : "registeredUser.userId is null after registerUser() was called."; //NOI18N
@@ -229,6 +242,25 @@ public class JobsUserRegisterWebSessionBean extends BaseJobsController implement
                        this.contactController.setEmailAddressRepeat(null);
                        this.showFacesMessage("form_register_page1:emailAddressRepeat", "ERROR_EMAIL_ADDRESSES_MISMATCHING"); //NOI18N
                        return ""; //NOI18N
+               } else if (!this.userController.isSamePasswordEntered()) {
+                       // Is multi-page enabled?
+                       if (this.featureController.isFeatureEnabled("user_register_multiple_page")) { //NOI18N
+                               // Unset both
+                               this.userController.setUserPassword(null);
+                               this.userController.setUserPasswordRepeat(null);
+
+                               // Output faces message
+                               this.showFacesMessage("form_register_page1:userPassword", "ERROR_USER_PASSWORD_EMPTY"); //NOI18N
+                               this.showFacesMessage("form_register_page1:userPasswordRepeat", "ERROR_USER_PASSWORD_REPEAT_EMPTY"); //NOI18N
+                               return ""; //NOI18N
+                       } else if (this.userController.ifBothPasswordsEmptyAllowed()) {
+                               // Both passwords are left empty and is allowed, then generate a random password
+                               String randomPassword = UserUtils.createRandomPassword(JobsUserWebSessionController.MINIMUM_PASSWORD_LENGTH);
+
+                               // Set it in both fields
+                               this.userController.setUserPassword(randomPassword);
+                               this.userController.setUserPasswordRepeat(randomPassword);
+                       }
                }
 
                // Create half contact instance with email address
@@ -248,7 +280,7 @@ public class JobsUserRegisterWebSessionBean extends BaseJobsController implement
                }
 
                // Now only redirect to next page as the JSF does it
-               return "user_register_page2"; //NOI18N
+               return "register_page2"; //NOI18N
        }
 
        /**
index 190647c63b4de034f6ca2205b24ff03ee904b4d6..c0acff063f7c8f47c0747c91c7a8134bb1c7e6c5 100644 (file)
@@ -797,3 +797,36 @@ CONTENT_TITLE_ADMIN_LIST_CONTACT_CELLPHONE=Mobiltelefonnummern auflisten:
 LOGIN_ENTER_CURRENT_PASSWORD=Aktuelles Passwort eingeben:
 #@TODO Please fix German umlauts!
 GUEST_REGISTRATION_USER_NAME_NOT_ENTERED=Bitte geben Sie einen Benutzernamen ein. Dieser wird auf Verfuegbarkeit hin getestet.
+<<<<<<< HEAD
+=======
+#@TODO Please fix German umlauts!
+PAGE_TITLE_LOGIN_FINANCIAL_OVERVIEW=Finanzen-Uebersicht
+#@TODO Please fix German umlauts!
+SUB_TITLE_LOGIN_FINANCIAL_OVERVIEW=Uebersicht Ihrer Finanzen:
+#@TODO Please fix German umlauts!
+PAGE_TITLE_LOGIN_FINANCIAL_ADD_RECEIPT=Rechnung hinzufuegen/erfassen
+SUB_TITLE_LOGIN_FINANCIAL_ADD_RECEIPT=Weitere Rechnung erfassen:
+#@TODO Please fix German umlauts!
+PAGE_TITLE_LOGIN_FINANCIAL_ADD_INCOME=Neue Einkommensart hinzufuegen
+#@TODO Please fix German umlauts!
+SUB_TITLE_LOGIN_FINANCIAL_ADD_INCOME=Weitere Einkommensart hinzufuegen:
+LOGIN_FINANCIAL_ADD_INCOME_FORM_TITLE=Daten einer Einkommensart erfassen:
+LOGIN_FINANCIAL_INCOME_INTERVAL=Einkommensinterval:
+#@TODO Please fix German umlauts!
+FIELD_FINANCIAL_INCOME_REQUIRED=Feld "Einkommensinterval" muss ausgewaehlt werden.
+#@TODO Please fix German umlauts!
+BUTTON_LOGIN_FINCIAL_ADD_INCOME=Einkommensart hinzufuegen
+LOGIN_FINANCIAL_INCOME_SINGLE_VALUE=Einkommensbetrag:
+#@TODO Please fix German umlauts!
+FIELD_FINANCIAL_INCOME_SINGLE_VALUE_REQUIRED=Feld "Einkommensbetrag" bitte ausfuellen.
+LOGIN_FINANCIAL_INCOME_TITLE=Bezeichnung der Einkommensart:
+#@TODO Please fix German umlauts!
+FIELD_FINANCIAL_INCOME_TITLE_REQUIRED=Feld "Title" muss ausgefuellt werden.
+#@TODO Please fix German umlauts!
+ERROR_USER_PASSWORD_EMPTY=Sie muessen ein Passwort eingeben.
+#@TODO Please fix German umlauts!
+ERROR_USER_PASSWORD_REPEAT_EMPTY=Sie muessen das eingegebene Passwort wiederholen.
+GUEST_REGISTRATION_USER_PASSWORDS_EMPTY_ALLOWED=Lassen Sie beide Passwortfelder leer, wird Ihnen ein Passwort per Zufall generiert.
+#@TODO Please fix German umlauts!
+GUEST_REGISTRATION_USER_PASSWORDS_EMPTY_NOT_ALLOWED=Sie muessen selbst ein Passwort vergeben. Bitte geben Sie dies zur Bestaetigung zweimal ein.
+>>>>>>> 6ed28b1... Please cherry-pick:
index f0af84e98c98f1b647a7505cda4adc01d00c868a..bc535b641a309994fc04b1683e055a8806d2174e 100644 (file)
@@ -796,3 +796,24 @@ ERROR_ADMIN_BEAN_MOBILE_NUMBER_NOT_SET=Error: Instance 'cellPhone' in administra
 CONTENT_TITLE_ADMIN_LIST_CONTACT_CELLPHONE=List mobile phone numbers:
 LOGIN_ENTER_CURRENT_PASSWORD=Enter current password:
 GUEST_REGISTRATION_USER_NAME_NOT_ENTERED=Please enter a user name. The entered name is being checked for availability.
+<<<<<<< HEAD
+=======
+PAGE_TITLE_LOGIN_FINANCIAL_OVERVIEW=Financials Overview
+SUB_TITLE_LOGIN_FINANCIAL_OVERVIEW=Overview of your financials:
+PAGE_TITLE_LOGIN_FINANCIAL_ADD_RECEIPT=Add receipt
+SUB_TITLE_LOGIN_FINANCIAL_ADD_RECEIPT=Add new receipt:
+PAGE_TITLE_LOGIN_FINANCIAL_ADD_INCOME=Add new income type
+SUB_TITLE_LOGIN_FINANCIAL_ADD_INCOME=Add new income type:
+LOGIN_FINANCIAL_ADD_INCOME_FORM_TITLE=Enter all data of one income type:
+LOGIN_FINANCIAL_INCOME_INTERVAL=Income interval:
+FIELD_FINANCIAL_INCOME_REQUIRED=Field "Income interval" must be selected.
+BUTTON_LOGIN_FINCIAL_ADD_INCOME=Add income type
+LOGIN_FINANCIAL_INCOME_SINGLE_VALUE=Income value:
+FIELD_FINANCIAL_INCOME_SINGLE_VALUE_REQUIRED=Field "Income value" must be filled out.
+LOGIN_FINANCIAL_INCOME_TITLE=Title of income type:
+FIELD_FINANCIAL_INCOME_TITLE_REQUIRED=Field "Title" must be filled out.
+ERROR_USER_PASSWORD_EMPTY=You have to enter a password.
+ERROR_USER_PASSWORD_REPEAT_EMPTY=You have to repeat the entered password.
+GUEST_REGISTRATION_USER_PASSWORDS_EMPTY_ALLOWED=If you left both password fields empty, a random password will generated for you.
+GUEST_REGISTRATION_USER_PASSWORDS_EMPTY_NOT_ALLOWED=You have to enter an own password. Please enter it twice for confirmation.
+>>>>>>> 6ed28b1... Please cherry-pick:
diff --git a/web/WEB-INF/templates/guest/user/guest_registration_form.tpl b/web/WEB-INF/templates/guest/user/guest_registration_form.tpl
deleted file mode 100644 (file)
index 7c46749..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<ui:composition
-       xmlns="http://www.w3.org/1999/xhtml"
-       xmlns:f="http://java.sun.com/jsf/core"
-       xmlns:h="http://java.sun.com/jsf/html"
-       xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
-
-       <h:form id="register_page2_form">
-               <div class="table">
-                       <div class="table_header">
-                               <h:outputText value="#{msg.GUEST_REGISTRATION_PAGE2_TITLE}" />
-                       </div>
-
-                       <ui:include src="/WEB-INF/templates/contact/form_contact_data.tpl" />
-
-                       <div class="para">
-                               <fieldset id="login_data">
-                                       <legend title="#{msg.GUEST_REGISTRATION_EMAIL_LEGEND_TITLE}">#{msg.GUEST_REGISTRATION_EMAIL_LEGEND}</legend>
-
-                                       <div class="table_row">
-                                               <div class="table_left">
-                                                       <h:outputLabel for="userName" value="#{msg.GUEST_REGISTRATION_ENTER_USER_NAME}" />
-                                               </div>
-
-                                               <div class="table_right">
-                                                       <h:inputText styleClass="input" id="userName" size="20" maxlength="255" value="#{userController.userName}" required="true" requiredMessage="#{msg.GUEST_REGISTRATION_USER_NAME_NOT_ENTERED}" />
-                                               </div>
-
-                                               <div class="clear"></div>
-                                       </div>
-
-                                       <h:panelGroup styleClass="error_container" layout="block">
-                                               <h:message for="userName" errorClass="errors" fatalClass="errors" warnClass="errors" />
-                                       </h:panelGroup>
-
-                                       <div class="table_row">
-                                               <div class="table_left">
-                                                       <h:outputLabel for="emailAddress" value="#{msg.GUEST_REGISTRATION_ENTER_EMAIL1}" />
-                                               </div>
-
-                                               <div class="table_right">
-                                                       <h:inputText styleClass="input" id="emailAddress" size="20" maxlength="255" value="#{contactController.emailAddress}" required="true" requiredMessage="#{msg.EMAIL_ADDRESS_NOT_ENTERED}" />
-                                               </div>
-
-                                               <div class="clear"></div>
-                                       </div>
-
-                                       <h:panelGroup styleClass="error_container" layout="block">
-                                               <h:message for="emailAddress" errorClass="errors" fatalClass="errors" warnClass="errors" />
-                                       </h:panelGroup>
-
-                                       <div class="table_row">
-                                               <div class="table_left">
-                                                       <h:outputLabel for="emailAddressRepeat" value="#{msg.GUEST_REGISTRATION_ENTER_EMAIL2}" />
-                                               </div>
-
-                                               <div class="table_right">
-                                                       <h:inputText styleClass="input" id="emailAddressRepeat" size="20" maxlength="255" value="#{contactController.emailAddressRepeat}" required="true" requiredMessage="#{msg.EMAIL_ADDRESS_REPEAT_NOT_ENTERED}" />
-                                               </div>
-
-                                               <div class="clear"></div>
-                                       </div>
-
-                                       <h:panelGroup styleClass="error_container" layout="block">
-                                               <h:message for="emailAddressRepeat" errorClass="errors" fatalClass="errors" warnClass="errors" />
-                                       </h:panelGroup>
-
-                                       <div class="para"></div>
-
-                                       <div class="table_row">
-                                               <div class="table_left">
-                                                       <h:outputLabel for="userPassword" value="#{msg.GUEST_REGISTRATION_ENTER_PASSWORD}" />
-                                               </div>
-
-                                               <div class="table_right">
-                                                       <h:inputSecret styleClass="input" id="userPassword" size="10" maxlength="255" value="#{userController.userPassword}" />
-                                               </div>
-
-                                               <div class="clear"></div>
-                                       </div>
-
-                                       <div class="table_row">
-                                               <div class="table_left">
-                                                       <h:outputLabel for="userPasswordRepeat" value="#{msg.GUEST_REGISTRATION_ENTER_PASSWORD_REPEAT}" />
-                                               </div>
-
-                                               <div class="table_right">
-                                                       <h:inputSecret styleClass="input" id="userPasswordRepeat" size="10" maxlength="255" value="#{userController.userPasswordRepeat}" />
-                                               </div>
-
-                                               <div class="clear"></div>
-                                       </div>
-
-                                       <div class="para notice">
-                                               <h:outputText value="#{msg.GUEST_REGISTRATION_USER_NAME_NOTICE}" />
-                                       </div>
-                               </fieldset>
-                       </div>
-
-                       <ui:include src="/WEB-INF/templates/guest/guest_privacy_terms.tpl" />
-
-                       <div class="table_footer">
-                               <h:commandButton styleClass="reset" type="reset" value="#{msg.BUTTON_RESET_FORM}" />
-                               <h:commandButton styleClass="submit" type="submit" id="register" value="#{msg.BUTTON_FINISH_REGISTRATION}" action="#{registerController.doFinishRegistration()}" />
-                       </div>
-               </div>
-       </h:form>
-</ui:composition>
index aba8452c9e5d261380db4e7dc93ae146344babf3..e53ce9ecf917faffeac681e164d12330a3cc0cf8 100644 (file)
                                                </h:panelGroup>
 
                                                <div class="para notice">
-                                                       <h:outputText value="#{msg.GUEST_REGISTRATION_USER_NAME_NOTICE}" />
+                                                       <ul>
+                                                               <li><h:outputText value="#{msg.GUEST_REGISTRATION_USER_NAME_NOTICE}" /></li>
+                                                               <ui:fragment rendered="#{featureController.isFeatureEnabled('allow_user_registration_empty_password')}">
+                                                                       <li><h:outputText value="#{msg.GUEST_REGISTRATION_USER_PASSWORDS_EMPTY_ALLOWED}" /></li>
+                                                               </ui:fragment>
+                                                               <ui:fragment rendered="#{not featureController.isFeatureEnabled('allow_user_registration_empty_password')}">
+                                                                       <li><h:outputText value="#{msg.GUEST_REGISTRATION_USER_PASSWORDS_EMPTY_NOT_ALLOWED}" /></li>
+                                                               </ui:fragment>
+                                                       </ul>
                                                </div>
                                        </ui:fragment>
                                </fieldset>
index 9a1dd99aa7841f2697504bd01e7e799d5e1e12dd..312d8ab10295b0d22239532eef944eddb9f4dbbb 100644 (file)
                                                </h:panelGroup>
 
                                                <div class="para notice">
-                                                       <h:outputText value="#{msg.GUEST_REGISTRATION_USER_NAME_NOTICE}" />
+                                                       <ul>
+                                                               <li><h:outputText value="#{msg.GUEST_REGISTRATION_USER_NAME_NOTICE}" /></li>
+                                                               <ui:fragment rendered="#{featureController.isFeatureEnabled('allow_user_registration_empty_password')}">
+                                                                       <li><h:outputText value="#{msg.GUEST_REGISTRATION_USER_PASSWORDS_EMPTY_ALLOWED}" /></li>
+                                                               </ui:fragment>
+                                                               <ui:fragment rendered="#{not featureController.isFeatureEnabled('allow_user_registration_empty_password')}">
+                                                                       <li><h:outputText value="#{msg.GUEST_REGISTRATION_USER_PASSWORDS_EMPTY_NOT_ALLOWED}" /></li>
+                                                               </ui:fragment>
+                                                       </ul>
                                                </div>
                                        </ui:fragment>
                                </fieldset>
index e26eb8475d833427d340b5bf9f23429e1c032009..edbe14739a0b52a4acdc7e46616852ae4a138921 100644 (file)
         <param-name>is_feature_user_registration_in_index_enabled</param-name>
         <param-value>false</param-value>
     </context-param>
+    <context-param>
+        <description>Whether user can leave both passwords empty on registration.</description>
+        <param-name>allow_user_registration_empty_password</param-name>
+        <param-value>false</param-value>
+    </context-param>
     <context-param>
         <description>Maximum passwords that must be different.</description>
         <param-name>max_user_password_history</param-name>
index c6ef011cf58e1821359a77814c3691738510fea5..dfc58f178dd5702ffde75a42fb8dff63ca5ababa 100644 (file)
                <ui:define name="content">
                        <ui:fragment rendered="#{not featureController.isFeatureEnabled('user_registration_in_index') and featureController.isFeatureEnabled('user_registration')}">
                                <ui:fragment rendered="#{featureController.isFeatureEnabled('user_name_required')}">
-                                       <div class="para">
+                                       <h:panelGroup styleClass="para" layout="block">
                                                <h:outputText value="#{msg.GUEST_ALREADY_USER_CONTINUE_LOGIN_1}" />
                                                <h:outputText value="&nbsp;" />
                                                <h:link outcome="user_login" value="#{msg.CLICK_HERE}" />
                                                <h:outputText value="&nbsp;" />
                                                <h:outputText value="#{msg.GUEST_ALREADY_USER_CONTINUE_LOGIN_2}" />
-                                       </div>
+                                       </h:panelGroup>
                                </ui:fragment>
 
                                <h:panelGroup layout="block" styleClass="registration_form">