a few steps towards e-mail validation

This commit is contained in:
Axel Uhl
2014-10-17 18:33:33 +02:00
parent 9524510fa0
commit 8d211ce1dd
10 changed files with 44 additions and 111 deletions
@@ -119,4 +119,8 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages {
String newPasswordSent(String username);
String errorValidatingEmail(String username, String message);
String emailValidatedSuccessfully(String username);
}
@@ -54,4 +54,6 @@ successfullyUpdatedEmail=Successfully updated e-mail address
resetPassword=Reset password
errorDuringPasswordReset=Error during password reset: {0}
cannotResetPasswordWithoutValidatedEmail=Cannot reset password because user {0} does not have a validated e-mail address
newPasswordSent=A new password has been sent to {0}''s validated e-mail address
newPasswordSent=A new password has been sent to {0}''s validated e-mail address
errorValidatingEmail=Error validating e-mail address of user {0}: {1}
emailValidatedSuccessfully=e-mail address of user {0} validated successfully
@@ -54,4 +54,6 @@ successfullyUpdatedEmail=e-Mail-Adresse erfolgreich aktualisiert
resetPassword=Passwort zurücksetzen
errorDuringPasswordReset=Fehler beim Zurücksetyen des Passworts: {0}
cannotResetPasswordWithoutValidatedEmail=Passwort für Benutzer {0} kann nicht zurückgesetzt werden, da keine validierte e-Mail-Adresse vorliegt
newPasswordSent=Ein neues Passwort ist an die validierte e-Mail-Adresse des Benutzers {0} gesendet worden
newPasswordSent=Ein neues Passwort ist an die validierte e-Mail-Adresse des Benutzers {0} gesendet worden
errorValidatingEmail=Fehler beim Validieren der e-Mail-Adresse für Benutzer {0}: {1}
emailValidatedSuccessfully=e-Mail-Adresse für Benutzer {0} erfolgreich validiert
@@ -2,33 +2,15 @@ package com.sap.sse.security.ui.emailvalidation;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.FormPanel.SubmitEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitHandler;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.gwt.user.client.ui.SubmitButton;
import com.google.gwt.user.client.ui.TextBox;
import com.sap.sse.gwt.client.EntryPointHelper;
import com.sap.sse.security.shared.UserManagementException;
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
import com.sap.sse.security.ui.client.RemoteServiceMappingConstants;
import com.sap.sse.security.ui.client.StringMessages;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.ui.client.UserStatusEventHandler;
import com.sap.sse.security.ui.client.component.NewAccountValidator;
import com.sap.sse.security.ui.shared.UserDTO;
import com.sap.sse.security.ui.shared.UserManagementService;
import com.sap.sse.security.ui.shared.UserManagementServiceAsync;
@@ -41,99 +23,21 @@ public class EmailValidationEntryPoint implements EntryPoint {
EntryPointHelper.registerASyncService((ServiceDefTarget) userManagementService,
RemoteServiceMappingConstants.WEB_CONTEXT_PATH,
RemoteServiceMappingConstants.userManagementServiceRemotePath);
final UserService userService = new UserService(userManagementService);
final NewAccountValidator validator = new NewAccountValidator(stringMessages);
final String username = Window.Location.getParameter("u");
final String validationSecret = Window.Location.getParameter("v");
RootLayoutPanel rootPanel = RootLayoutPanel.get();
DockLayoutPanel dockPanel = new DockLayoutPanel(Unit.PX);
rootPanel.add(dockPanel);
FlowPanel fp = new FlowPanel();
final Label errorLabel = new Label();
fp.add(errorLabel);
final Label nameLabel = new Label(stringMessages.username());
fp.add(nameLabel);
final TextBox nameText = new TextBox();
nameText.setEnabled(false);
userService.addUserStatusEventHandler(new UserStatusEventHandler() {
final Label resultLabel = new Label();
userManagementService.validateEmail(username, validationSecret, new MarkedAsyncCallback<Void>(new AsyncCallback<Void>() {
@Override
public void onUserStatusChange(UserDTO user) {
if (user == null) {
nameText.setText("");
} else {
nameText.setText(user.getName());
}
public void onFailure(Throwable caught) {
resultLabel.setText(stringMessages.errorValidatingEmail(username, caught.getMessage()));
}
});
fp.add(nameText);
Label currentPasswordLabel = new Label(stringMessages.currentPassword());
fp.add(currentPasswordLabel);
final TextBox currentPasswordText = new PasswordTextBox();
fp.add(currentPasswordText);
Label pwLabel = new Label(stringMessages.password());
fp.add(pwLabel);
final PasswordTextBox pwText = new PasswordTextBox();
fp.add(pwText);
Label pw2Label = new Label(stringMessages.passwordRepeat());
fp.add(pw2Label);
final PasswordTextBox pw2Text = new PasswordTextBox();
fp.add(pw2Text);
final SubmitButton submit = new SubmitButton(stringMessages.changePassword());
fp.add(submit);
KeyUpHandler keyUpHandler = new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
String errorMessage = validator.validateUsernameAndPassword(nameText.getText(), pwText.getText(), pw2Text.getText());
if (errorMessage == null) {
errorLabel.setText("");
submit.setEnabled(true);
} else {
errorLabel.setText(errorMessage);
submit.setEnabled(false);
}
}
};
keyUpHandler.onKeyUp(null); // enable/disable submit button and fill error label
nameText.addKeyUpHandler(keyUpHandler);
pwText.addKeyUpHandler(keyUpHandler);
pw2Text.addKeyUpHandler(keyUpHandler);
FormPanel formPanel = new FormPanel();
formPanel.addSubmitHandler(new SubmitHandler() {
@Override
public void onSubmit(SubmitEvent event) {
userManagementService.updateSimpleUserPassword(nameText.getText(), currentPasswordText.getText(), pwText.getText(), new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
GWT.log(caught.getMessage());
if (caught instanceof UserManagementException) {
String message = ((UserManagementException) caught).getMessage();
if (UserManagementException.PASSWORD_DOES_NOT_MEET_REQUIREMENTS.equals(message)) {
Window.alert(stringMessages.passwordDoesNotMeetRequirements());
} else if (UserManagementException.INVALID_CREDENTIALS.equals(message)) {
Window.alert(stringMessages.invalidCredentials());
} else {
Window.alert(stringMessages.errorChangingPassword(caught.getMessage()));
}
} else {
Window.alert(stringMessages.errorChangingPassword(caught.getMessage()));
}
}
@Override
public void onSuccess(Void result) {
Window.alert(stringMessages.passwordSuccessfullyChanged());
}
});
}
});
final Button logout = new Button(stringMessages.signOut());
logout.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
userService.logout();
Window.Location.reload();
public void onSuccess(Void result) {
resultLabel.setText(stringMessages.emailValidatedSuccessfully(username));
}
});
fp.add(logout);
formPanel.add(fp);
dockPanel.add(formPanel);
}));
rootPanel.add(resultLabel);
}
}
@@ -171,6 +171,11 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U
getSecurityService().resetPassword(username);
}
@Override
public void validateEmail(String username, String validationSecret) throws UserManagementException {
getSecurityService().validateEmail(username, validationSecret);
}
@Override
public Collection<UserDTO> getFilteredSortedUserList(String filter) {
List<UserDTO> users = new ArrayList<>();
@@ -26,6 +26,8 @@ public interface UserManagementService extends RemoteService {
void resetPassword(String username) throws UserManagementException, MailException;
void validateEmail(String username, String validationSecret) throws UserManagementException;
SuccessInfo deleteUser(String username);
SuccessInfo logout();
@@ -20,6 +20,8 @@ public interface UserManagementServiceAsync {
void updateSimpleUserPassword(String name, String oldPassword, String newPassword, AsyncCallback<Void> callback);
void resetPassword(String username, AsyncCallback<Void> callback);
void validateEmail(String username, String validationSecret, AsyncCallback<Void> markedAsyncCallback);
void updateSimpleUserEmail(String username, String newEmail, AsyncCallback<Void> callback);
@@ -81,7 +81,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
}
DBObject accountsMap = (DBObject) userDBObject.get(FieldNames.User.ACCOUNTS.name());
Map<AccountType, Account> accounts = createAccountMapFromdDBObject(accountsMap);
User result = new User(name, email, emailValidated, validationSecret, accounts.values());
User result = new User(name, email, emailValidated==null?false:emailValidated, validationSecret, accounts.values());
for (String role : roles) {
result.addRole(role);
}
@@ -80,4 +80,6 @@ public interface SecurityService {
*/
void resetPassword(String username) throws UserManagementException, MailException;
boolean validateEmail(String username, String validationSecret) throws UserManagementException;
}
@@ -225,6 +225,7 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
UsernamePasswordAccount upa = new UsernamePasswordAccount(name, hashedPasswordBase64, salt);
final User result = store.createUser(name, email, upa);
startEmailValidation(result);
store.updateUser(result);
return result;
}
@@ -271,6 +272,15 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
startEmailValidation(user);
store.updateUser(user);
}
@Override
public boolean validateEmail(String username, String validationSecret) throws UserManagementException {
final User user = store.getUserByName(username);
if (user == null) {
throw new UserManagementException(UserManagementException.USER_DOES_NOT_EXIST);
}
return user.validate(validationSecret);
}
/**
* {@link User#startEmailValidation() Triggers} e-mail validation for the <code>user</code> object and
@@ -279,7 +289,7 @@ public class SecurityServiceImpl extends RemoteServiceServlet implements Securit
private void startEmailValidation(User user) throws MailException {
String secret = user.startEmailValidation();
sendMail(user.getName(), "e-Mail Validation", "Please click on the link below to validate your e-mail address.\n "+
"http://127.0.0.1:8888/security/ui/EmailValidation.html?gwt.codesvr=127.0.0.1:9997&v="+secret);
"http://127.0.0.1:8888/security/ui/EmailValidation.html?gwt.codesvr=127.0.0.1:9997&u="+user.getName()+"&v="+secret);
}
protected String hashPassword(String password, Object salt) {