package com.github.wicketoracle.app.user.standard.mgr; import java.sql.SQLException; import org.apache.wicket.Localizer; import org.apache.wicket.authorization.strategies.role.annotations.AuthorizeInstantiation; import org.apache.wicket.markup.html.form.PasswordTextField; import org.apache.wicket.markup.html.form.StatelessForm; import org.apache.wicket.markup.html.form.validation.EqualPasswordInputValidator; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.protocol.https.RequireHttps; import org.apache.wicket.util.value.ValueMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.wicketoracle.html.page.StandardPage; import com.github.wicketoracle.html.panel.menu.PostLoginMenuPanelFactory; import com.github.wicketoracle.oracle.exception.SQLExceptionCodes; import com.github.wicketoracle.session.Session; @RequireHttps @AuthorizeInstantiation( RequiredRoles.ROLE_STD_USER_PASSWORD_MGR ) public final class StandardUserPasswordMgrPage extends StandardPage { /** Log */ private static final Logger LOGGER = LoggerFactory.getLogger( StandardUserPasswordMgrPage.class ); private final Panel menuPanel = PostLoginMenuPanelFactory.getPostLoginMenuPanel(); private final Label headerLabel; private final PasswordMgrForm passwordMgrForm; /** * * @param pStandardUser */ public StandardUserPasswordMgrPage( final StandardUser pStandardUser ) { add( menuPanel ); ValueMap headerLabelParams = new ValueMap(); headerLabelParams.put( "username" , pStandardUser.getUsername() ); headerLabel = new Label( "HeaderChangePassword" , new StringResourceModel( "HeaderChangePassword" , this , new Model<ValueMap>( headerLabelParams ) ) ); add( headerLabel ); passwordMgrForm = new PasswordMgrForm( "changePasswordForm" , pStandardUser.getUserId() ); add( passwordMgrForm ); } /** * * @author Andrew Hall * */ private final class PasswordMgrForm extends StatelessForm<StandardUserPassword> { private static final long serialVersionUID = 1L; private int userId = 0; private final StandardUserPassword standardUserPassword = new StandardUserPassword(); private final PasswordTextField passwordTextField = new PasswordTextField( "password" , new PropertyModel<String>( standardUserPassword , "password" ) ); private final PasswordTextField passwordConfirmationTextField = new PasswordTextField( "passwordConfirmation" , new PropertyModel<String>( standardUserPassword , "passwordConfirmation" ) ); public PasswordMgrForm( final String pId , final int pUserId ) { super( pId ); userId = pUserId; add( passwordTextField ); add( passwordConfirmationTextField ); add( new EqualPasswordInputValidator( passwordTextField , passwordConfirmationTextField ) ); } /** * */ @Override public void onSubmit() { if ( getIsDebugInfoVisible() ) { info( "Change user password :: User id :: " + userId ); info( "Change user password :: Password :: " + standardUserPassword.getPassword() ); info( "Change user password :: Password Confirmation :: " + standardUserPassword.getPasswordConfirmation() ); } final Session session = ( Session ) getSession(); final Localizer localiser = getLocalizer(); StandardUserPasswordMgrDAO dataService = null; try { dataService = new StandardUserPasswordMgrDAO( session.getUsername() , session.getPassword() ); dataService.changePassword( userId , standardUserPassword.getPassword() ); info( localiser.getString( "MessageSuccess" , this ) ); } catch ( SQLException sqle ) { switch( sqle.getErrorCode() ) { case SQLExceptionCodes.DANGEROUS_PASSWORD : error( localiser.getString( "MessageDangerousPassword" , this ) ); break; case SQLExceptionCodes.NON_COMPLIANT_PASSWORD : error( localiser.getString( "MessageNonCompliantPassword" , this ) ); break; case SQLExceptionCodes.NON_REUSABLE_PASSWORD : error( localiser.getString( "MessageNonReusablePassword" , this ) ); break; default : LOGGER.error ( "SQL Exception when changing the password of user '{}' -> {}; error code -> {}; sql state -> {}" , new Object[] { Integer.toString( userId ) , sqle.getMessage() , sqle.getErrorCode() , sqle.getSQLState() } ); error( localiser.getString( "MessageUnexpectedError" , this ) ); break; } } finally { if ( ! dataService.closeConnection() ) { error( localiser.getString( "MessageUnexpectedError" , this ) ); } } } } }