mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-14 06:18:12 +00:00
Merge branch 'design2015-user-management' into design2015
This commit is contained in:
commit
1ffc945070
135 files changed
+1891
-1221
No files matched your search
+4
-3
@@ -3,8 +3,9 @@ package com.sap.sailing.gwt.common.client;
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.resources.client.ClientBundle;
|
||||
import com.google.gwt.resources.client.CssResource;
|
||||
import com.sap.sse.gwt.common.CommonSharedResources;
|
||||
|
||||
public interface SharedResources extends ClientBundle {
|
||||
public interface SharedResources extends ClientBundle, CommonSharedResources {
|
||||
public static final SharedResources INSTANCE = GWT.create(SharedResources.class);
|
||||
|
||||
@Source("main.gss")
|
||||
@@ -13,7 +14,7 @@ public interface SharedResources extends ClientBundle {
|
||||
@Source("media.gss")
|
||||
MediaCss mediaCss();
|
||||
|
||||
public interface MainCss extends CssResource{
|
||||
public interface MainCss extends CssResource, CommonMainCss {
|
||||
String mobile();
|
||||
String desktop();
|
||||
String wrapper();
|
||||
@@ -76,7 +77,7 @@ public interface SharedResources extends ClientBundle {
|
||||
String fleetcorner();
|
||||
}
|
||||
|
||||
public interface MediaCss extends CssResource{
|
||||
public interface MediaCss extends CssResource, CommonMediaCss {
|
||||
String grid();
|
||||
String stackenblochen();
|
||||
String column();
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
<inherits name="com.sap.sailing.domain.SailingDomain" />
|
||||
<inherits name="com.sap.sse.gwt.AdminConsole" />
|
||||
<inherits name="com.sap.sse.security.ui.LoginPanel" />
|
||||
<inherits name="com.sap.sse.security.ui.Authentication" />
|
||||
|
||||
<!-- Highcharts API -->
|
||||
<inherits name='com.sap.sse.gwt.Highcharts' />
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
package com.sap.sailing.gwt.home.desktop.app;
|
||||
|
||||
import com.sap.sse.security.ui.authentication.view.AuthenticationMenuView;
|
||||
|
||||
public interface DesktopApplicationTopLevelView extends ApplicationTopLevelView<DesktopResettableNavigationPathDisplay> {
|
||||
AuthenticationMenuView getAuthenticationMenuView();
|
||||
}
|
||||
+1
-4
@@ -10,8 +10,6 @@ import com.sap.sailing.gwt.home.desktop.places.sponsoring.SponsoringClientFactor
|
||||
import com.sap.sailing.gwt.home.desktop.places.start.StartClientFactory;
|
||||
import com.sap.sailing.gwt.home.desktop.places.user.profile.UserProfileClientFactory;
|
||||
import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewClientFactory;
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementContext;
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementService;
|
||||
import com.sap.sailing.gwt.home.shared.places.error.ErrorClientFactory;
|
||||
import com.sap.sailing.gwt.home.shared.places.searchresult.SearchResultClientFactory;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.confirmation.ConfirmationClientFactory;
|
||||
@@ -20,8 +18,7 @@ import com.sap.sailing.gwt.home.shared.places.user.passwordreset.PasswordResetCl
|
||||
public interface DesktopClientFactory extends AboutUsClientFactory, ContactClientFactory, EventClientFactory,
|
||||
EventsClientFactory, StartClientFactory, SponsoringClientFactory, SolutionsClientFactory,
|
||||
SearchResultClientFactory, WhatsNewClientFactory, SeriesClientFactory, UserProfileClientFactory,
|
||||
ErrorClientFactory, ClientFactoryWithUserManagementContext, ClientFactoryWithUserManagementService,
|
||||
ConfirmationClientFactory, PasswordResetClientFactory {
|
||||
ErrorClientFactory, ConfirmationClientFactory, PasswordResetClientFactory {
|
||||
|
||||
DesktopPlacesNavigator getHomePlacesNavigator();
|
||||
|
||||
|
||||
+30
-68
@@ -3,6 +3,7 @@ package com.sap.sailing.gwt.home.desktop.app;
|
||||
import com.google.gwt.event.shared.SimpleEventBus;
|
||||
import com.google.gwt.place.shared.PlaceController;
|
||||
import com.google.web.bindery.event.shared.EventBus;
|
||||
import com.sap.sailing.gwt.common.client.SharedResources;
|
||||
import com.sap.sailing.gwt.home.communication.SailingDispatchSystem;
|
||||
import com.sap.sailing.gwt.home.communication.SailingDispatchSystemImpl;
|
||||
import com.sap.sailing.gwt.home.desktop.places.error.TabletAndDesktopErrorView;
|
||||
@@ -19,9 +20,6 @@ import com.sap.sailing.gwt.home.desktop.places.whatsnew.TabletAndDesktopWhatsNew
|
||||
import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewPlace.WhatsNewNavigationTabs;
|
||||
import com.sap.sailing.gwt.home.desktop.places.whatsnew.WhatsNewView;
|
||||
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContextImpl;
|
||||
import com.sap.sailing.gwt.home.shared.framework.WrappedPlaceManagementController;
|
||||
import com.sap.sailing.gwt.home.shared.partials.busy.BusyViewImpl;
|
||||
import com.sap.sailing.gwt.home.shared.places.searchresult.SearchResultView;
|
||||
import com.sap.sailing.gwt.home.shared.places.solutions.SolutionsPlace.SolutionsNavigationTabs;
|
||||
@@ -30,26 +28,23 @@ import com.sap.sailing.gwt.home.shared.places.user.confirmation.ConfirmationView
|
||||
import com.sap.sailing.gwt.home.shared.places.user.confirmation.ConfirmationViewImpl;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.passwordreset.PasswordResetView;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.passwordreset.PasswordResetViewImpl;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementContextEvent;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementPlaceManagementController;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementPlaceManagementController.SignInSuccessfulEvent;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementRequestEvent;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.info.LoggedInUserInfoPlace;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.view.UserManagementViewDesktop;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.AuthenticationCallbackImpl;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.view.AuthenticationViewDesktop;
|
||||
import com.sap.sailing.gwt.ui.client.refresh.BusyView;
|
||||
import com.sap.sse.security.ui.client.DefaultWithSecurityImpl;
|
||||
import com.sap.sse.security.ui.client.UserManagementServiceAsync;
|
||||
import com.sap.sse.security.ui.client.UserStatusEventHandler;
|
||||
import com.sap.sse.security.ui.client.WithSecurity;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationClientFactoryImpl;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationManager;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationManagerImpl;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationPlaceManagementController;
|
||||
import com.sap.sse.security.ui.authentication.WrappedPlaceManagementController;
|
||||
import com.sap.sse.security.ui.authentication.info.LoggedInUserInfoPlace;
|
||||
import com.sap.sse.security.ui.authentication.view.FlyoutAuthenticationPresenter;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
|
||||
public class TabletAndDesktopApplicationClientFactory extends AbstractApplicationClientFactory<ApplicationTopLevelView<DesktopResettableNavigationPathDisplay>> implements DesktopClientFactory {
|
||||
public class TabletAndDesktopApplicationClientFactory extends AbstractApplicationClientFactory<DesktopApplicationTopLevelView> implements DesktopClientFactory {
|
||||
private final SailingDispatchSystem dispatch = new SailingDispatchSystemImpl();
|
||||
private final WithSecurity securityProvider;
|
||||
private final WrappedPlaceManagementController userManagementWizardController;
|
||||
private UserManagementContext uCtx = new UserManagementContextImpl();
|
||||
private final AuthenticationManager authenticationManager;
|
||||
|
||||
public TabletAndDesktopApplicationClientFactory(boolean isStandaloneServer) {
|
||||
this(new SimpleEventBus(), isStandaloneServer);
|
||||
@@ -65,38 +60,24 @@ public class TabletAndDesktopApplicationClientFactory extends AbstractApplicatio
|
||||
|
||||
private TabletAndDesktopApplicationClientFactory(EventBus eventBus, PlaceController placeController, DesktopPlacesNavigator placesNavigator) {
|
||||
super(new TabletAndDesktopApplicationView(placesNavigator, eventBus), eventBus, placeController, placesNavigator);
|
||||
securityProvider = new DefaultWithSecurityImpl();
|
||||
securityProvider.getUserService().addUserStatusEventHandler(new UserStatusEventHandler() {
|
||||
@Override
|
||||
public void onUserStatusChange(UserDTO user) {
|
||||
uCtx = new UserManagementContextImpl(user);
|
||||
getEventBus().fireEvent(new UserManagementContextEvent(uCtx));
|
||||
}
|
||||
});
|
||||
|
||||
final UserManagementViewDesktop userManagementDisplay = new UserManagementViewDesktop();
|
||||
this.userManagementWizardController = new UserManagementPlaceManagementController<TabletAndDesktopApplicationClientFactory>(
|
||||
this, getHomePlacesNavigator().getMailVerifiedConfirmationNavigation(),
|
||||
getHomePlacesNavigator().getPasswordResetNavigation(),
|
||||
getHomePlacesNavigator().getUserProfileNavigation(), userManagementDisplay, getEventBus());
|
||||
this.userManagementWizardController.addHandler(SignInSuccessfulEvent.TYPE, new SignInSuccessfulEvent.Handler() {
|
||||
final AuthenticationViewDesktop userManagementDisplay = new AuthenticationViewDesktop();
|
||||
final Runnable signInSuccesfullNavigation = new Runnable() {
|
||||
@Override
|
||||
public void onSignInSuccessful(SignInSuccessfulEvent event) {
|
||||
public void run() {
|
||||
userManagementWizardController.goTo(new LoggedInUserInfoPlace());
|
||||
}
|
||||
});
|
||||
getEventBus().addHandler(UserManagementRequestEvent.TYPE, new UserManagementRequestEvent.Handler() {
|
||||
@Override
|
||||
public void onUserManagementRequestEvent(UserManagementRequestEvent event) {
|
||||
if (userManagementDisplay.isShowing()) {
|
||||
userManagementDisplay.hide();
|
||||
} else {
|
||||
userManagementDisplay.setWidget(createBusyView());
|
||||
userManagementDisplay.show();
|
||||
userManagementWizardController.start();
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
this.authenticationManager = new AuthenticationManagerImpl(this, eventBus, getHomePlacesNavigator()
|
||||
.getMailVerifiedConfirmationNavigation().getFullQualifiedUrl(), getHomePlacesNavigator()
|
||||
.getPasswordResetNavigation().getFullQualifiedUrl());
|
||||
this.userManagementWizardController = new AuthenticationPlaceManagementController(
|
||||
new AuthenticationClientFactoryImpl(authenticationManager, SharedResources.INSTANCE),
|
||||
new AuthenticationCallbackImpl(getHomePlacesNavigator().getUserProfileNavigation(),
|
||||
signInSuccesfullNavigation), userManagementDisplay, getEventBus());
|
||||
|
||||
new FlyoutAuthenticationPresenter(userManagementDisplay, getTopLevelView().getAuthenticationMenuView(),
|
||||
userManagementWizardController, eventBus);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -150,32 +131,13 @@ public class TabletAndDesktopApplicationClientFactory extends AbstractApplicatio
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserManagementServiceAsync getUserManagement() {
|
||||
return securityProvider.getUserManagementService();
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserManagementContext getUserManagementContext() {
|
||||
return uCtx;
|
||||
public AuthenticationManager getAuthenticationManager() {
|
||||
return authenticationManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resetUserManagementContext() {
|
||||
uCtx = new UserManagementContextImpl();
|
||||
securityProvider.getUserService().updateUser(true);
|
||||
getEventBus().fireEvent(new UserManagementRequestEvent());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void didLogin(UserDTO user) {
|
||||
uCtx = new UserManagementContextImpl(user);
|
||||
securityProvider.getUserService().updateUser(true);
|
||||
getEventBus().fireEvent(new UserManagementContextEvent(uCtx));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConfirmationView createAccountConfirmationView(String message) {
|
||||
return new ConfirmationViewImpl(StringMessages.INSTANCE.accountConfirmation(), message);
|
||||
public ConfirmationView createConfirmationView() {
|
||||
return new ConfirmationViewImpl(SharedResources.INSTANCE, StringMessages.INSTANCE.accountConfirmation());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+7
-1
@@ -17,12 +17,13 @@ import com.sap.sailing.gwt.home.shared.ExperimentalFeatures;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sse.gwt.client.DefaultErrorReporter;
|
||||
import com.sap.sse.gwt.client.ErrorReporter;
|
||||
import com.sap.sse.security.ui.authentication.view.AuthenticationMenuView;
|
||||
|
||||
/**
|
||||
* This is the top-level view of the application. Every time another presenter wants to reveal itself,
|
||||
* {@link TabletAndDesktopApplicationView} will add its content of the target inside the {@code mainContantPanel}.
|
||||
*/
|
||||
public class TabletAndDesktopApplicationView extends Composite implements ApplicationTopLevelView<DesktopResettableNavigationPathDisplay> {
|
||||
public class TabletAndDesktopApplicationView extends Composite implements DesktopApplicationTopLevelView {
|
||||
interface TabletAndDesktopApplicationViewUiBinder extends UiBinder<Widget, TabletAndDesktopApplicationView> {
|
||||
}
|
||||
|
||||
@@ -68,6 +69,11 @@ public class TabletAndDesktopApplicationView extends Composite implements Applic
|
||||
return errorReporter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AuthenticationMenuView getAuthenticationMenuView() {
|
||||
return headerPanel.getAuthenticationMenuView();
|
||||
}
|
||||
|
||||
@Override
|
||||
public DesktopResettableNavigationPathDisplay getNavigationPathDisplay() {
|
||||
return navigationPathDisplay;
|
||||
|
||||
+9
-17
@@ -32,9 +32,9 @@ import com.sap.sailing.gwt.home.shared.places.searchresult.SearchResultPlace;
|
||||
import com.sap.sailing.gwt.home.shared.places.solutions.SolutionsPlace;
|
||||
import com.sap.sailing.gwt.home.shared.places.solutions.SolutionsPlace.SolutionsNavigationTabs;
|
||||
import com.sap.sailing.gwt.home.shared.places.start.StartPlace;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementContextEvent;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementRequestEvent;
|
||||
import com.sap.sse.gwt.client.mvp.PlaceChangedEvent;
|
||||
import com.sap.sse.security.ui.authentication.view.AuthenticationMenuView;
|
||||
import com.sap.sse.security.ui.authentication.view.AuthenticationMenuViewImpl;
|
||||
|
||||
public class Header extends Composite {
|
||||
@UiField Anchor startPageLink;
|
||||
@@ -56,7 +56,7 @@ public class Header extends Composite {
|
||||
private final PlaceNavigation<EventsPlace> eventsNavigation;
|
||||
private final PlaceNavigation<SolutionsPlace> solutionsNavigation;
|
||||
|
||||
private final EventBus eventBus;
|
||||
private final AuthenticationMenuView authenticationMenuView;
|
||||
|
||||
interface HeaderUiBinder extends UiBinder<Widget, Header> {
|
||||
}
|
||||
@@ -65,7 +65,6 @@ public class Header extends Composite {
|
||||
|
||||
public Header(final DesktopPlacesNavigator navigator, EventBus eventBus) {
|
||||
this.navigator = navigator;
|
||||
this.eventBus = eventBus;
|
||||
|
||||
HeaderResources.INSTANCE.css().ensureInjected();
|
||||
|
||||
@@ -97,14 +96,8 @@ public class Header extends Composite {
|
||||
}
|
||||
});
|
||||
|
||||
if (ExperimentalFeatures.SHOW_USER_MANAGEMENT_ON_DESKTOP) {
|
||||
eventBus.addHandler(UserManagementContextEvent.TYPE, new UserManagementContextEvent.Handler() {
|
||||
@Override
|
||||
public void onUserChangeEvent(UserManagementContextEvent event) {
|
||||
usermenu.setStyleName(HeaderResources.INSTANCE.css().loggedin(), event.getCtx().isLoggedIn());
|
||||
}
|
||||
});
|
||||
} else {
|
||||
authenticationMenuView = new AuthenticationMenuViewImpl(usermenu, HeaderResources.INSTANCE.css().loggedin());
|
||||
if (!ExperimentalFeatures.SHOW_USER_MANAGEMENT_ON_DESKTOP) {
|
||||
usermenu.removeFromParent();
|
||||
}
|
||||
}
|
||||
@@ -136,11 +129,6 @@ public class Header extends Composite {
|
||||
navigator.goToPlace(searchResultNavigation);
|
||||
}
|
||||
|
||||
@UiHandler("usermenu")
|
||||
void toggleUsermenu(ClickEvent event) {
|
||||
eventBus.fireEvent(new UserManagementRequestEvent());
|
||||
}
|
||||
|
||||
private void updateActiveLink(Place place) {
|
||||
if(place instanceof EventsPlace
|
||||
|| place instanceof AbstractEventPlace
|
||||
@@ -175,4 +163,8 @@ public class Header extends Composite {
|
||||
setActiveLink(activeLink);
|
||||
}
|
||||
}
|
||||
|
||||
public AuthenticationMenuView getAuthenticationMenuView() {
|
||||
return authenticationMenuView;
|
||||
}
|
||||
}
|
||||
+4
-5
@@ -6,7 +6,7 @@ import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
|
||||
public class UserHeader extends Composite {
|
||||
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
|
||||
@@ -22,12 +22,11 @@ public class UserHeader extends Composite {
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
}
|
||||
|
||||
public void setUserManagementContext(UserManagementContext userManagementContext) {
|
||||
public void setUserManagementContext(AuthenticationContext userManagementContext) {
|
||||
UserHeaderResources.INSTANCE.css().ensureInjected();
|
||||
imageUi.getStyle().setBackgroundImage("url(images/home/userdefault.svg)");
|
||||
nameUi.setInnerText(userManagementContext.getCurrentUser().getName());
|
||||
|
||||
// TODO there is no distinction between usernam und the user's name, so we show the email instead as username
|
||||
usernameUi.setInnerText(userManagementContext.getCurrentUser().getEmail());
|
||||
nameUi.setInnerText(userManagementContext.getUserTitle());
|
||||
usernameUi.setInnerText(userManagementContext.getUserSubtitle());
|
||||
}
|
||||
}
|
||||
+14
-6
@@ -11,7 +11,7 @@ import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.PasswordTextBox;
|
||||
import com.google.gwt.user.client.ui.TextBox;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
@@ -22,13 +22,15 @@ public class UserAccountDetails extends Composite {
|
||||
}
|
||||
|
||||
public interface Presenter {
|
||||
void handleSaveChangesRequest(String email);
|
||||
void handleSaveChangesRequest(String fullName, String company);
|
||||
void handleEmailChangeRequest(String email);
|
||||
void handlePasswordChangeRequest(String oldPassword, String newPassword, String newPasswordConfirmation);
|
||||
}
|
||||
|
||||
@UiField DivElement editImageLinkUi;
|
||||
@UiField InputElement usernameUi;
|
||||
@UiField InputElement nameUi;
|
||||
@UiField TextBox nameUi;
|
||||
@UiField TextBox companyUi;
|
||||
@UiField TextBox emailUi;
|
||||
@UiField PasswordTextBox oldPasswordUi;
|
||||
@UiField PasswordTextBox newPasswordUi;
|
||||
@@ -46,14 +48,15 @@ public class UserAccountDetails extends Composite {
|
||||
setPlaceholder(newPasswordConfirmationUi, i18n.passwordRepeatPlaceholder());
|
||||
}
|
||||
|
||||
public void setUserManagementContext(UserManagementContext userManagementContext) {
|
||||
public void setUserManagementContext(AuthenticationContext userManagementContext) {
|
||||
UserDTO currentUser = userManagementContext.getCurrentUser();
|
||||
// TODO correct message
|
||||
editImageLinkUi.setTitle("TODO picture of: " + currentUser.getName());
|
||||
// TODO use image from user when field is available
|
||||
editImageLinkUi.getStyle().setBackgroundImage("url(images/home/userdefault.svg)");
|
||||
|
||||
nameUi.setValue(currentUser.getName());
|
||||
nameUi.setValue(currentUser.getFullName());
|
||||
companyUi.setValue(currentUser.getCompany());
|
||||
usernameUi.setValue(currentUser.getName());
|
||||
emailUi.setValue(currentUser.getEmail());
|
||||
oldPasswordUi.setValue("");
|
||||
@@ -67,7 +70,12 @@ public class UserAccountDetails extends Composite {
|
||||
|
||||
@UiHandler("saveChangesUi")
|
||||
void onSaveChangesClicked(ClickEvent event) {
|
||||
presenter.handleSaveChangesRequest(emailUi.getValue());
|
||||
presenter.handleSaveChangesRequest(nameUi.getValue(), companyUi.getValue());
|
||||
}
|
||||
|
||||
@UiHandler("changeEmailUi")
|
||||
void onChangeEmailClicked(ClickEvent event) {
|
||||
presenter.handleEmailChangeRequest(emailUi.getValue());
|
||||
}
|
||||
|
||||
@UiHandler("changePasswordUi")
|
||||
|
||||
+15
-3
@@ -24,16 +24,28 @@
|
||||
<label class="{local_res.css.useraccountdetails_content_detail_label}">
|
||||
<ui:text from="{i18n_sec.name}" />
|
||||
</label>
|
||||
<input ui:field="nameUi" type="text" disabled="disabled" class="{local_res.css.useraccountdetails_content_detail_input}" />
|
||||
<g:TextBox ui:field="nameUi" styleName="{local_res.css.useraccountdetails_content_detail_input}" />
|
||||
</div>
|
||||
<div class="{local_res.css.useraccountdetails_content_detail} {res.mediaCss.medium6} {res.mediaCss.mediumoffset6} {res.mediaCss.small12}">
|
||||
<div class="{local_res.css.useraccountdetails_content_detail} {res.mediaCss.medium6} {res.mediaCss.mediumoffset6} {res.mediaCss.small12}">
|
||||
<label class="{local_res.css.useraccountdetails_content_detail_label}">
|
||||
<ui:text from="{i18n_sec.company}" />
|
||||
</label>
|
||||
<g:TextBox ui:field="companyUi" styleName="{local_res.css.useraccountdetails_content_detail_input}" />
|
||||
</div>
|
||||
<div class="{local_res.css.useraccountdetails_content_submit} {res.mediaCss.small12}">
|
||||
<g:Button ui:field="saveChangesUi" addStyleNames="{res.mainCss.button} {res.mainCss.buttonprimary}">
|
||||
<ui:text from="{i18n_sec.save}" />
|
||||
</g:Button>
|
||||
</div>
|
||||
<div class="{local_res.css.useraccountdetails_content_spacer} {res.mediaCss.small12}"></div>
|
||||
<div class="{local_res.css.useraccountdetails_content_detail} {res.mediaCss.medium6} {res.mediaCss.mediumoffset6} {res.mediaCss.small12}">
|
||||
<label class="{local_res.css.useraccountdetails_content_detail_label}">
|
||||
<ui:text from="{i18n_sec.email}" />
|
||||
</label>
|
||||
<g:TextBox ui:field="emailUi" addStyleNames="{local_res.css.useraccountdetails_content_detail_input}" />
|
||||
</div>
|
||||
<div class="{local_res.css.useraccountdetails_content_submit} {res.mediaCss.small12}">
|
||||
<g:Button ui:field="saveChangesUi" addStyleNames="{res.mainCss.button} {res.mainCss.buttonprimary}">
|
||||
<g:Button ui:field="changeEmailUi" addStyleNames="{res.mainCss.button} {res.mainCss.buttonprimary}">
|
||||
<ui:text from="{i18n_sec.save}" />
|
||||
</g:Button>
|
||||
</div>
|
||||
|
||||
+2
-2
@@ -14,9 +14,9 @@ import com.sap.sailing.gwt.common.client.controls.tabbar.TabView;
|
||||
import com.sap.sailing.gwt.common.client.i18n.TextMessages;
|
||||
import com.sap.sailing.gwt.home.desktop.partials.userHeader.UserHeader;
|
||||
import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
|
||||
public class TabletAndDesktopUserProfileView extends Composite implements UserProfileView<AbstractUserProfilePlace, UserProfileView.Presenter> {
|
||||
private static final ApplicationHistoryMapper historyMapper = GWT.<ApplicationHistoryMapper> create(ApplicationHistoryMapper.class);
|
||||
@@ -64,7 +64,7 @@ public class TabletAndDesktopUserProfileView extends Composite implements UserPr
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUserManagementContext(UserManagementContext userManagementContext) {
|
||||
public void setUserManagementContext(AuthenticationContext userManagementContext) {
|
||||
headerUi.setUserManagementContext(userManagementContext);
|
||||
tabPanelUi.getCurrentTab().setUserManagementContext(userManagementContext);
|
||||
}
|
||||
|
||||
+29
-11
@@ -18,9 +18,9 @@ import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
|
||||
import com.sap.sailing.gwt.home.shared.places.fakeseries.AbstractSeriesPlace;
|
||||
import com.sap.sailing.gwt.home.shared.places.start.StartPlace;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementContextEvent;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementRequestEvent;
|
||||
import com.sap.sse.security.shared.UserManagementException;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationContextEvent;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationRequestEvent;
|
||||
import com.sap.sse.security.ui.client.component.NewAccountValidator;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
|
||||
@@ -57,19 +57,36 @@ public class UserProfileActivity extends AbstractActivity implements UserProfile
|
||||
currentView.registerPresenter(this);
|
||||
panel.setWidget(currentView);
|
||||
currentView.navigateTabsTo(currentPlace);
|
||||
currentView.setUserManagementContext(clientFactory.getUserManagementContext());
|
||||
eventBus.addHandler(UserManagementContextEvent.TYPE, new UserManagementContextEvent.Handler() {
|
||||
currentView.setUserManagementContext(clientFactory.getAuthenticationManager().getAuthenticationContext());
|
||||
eventBus.addHandler(AuthenticationContextEvent.TYPE, new AuthenticationContextEvent.Handler() {
|
||||
@Override
|
||||
public void onUserChangeEvent(UserManagementContextEvent event) {
|
||||
public void onUserChangeEvent(AuthenticationContextEvent event) {
|
||||
currentView.setUserManagementContext(event.getCtx());
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void handleSaveChangesRequest(final String email) {
|
||||
final String username = clientFactory.getUserManagementContext().getCurrentUser().getName();
|
||||
public void handleSaveChangesRequest(String fullName, String company) {
|
||||
final String username = clientFactory.getAuthenticationManager().getAuthenticationContext().getCurrentUser().getName();
|
||||
clientFactory.getUserManagementService().updateUserProperties(username, fullName, company,
|
||||
new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onSuccess(Void result) {
|
||||
clientFactory.getAuthenticationManager().refreshUserInfo();
|
||||
Window.alert(i18n_sec.successfullyUpdatedUserProperties(username));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
Window.alert(i18n_sec.errorUpdatingUserProperties(caught.getMessage()));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleEmailChangeRequest(final String email) {
|
||||
final String username = clientFactory.getAuthenticationManager().getAuthenticationContext().getCurrentUser().getName();
|
||||
final String url = Window.Location.createUrlBuilder()
|
||||
.setHash(homePlacesNavigator.getMailVerifiedConfirmationNavigation().getTargetUrl()).buildString();
|
||||
clientFactory.getUserManagementService().updateSimpleUserEmail(username, email, url,
|
||||
@@ -88,7 +105,7 @@ public class UserProfileActivity extends AbstractActivity implements UserProfile
|
||||
|
||||
@Override
|
||||
public void handlePasswordChangeRequest(String oldPassword, String newPassword, String newPasswordConfirmation) {
|
||||
final String username = clientFactory.getUserManagementContext().getCurrentUser().getName();
|
||||
final String username = clientFactory.getAuthenticationManager().getAuthenticationContext().getCurrentUser().getName();
|
||||
String errorMessage = validator.validateUsernameAndPassword(username, newPassword, newPasswordConfirmation);
|
||||
if (errorMessage != null && !errorMessage.isEmpty()) {
|
||||
Window.alert(errorMessage);
|
||||
@@ -115,6 +132,7 @@ public class UserProfileActivity extends AbstractActivity implements UserProfile
|
||||
@Override
|
||||
public void onSuccess(Void result) {
|
||||
Window.alert(i18n_sec.passwordSuccessfullyChanged());
|
||||
currentView.setUserManagementContext(clientFactory.getAuthenticationManager().getAuthenticationContext());
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -148,6 +166,6 @@ public class UserProfileActivity extends AbstractActivity implements UserProfile
|
||||
|
||||
@Override
|
||||
public void doTriggerLoginForm() {
|
||||
clientFactory.getEventBus().fireEvent(new UserManagementRequestEvent());
|
||||
clientFactory.getEventBus().fireEvent(new AuthenticationRequestEvent());
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
package com.sap.sailing.gwt.home.desktop.places.user.profile;
|
||||
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementContext;
|
||||
import com.sap.sailing.gwt.ui.client.SailingClientFactory;
|
||||
import com.sap.sailing.gwt.ui.client.refresh.ErrorAndBusyClientFactory;
|
||||
import com.sap.sse.security.ui.authentication.WithAuthenticationManager;
|
||||
|
||||
public interface UserProfileClientFactory extends SailingClientFactory, ErrorAndBusyClientFactory, ClientFactoryWithUserManagementContext {
|
||||
public interface UserProfileClientFactory extends SailingClientFactory, ErrorAndBusyClientFactory, WithAuthenticationManager {
|
||||
}
|
||||
+2
-2
@@ -1,11 +1,11 @@
|
||||
package com.sap.sailing.gwt.home.desktop.places.user.profile;
|
||||
|
||||
import com.sap.sailing.gwt.common.client.controls.tabbar.TabView;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
|
||||
public interface UserProfileTabView<PLACE extends AbstractUserProfilePlace> extends TabView<PLACE, UserProfileView.Presenter> {
|
||||
|
||||
void setUserManagementContext(UserManagementContext userManagementContext);
|
||||
void setUserManagementContext(AuthenticationContext userManagementContext);
|
||||
|
||||
}
|
||||
+2
-2
@@ -6,11 +6,11 @@ import com.google.gwt.user.client.ui.IsWidget;
|
||||
import com.sap.sailing.gwt.common.client.controls.tabbar.TabView;
|
||||
import com.sap.sailing.gwt.home.desktop.partials.useraccountDetails.UserAccountDetails;
|
||||
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
import com.sap.sailing.gwt.home.shared.places.fakeseries.AbstractSeriesPlace;
|
||||
import com.sap.sailing.gwt.home.shared.places.start.StartPlace;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.decorator.NotLoggedInPresenter;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
|
||||
public interface UserProfileView<PLACE extends AbstractUserProfilePlace, PRES extends UserProfileView.Presenter> extends IsWidget {
|
||||
|
||||
@@ -40,6 +40,6 @@ public interface UserProfileView<PLACE extends AbstractUserProfilePlace, PRES ex
|
||||
|
||||
void showErrorInCurrentTab(IsWidget errorView);
|
||||
|
||||
void setUserManagementContext(UserManagementContext userManagementContext);
|
||||
void setUserManagementContext(AuthenticationContext userManagementContext);
|
||||
|
||||
}
|
||||
+2
-2
@@ -10,9 +10,9 @@ import com.sap.sailing.gwt.common.client.controls.tabbar.TabView;
|
||||
import com.sap.sailing.gwt.home.desktop.partials.useraccountDetails.UserAccountDetails;
|
||||
import com.sap.sailing.gwt.home.desktop.places.user.profile.UserProfileTabView;
|
||||
import com.sap.sailing.gwt.home.desktop.places.user.profile.UserProfileView;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.UserProfileDetailsPlace;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.decorator.AuthorizedContentDecoratorDesktop;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
|
||||
/**
|
||||
* Created by pgtaboada on 25.11.14.
|
||||
@@ -54,7 +54,7 @@ public class UserProfileDetailsTabView extends Composite implements UserProfileT
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUserManagementContext(UserManagementContext userManagementContext) {
|
||||
public void setUserManagementContext(AuthenticationContext userManagementContext) {
|
||||
decoratorUi.setUserManagementContext(userManagementContext);
|
||||
accountDetailsUi.setUserManagementContext(userManagementContext);
|
||||
}
|
||||
|
||||
+14
-66
@@ -2,20 +2,16 @@ package com.sap.sailing.gwt.home.mobile.app;
|
||||
|
||||
import com.google.gwt.place.shared.Place;
|
||||
import com.google.gwt.place.shared.PlaceController;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.web.bindery.event.shared.EventBus;
|
||||
import com.google.web.bindery.event.shared.SimpleEventBus;
|
||||
import com.sap.sailing.gwt.common.client.SharedResources;
|
||||
import com.sap.sailing.gwt.home.communication.SailingDispatchSystem;
|
||||
import com.sap.sailing.gwt.home.communication.SailingDispatchSystemImpl;
|
||||
import com.sap.sailing.gwt.home.desktop.app.ApplicationTopLevelView;
|
||||
import com.sap.sailing.gwt.home.mobile.places.error.ErrorViewImpl;
|
||||
import com.sap.sailing.gwt.home.mobile.places.searchresult.SearchResultViewImpl;
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementContext;
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementService;
|
||||
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
|
||||
import com.sap.sailing.gwt.home.shared.app.ResettableNavigationPathDisplay;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContextImpl;
|
||||
import com.sap.sailing.gwt.home.shared.partials.busy.BusyViewImpl;
|
||||
import com.sap.sailing.gwt.home.shared.places.searchresult.SearchResultClientFactory;
|
||||
import com.sap.sailing.gwt.home.shared.places.searchresult.SearchResultView;
|
||||
@@ -27,19 +23,14 @@ import com.sap.sailing.gwt.home.shared.places.user.confirmation.ConfirmationView
|
||||
import com.sap.sailing.gwt.home.shared.places.user.passwordreset.PasswordResetClientFactory;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.passwordreset.PasswordResetView;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.passwordreset.PasswordResetViewImpl;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementContextEvent;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementRequestEvent;
|
||||
import com.sap.sailing.gwt.ui.client.refresh.BusyView;
|
||||
import com.sap.sailing.gwt.ui.client.refresh.ErrorAndBusyClientFactory;
|
||||
import com.sap.sse.gwt.client.mvp.ErrorView;
|
||||
import com.sap.sse.security.ui.client.DefaultWithSecurityImpl;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationManager;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationManagerImpl;
|
||||
import com.sap.sse.security.ui.authentication.WithAuthenticationManager;
|
||||
import com.sap.sse.security.ui.client.SecureClientFactoryImpl;
|
||||
import com.sap.sse.security.ui.client.UserManagementServiceAsync;
|
||||
import com.sap.sse.security.ui.client.UserStatusEventHandler;
|
||||
import com.sap.sse.security.ui.client.WithSecurity;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
import com.sap.sse.security.ui.shared.SuccessInfo;
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -48,12 +39,11 @@ import com.sap.sse.security.ui.shared.UserDTO;
|
||||
*/
|
||||
public class MobileApplicationClientFactory extends
|
||||
SecureClientFactoryImpl<ApplicationTopLevelView<ResettableNavigationPathDisplay>> implements
|
||||
ErrorAndBusyClientFactory, SearchResultClientFactory, ClientFactoryWithUserManagementContext,
|
||||
ClientFactoryWithUserManagementService, ConfirmationClientFactory, PasswordResetClientFactory {
|
||||
ErrorAndBusyClientFactory, SearchResultClientFactory, ConfirmationClientFactory, PasswordResetClientFactory,
|
||||
WithAuthenticationManager {
|
||||
private final MobilePlacesNavigator navigator;
|
||||
private final SailingDispatchSystem dispatch = new SailingDispatchSystemImpl();
|
||||
private WithSecurity securityProvider;
|
||||
private UserManagementContext uCtx = new UserManagementContextImpl();
|
||||
private final AuthenticationManager authenticationManager;
|
||||
|
||||
public MobileApplicationClientFactory(boolean isStandaloneServer) {
|
||||
this(new SimpleEventBus(), isStandaloneServer);
|
||||
@@ -75,32 +65,9 @@ public class MobileApplicationClientFactory extends
|
||||
PlaceController placeController, final MobilePlacesNavigator navigator) {
|
||||
super(root, eventBus, placeController);
|
||||
this.navigator = navigator;
|
||||
securityProvider = new DefaultWithSecurityImpl();
|
||||
securityProvider.getUserService().addUserStatusEventHandler(new UserStatusEventHandler() {
|
||||
@Override
|
||||
public void onUserStatusChange(UserDTO user) {
|
||||
uCtx = new UserManagementContextImpl(user);
|
||||
getEventBus().fireEvent(new UserManagementContextEvent(uCtx));
|
||||
}
|
||||
});
|
||||
getEventBus().addHandler(UserManagementRequestEvent.TYPE, new UserManagementRequestEvent.Handler() {
|
||||
@Override
|
||||
public void onUserManagementRequestEvent(UserManagementRequestEvent event) {
|
||||
if (!event.isLogin()) {
|
||||
getUserManagementService().logout(new AsyncCallback<SuccessInfo>() {
|
||||
@Override
|
||||
public void onSuccess(SuccessInfo result) {
|
||||
resetUserManagementContext();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
resetUserManagementContext();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
this.authenticationManager = new AuthenticationManagerImpl(this, eventBus, getNavigator()
|
||||
.getMailVerifiedConfirmationNavigation().getFullQualifiedUrl(), getNavigator()
|
||||
.getPasswordResetNavigation().getFullQualifiedUrl());
|
||||
}
|
||||
|
||||
public MobilePlacesNavigator getNavigator() {
|
||||
@@ -134,34 +101,15 @@ public class MobileApplicationClientFactory extends
|
||||
public ResettableNavigationPathDisplay getNavigationPathDisplay() {
|
||||
return getTopLevelView().getNavigationPathDisplay();
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserManagementContext getUserManagementContext() {
|
||||
return uCtx;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resetUserManagementContext() {
|
||||
uCtx = new UserManagementContextImpl();
|
||||
securityProvider.getUserService().updateUser(true);
|
||||
getEventBus().fireEvent(new UserManagementRequestEvent());
|
||||
public AuthenticationManager getAuthenticationManager() {
|
||||
return authenticationManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void didLogin(UserDTO user) {
|
||||
uCtx = new UserManagementContextImpl(user);
|
||||
securityProvider.getUserService().updateUser(true);
|
||||
getEventBus().fireEvent(new UserManagementContextEvent(uCtx));
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserManagementServiceAsync getUserManagement() {
|
||||
return securityProvider.getUserManagementService();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConfirmationView createAccountConfirmationView(String message) {
|
||||
return new ConfirmationViewImpl(StringMessages.INSTANCE.accountConfirmation(), message);
|
||||
public ConfirmationView createConfirmationView() {
|
||||
return new ConfirmationViewImpl(SharedResources.INSTANCE, StringMessages.INSTANCE.accountConfirmation());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+5
-5
@@ -21,10 +21,10 @@ import com.sap.sailing.gwt.home.mobile.app.MobilePlacesNavigator;
|
||||
import com.sap.sailing.gwt.home.shared.ExperimentalFeatures;
|
||||
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
|
||||
import com.sap.sailing.gwt.home.shared.app.ResettableNavigationPathDisplay;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementContextEvent;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementRequestEvent;
|
||||
import com.sap.sailing.gwt.home.shared.utils.DropdownHandler;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationContextEvent;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationRequestEvent;
|
||||
|
||||
public class Header extends Composite {
|
||||
|
||||
@@ -73,7 +73,7 @@ public class Header extends Composite {
|
||||
signOutNavigationItem = addNavigation(com.sap.sse.security.ui.client.i18n.StringMessages.INSTANCE.signOut(), new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
eventBus.fireEvent(new UserManagementRequestEvent(false));
|
||||
eventBus.fireEvent(new AuthenticationRequestEvent(false));
|
||||
}
|
||||
});
|
||||
|
||||
@@ -92,9 +92,9 @@ public class Header extends Composite {
|
||||
});
|
||||
|
||||
if (ExperimentalFeatures.SHOW_USER_MANAGEMENT_ON_MOBILE) {
|
||||
eventBus.addHandler(UserManagementContextEvent.TYPE, new UserManagementContextEvent.Handler() {
|
||||
eventBus.addHandler(AuthenticationContextEvent.TYPE, new AuthenticationContextEvent.Handler() {
|
||||
@Override
|
||||
public void onUserChangeEvent(UserManagementContextEvent event) {
|
||||
public void onUserChangeEvent(AuthenticationContextEvent event) {
|
||||
String loggedInStyle = HeaderResources.INSTANCE.css().header_navigation_iconsignedin();
|
||||
UIObject.setStyleName(dropdownTriggerUi, loggedInStyle, event.getCtx().isLoggedIn());
|
||||
signInNavigationItem.setVisible(!event.getCtx().isLoggedIn());
|
||||
|
||||
+13
-5
@@ -10,7 +10,7 @@ import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.PasswordTextBox;
|
||||
import com.google.gwt.user.client.ui.TextBox;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
@@ -22,12 +22,14 @@ public class UserDetails extends Composite {
|
||||
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
|
||||
|
||||
public interface Presenter {
|
||||
void handleSaveChangesRequest(String email);
|
||||
void handleSaveChangesRequest(String fullName, String company);
|
||||
void handleEmailChangeRequest(String email);
|
||||
void handlePasswordChangeRequest(String oldPassword, String newPassword, String newPasswordConfirmation);
|
||||
}
|
||||
|
||||
@UiField InputElement usernameUi;
|
||||
@UiField InputElement nameUi;
|
||||
@UiField InputElement companyUi;
|
||||
@UiField TextBox emailUi;
|
||||
@UiField PasswordTextBox oldPasswordUi;
|
||||
@UiField PasswordTextBox newPasswordUi;
|
||||
@@ -45,10 +47,11 @@ public class UserDetails extends Composite {
|
||||
setPlaceholder(newPasswordConfirmationUi, i18n.passwordRepeatPlaceholder());
|
||||
}
|
||||
|
||||
public void setUserManagementContext(UserManagementContext userManagementContext) {
|
||||
public void setUserManagementContext(AuthenticationContext userManagementContext) {
|
||||
UserDTO currentUser = userManagementContext.getCurrentUser();
|
||||
nameUi.setValue(currentUser.getName());
|
||||
usernameUi.setValue(currentUser.getName());
|
||||
nameUi.setValue(currentUser.getFullName());
|
||||
companyUi.setValue(currentUser.getCompany());
|
||||
emailUi.setValue(currentUser.getEmail());
|
||||
oldPasswordUi.setValue("");
|
||||
newPasswordUi.setValue("");
|
||||
@@ -61,7 +64,12 @@ public class UserDetails extends Composite {
|
||||
|
||||
@UiHandler("saveChangesUi")
|
||||
void onSaveChangesClicked(ClickEvent event) {
|
||||
presenter.handleSaveChangesRequest(emailUi.getValue());
|
||||
presenter.handleSaveChangesRequest(nameUi.getValue(), companyUi.getValue());
|
||||
}
|
||||
|
||||
@UiHandler("changeEmailUi")
|
||||
void onChangeEmailClicked(ClickEvent event) {
|
||||
presenter.handleEmailChangeRequest(emailUi.getValue());
|
||||
}
|
||||
|
||||
@UiHandler("changePasswordUi")
|
||||
|
||||
+13
-4
@@ -12,23 +12,32 @@
|
||||
<form action="" method="">
|
||||
<div class="{res.mainCss.input}">
|
||||
<div class="{res.mainCss.input_label}">
|
||||
<ui:text from='{i18n_sec.name}' />
|
||||
<ui:text from='{i18n_sec.username}' />
|
||||
</div>
|
||||
<input ui:field="usernameUi" type="text" disabled="disabled" class="{res.mainCss.input_input}" />
|
||||
</div>
|
||||
<div class="{res.mainCss.input}">
|
||||
<div class="{res.mainCss.input_label}">
|
||||
<ui:text from='{i18n_sec.username}' />
|
||||
<ui:text from='{i18n_sec.name}' />
|
||||
</div>
|
||||
<input ui:field="nameUi" type="text" disabled="disabled" class="{res.mainCss.input_input}" />
|
||||
<input ui:field="nameUi" type="text" class="{res.mainCss.input_input}" />
|
||||
</div>
|
||||
<div class="{res.mainCss.input}">
|
||||
<div class="{res.mainCss.input_label}">
|
||||
<ui:text from='{i18n_sec.company}' />
|
||||
</div>
|
||||
<input ui:field="companyUi" type="text" class="{res.mainCss.input_input}" />
|
||||
</div>
|
||||
<g:Button ui:field="saveChangesUi" addStyleNames="{local_res.css.userdetails_save} {res.mainCss.button} {res.mainCss.buttonprimary}">
|
||||
<ui:text from='{i18n_sec.save}' />
|
||||
</g:Button>
|
||||
<div class="{res.mainCss.input}">
|
||||
<div class="{res.mainCss.input_label}">
|
||||
<ui:text from='{i18n_sec.email}' />
|
||||
</div>
|
||||
<g:TextBox ui:field="emailUi" addStyleNames="{res.mainCss.input_input}" />
|
||||
</div>
|
||||
<g:Button ui:field="saveChangesUi" addStyleNames="{local_res.css.userdetails_save} {res.mainCss.button} {res.mainCss.buttonprimary}">
|
||||
<g:Button ui:field="changeEmailUi" addStyleNames="{local_res.css.userdetails_save} {res.mainCss.button} {res.mainCss.buttonprimary}">
|
||||
<ui:text from='{i18n_sec.save}' />
|
||||
</g:Button>
|
||||
<div class="{res.mainCss.input}">
|
||||
|
||||
+4
-4
@@ -7,7 +7,7 @@ import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
public class UserHeader extends Composite {
|
||||
@@ -29,15 +29,15 @@ public class UserHeader extends Composite {
|
||||
subtitleUi.setInnerText("jennifer@auchnichtwennduderletztemenschauferdenwaerts.looser");
|
||||
}
|
||||
|
||||
public void setUserManagementContext(UserManagementContext userManagementContext) {
|
||||
public void setUserManagementContext(AuthenticationContext userManagementContext) {
|
||||
UserDTO currentUser = userManagementContext.getCurrentUser();
|
||||
// TODO correct message
|
||||
imageUi.setTitle("TODO picture of: " + currentUser.getName());
|
||||
// TODO use image from user when field is available
|
||||
imageUi.getStyle().setBackgroundImage("url(images/home/userdefault.svg)");
|
||||
|
||||
titleUi.setInnerText(currentUser.getName());
|
||||
subtitleUi.setInnerText(currentUser.getEmail());
|
||||
titleUi.setInnerText(userManagementContext.getUserTitle());
|
||||
subtitleUi.setInnerText(userManagementContext.getUserSubtitle());
|
||||
}
|
||||
|
||||
}
|
||||
+20
-17
@@ -4,16 +4,18 @@ import com.google.gwt.activity.shared.AbstractActivity;
|
||||
import com.google.gwt.event.shared.EventBus;
|
||||
import com.google.gwt.user.client.History;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.sap.sailing.gwt.common.client.SharedResources;
|
||||
import com.sap.sailing.gwt.home.mobile.app.MobileApplicationClientFactory;
|
||||
import com.sap.sailing.gwt.home.shared.framework.WrappedPlaceManagementController;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementPlaceManagementController;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementPlaceManagementController.SignInSuccessfulEvent;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.view.UserManagementView;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.view.UserManagementViewMobile;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.AuthenticationCallbackImpl;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.view.AuthenticationViewMobile;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationClientFactoryImpl;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationPlaceManagementController;
|
||||
import com.sap.sse.security.ui.authentication.WrappedPlaceManagementController;
|
||||
import com.sap.sse.security.ui.authentication.view.AuthenticationView;
|
||||
|
||||
public class AuthenticationActivity extends AbstractActivity {
|
||||
private final MobileApplicationClientFactory clientFactory;
|
||||
private final UserManagementView userManagementView = new UserManagementViewMobile();
|
||||
private final AuthenticationView userManagementView = new AuthenticationViewMobile();
|
||||
|
||||
public AuthenticationActivity(AuthenticationPlace place, MobileApplicationClientFactory clientFactory) {
|
||||
this.clientFactory = clientFactory;
|
||||
@@ -22,18 +24,19 @@ public class AuthenticationActivity extends AbstractActivity {
|
||||
@Override
|
||||
public void start(final AcceptsOneWidget panel, EventBus eventBus) {
|
||||
panel.setWidget(userManagementView);
|
||||
WrappedPlaceManagementController userManagementController =
|
||||
new UserManagementPlaceManagementController<MobileApplicationClientFactory>(clientFactory,
|
||||
clientFactory.getNavigator().getMailVerifiedConfirmationNavigation(),
|
||||
clientFactory.getNavigator().getPasswordResetNavigation(), clientFactory
|
||||
.getNavigator().getUserProfileNavigation(), userManagementView, eventBus);
|
||||
userManagementController.addHandler(SignInSuccessfulEvent.TYPE, new SignInSuccessfulEvent.Handler() {
|
||||
@Override
|
||||
public void onSignInSuccessful(SignInSuccessfulEvent event) {
|
||||
History.back();
|
||||
}
|
||||
});
|
||||
WrappedPlaceManagementController userManagementController = new AuthenticationPlaceManagementController(
|
||||
new AuthenticationClientFactoryImpl(clientFactory.getAuthenticationManager(), SharedResources.INSTANCE),
|
||||
new AuthenticationCallbackImpl(clientFactory.getNavigator().getUserProfileNavigation(),
|
||||
new SignInSuccessfulNavigationMobile()),
|
||||
userManagementView, eventBus);
|
||||
userManagementController.start();
|
||||
}
|
||||
|
||||
private class SignInSuccessfulNavigationMobile implements Runnable {
|
||||
@Override
|
||||
public void run() {
|
||||
History.back();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+26
-7
@@ -7,8 +7,8 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.sap.sailing.gwt.home.mobile.app.MobileApplicationClientFactory;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementContextEvent;
|
||||
import com.sap.sse.security.shared.UserManagementException;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationContextEvent;
|
||||
import com.sap.sse.security.ui.client.component.NewAccountValidator;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
|
||||
@@ -28,10 +28,10 @@ public class UserProfileDetailsActivity extends AbstractActivity implements User
|
||||
@Override
|
||||
public void start(final AcceptsOneWidget panel, final EventBus eventBus) {
|
||||
panel.setWidget(currentView);
|
||||
currentView.setUserManagementContext(clientFactory.getUserManagementContext());
|
||||
eventBus.addHandler(UserManagementContextEvent.TYPE, new UserManagementContextEvent.Handler() {
|
||||
currentView.setUserManagementContext(clientFactory.getAuthenticationManager().getAuthenticationContext());
|
||||
eventBus.addHandler(AuthenticationContextEvent.TYPE, new AuthenticationContextEvent.Handler() {
|
||||
@Override
|
||||
public void onUserChangeEvent(UserManagementContextEvent event) {
|
||||
public void onUserChangeEvent(AuthenticationContextEvent event) {
|
||||
currentView.setUserManagementContext(event.getCtx());
|
||||
}
|
||||
});
|
||||
@@ -43,8 +43,26 @@ public class UserProfileDetailsActivity extends AbstractActivity implements User
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleSaveChangesRequest(final String email) {
|
||||
final String username = clientFactory.getUserManagementContext().getCurrentUser().getName();
|
||||
public void handleSaveChangesRequest(String fullName, String company) {
|
||||
final String username = clientFactory.getAuthenticationManager().getAuthenticationContext().getCurrentUser().getName();
|
||||
clientFactory.getUserManagementService().updateUserProperties(username, fullName, company,
|
||||
new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onSuccess(Void result) {
|
||||
clientFactory.getAuthenticationManager().refreshUserInfo();
|
||||
Window.alert(i18n_sec.successfullyUpdatedUserProperties(username));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
Window.alert(i18n_sec.errorUpdatingUserProperties(caught.getMessage()));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleEmailChangeRequest(final String email) {
|
||||
final String username = clientFactory.getAuthenticationManager().getAuthenticationContext().getCurrentUser().getName();
|
||||
final String url = Window.Location.createUrlBuilder()
|
||||
.setHash(clientFactory.getNavigator().getMailVerifiedConfirmationNavigation().getTargetUrl())
|
||||
.buildString();
|
||||
@@ -64,7 +82,7 @@ public class UserProfileDetailsActivity extends AbstractActivity implements User
|
||||
|
||||
@Override
|
||||
public void handlePasswordChangeRequest(String oldPassword, String newPassword, String newPasswordConfirmation) {
|
||||
final String username = clientFactory.getUserManagementContext().getCurrentUser().getName();
|
||||
final String username = clientFactory.getAuthenticationManager().getAuthenticationContext().getCurrentUser().getName();
|
||||
String errorMessage = validator.validateUsernameAndPassword(username, newPassword, newPasswordConfirmation);
|
||||
if (errorMessage != null && !errorMessage.isEmpty()) {
|
||||
Window.alert(errorMessage);
|
||||
@@ -91,6 +109,7 @@ public class UserProfileDetailsActivity extends AbstractActivity implements User
|
||||
@Override
|
||||
public void onSuccess(Void result) {
|
||||
Window.alert(i18n_sec.passwordSuccessfullyChanged());
|
||||
currentView.setUserManagementContext(clientFactory.getAuthenticationManager().getAuthenticationContext());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
+2
-2
@@ -2,12 +2,12 @@ package com.sap.sailing.gwt.home.mobile.places.user.profile;
|
||||
|
||||
import com.google.gwt.user.client.ui.IsWidget;
|
||||
import com.sap.sailing.gwt.home.mobile.partials.userdetails.UserDetails;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.decorator.NotLoggedInPresenter;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
|
||||
public interface UserProfileDetailsView extends IsWidget {
|
||||
|
||||
void setUserManagementContext(UserManagementContext userManagementContext);
|
||||
void setUserManagementContext(AuthenticationContext userManagementContext);
|
||||
|
||||
public interface Presenter extends UserDetails.Presenter, NotLoggedInPresenter {
|
||||
}
|
||||
|
||||
+2
-2
@@ -7,8 +7,8 @@ import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.mobile.partials.userdetails.UserDetails;
|
||||
import com.sap.sailing.gwt.home.mobile.partials.userheader.UserHeader;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.decorator.AuthorizedContentDecoratorMobile;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
|
||||
public class UserProfileDetailsViewImpl extends Composite implements UserProfileDetailsView {
|
||||
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
|
||||
@@ -27,7 +27,7 @@ public class UserProfileDetailsViewImpl extends Composite implements UserProfile
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUserManagementContext(UserManagementContext userManagementContext) {
|
||||
public void setUserManagementContext(AuthenticationContext userManagementContext) {
|
||||
userHeaderUi.setUserManagementContext(userManagementContext);
|
||||
decoratorUi.setUserManagementContext(userManagementContext);
|
||||
userDetailsUi.setUserManagementContext(userManagementContext);
|
||||
|
||||
+2
-2
@@ -70,11 +70,11 @@ public class ExperimentalFeatures {
|
||||
/**
|
||||
* Enables/disables user management on desktop by showing/hiding the respective menu in the upper right corner.
|
||||
*/
|
||||
public static final boolean SHOW_USER_MANAGEMENT_ON_DESKTOP = false;
|
||||
public static final boolean SHOW_USER_MANAGEMENT_ON_DESKTOP = true;
|
||||
/**
|
||||
* Enables/disables user management on mobile UI by showing/hiding the respective menu item(s) in the upper right menu.
|
||||
*/
|
||||
public static final boolean SHOW_USER_MANAGEMENT_ON_MOBILE = false;
|
||||
public static final boolean SHOW_USER_MANAGEMENT_ON_MOBILE = true;
|
||||
/**
|
||||
* Provide buttons for user management login via social services like facebook or google.
|
||||
*/
|
||||
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.app;
|
||||
|
||||
|
||||
|
||||
public interface ClientFactoryWithUserManagementContext {
|
||||
UserManagementContext getUserManagementContext();
|
||||
void resetUserManagementContext();
|
||||
}
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.app;
|
||||
|
||||
import com.sap.sse.security.ui.client.UserManagementServiceAsync;
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
public interface ClientFactoryWithUserManagementService {
|
||||
UserManagementServiceAsync getUserManagement();
|
||||
void didLogin(UserDTO user);
|
||||
}
|
||||
+4
@@ -106,4 +106,8 @@ public class PlaceNavigation<T extends Place> {
|
||||
});
|
||||
}
|
||||
|
||||
public String getFullQualifiedUrl() {
|
||||
return Window.Location.createUrlBuilder().setHash(getTargetUrl()).buildString();
|
||||
}
|
||||
|
||||
}
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.app;
|
||||
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
public interface UserManagementContext {
|
||||
boolean isLoggedIn();
|
||||
|
||||
UserDTO getCurrentUser();
|
||||
}
|
||||
-36
@@ -1,36 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.app;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.sap.sse.security.ui.shared.AccountDTO;
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
public class UserManagementContextImpl implements UserManagementContext {
|
||||
|
||||
private final UserDTO currentUser;
|
||||
private final static UserDTO ANONYMOUS = new UserDTO("Anonymous", "", "", "", false, new ArrayList<AccountDTO>(),
|
||||
new ArrayList<String>(), new ArrayList<String>());
|
||||
|
||||
public UserManagementContextImpl() {
|
||||
this.currentUser = ANONYMOUS;
|
||||
}
|
||||
|
||||
public UserManagementContextImpl(UserDTO currentUser) {
|
||||
if (currentUser == null) {
|
||||
this.currentUser = ANONYMOUS;
|
||||
} else {
|
||||
this.currentUser = currentUser;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLoggedIn() {
|
||||
return (currentUser != ANONYMOUS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserDTO getCurrentUser() {
|
||||
return currentUser;
|
||||
}
|
||||
|
||||
}
|
||||
+12
-18
@@ -9,51 +9,45 @@ import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
|
||||
public class ConfirmationActivity extends AbstractActivity implements ConfirmationView.Presenter {
|
||||
private final ConfirmationPlace place;
|
||||
private final ConfirmationView view;
|
||||
private final ConfirmationClientFactory clientFactory;
|
||||
private final StringMessages i18n_sec = StringMessages.INSTANCE;
|
||||
|
||||
public ConfirmationActivity(ConfirmationPlace place, ConfirmationClientFactory clientFactory) {
|
||||
public ConfirmationActivity(ConfirmationPlace place, ConfirmationView view, ConfirmationClientFactory clientFactory) {
|
||||
this.place = place;
|
||||
this.view = view;
|
||||
this.clientFactory = clientFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(final AcceptsOneWidget panel, EventBus eventBus) {
|
||||
panel.setWidget(view);
|
||||
switch (place.getAction()) {
|
||||
case ERROR:
|
||||
panel.setWidget(clientFactory.createAccountConfirmationView(i18n_sec.error()));
|
||||
break;
|
||||
case ACCOUNT_CREATED:
|
||||
panel.setWidget(clientFactory.createAccountConfirmationView(
|
||||
i18n_sec.signedUpSuccessfully(place.getName())));
|
||||
break;
|
||||
case RESET_REQUESTED:
|
||||
panel.setWidget(clientFactory.createAccountConfirmationView(
|
||||
i18n_sec.passwordResetLinkSent(place.getName())));
|
||||
break;
|
||||
case RESET_EXECUTED:
|
||||
panel.setWidget(clientFactory.createAccountConfirmationView(
|
||||
i18n_sec.successfullyResetPassword(place.getName())));
|
||||
view.setMessage(i18n_sec.successfullyResetPassword(place.getName()));
|
||||
break;
|
||||
case MAIL_VERIFIED:
|
||||
panel.setWidget(clientFactory.createBusyView());
|
||||
clientFactory.getUserManagement().validateEmail(place.getName(), place.getValidationSecret(),
|
||||
clientFactory.getUserManagementService().validateEmail(place.getName(), place.getValidationSecret(),
|
||||
new MarkedAsyncCallback<Boolean>(new AsyncCallback<Boolean>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
panel.setWidget(clientFactory.createAccountConfirmationView(i18n_sec
|
||||
.errorValidatingEmail(place.getName(), caught.getMessage())));
|
||||
panel.setWidget(view);
|
||||
view.setMessage(i18n_sec.errorValidatingEmail(place.getName(), caught.getMessage()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(Boolean result) {
|
||||
panel.setWidget(view);
|
||||
final String message = result ? i18n_sec.emailValidatedSuccessfully(place.getName())
|
||||
: i18n_sec.emailValidationUnsuccessful(place.getName());
|
||||
panel.setWidget(clientFactory.createAccountConfirmationView(message));
|
||||
view.setMessage(message);
|
||||
}
|
||||
}));
|
||||
break;
|
||||
case ERROR:
|
||||
default:
|
||||
view.setMessage(i18n_sec.error());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ public class ConfirmationActivityProxy extends AbstractActivityProxy {
|
||||
GWT.runAsync(new AbstractRunAsyncCallback() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
super.onSuccess(new ConfirmationActivity(place, clientFactory));
|
||||
super.onSuccess(new ConfirmationActivity(place, clientFactory.createConfirmationView(), clientFactory));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
+3
-3
@@ -1,9 +1,9 @@
|
||||
package com.sap.sailing.gwt.home.shared.places.user.confirmation;
|
||||
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementService;
|
||||
import com.sap.sailing.gwt.ui.client.refresh.ErrorAndBusyClientFactory;
|
||||
import com.sap.sse.security.ui.client.WithSecurity;
|
||||
|
||||
public interface ConfirmationClientFactory extends ClientFactoryWithUserManagementService, ErrorAndBusyClientFactory {
|
||||
public interface ConfirmationClientFactory extends WithSecurity, ErrorAndBusyClientFactory {
|
||||
|
||||
ConfirmationView createAccountConfirmationView(String message);
|
||||
ConfirmationView createConfirmationView();
|
||||
}
|
||||
+1
-1
@@ -15,7 +15,7 @@ public class ConfirmationPlace extends AbstractBasePlace implements HasMobileVer
|
||||
private final Action action;
|
||||
|
||||
public enum Action {
|
||||
ERROR, ACCOUNT_CREATED, RESET_REQUESTED, RESET_EXECUTED, MAIL_VERIFIED;
|
||||
ERROR, RESET_EXECUTED, MAIL_VERIFIED;
|
||||
};
|
||||
|
||||
public ConfirmationPlace(Action action) {
|
||||
|
||||
+2
@@ -3,6 +3,8 @@ package com.sap.sailing.gwt.home.shared.places.user.confirmation;
|
||||
import com.google.gwt.user.client.ui.IsWidget;
|
||||
|
||||
public interface ConfirmationView extends IsWidget {
|
||||
|
||||
void setMessage(String message);
|
||||
|
||||
public interface Presenter {
|
||||
|
||||
|
||||
+9
-1
@@ -7,6 +7,7 @@ import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sse.gwt.common.CommonSharedResources;
|
||||
|
||||
public class ConfirmationViewImpl extends Composite implements ConfirmationView {
|
||||
private static WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class);
|
||||
@@ -18,10 +19,17 @@ public class ConfirmationViewImpl extends Composite implements ConfirmationView
|
||||
protected DivElement messageTitleUi;
|
||||
@UiField
|
||||
protected Element messageUi;
|
||||
@UiField(provided = true)
|
||||
final CommonSharedResources res;
|
||||
|
||||
public ConfirmationViewImpl(String messageTitle, String message) {
|
||||
public ConfirmationViewImpl(CommonSharedResources resources, String messageTitle) {
|
||||
this.res = resources;
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
messageTitleUi.setInnerText(messageTitle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMessage(String message) {
|
||||
messageUi.setInnerText(message);
|
||||
}
|
||||
|
||||
|
||||
+5
-11
@@ -1,17 +1,11 @@
|
||||
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
|
||||
xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:sp="urn:import:com.sap.sailing.gwt.home.shared.partials">
|
||||
<ui:with field="res"
|
||||
type="com.sap.sailing.gwt.common.client.SharedResources" />
|
||||
<g:HTMLPanel addStyleNames="{res.mediaCss.grid}">
|
||||
<div class="{res.mediaCss.columns}">
|
||||
<div class="{res.mainCss.mainsection}">
|
||||
<div class="{res.mainCss.mainsection_header}">
|
||||
<div class="{res.mainCss.mainsection_header_title}"
|
||||
ui:field="messageTitleUi" />
|
||||
<p ui:field="messageUi" />
|
||||
</div>
|
||||
</div>
|
||||
<ui:with field="res" type="com.sap.sse.gwt.common.CommonSharedResources" />
|
||||
<g:HTMLPanel addStyleNames="{res.mainCss.mainsection}">
|
||||
<div class="{res.mainCss.mainsection_header}">
|
||||
<div class="{res.mainCss.mainsection_header_title}" ui:field="messageTitleUi" />
|
||||
<p ui:field="messageUi" />
|
||||
</div>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+59
-32
@@ -2,7 +2,6 @@ package com.sap.sailing.gwt.home.shared.places.user.passwordreset;
|
||||
|
||||
import com.google.gwt.activity.shared.AbstractActivity;
|
||||
import com.google.gwt.event.shared.EventBus;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.sap.sse.security.shared.UserManagementException;
|
||||
@@ -10,54 +9,82 @@ import com.sap.sse.security.ui.client.component.NewAccountValidator;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
|
||||
public class PasswordResetActivity extends AbstractActivity implements PasswordResetView.Presenter {
|
||||
private final PasswordResetPlace place;
|
||||
|
||||
private final PasswordResetClientFactory clientFactory;
|
||||
private final PasswordResetView view;
|
||||
private final StringMessages i18n_sec = StringMessages.INSTANCE;
|
||||
private final NewAccountValidator validator = new NewAccountValidator(i18n_sec);
|
||||
private final ResetPasswordFormValues values;
|
||||
|
||||
public PasswordResetActivity(PasswordResetPlace place, PasswordResetClientFactory clientFactory) {
|
||||
this.place = place;
|
||||
this.clientFactory = clientFactory;
|
||||
this.view = clientFactory.createPasswordResetView();
|
||||
this.values = new ResetPasswordFormValues(place.getName(), place.getResetSecret());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(final AcceptsOneWidget panel, EventBus eventBus) {
|
||||
PasswordResetView view = clientFactory.createPasswordResetView();
|
||||
view.setPresenter(this);
|
||||
panel.setWidget(view.asWidget());
|
||||
values.validate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resetPassword(String newPassword, String newPasswordConfirmation) {
|
||||
final String username = place.getName();
|
||||
String errorMessage = validator.validateUsernameAndPassword(username, newPassword, newPasswordConfirmation);
|
||||
if (errorMessage != null && !errorMessage.isEmpty()) {
|
||||
Window.alert(errorMessage);
|
||||
return;
|
||||
}
|
||||
|
||||
clientFactory.getUserManagement().updateSimpleUserPassword(username, null, place.getResetSecret(),
|
||||
newPassword, new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
if (caught instanceof UserManagementException) {
|
||||
String message = ((UserManagementException) caught).getMessage();
|
||||
if (UserManagementException.PASSWORD_DOES_NOT_MEET_REQUIREMENTS.equals(message)) {
|
||||
Window.alert(i18n_sec.passwordDoesNotMeetRequirements());
|
||||
} else if (UserManagementException.INVALID_CREDENTIALS.equals(message)) {
|
||||
Window.alert(i18n_sec.invalidCredentials());
|
||||
} else {
|
||||
Window.alert(i18n_sec.errorChangingPassword(caught.getMessage()));
|
||||
}
|
||||
public void onChangePassword(String newValue) {
|
||||
values.password = newValue;
|
||||
values.validate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangePasswordConfirmation(String newValue) {
|
||||
values.passwordConfirmation = newValue;
|
||||
values.validate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resetPassword() {
|
||||
if (values.validate()) {
|
||||
clientFactory.getUserManagementService().updateSimpleUserPassword(values.username, null,
|
||||
values.resetSecret, values.password, new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
if (caught instanceof UserManagementException) {
|
||||
String message = ((UserManagementException) caught).getMessage();
|
||||
if (UserManagementException.PASSWORD_DOES_NOT_MEET_REQUIREMENTS.equals(message)) {
|
||||
view.setErrorMessage(i18n_sec.passwordDoesNotMeetRequirements());
|
||||
} else if (UserManagementException.INVALID_CREDENTIALS.equals(message)) {
|
||||
view.setErrorMessage(i18n_sec.invalidCredentials());
|
||||
} else {
|
||||
Window.alert(i18n_sec.errorChangingPassword(caught.getMessage()));
|
||||
view.setErrorMessage(i18n_sec.errorChangingPassword(caught.getMessage()));
|
||||
}
|
||||
} else {
|
||||
view.setErrorMessage(i18n_sec.errorChangingPassword(caught.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(Void result) {
|
||||
clientFactory.getPasswordResettedConfirmationNavigation(values.username).goToPlace();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private class ResetPasswordFormValues {
|
||||
private final NewAccountValidator validator = new NewAccountValidator(i18n_sec);
|
||||
private final String username, resetSecret;
|
||||
private String password, passwordConfirmation;
|
||||
|
||||
private ResetPasswordFormValues(String username, String resetSecret) {
|
||||
this.username = username;
|
||||
this.resetSecret = resetSecret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(Void result) {
|
||||
clientFactory.getPasswordResettedConfirmationNavigation(username).goToPlace();
|
||||
}
|
||||
});
|
||||
private boolean validate() {
|
||||
String errorMessage = validator.validateUsernameAndPassword(username, password, passwordConfirmation);
|
||||
boolean isValid = errorMessage == null || errorMessage.isEmpty();
|
||||
view.setErrorMessage(isValid ? null : errorMessage);
|
||||
view.getChangePasswordControl().setEnabled(isValid);
|
||||
return isValid;
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-2
@@ -1,11 +1,13 @@
|
||||
package com.sap.sailing.gwt.home.shared.places.user.passwordreset;
|
||||
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementService;
|
||||
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.confirmation.ConfirmationPlace;
|
||||
import com.sap.sailing.gwt.ui.client.refresh.ErrorAndBusyClientFactory;
|
||||
import com.sap.sse.security.ui.client.WithSecurity;
|
||||
|
||||
public interface PasswordResetClientFactory extends ClientFactoryWithUserManagementService, ErrorAndBusyClientFactory {
|
||||
public interface PasswordResetClientFactory extends WithSecurity, ErrorAndBusyClientFactory {
|
||||
|
||||
PasswordResetView createPasswordResetView();
|
||||
|
||||
PlaceNavigation<ConfirmationPlace> getPasswordResettedConfirmationNavigation(String username);
|
||||
}
|
||||
+11
-2
@@ -1,13 +1,22 @@
|
||||
package com.sap.sailing.gwt.home.shared.places.user.passwordreset;
|
||||
|
||||
import com.google.gwt.user.client.ui.HasEnabled;
|
||||
import com.google.gwt.user.client.ui.IsWidget;
|
||||
import com.sap.sse.security.ui.authentication.ErrorMessageView;
|
||||
|
||||
public interface PasswordResetView extends IsWidget {
|
||||
public interface PasswordResetView extends ErrorMessageView, IsWidget {
|
||||
|
||||
void setPresenter(Presenter currentPresenter);
|
||||
|
||||
HasEnabled getChangePasswordControl();
|
||||
|
||||
public interface Presenter {
|
||||
void resetPassword(String newPassword, String newPasswordConfirmation);
|
||||
|
||||
void onChangePassword(String newValue);
|
||||
|
||||
void onChangePasswordConfirmation(String newValue);
|
||||
|
||||
void resetPassword();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+41
-12
@@ -1,14 +1,17 @@
|
||||
package com.sap.sailing.gwt.home.shared.places.user.passwordreset;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.DivElement;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.KeyCodes;
|
||||
import com.google.gwt.event.dom.client.KeyUpEvent;
|
||||
import com.google.gwt.event.dom.client.KeyUpHandler;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.uibinder.client.UiHandler;
|
||||
import com.google.gwt.user.client.ui.Button;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.HasEnabled;
|
||||
import com.google.gwt.user.client.ui.PasswordTextBox;
|
||||
import com.google.gwt.user.client.ui.TextBox;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
@@ -23,6 +26,7 @@ public class PasswordResetViewImpl extends Composite implements PasswordResetVie
|
||||
private Presenter currentPresenter;
|
||||
|
||||
@UiField StringMessages i18n_sec;
|
||||
@UiField protected DivElement errorsUi;
|
||||
@UiField protected Button changePasswordUi;
|
||||
@UiField protected PasswordTextBox newPasswordUi;
|
||||
@UiField protected PasswordTextBox newPasswordConfirmationUi;
|
||||
@@ -31,6 +35,24 @@ public class PasswordResetViewImpl extends Composite implements PasswordResetVie
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
setPlaceholder(newPasswordUi, i18n_sec.newPasswordPlaceholder());
|
||||
setPlaceholder(newPasswordConfirmationUi, i18n_sec.passwordRepeatPlaceholder());
|
||||
|
||||
newPasswordUi.addKeyUpHandler(new FieldKeyUpHandler() {
|
||||
@Override
|
||||
void updateFieldValue() {
|
||||
currentPresenter.onChangePassword(newPasswordUi.getValue());
|
||||
}
|
||||
});
|
||||
newPasswordConfirmationUi.addKeyUpHandler(new FieldKeyUpHandler() {
|
||||
@Override
|
||||
void updateFieldValue() {
|
||||
currentPresenter.onChangePasswordConfirmation(newPasswordConfirmationUi.getValue());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public HasEnabled getChangePasswordControl() {
|
||||
return changePasswordUi;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -38,6 +60,11 @@ public class PasswordResetViewImpl extends Composite implements PasswordResetVie
|
||||
this.currentPresenter = currentPresenter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setErrorMessage(String errorMessage) {
|
||||
errorsUi.setInnerText(errorMessage);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onLoad() {
|
||||
selectAll(newPasswordUi);
|
||||
@@ -45,18 +72,7 @@ public class PasswordResetViewImpl extends Composite implements PasswordResetVie
|
||||
|
||||
@UiHandler("changePasswordUi")
|
||||
void onChangePasswordClicked(ClickEvent event) {
|
||||
triggerChangePassword();
|
||||
}
|
||||
|
||||
@UiHandler({"newPasswordUi", "newPasswordConfirmationUi"})
|
||||
void onChangePasswordKeyPressed(KeyUpEvent event) {
|
||||
if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
|
||||
triggerChangePassword();
|
||||
}
|
||||
}
|
||||
|
||||
private void triggerChangePassword() {
|
||||
currentPresenter.resetPassword(newPasswordUi.getValue(), newPasswordConfirmationUi.getValue());
|
||||
currentPresenter.resetPassword();
|
||||
}
|
||||
|
||||
private void setPlaceholder(Widget widget, String placeholderText) {
|
||||
@@ -67,4 +83,17 @@ public class PasswordResetViewImpl extends Composite implements PasswordResetVie
|
||||
textBox.setFocus(true);
|
||||
textBox.selectAll();
|
||||
}
|
||||
|
||||
private abstract class FieldKeyUpHandler implements KeyUpHandler {
|
||||
@Override
|
||||
public void onKeyUp(KeyUpEvent event) {
|
||||
if(event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
|
||||
currentPresenter.resetPassword();
|
||||
} else {
|
||||
updateFieldValue();
|
||||
}
|
||||
}
|
||||
|
||||
abstract void updateFieldValue();
|
||||
}
|
||||
}
|
||||
+1
@@ -17,6 +17,7 @@
|
||||
<div class="{res.mediaCss.columns}">
|
||||
<div class="{res.mainCss.mainsection}" style="max-width: 30rem; margin: auto;">
|
||||
<div class="{res.mainCss.mainsection_header_title}"><ui:text from="{i18n_sec.resetPassword}"/></div>
|
||||
<div class="{res.mainCss.input_errortext}" ui:field="errorsUi"></div>
|
||||
<div class="{res.mainCss.input}">
|
||||
<div class="{res.mainCss.input_label}">
|
||||
<ui:text from='{i18n_sec.password}' />
|
||||
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement;
|
||||
|
||||
import com.google.gwt.place.shared.Place;
|
||||
import com.sap.sailing.gwt.home.shared.app.HasLocationTitle;
|
||||
|
||||
public abstract class AbstractUserManagementPlace extends Place implements HasLocationTitle {
|
||||
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement;
|
||||
|
||||
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationCallback;
|
||||
|
||||
public class AuthenticationCallbackImpl implements AuthenticationCallback {
|
||||
|
||||
private final PlaceNavigation<? extends AbstractUserProfilePlace> userProfileNavigation;
|
||||
private final Runnable signInSuccessfulNavigation;
|
||||
|
||||
public AuthenticationCallbackImpl(PlaceNavigation<? extends AbstractUserProfilePlace> userProfileNavigation,
|
||||
Runnable signInSuccessfulNavigation) {
|
||||
this.signInSuccessfulNavigation = signInSuccessfulNavigation;
|
||||
this.userProfileNavigation = userProfileNavigation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleUserProfileNavigation() {
|
||||
userProfileNavigation.goToPlace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleSignInSuccess() {
|
||||
signInSuccessfulNavigation.run();
|
||||
}
|
||||
|
||||
}
|
||||
-4
@@ -1,4 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement;
|
||||
|
||||
public interface RequiresLoggedInUser {
|
||||
}
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement;
|
||||
|
||||
import com.google.gwt.event.shared.EventHandler;
|
||||
import com.google.gwt.event.shared.GwtEvent;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
|
||||
public class UserManagementContextEvent extends GwtEvent<UserManagementContextEvent.Handler> {
|
||||
public static final Type<Handler> TYPE = new Type<UserManagementContextEvent.Handler>();
|
||||
|
||||
private final UserManagementContext ctx;
|
||||
|
||||
public interface Handler extends EventHandler {
|
||||
void onUserChangeEvent(UserManagementContextEvent event);
|
||||
}
|
||||
|
||||
public UserManagementContextEvent(UserManagementContext ctx) {
|
||||
this.ctx = ctx;
|
||||
}
|
||||
|
||||
public UserManagementContext getCtx() {
|
||||
return ctx;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type<Handler> getAssociatedType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dispatch(Handler handler) {
|
||||
handler.onUserChangeEvent(this);
|
||||
}
|
||||
}
|
||||
-143
@@ -1,143 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement;
|
||||
|
||||
import com.google.gwt.activity.shared.Activity;
|
||||
import com.google.gwt.event.shared.EventHandler;
|
||||
import com.google.gwt.event.shared.GwtEvent;
|
||||
import com.google.gwt.place.shared.Place;
|
||||
import com.google.gwt.place.shared.PlaceController;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.google.web.bindery.event.shared.EventBus;
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementContext;
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementService;
|
||||
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
|
||||
import com.sap.sailing.gwt.home.shared.framework.WrappedPlaceManagementController;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.confirmation.ConfirmationActivity;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.confirmation.ConfirmationClientFactory;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.confirmation.ConfirmationPlace;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.passwordreset.PasswordResetPlace;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.create.CreateAccountActivity;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.create.CreateAccountPlace;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.info.LoggedInUserInfoActivity;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.info.LoggedInUserInfoPlace;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.recovery.PasswordRecoveryActivity;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.recovery.PasswordRecoveryPlace;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.signin.SignInActivity;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.signin.SignInPlace;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.view.UserManagementView;
|
||||
import com.sap.sse.gwt.client.mvp.ClientFactory;
|
||||
|
||||
public class UserManagementPlaceManagementController
|
||||
<CF extends ClientFactory & ClientFactoryWithUserManagementContext & ClientFactoryWithUserManagementService & ConfirmationClientFactory>
|
||||
extends WrappedPlaceManagementController {
|
||||
|
||||
public UserManagementPlaceManagementController(CF clientFactory,
|
||||
PlaceNavigation<ConfirmationPlace> createConfirmationNavigation,
|
||||
PlaceNavigation<PasswordResetPlace> passwordResetPlaceNav,
|
||||
PlaceNavigation<? extends AbstractUserProfilePlace> userProfileNavigation,
|
||||
UserManagementView userManagementView, EventBus globalEventBus) {
|
||||
super(new Configuration<CF>(clientFactory, createConfirmationNavigation, passwordResetPlaceNav, userProfileNavigation, userManagementView));
|
||||
globalEventBus.addHandler(UserManagementContextEvent.TYPE, new UserManagementContextEvent.Handler() {
|
||||
@Override
|
||||
public void onUserChangeEvent(UserManagementContextEvent event) {
|
||||
UserManagementPlaceManagementController.this.fireEvent(event);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static class Configuration
|
||||
<CF extends ClientFactory & ClientFactoryWithUserManagementContext & ClientFactoryWithUserManagementService & ConfirmationClientFactory>
|
||||
implements PlaceManagementConfiguration {
|
||||
private final CF clientFactory;
|
||||
private final PlaceNavigation<ConfirmationPlace> createConfirmationNavigation;
|
||||
private final PlaceNavigation<? extends AbstractUserProfilePlace> userProfileNavigation;
|
||||
private final UserManagementView userManagementView;
|
||||
private PlaceController placeController;
|
||||
private final PlaceNavigation<PasswordResetPlace> passwordResetPlaceNav;
|
||||
|
||||
public Configuration(CF clientFactory, PlaceNavigation<ConfirmationPlace> createConfirmationNavigation,
|
||||
PlaceNavigation<PasswordResetPlace> passwordResetPlaceNav,
|
||||
PlaceNavigation<? extends AbstractUserProfilePlace> userProfileNavigation,
|
||||
UserManagementView userManagementView) {
|
||||
this.clientFactory = clientFactory;
|
||||
this.createConfirmationNavigation = createConfirmationNavigation;
|
||||
this.passwordResetPlaceNav = passwordResetPlaceNav;
|
||||
this.userProfileNavigation = userProfileNavigation;
|
||||
this.userManagementView = userManagementView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPlaceController(PlaceController placeController) {
|
||||
this.placeController = placeController;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AcceptsOneWidget getDisplay() {
|
||||
return userManagementView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Place getStartPlace() {
|
||||
return isLoggedIn() ? new LoggedInUserInfoPlace() : new SignInPlace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Activity getActivity(Place requestedPlace) {
|
||||
final Place placeToUse = getPlaceToUse(requestedPlace);
|
||||
this.updateViewHeading(placeToUse);
|
||||
|
||||
if (placeToUse instanceof SignInPlace) {
|
||||
return new SignInActivity((SignInPlace) placeToUse, clientFactory, placeController);
|
||||
} else if (placeToUse instanceof CreateAccountPlace) {
|
||||
return new CreateAccountActivity((CreateAccountPlace) placeToUse, clientFactory,
|
||||
createConfirmationNavigation, placeController);
|
||||
} else if (placeToUse instanceof PasswordRecoveryPlace) {
|
||||
return new PasswordRecoveryActivity<CF>((PasswordRecoveryPlace) placeToUse, clientFactory, passwordResetPlaceNav, placeController);
|
||||
} else if (placeToUse instanceof LoggedInUserInfoPlace) {
|
||||
return new LoggedInUserInfoActivity<CF>((LoggedInUserInfoPlace) placeToUse, clientFactory,
|
||||
userProfileNavigation, placeController);
|
||||
} else if (placeToUse instanceof ConfirmationPlace) {
|
||||
return new ConfirmationActivity((ConfirmationPlace) placeToUse, clientFactory);
|
||||
}
|
||||
|
||||
return getActivity(new SignInPlace());
|
||||
}
|
||||
|
||||
private boolean isLoggedIn() {
|
||||
return clientFactory.getUserManagementContext().isLoggedIn();
|
||||
}
|
||||
|
||||
private Place getPlaceToUse(Place requestedPlace) {
|
||||
boolean requiresLogin = requestedPlace instanceof RequiresLoggedInUser;
|
||||
return requiresLogin && !isLoggedIn() ? getStartPlace() : requestedPlace;
|
||||
}
|
||||
|
||||
private void updateViewHeading(Place placeToUse) {
|
||||
userManagementView.setHeading(placeToUse instanceof AbstractUserManagementPlace
|
||||
? ((AbstractUserManagementPlace) placeToUse).getLocationTitle() : "");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class SignInSuccessfulEvent extends GwtEvent<SignInSuccessfulEvent.Handler> {
|
||||
|
||||
public static final Type<SignInSuccessfulEvent.Handler> TYPE = new Type<>();
|
||||
|
||||
public interface Handler extends EventHandler {
|
||||
public void onSignInSuccessful(SignInSuccessfulEvent event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type<Handler> getAssociatedType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dispatch(Handler handler) {
|
||||
handler.onSignInSuccessful(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
-82
@@ -1,82 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement.create;
|
||||
|
||||
import com.google.gwt.activity.shared.AbstractActivity;
|
||||
import com.google.gwt.event.shared.EventBus;
|
||||
import com.google.gwt.place.shared.PlaceController;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementService;
|
||||
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.confirmation.ConfirmationPlace;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.confirmation.ConfirmationPlace.Action;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.AsyncLoginCallback;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.signin.SignInPlace;
|
||||
import com.sap.sse.security.shared.UserManagementException;
|
||||
import com.sap.sse.security.ui.client.component.NewAccountValidator;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
public class CreateAccountActivity extends AbstractActivity implements CreateAccountView.Presenter {
|
||||
|
||||
private final ClientFactoryWithUserManagementService clientFactory;
|
||||
private final PlaceController placeController;
|
||||
private final CreateAccountView view = new CreateAccountViewImpl();
|
||||
|
||||
private final StringMessages i18n_sec = StringMessages.INSTANCE;
|
||||
private final NewAccountValidator validator = new NewAccountValidator(i18n_sec);
|
||||
private final PlaceNavigation<ConfirmationPlace> confirmationPlaceNav;
|
||||
private EventBus eventBus;
|
||||
|
||||
public CreateAccountActivity(CreateAccountPlace place, ClientFactoryWithUserManagementService clientFactory,
|
||||
PlaceNavigation<ConfirmationPlace> confirmationPlaceNav, PlaceController placeController) {
|
||||
this.clientFactory = clientFactory;
|
||||
this.confirmationPlaceNav = confirmationPlaceNav;
|
||||
this.placeController = placeController;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(AcceptsOneWidget panel, EventBus eventBus) {
|
||||
this.eventBus = eventBus;
|
||||
view.setPresenter(this);
|
||||
panel.setWidget(view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createAccount(final String username, String email, final String password, String passwordConfirmation) {
|
||||
String errorMessage = validator.validateUsernameAndPassword(username, password, passwordConfirmation);
|
||||
if (errorMessage != null && !errorMessage.isEmpty()) {
|
||||
view.setErrorMessage(errorMessage);
|
||||
return;
|
||||
}
|
||||
final String url = Window.Location.createUrlBuilder().setHash(confirmationPlaceNav.getTargetUrl())
|
||||
.buildString();
|
||||
|
||||
clientFactory.getUserManagement().createSimpleUser(username, email, password, url,
|
||||
new AsyncCallback<UserDTO>() {
|
||||
@Override
|
||||
public void onSuccess(UserDTO result) {
|
||||
clientFactory.getUserManagement().login(result.getName(), password,
|
||||
new AsyncLoginCallback(clientFactory, view, eventBus, false));
|
||||
placeController.goTo(new ConfirmationPlace(Action.ACCOUNT_CREATED, username));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
if (caught instanceof UserManagementException) {
|
||||
if (UserManagementException.USER_ALREADY_EXISTS.equals(((UserManagementException) caught).getMessage())) {
|
||||
Window.alert(i18n_sec.userAlreadyExists(username));
|
||||
}
|
||||
} else {
|
||||
Window.alert(i18n_sec.errorCreatingUser(username, caught.getMessage()));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void signIn() {
|
||||
placeController.goTo(new SignInPlace());
|
||||
}
|
||||
|
||||
}
|
||||
-14
@@ -1,14 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement.create;
|
||||
|
||||
import com.sap.sailing.gwt.home.shared.app.HasMobileVersion;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.AbstractUserManagementPlace;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
|
||||
public class CreateAccountPlace extends AbstractUserManagementPlace implements HasMobileVersion {
|
||||
|
||||
@Override
|
||||
public String getLocationTitle() {
|
||||
return StringMessages.INSTANCE.signUp();
|
||||
}
|
||||
|
||||
}
|
||||
-19
@@ -1,19 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement.create;
|
||||
|
||||
import com.google.gwt.user.client.ui.IsWidget;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.ErrorMessageView;
|
||||
|
||||
public interface CreateAccountView extends ErrorMessageView, IsWidget {
|
||||
|
||||
void setPresenter(Presenter presenter);
|
||||
|
||||
public interface Presenter {
|
||||
|
||||
void createAccount(String username, String email, String password, String passwordConfirmation);
|
||||
|
||||
void signIn();
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
-94
@@ -1,94 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement.create;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.DivElement;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.KeyCodes;
|
||||
import com.google.gwt.event.dom.client.KeyUpEvent;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.uibinder.client.UiHandler;
|
||||
import com.google.gwt.user.client.ui.Anchor;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.PasswordTextBox;
|
||||
import com.google.gwt.user.client.ui.TextBox;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementResources;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
|
||||
public class CreateAccountViewImpl extends Composite implements CreateAccountView {
|
||||
|
||||
interface CreateAccountViewImplUiBinder extends UiBinder<Widget, CreateAccountViewImpl> {
|
||||
}
|
||||
|
||||
private static CreateAccountViewImplUiBinder uiBinder = GWT.create(CreateAccountViewImplUiBinder.class);
|
||||
|
||||
@UiField TextBox emailUi;
|
||||
@UiField TextBox usernameUi;
|
||||
@UiField PasswordTextBox passwordUi;
|
||||
@UiField PasswordTextBox passwordConfirmationUi;
|
||||
@UiField Anchor createAccountUi;
|
||||
@UiField Anchor signInUi;
|
||||
|
||||
@UiField DivElement formErrorUi;
|
||||
|
||||
private Presenter presenter;
|
||||
|
||||
public CreateAccountViewImpl() {
|
||||
UserManagementResources.INSTANCE.css().ensureInjected();
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
|
||||
StringMessages i18n = StringMessages.INSTANCE;
|
||||
setPlaceholder(passwordUi, i18n.newPasswordPlaceholder());
|
||||
setPlaceholder(passwordConfirmationUi, i18n.passwordRepeatPlaceholder());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPresenter(Presenter presenter) {
|
||||
this.presenter = presenter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setErrorMessage(String errorMessage) {
|
||||
formErrorUi.setInnerText(errorMessage);
|
||||
selectAll(emailUi);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onLoad() {
|
||||
selectAll(emailUi);
|
||||
}
|
||||
|
||||
@UiHandler("createAccountUi")
|
||||
void onCreateAccountUiControlClicked(ClickEvent event) {
|
||||
triggerCreateAccount();
|
||||
}
|
||||
|
||||
@UiHandler({ "emailUi", "usernameUi", "passwordUi", "passwordConfirmationUi"})
|
||||
void onCreateAccountKeyPressed(KeyUpEvent event) {
|
||||
if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
|
||||
triggerCreateAccount();
|
||||
}
|
||||
}
|
||||
|
||||
@UiHandler("signInUi")
|
||||
void onSignInControlUiClicked(ClickEvent event) {
|
||||
presenter.signIn();
|
||||
}
|
||||
|
||||
private void triggerCreateAccount() {
|
||||
String username = usernameUi.getValue(), email = emailUi.getValue();
|
||||
String password = passwordUi.getValue(), passwordConfirmation = passwordConfirmationUi.getValue();
|
||||
presenter.createAccount(username, email, password, passwordConfirmation);
|
||||
}
|
||||
|
||||
private void setPlaceholder(Widget widget, String placeholderText) {
|
||||
widget.getElement().setAttribute("placeholder", placeholderText);
|
||||
}
|
||||
|
||||
private void selectAll(TextBox textBox) {
|
||||
textBox.setFocus(true);
|
||||
textBox.selectAll();
|
||||
}
|
||||
|
||||
}
|
||||
+2
-2
@@ -4,7 +4,7 @@ import com.google.gwt.uibinder.client.UiChild;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.SimplePanel;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.shared.app.UserManagementContext;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
|
||||
public class AuthorizedContentDecorator extends Composite {
|
||||
@@ -28,7 +28,7 @@ public class AuthorizedContentDecorator extends Composite {
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public void setUserManagementContext(UserManagementContext userManagementContext) {
|
||||
public void setUserManagementContext(AuthenticationContext userManagementContext) {
|
||||
contentHolder.setWidget(userManagementContext.isLoggedIn() ? content : notLoggedInView);
|
||||
}
|
||||
}
|
||||
-72
@@ -1,72 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement.info;
|
||||
|
||||
import com.google.gwt.activity.shared.AbstractActivity;
|
||||
import com.google.gwt.event.shared.EventBus;
|
||||
import com.google.gwt.place.shared.PlaceController;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementContext;
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementService;
|
||||
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.AbstractUserProfilePlace;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementContextEvent;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementRequestEvent;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.signin.SignInPlace;
|
||||
import com.sap.sse.gwt.client.mvp.ClientFactory;
|
||||
import com.sap.sse.security.ui.shared.SuccessInfo;
|
||||
|
||||
public class LoggedInUserInfoActivity<CF extends ClientFactory & ClientFactoryWithUserManagementService & ClientFactoryWithUserManagementContext>
|
||||
extends AbstractActivity implements LoggedInUserInfoView.Presenter {
|
||||
|
||||
private final CF clientFactory;
|
||||
private final PlaceNavigation<? extends AbstractUserProfilePlace> userProfileNavigation;
|
||||
private final PlaceController placeController;
|
||||
|
||||
public LoggedInUserInfoActivity(LoggedInUserInfoPlace place, CF clientFactory,
|
||||
PlaceNavigation<? extends AbstractUserProfilePlace> userProfileNavigation, PlaceController placeController) {
|
||||
this.clientFactory = clientFactory;
|
||||
this.userProfileNavigation = userProfileNavigation;
|
||||
this.placeController = placeController;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(AcceptsOneWidget panel, EventBus eventBus) {
|
||||
final LoggedInUserInfoView view = new LoggedInUserInfoViewImpl();
|
||||
view.setPresenter(this);
|
||||
panel.setWidget(view);
|
||||
view.setUserInfo(clientFactory.getUserManagementContext().getCurrentUser());
|
||||
eventBus.addHandler(UserManagementContextEvent.TYPE, new UserManagementContextEvent.Handler() {
|
||||
@Override
|
||||
public void onUserChangeEvent(UserManagementContextEvent event) {
|
||||
if (event.getCtx().isLoggedIn()) {
|
||||
view.setUserInfo(event.getCtx().getCurrentUser());
|
||||
} else {
|
||||
placeController.goTo(new SignInPlace());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void gotoProfileUi() {
|
||||
clientFactory.getEventBus().fireEvent(new UserManagementRequestEvent());
|
||||
userProfileNavigation.goToPlace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void signOut() {
|
||||
clientFactory.getUserManagement().logout(new AsyncCallback<SuccessInfo>() {
|
||||
@Override
|
||||
public void onSuccess(SuccessInfo result) {
|
||||
clientFactory.resetUserManagementContext();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
clientFactory.resetUserManagementContext();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement.info;
|
||||
|
||||
import com.google.gwt.place.shared.Place;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.RequiresLoggedInUser;
|
||||
|
||||
public class LoggedInUserInfoPlace extends Place implements RequiresLoggedInUser {
|
||||
|
||||
}
|
||||
-68
@@ -1,68 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement.recovery;
|
||||
|
||||
import static com.sap.sse.security.shared.UserManagementException.CANNOT_RESET_PASSWORD_WITHOUT_VALIDATED_EMAIL;
|
||||
|
||||
import com.google.gwt.activity.shared.AbstractActivity;
|
||||
import com.google.gwt.event.shared.EventBus;
|
||||
import com.google.gwt.place.shared.PlaceController;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementService;
|
||||
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.confirmation.ConfirmationPlace;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.confirmation.ConfirmationPlace.Action;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.passwordreset.PasswordResetPlace;
|
||||
import com.sap.sse.gwt.client.mvp.ClientFactory;
|
||||
import com.sap.sse.security.shared.UserManagementException;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
|
||||
public class PasswordRecoveryActivity<CF extends ClientFactoryWithUserManagementService & ClientFactory> extends AbstractActivity implements PasswordRecoveryView.Presenter {
|
||||
|
||||
private final CF clientFactory;
|
||||
private final PlaceController placeController;
|
||||
private final PasswordRecoveryView view = new PasswordRecoveryViewImpl();
|
||||
private final PlaceNavigation<PasswordResetPlace> passwordResetPlaceNav;
|
||||
|
||||
public PasswordRecoveryActivity(PasswordRecoveryPlace place, CF clientFactory,
|
||||
PlaceNavigation<PasswordResetPlace> passwordResetPlaceNav, PlaceController placeController) {
|
||||
this.clientFactory = clientFactory;
|
||||
this.passwordResetPlaceNav = passwordResetPlaceNav;
|
||||
this.placeController = placeController;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(AcceptsOneWidget panel, EventBus eventBus) {
|
||||
view.setPresenter(this);
|
||||
panel.setWidget(view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resetPassword(final String email, final String username) {
|
||||
final String url = Window.Location.createUrlBuilder().setHash(passwordResetPlaceNav.getTargetUrl())
|
||||
.buildString();
|
||||
clientFactory.getUserManagement().resetPassword(username, email,
|
||||
url,
|
||||
new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onSuccess(Void result) {
|
||||
String name = (username == null || username.isEmpty()) ? email : username;
|
||||
placeController.goTo(new ConfirmationPlace(Action.RESET_REQUESTED, name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
StringMessages i18n = StringMessages.INSTANCE;
|
||||
if (caught instanceof UserManagementException) {
|
||||
if (CANNOT_RESET_PASSWORD_WITHOUT_VALIDATED_EMAIL.equals(caught.getMessage())) {
|
||||
view.setErrorMessage(i18n.cannotResetPasswordWithoutValidatedEmail(username));
|
||||
} else {
|
||||
view.setErrorMessage(i18n.errorResettingPassword(username, caught.getMessage()));
|
||||
}
|
||||
} else {
|
||||
view.setErrorMessage(i18n.errorDuringPasswordReset(caught.getMessage()));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
-14
@@ -1,14 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement.recovery;
|
||||
|
||||
import com.sap.sailing.gwt.home.shared.app.HasMobileVersion;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.AbstractUserManagementPlace;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
|
||||
public class PasswordRecoveryPlace extends AbstractUserManagementPlace implements HasMobileVersion {
|
||||
|
||||
@Override
|
||||
public String getLocationTitle() {
|
||||
return StringMessages.INSTANCE.forgotPassword();
|
||||
}
|
||||
|
||||
}
|
||||
-14
@@ -1,14 +0,0 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement.signin;
|
||||
|
||||
import com.sap.sailing.gwt.home.shared.app.HasMobileVersion;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.AbstractUserManagementPlace;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
|
||||
public class SignInPlace extends AbstractUserManagementPlace implements HasMobileVersion {
|
||||
|
||||
@Override
|
||||
public String getLocationTitle() {
|
||||
return StringMessages.INSTANCE.signIn();
|
||||
}
|
||||
|
||||
}
|
||||
+17
-7
@@ -13,31 +13,41 @@ import com.google.gwt.user.client.ui.PopupPanel.PositionCallback;
|
||||
import com.google.gwt.user.client.ui.SimplePanel;
|
||||
import com.google.gwt.user.client.ui.UIObject;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementResources;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementResources.LocalCss;
|
||||
import com.sap.sailing.gwt.common.client.SharedResources;
|
||||
import com.sap.sse.gwt.common.CommonSharedResources;
|
||||
import com.sap.sse.security.ui.authentication.UserManagementResources;
|
||||
import com.sap.sse.security.ui.authentication.UserManagementResources.LocalCss;
|
||||
import com.sap.sse.security.ui.authentication.view.FlyoutAuthenticationView;
|
||||
|
||||
public class UserManagementViewDesktop extends Composite implements UserManagementView {
|
||||
public class AuthenticationViewDesktop extends Composite implements FlyoutAuthenticationView {
|
||||
|
||||
private static final LocalCss LOCAL_CSS = UserManagementResources.INSTANCE.css();
|
||||
|
||||
interface UserManagementViewUiBinder extends UiBinder<Widget, UserManagementViewDesktop> {
|
||||
interface AuthenticationViewUiBinder extends UiBinder<Widget, AuthenticationViewDesktop> {
|
||||
}
|
||||
|
||||
private static UserManagementViewUiBinder uiBinder = GWT.create(UserManagementViewUiBinder.class);
|
||||
private static AuthenticationViewUiBinder uiBinder = GWT.create(AuthenticationViewUiBinder.class);
|
||||
|
||||
private final PopupPanel popupPanel = new PopupPanel(true, false);
|
||||
|
||||
@UiField DivElement headingUi;
|
||||
@UiField SimplePanel contentContainerUi;
|
||||
|
||||
@UiField(provided = true)
|
||||
CommonSharedResources res = SharedResources.INSTANCE;
|
||||
|
||||
public UserManagementViewDesktop() {
|
||||
public AuthenticationViewDesktop() {
|
||||
LOCAL_CSS.ensureInjected();
|
||||
popupPanel.addStyleName(LOCAL_CSS.flyover());
|
||||
// popupPanel.addAutoHidePartner(autoHidePartner);
|
||||
super.initWidget(uiBinder.createAndBindUi(this));
|
||||
popupPanel.setWidget(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAutoHidePartner(IsWidget autoHidePartner) {
|
||||
popupPanel.addAutoHidePartner(autoHidePartner.asWidget().getElement());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setHeading(String heading) {
|
||||
headingUi.setInnerText(heading);
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"
|
||||
xmlns:s="urn:import:com.sap.sailing.gwt.home.client.shared">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
|
||||
<ui:with field="res" type="com.sap.sse.gwt.common.CommonSharedResources" />
|
||||
<ui:with field="local_res" type="com.sap.sse.security.ui.authentication.UserManagementResources" />
|
||||
<g:HTMLPanel addStyleNames="{local_res.css.flyover_content_wrapper}">
|
||||
<div class="{local_res.css.flyover_content}">
|
||||
<div class="{local_res.css.form_title}" ui:field="headingUi"></div>
|
||||
<g:SimplePanel ui:field="contentContainerUi"/>
|
||||
</div>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+12
-6
@@ -7,24 +7,30 @@ import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.IsWidget;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.common.client.SharedResources;
|
||||
import com.sap.sailing.gwt.home.mobile.partials.section.MobileSection;
|
||||
import com.sap.sailing.gwt.home.mobile.partials.sectionHeader.SectionHeaderContent;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementResources;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementResources.LocalCss;
|
||||
import com.sap.sse.gwt.common.CommonSharedResources;
|
||||
import com.sap.sse.security.ui.authentication.UserManagementResources;
|
||||
import com.sap.sse.security.ui.authentication.UserManagementResources.LocalCss;
|
||||
import com.sap.sse.security.ui.authentication.view.AuthenticationView;
|
||||
|
||||
public class UserManagementViewMobile extends Composite implements UserManagementView {
|
||||
public class AuthenticationViewMobile extends Composite implements AuthenticationView {
|
||||
|
||||
private static final LocalCss LOCAL_CSS = UserManagementResources.INSTANCE.css();
|
||||
|
||||
interface UserManagementViewUiBinder extends UiBinder<MobileSection, UserManagementViewMobile> {
|
||||
interface AuthenticationViewUiBinder extends UiBinder<MobileSection, AuthenticationViewMobile> {
|
||||
}
|
||||
|
||||
private static UserManagementViewUiBinder uiBinder = GWT.create(UserManagementViewUiBinder.class);
|
||||
private static AuthenticationViewUiBinder uiBinder = GWT.create(AuthenticationViewUiBinder.class);
|
||||
|
||||
@UiField SectionHeaderContent sectionHeaderUi;
|
||||
private final MobileSection contentContainerUi;
|
||||
|
||||
@UiField(provided = true)
|
||||
CommonSharedResources res = SharedResources.INSTANCE;
|
||||
|
||||
public UserManagementViewMobile() {
|
||||
public AuthenticationViewMobile() {
|
||||
LOCAL_CSS.ensureInjected();
|
||||
super.initWidget(contentContainerUi = uiBinder.createAndBindUi(this));
|
||||
}
|
||||
+2
-2
@@ -2,8 +2,8 @@
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"
|
||||
xmlns:mp="urn:import:com.sap.sailing.gwt.home.mobile.partials" xmlns:s="urn:import:com.sap.sailing.gwt.home.client.shared">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
|
||||
<ui:with field="res" type="com.sap.sailing.gwt.common.client.SharedResources" />
|
||||
<ui:with field="local_res" type="com.sap.sailing.gwt.home.shared.usermanagement.UserManagementResources" />
|
||||
<ui:with field="res" type="com.sap.sse.gwt.common.CommonSharedResources" />
|
||||
<ui:with field="local_res" type="com.sap.sse.security.ui.authentication.UserManagementResources" />
|
||||
<mp:section.MobileSection borderTop="false">
|
||||
<mp:header>
|
||||
<mp:sectionHeader.SectionHeaderContent ui:field="sectionHeaderUi" />
|
||||
-15
@@ -1,15 +0,0 @@
|
||||
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"
|
||||
xmlns:s="urn:import:com.sap.sailing.gwt.home.client.shared">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
|
||||
<ui:with field="res" type="com.sap.sailing.gwt.common.client.SharedResources" />
|
||||
<ui:with field="local_res" type="com.sap.sailing.gwt.home.shared.usermanagement.UserManagementResources" />
|
||||
<g:HTMLPanel addStyleNames="{res.mediaCss.grid}">
|
||||
<div class="{res.mediaCss.column} {res.mediaCss.small12}">
|
||||
<div class="{local_res.css.flyover_content}">
|
||||
<div class="{local_res.css.form_title}" ui:field="headingUi"></div>
|
||||
<g:SimplePanel ui:field="contentContainerUi"/>
|
||||
</div>
|
||||
</div>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+1
@@ -6,6 +6,7 @@
|
||||
|
||||
<!-- Other module inherits -->
|
||||
|
||||
<inherits name="com.sap.sse.gwt.CommonSharedResources" />
|
||||
<inherits name="com.sap.sse.gwt.SSESharedGWT" />
|
||||
<inherits name="com.sap.sse.SSECommon" />
|
||||
<inherits name="com.sap.sailing.domain.SailingDomain" />
|
||||
|
||||
+2
-7
@@ -2,8 +2,7 @@ package com.sap.sailing.gwt.ui.client;
|
||||
|
||||
import com.sap.sse.gwt.client.mvp.ClientFactory;
|
||||
import com.sap.sse.gwt.client.mvp.ErrorView;
|
||||
import com.sap.sse.security.ui.client.UserManagementServiceAsync;
|
||||
import com.sap.sse.security.ui.client.UserService;
|
||||
import com.sap.sse.security.ui.client.WithSecurity;
|
||||
|
||||
/**
|
||||
* A client factory that can deliver the sailing-specific services.
|
||||
@@ -11,14 +10,10 @@ import com.sap.sse.security.ui.client.UserService;
|
||||
* @author Axel Uhl (D043530)
|
||||
*
|
||||
*/
|
||||
public interface SailingClientFactory extends ClientFactory {
|
||||
public interface SailingClientFactory extends ClientFactory, WithSecurity {
|
||||
SailingServiceAsync getSailingService();
|
||||
|
||||
MediaServiceAsync getMediaService();
|
||||
|
||||
UserManagementServiceAsync getUserManagementService();
|
||||
|
||||
UserService getUserService();
|
||||
|
||||
ErrorView createErrorView(String errorMessage, Throwable errorReason);
|
||||
}
|
||||
+6
-1
@@ -25,7 +25,9 @@ import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
|
||||
import com.sap.sailing.domain.common.media.MediaTrack;
|
||||
import com.sap.sailing.domain.common.media.MediaTrack.Status;
|
||||
import com.sap.sailing.domain.common.security.Permission;
|
||||
import com.sap.sailing.domain.common.security.Roles;
|
||||
import com.sap.sailing.domain.common.security.SailingPermissionsForRoleProvider;
|
||||
import com.sap.sailing.gwt.ui.client.MediaServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
@@ -664,7 +666,10 @@ public class MediaPlayerManagerComponent implements Component<AbstractSettings>,
|
||||
|
||||
@Override
|
||||
public boolean allowsEditing() {
|
||||
return userService.getCurrentUser() != null;
|
||||
UserDTO currentUser = userService.getCurrentUser();
|
||||
return currentUser != null
|
||||
&& currentUser.hasPermission(Permission.MANAGE_MEDIA.getStringPermission(),
|
||||
SailingPermissionsForRoleProvider.INSTANCE);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+5
-4
@@ -70,6 +70,7 @@ public class SideBySideComponentViewer implements ComponentViewer, UserStatusEve
|
||||
private final Button mediaSelectionButton;
|
||||
private final Button mediaManagementButton;
|
||||
private final EditMarkPassingsPanel markPassingsPanel;
|
||||
private final MediaPlayerManagerComponent mediaPlayerManagerComponent;
|
||||
|
||||
private LayoutPanel mainPanel;
|
||||
|
||||
@@ -80,6 +81,7 @@ public class SideBySideComponentViewer implements ComponentViewer, UserStatusEve
|
||||
public SideBySideComponentViewer(final LeaderboardPanel leftComponentP, final Component<?> rightComponentP,
|
||||
final MediaPlayerManagerComponent mediaPlayerManagerComponent, List<Component<?>> components,
|
||||
final StringMessages stringMessages, UserService userService, EditMarkPassingsPanel markPassingsPanel) {
|
||||
this.mediaPlayerManagerComponent = mediaPlayerManagerComponent;
|
||||
this.stringMessages = stringMessages;
|
||||
this.leftComponent = leftComponentP;
|
||||
this.rightComponent = rightComponentP;
|
||||
@@ -162,10 +164,8 @@ public class SideBySideComponentViewer implements ComponentViewer, UserStatusEve
|
||||
List<Pair<Button, String>> additionalVerticalButtons = new ArrayList<Pair<Button, String>>();
|
||||
additionalVerticalButtons.add(new Pair<Button, String>(mediaSelectionButton,
|
||||
mediaPlayerManagerComponent.getDependentCssClassName()));
|
||||
if (/* TODO check for correct role; was: user != null */ true) {
|
||||
additionalVerticalButtons.add(new Pair<Button, String>(mediaManagementButton,
|
||||
"managemedia"));
|
||||
}
|
||||
additionalVerticalButtons.add(new Pair<Button, String>(mediaManagementButton,
|
||||
"managemedia"));
|
||||
onUserStatusChange(userService.getCurrentUser());
|
||||
// ensure that toggle buttons are positioned right
|
||||
splitLayoutPanel.lastComponentHasBeenAdded(this, panelForMapAndHorizontalToggleButtons,
|
||||
@@ -311,6 +311,7 @@ public class SideBySideComponentViewer implements ComponentViewer, UserStatusEve
|
||||
forceLayout();
|
||||
}
|
||||
}
|
||||
mediaManagementButton.setVisible(mediaPlayerManagerComponent.allowsEditing());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+11
@@ -4,6 +4,17 @@
|
||||
<div id="mainContent">
|
||||
<h4 class="articleHeadline">What's New - SAP Sailing Analytics</h4>
|
||||
<div class="innerContent">
|
||||
<h5 class="articleSubheadline">February 2016</h5>
|
||||
|
||||
<ul class="bulletList">
|
||||
<!--
|
||||
<li>The website now features a user registration and authentication interface.
|
||||
Creating an account will provide user specific features (e.g. preferences).
|
||||
New user specific features will be available in the next couple of months.
|
||||
</li>
|
||||
-->
|
||||
</ul>
|
||||
|
||||
<h5 class="articleSubheadline">December 2015</h5>
|
||||
|
||||
<ul class="bulletList">
|
||||
|
||||
@@ -37,6 +37,7 @@ Export-Package: com.google.gwt.user.client.rpc.core.java.util,
|
||||
com.sap.sse.gwt.client.player,
|
||||
com.sap.sse.gwt.client.shared.components,
|
||||
com.sap.sse.gwt.client.useragent,
|
||||
com.sap.sse.gwt.common,
|
||||
com.sap.sse.gwt.dispatch.client,
|
||||
com.sap.sse.gwt.dispatch.client.system,
|
||||
com.sap.sse.gwt.dispatch.client.system.batching,
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.7.0//EN" "http://gwtproject.org/doctype/2.7.0/gwt-module.dtd">
|
||||
<module>
|
||||
<inherits name='com.google.gwt.user.User' />
|
||||
|
||||
<source path='common'/>
|
||||
</module>
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.sap.sse.gwt.common;
|
||||
|
||||
|
||||
public interface CommonSharedResources {
|
||||
|
||||
CommonMainCss mainCss();
|
||||
|
||||
CommonMediaCss mediaCss();
|
||||
|
||||
public interface CommonMainCss {
|
||||
String button();
|
||||
String buttonprimary();
|
||||
String buttonprimaryoutlined();
|
||||
String buttonarrowrightwhite();
|
||||
|
||||
String mainsection();
|
||||
String mainsection_header();
|
||||
String mainsection_header_title();
|
||||
}
|
||||
|
||||
public interface CommonMediaCss {
|
||||
}
|
||||
|
||||
}
|
||||
+4
-2
@@ -100,7 +100,8 @@ public class SecurityReplicationLeadingToEmailReplicationTest extends AbstractSe
|
||||
final String password = "BertMyFriend";
|
||||
final String validationBaseURL = null; //so that validation email is not sent
|
||||
|
||||
masterSecurityService.createSimpleUser(username, email, password, validationBaseURL);
|
||||
masterSecurityService.createSimpleUser(username, email, password,
|
||||
/* fullName */ null, /* company */ null, validationBaseURL);
|
||||
|
||||
masterSecurityService.sendMail(username, "subject", "body");
|
||||
|
||||
@@ -130,7 +131,8 @@ public class SecurityReplicationLeadingToEmailReplicationTest extends AbstractSe
|
||||
final String password = "BertMyFriend";
|
||||
final String validationBaseURL = null; //so that validation email is not sent
|
||||
|
||||
replicaSecurityService.createSimpleUser(username, email, password, validationBaseURL);
|
||||
replicaSecurityService.createSimpleUser(username, email, password,
|
||||
/* fullName */ null, /* company */ null, validationBaseURL);
|
||||
|
||||
replicaSecurityService.sendMail(username, "subject", "body");
|
||||
|
||||
|
||||
+119
-113
@@ -1,113 +1,119 @@
|
||||
package com.sap.sse.security.replication.test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertSame;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.common.mail.MailException;
|
||||
import com.sap.sse.security.User;
|
||||
import com.sap.sse.security.shared.UserManagementException;
|
||||
|
||||
public class SimpleSecurityReplicationTest extends AbstractSecurityReplicationTest {
|
||||
@Test
|
||||
public void testSimpleReplicationOfUserCreation() throws InterruptedException, UserManagementException, MailException, IllegalAccessException {
|
||||
final String username = "Ernie";
|
||||
final String email = "ernie@sesame-street.com";
|
||||
final String password = "BertMyFriend";
|
||||
final String validationBaseURL = "http://me.to.back.com";
|
||||
assertNull(master.getUserByName(username));
|
||||
User user = master.createSimpleUser(username, email, password, validationBaseURL);
|
||||
assertNotNull(user);
|
||||
assertSame(user, master.getUserByName(username));
|
||||
assertTrue(master.checkPassword(username, password));
|
||||
final String emailValidationSecret = user.getValidationSecret();
|
||||
|
||||
replicaReplicator.waitUntilQueueIsEmpty();
|
||||
Thread.sleep(3000);
|
||||
|
||||
User replicatedErnie = replica.getUserByName(username);
|
||||
assertNotNull(replicatedErnie);
|
||||
assertEquals(username, replicatedErnie.getName());
|
||||
assertEquals(email, replicatedErnie.getEmail());
|
||||
assertTrue(replica.checkPassword(username, password));
|
||||
assertEquals(emailValidationSecret, replicatedErnie.getValidationSecret());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleReplicationOfUserEmailChange() throws InterruptedException, UserManagementException, MailException, IllegalAccessException {
|
||||
final String username = "Ernie";
|
||||
final String email = "ernie@sesame-street.com";
|
||||
final String newEmail = "ernie2@sesame-street.com";
|
||||
final String password = "BertMyFriend";
|
||||
final String validationBaseURL = "http://me.to.back.com";
|
||||
final String fullName = "Ernie's Full Name";
|
||||
final String company = "Ernie's Company";
|
||||
User user = master.createSimpleUser(username, email, password, validationBaseURL);
|
||||
user.setFullName(fullName);
|
||||
user.setCompany(company);
|
||||
final String emailValidationSecretAfterCreation = user.getValidationSecret();
|
||||
master.updateSimpleUserEmail(username, newEmail, validationBaseURL);
|
||||
final String emailValidationSecretAfterChangingEmail = user.getValidationSecret();
|
||||
assertFalse(emailValidationSecretAfterChangingEmail.equals(emailValidationSecretAfterCreation));
|
||||
assertEquals(newEmail, user.getEmail());
|
||||
|
||||
replicaReplicator.waitUntilQueueIsEmpty();
|
||||
Thread.sleep(3000);
|
||||
|
||||
User replicatedErnie = replica.getUserByName(username);
|
||||
assertNotNull(replicatedErnie);
|
||||
assertEquals(username, replicatedErnie.getName());
|
||||
assertEquals(newEmail, replicatedErnie.getEmail());
|
||||
assertEquals(emailValidationSecretAfterChangingEmail, replicatedErnie.getValidationSecret());
|
||||
assertEquals(fullName, replicatedErnie.getFullName());
|
||||
assertEquals(company, replicatedErnie.getCompany());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleReplicationOfUserPasswordChange() throws InterruptedException, UserManagementException, MailException, IllegalAccessException {
|
||||
final String username = "Ernie";
|
||||
final String email = "ernie@sesame-street.com";
|
||||
final String password = "BertMyFriend";
|
||||
final String newPassword = "ErnieAndBert";
|
||||
final String validationBaseURL = "http://me.to.back.com";
|
||||
master.createSimpleUser(username, email, password, validationBaseURL);
|
||||
master.updateSimpleUserPassword(username, newPassword);
|
||||
assertTrue(master.checkPassword(username, newPassword));
|
||||
|
||||
replicaReplicator.waitUntilQueueIsEmpty();
|
||||
Thread.sleep(3000);
|
||||
|
||||
User replicatedErnie = replica.getUserByName(username);
|
||||
assertNotNull(replicatedErnie);
|
||||
assertEquals(username, replicatedErnie.getName());
|
||||
assertFalse(replica.checkPassword(username, password));
|
||||
assertTrue(replica.checkPassword(username, newPassword));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReplicationOfPasswordReset() throws InterruptedException, UserManagementException, MailException, IllegalAccessException {
|
||||
final String username = "Ernie";
|
||||
final String email = "ernie@sesame-street.com";
|
||||
final String password = "BertMyFriend";
|
||||
final String validationBaseURL = "http://me.to.back.com/validateemail";
|
||||
final String passwordResetBaseURL = "http://me.to.back.com/passwordreset";
|
||||
User user = master.createSimpleUser(username, email, password, validationBaseURL);
|
||||
master.validateEmail(username, user.getValidationSecret());
|
||||
assertTrue(user.isEmailValidated());
|
||||
master.resetPassword(username, passwordResetBaseURL);
|
||||
String passwordResetSecret = user.getPasswordResetSecret();
|
||||
|
||||
replicaReplicator.waitUntilQueueIsEmpty();
|
||||
Thread.sleep(3000);
|
||||
|
||||
User replicatedErnie = replica.getUserByName(username);
|
||||
assertNotNull(replicatedErnie);
|
||||
assertTrue(replicatedErnie.isEmailValidated());
|
||||
assertEquals(passwordResetSecret, replicatedErnie.getPasswordResetSecret());
|
||||
}
|
||||
}
|
||||
package com.sap.sse.security.replication.test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertSame;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sse.common.mail.MailException;
|
||||
import com.sap.sse.security.User;
|
||||
import com.sap.sse.security.shared.UserManagementException;
|
||||
|
||||
public class SimpleSecurityReplicationTest extends AbstractSecurityReplicationTest {
|
||||
@Test
|
||||
public void testSimpleReplicationOfUserCreation() throws InterruptedException, UserManagementException, MailException, IllegalAccessException {
|
||||
final String username = "Ernie";
|
||||
final String email = "ernie@sesame-street.com";
|
||||
final String password = "BertMyFriend";
|
||||
final String fullName = "Ernie's Full Name";
|
||||
final String company = "Ernie's Company";
|
||||
final String validationBaseURL = "http://me.to.back.com";
|
||||
assertNull(master.getUserByName(username));
|
||||
User user = master.createSimpleUser(username, email, password, fullName, company, validationBaseURL);
|
||||
assertNotNull(user);
|
||||
assertSame(user, master.getUserByName(username));
|
||||
assertTrue(master.checkPassword(username, password));
|
||||
final String emailValidationSecret = user.getValidationSecret();
|
||||
|
||||
replicaReplicator.waitUntilQueueIsEmpty();
|
||||
Thread.sleep(3000);
|
||||
|
||||
User replicatedErnie = replica.getUserByName(username);
|
||||
assertNotNull(replicatedErnie);
|
||||
assertEquals(username, replicatedErnie.getName());
|
||||
assertEquals(email, replicatedErnie.getEmail());
|
||||
assertTrue(replica.checkPassword(username, password));
|
||||
assertEquals(emailValidationSecret, replicatedErnie.getValidationSecret());
|
||||
assertEquals(fullName, replicatedErnie.getFullName());
|
||||
assertEquals(company, replicatedErnie.getCompany());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleReplicationOfUserEmailChange() throws InterruptedException, UserManagementException, MailException, IllegalAccessException {
|
||||
final String username = "Ernie";
|
||||
final String email = "ernie@sesame-street.com";
|
||||
final String newEmail = "ernie2@sesame-street.com";
|
||||
final String password = "BertMyFriend";
|
||||
final String validationBaseURL = "http://me.to.back.com";
|
||||
final String fullName = "Ernie's Full Name";
|
||||
final String company = "Ernie's Company";
|
||||
User user = master.createSimpleUser(username, email, password, fullName, company, validationBaseURL);
|
||||
user.setFullName(fullName);
|
||||
user.setCompany(company);
|
||||
final String emailValidationSecretAfterCreation = user.getValidationSecret();
|
||||
master.updateSimpleUserEmail(username, newEmail, validationBaseURL);
|
||||
final String emailValidationSecretAfterChangingEmail = user.getValidationSecret();
|
||||
assertFalse(emailValidationSecretAfterChangingEmail.equals(emailValidationSecretAfterCreation));
|
||||
assertEquals(newEmail, user.getEmail());
|
||||
|
||||
replicaReplicator.waitUntilQueueIsEmpty();
|
||||
Thread.sleep(3000);
|
||||
|
||||
User replicatedErnie = replica.getUserByName(username);
|
||||
assertNotNull(replicatedErnie);
|
||||
assertEquals(username, replicatedErnie.getName());
|
||||
assertEquals(newEmail, replicatedErnie.getEmail());
|
||||
assertEquals(emailValidationSecretAfterChangingEmail, replicatedErnie.getValidationSecret());
|
||||
assertEquals(fullName, replicatedErnie.getFullName());
|
||||
assertEquals(company, replicatedErnie.getCompany());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleReplicationOfUserPasswordChange() throws InterruptedException, UserManagementException, MailException, IllegalAccessException {
|
||||
final String username = "Ernie";
|
||||
final String email = "ernie@sesame-street.com";
|
||||
final String password = "BertMyFriend";
|
||||
final String newPassword = "ErnieAndBert";
|
||||
final String validationBaseURL = "http://me.to.back.com";
|
||||
master.createSimpleUser(username, email, password,
|
||||
/* fullName */ null, /* company */ null, validationBaseURL);
|
||||
master.updateSimpleUserPassword(username, newPassword);
|
||||
assertTrue(master.checkPassword(username, newPassword));
|
||||
|
||||
replicaReplicator.waitUntilQueueIsEmpty();
|
||||
Thread.sleep(3000);
|
||||
|
||||
User replicatedErnie = replica.getUserByName(username);
|
||||
assertNotNull(replicatedErnie);
|
||||
assertEquals(username, replicatedErnie.getName());
|
||||
assertFalse(replica.checkPassword(username, password));
|
||||
assertTrue(replica.checkPassword(username, newPassword));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReplicationOfPasswordReset() throws InterruptedException, UserManagementException, MailException, IllegalAccessException {
|
||||
final String username = "Ernie";
|
||||
final String email = "ernie@sesame-street.com";
|
||||
final String password = "BertMyFriend";
|
||||
final String validationBaseURL = "http://me.to.back.com/validateemail";
|
||||
final String passwordResetBaseURL = "http://me.to.back.com/passwordreset";
|
||||
User user = master.createSimpleUser(username, email, password,
|
||||
/* fullName */ null, /* company */ null, validationBaseURL);
|
||||
master.validateEmail(username, user.getValidationSecret());
|
||||
assertTrue(user.isEmailValidated());
|
||||
master.resetPassword(username, passwordResetBaseURL);
|
||||
String passwordResetSecret = user.getPasswordResetSecret();
|
||||
|
||||
replicaReplicator.waitUntilQueueIsEmpty();
|
||||
Thread.sleep(3000);
|
||||
|
||||
User replicatedErnie = replica.getUserByName(username);
|
||||
assertNotNull(replicatedErnie);
|
||||
assertTrue(replicatedErnie.isEmailValidated());
|
||||
assertEquals(passwordResetSecret, replicatedErnie.getPasswordResetSecret());
|
||||
}
|
||||
}
|
||||
@@ -24,7 +24,16 @@ Require-Bundle: javax.servlet;bundle-version="2.5.0",
|
||||
com.sap.sse.security.common,
|
||||
com.sap.sse.mail
|
||||
Web-ContextPath: /security/ui
|
||||
Export-Package: com.sap.sse.security.ui.client,
|
||||
Export-Package: com.sap.sse.security.shared,
|
||||
com.sap.sse.security.ui.authentication,
|
||||
com.sap.sse.security.ui.authentication.app,
|
||||
com.sap.sse.security.ui.authentication.confirm,
|
||||
com.sap.sse.security.ui.authentication.create,
|
||||
com.sap.sse.security.ui.authentication.info,
|
||||
com.sap.sse.security.ui.authentication.recover,
|
||||
com.sap.sse.security.ui.authentication.signin,
|
||||
com.sap.sse.security.ui.authentication.view,
|
||||
com.sap.sse.security.ui.client,
|
||||
com.sap.sse.security.ui.client.component,
|
||||
com.sap.sse.security.ui.client.i18n,
|
||||
com.sap.sse.security.ui.loginpanel,
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
import com.google.gwt.place.shared.Place;
|
||||
|
||||
public abstract class AbstractAuthenticationPlace extends Place {
|
||||
|
||||
public abstract String getHeaderText();
|
||||
|
||||
}
|
||||
+5
-12
@@ -1,33 +1,26 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement;
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
import com.google.gwt.event.shared.EventBus;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementService;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementPlaceManagementController.SignInSuccessfulEvent;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
import com.sap.sse.security.ui.shared.SuccessInfo;
|
||||
|
||||
public class AsyncLoginCallback implements AsyncCallback<SuccessInfo> {
|
||||
|
||||
private final ClientFactoryWithUserManagementService clientFactory;
|
||||
private final ErrorMessageView view;
|
||||
private final EventBus eventBus;
|
||||
private final AuthenticationCallback callback;
|
||||
private final boolean fireSignInSuccessfulEvent;
|
||||
|
||||
public AsyncLoginCallback(ClientFactoryWithUserManagementService clientFactory, ErrorMessageView view,
|
||||
EventBus eventBus, boolean fireSignInSuccessfulEvent) {
|
||||
this.clientFactory = clientFactory;
|
||||
public AsyncLoginCallback(ErrorMessageView view, AuthenticationCallback callback, boolean fireSignInSuccessfulEvent) {
|
||||
this.view = view;
|
||||
this.eventBus = eventBus;
|
||||
this.callback = callback;
|
||||
this.fireSignInSuccessfulEvent = fireSignInSuccessfulEvent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(SuccessInfo result) {
|
||||
if (result.isSuccessful()) {
|
||||
clientFactory.didLogin(result.getUserDTO());
|
||||
if (fireSignInSuccessfulEvent) {
|
||||
eventBus.fireEvent(new SignInSuccessfulEvent());
|
||||
callback.handleSignInSuccess();
|
||||
}
|
||||
} else {
|
||||
if (SuccessInfo.FAILED_TO_LOGIN.equals(result.getMessage())) {
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
|
||||
public interface AuthenticationCallback {
|
||||
|
||||
void handleSignInSuccess();
|
||||
|
||||
void handleUserProfileNavigation();
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
import com.sap.sse.security.ui.authentication.confirm.ConfirmationInfoView;
|
||||
import com.sap.sse.security.ui.authentication.create.CreateAccountView;
|
||||
import com.sap.sse.security.ui.authentication.info.LoggedInUserInfoView;
|
||||
import com.sap.sse.security.ui.authentication.recover.PasswordRecoveryView;
|
||||
import com.sap.sse.security.ui.authentication.signin.SignInView;
|
||||
|
||||
public interface AuthenticationClientFactory extends WithAuthenticationManager {
|
||||
|
||||
SignInView createSignInView();
|
||||
|
||||
CreateAccountView createCreateAccountView();
|
||||
|
||||
PasswordRecoveryView createPasswordRecoveryView();
|
||||
|
||||
LoggedInUserInfoView createLoggedInUserInfoView();
|
||||
|
||||
ConfirmationInfoView createConfirmationInfoView();
|
||||
|
||||
}
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
import com.sap.sse.gwt.common.CommonSharedResources;
|
||||
import com.sap.sse.security.ui.authentication.confirm.ConfirmationInfoView;
|
||||
import com.sap.sse.security.ui.authentication.confirm.ConfirmationInfoViewImpl;
|
||||
import com.sap.sse.security.ui.authentication.create.CreateAccountView;
|
||||
import com.sap.sse.security.ui.authentication.create.CreateAccountViewImpl;
|
||||
import com.sap.sse.security.ui.authentication.info.LoggedInUserInfoView;
|
||||
import com.sap.sse.security.ui.authentication.info.LoggedInUserInfoViewImpl;
|
||||
import com.sap.sse.security.ui.authentication.recover.PasswordRecoveryView;
|
||||
import com.sap.sse.security.ui.authentication.recover.PasswordRecoveryViewImpl;
|
||||
import com.sap.sse.security.ui.authentication.signin.SignInView;
|
||||
import com.sap.sse.security.ui.authentication.signin.SignInViewImpl;
|
||||
|
||||
public class AuthenticationClientFactoryImpl implements AuthenticationClientFactory {
|
||||
|
||||
private final AuthenticationManager authenticationManager;
|
||||
private final CommonSharedResources resources;
|
||||
|
||||
public AuthenticationClientFactoryImpl(AuthenticationManager authenticationManager,
|
||||
CommonSharedResources resources) {
|
||||
this.authenticationManager = authenticationManager;
|
||||
this.resources = resources;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SignInView createSignInView() {
|
||||
return new SignInViewImpl(resources);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CreateAccountView createCreateAccountView() {
|
||||
return new CreateAccountViewImpl(resources);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PasswordRecoveryView createPasswordRecoveryView() {
|
||||
return new PasswordRecoveryViewImpl(resources);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LoggedInUserInfoView createLoggedInUserInfoView() {
|
||||
return new LoggedInUserInfoViewImpl(resources);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConfirmationInfoView createConfirmationInfoView() {
|
||||
return new ConfirmationInfoViewImpl(resources);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AuthenticationManager getAuthenticationManager() {
|
||||
return authenticationManager;
|
||||
}
|
||||
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
import com.google.gwt.event.shared.EventHandler;
|
||||
import com.google.gwt.event.shared.GwtEvent;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
|
||||
public class AuthenticationContextEvent extends GwtEvent<AuthenticationContextEvent.Handler> {
|
||||
public static final Type<Handler> TYPE = new Type<AuthenticationContextEvent.Handler>();
|
||||
|
||||
private final AuthenticationContext ctx;
|
||||
|
||||
public interface Handler extends EventHandler {
|
||||
void onUserChangeEvent(AuthenticationContextEvent event);
|
||||
}
|
||||
|
||||
public AuthenticationContextEvent(AuthenticationContext ctx) {
|
||||
this.ctx = ctx;
|
||||
}
|
||||
|
||||
public AuthenticationContext getCtx() {
|
||||
return ctx;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type<Handler> getAssociatedType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dispatch(Handler handler) {
|
||||
handler.onUserChangeEvent(this);
|
||||
}
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
import com.sap.sse.security.ui.shared.SuccessInfo;
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
public interface AuthenticationManager {
|
||||
|
||||
void createAccount(String name, String email, String password, String fullName,
|
||||
String company, AsyncCallback<UserDTO> callback);
|
||||
|
||||
void reqeustPasswordReset(String username, String eMailAddress, AsyncCallback<Void> callback);
|
||||
|
||||
void login(String username, String password, AsyncCallback<SuccessInfo> callback);
|
||||
|
||||
void logout();
|
||||
|
||||
void refreshUserInfo();
|
||||
|
||||
AuthenticationContext getAuthenticationContext();
|
||||
}
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.web.bindery.event.shared.EventBus;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContext;
|
||||
import com.sap.sse.security.ui.authentication.app.AuthenticationContextImpl;
|
||||
import com.sap.sse.security.ui.client.UserStatusEventHandler;
|
||||
import com.sap.sse.security.ui.client.WithSecurity;
|
||||
import com.sap.sse.security.ui.shared.SuccessInfo;
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
public class AuthenticationManagerImpl implements AuthenticationManager {
|
||||
|
||||
private final WithSecurity clientFactory;
|
||||
private final EventBus eventBus;
|
||||
private final String emailConfirmationUrl;
|
||||
private final String passwordResetUrl;
|
||||
|
||||
public AuthenticationManagerImpl(WithSecurity clientFactory, final EventBus eventBus,
|
||||
String emailConfirmationUrl, String passwordResetUrl) {
|
||||
this.clientFactory = clientFactory;
|
||||
this.eventBus = eventBus;
|
||||
this.emailConfirmationUrl = emailConfirmationUrl;
|
||||
this.passwordResetUrl = passwordResetUrl;
|
||||
clientFactory.getUserService().addUserStatusEventHandler(new UserStatusEventHandler() {
|
||||
@Override
|
||||
public void onUserStatusChange(UserDTO user) {
|
||||
eventBus.fireEvent(new AuthenticationContextEvent(new AuthenticationContextImpl(user)));
|
||||
}
|
||||
});
|
||||
eventBus.addHandler(AuthenticationRequestEvent.TYPE, new AuthenticationRequestEvent.Handler() {
|
||||
@Override
|
||||
public void onUserManagementRequestEvent(AuthenticationRequestEvent event) {
|
||||
if (!event.isLogin()) {
|
||||
logout();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createAccount(String name, String email, String password, String fullName,
|
||||
String company, AsyncCallback<UserDTO> callback) {
|
||||
clientFactory.getUserManagementService().createSimpleUser(name, email, password,
|
||||
fullName, company, emailConfirmationUrl, callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reqeustPasswordReset(String username, String eMailAddress, AsyncCallback<Void> callback) {
|
||||
clientFactory.getUserManagementService().resetPassword(username, eMailAddress, passwordResetUrl, callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void login(String username, String password, AsyncCallback<SuccessInfo> callback) {
|
||||
clientFactory.getUserService().login(username, password, callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logout() {
|
||||
clientFactory.getUserService().logout();
|
||||
eventBus.fireEvent(new AuthenticationRequestEvent());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void refreshUserInfo() {
|
||||
clientFactory.getUserService().updateUser(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AuthenticationContext getAuthenticationContext() {
|
||||
return new AuthenticationContextImpl(clientFactory.getUserService().getCurrentUser());
|
||||
}
|
||||
}
|
||||
+97
@@ -0,0 +1,97 @@
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
import com.google.gwt.activity.shared.Activity;
|
||||
import com.google.gwt.place.shared.Place;
|
||||
import com.google.gwt.place.shared.PlaceController;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.google.web.bindery.event.shared.EventBus;
|
||||
import com.sap.sse.security.ui.authentication.confirm.ConfirmationInfoActivity;
|
||||
import com.sap.sse.security.ui.authentication.confirm.ConfirmationInfoPlace;
|
||||
import com.sap.sse.security.ui.authentication.create.CreateAccountActivity;
|
||||
import com.sap.sse.security.ui.authentication.create.CreateAccountPlace;
|
||||
import com.sap.sse.security.ui.authentication.info.LoggedInUserInfoActivity;
|
||||
import com.sap.sse.security.ui.authentication.info.LoggedInUserInfoPlace;
|
||||
import com.sap.sse.security.ui.authentication.recover.PasswordRecoveryActivity;
|
||||
import com.sap.sse.security.ui.authentication.recover.PasswordRecoveryPlace;
|
||||
import com.sap.sse.security.ui.authentication.signin.SignInActivity;
|
||||
import com.sap.sse.security.ui.authentication.signin.SignInPlace;
|
||||
import com.sap.sse.security.ui.authentication.view.AuthenticationView;
|
||||
|
||||
public class AuthenticationPlaceManagementController extends WrappedPlaceManagementController {
|
||||
|
||||
public AuthenticationPlaceManagementController(AuthenticationClientFactory clientFactory,
|
||||
AuthenticationCallback callback, AuthenticationView userManagementView, EventBus globalEventBus) {
|
||||
super(new Configuration(clientFactory, callback, userManagementView));
|
||||
globalEventBus.addHandler(AuthenticationContextEvent.TYPE, new AuthenticationContextEvent.Handler() {
|
||||
@Override
|
||||
public void onUserChangeEvent(AuthenticationContextEvent event) {
|
||||
AuthenticationPlaceManagementController.this.fireEvent(event);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static class Configuration implements PlaceManagementConfiguration {
|
||||
private final AuthenticationClientFactory clientFactory;
|
||||
private final AuthenticationCallback callback;
|
||||
private final AuthenticationView userManagementView;
|
||||
private PlaceController placeController;
|
||||
|
||||
public Configuration(AuthenticationClientFactory clientFactory, AuthenticationCallback callback,
|
||||
AuthenticationView userManagementView) {
|
||||
this.clientFactory = clientFactory;
|
||||
this.callback = callback;
|
||||
this.userManagementView = userManagementView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPlaceController(PlaceController placeController) {
|
||||
this.placeController = placeController;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AcceptsOneWidget getDisplay() {
|
||||
return userManagementView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Place getStartPlace() {
|
||||
return isLoggedIn() ? new LoggedInUserInfoPlace() : new SignInPlace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Activity getActivity(Place requestedPlace) {
|
||||
final Place placeToUse = getPlaceToUse(requestedPlace);
|
||||
this.updateViewHeading(placeToUse);
|
||||
|
||||
if (placeToUse instanceof SignInPlace) {
|
||||
return new SignInActivity(clientFactory, callback, placeController);
|
||||
} else if (placeToUse instanceof CreateAccountPlace) {
|
||||
return new CreateAccountActivity(clientFactory, callback, placeController);
|
||||
} else if (placeToUse instanceof PasswordRecoveryPlace) {
|
||||
return new PasswordRecoveryActivity(clientFactory, placeController);
|
||||
} else if (placeToUse instanceof LoggedInUserInfoPlace) {
|
||||
return new LoggedInUserInfoActivity(clientFactory, callback, placeController);
|
||||
} else if (placeToUse instanceof ConfirmationInfoPlace) {
|
||||
return new ConfirmationInfoActivity(clientFactory, (ConfirmationInfoPlace) placeToUse);
|
||||
}
|
||||
|
||||
return getActivity(new SignInPlace());
|
||||
}
|
||||
|
||||
private boolean isLoggedIn() {
|
||||
return clientFactory.getAuthenticationManager().getAuthenticationContext().isLoggedIn();
|
||||
}
|
||||
|
||||
private Place getPlaceToUse(Place requestedPlace) {
|
||||
boolean requiresLogin = requestedPlace instanceof RequiresLoggedInUser;
|
||||
return requiresLogin && !isLoggedIn() ? getStartPlace() : requestedPlace;
|
||||
}
|
||||
|
||||
private void updateViewHeading(Place placeToUse) {
|
||||
userManagementView.setHeading(placeToUse instanceof AbstractAuthenticationPlace
|
||||
? ((AbstractAuthenticationPlace) placeToUse).getHeaderText() : "");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+6
-6
@@ -1,22 +1,22 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement;
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
import com.google.gwt.event.shared.EventHandler;
|
||||
import com.google.gwt.event.shared.GwtEvent;
|
||||
|
||||
public class UserManagementRequestEvent extends GwtEvent<UserManagementRequestEvent.Handler> {
|
||||
public static final Type<Handler> TYPE = new Type<UserManagementRequestEvent.Handler>();
|
||||
public class AuthenticationRequestEvent extends GwtEvent<AuthenticationRequestEvent.Handler> {
|
||||
public static final Type<Handler> TYPE = new Type<AuthenticationRequestEvent.Handler>();
|
||||
|
||||
public interface Handler extends EventHandler {
|
||||
void onUserManagementRequestEvent(UserManagementRequestEvent event);
|
||||
void onUserManagementRequestEvent(AuthenticationRequestEvent event);
|
||||
}
|
||||
|
||||
private final boolean login;
|
||||
|
||||
public UserManagementRequestEvent() {
|
||||
public AuthenticationRequestEvent() {
|
||||
this(true);
|
||||
}
|
||||
|
||||
public UserManagementRequestEvent(boolean login) {
|
||||
public AuthenticationRequestEvent(boolean login) {
|
||||
super();
|
||||
this.login = login;
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement;
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
public interface ErrorMessageView {
|
||||
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
public interface RequiresLoggedInUser {
|
||||
}
|
||||
+3
-1
@@ -1,6 +1,8 @@
|
||||
.flyover {
|
||||
font-size: 1rem;
|
||||
|
||||
}
|
||||
.flyover_content_wrapper {
|
||||
padding: 0 1rem;
|
||||
}
|
||||
.flyover_content {
|
||||
width: 24.8em;
|
||||
+2
-1
@@ -1,4 +1,4 @@
|
||||
package com.sap.sailing.gwt.home.shared.usermanagement;
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.resources.client.ClientBundle;
|
||||
@@ -13,6 +13,7 @@ public interface UserManagementResources extends ClientBundle {
|
||||
|
||||
public interface LocalCss extends CssResource {
|
||||
String flyover();
|
||||
String flyover_content_wrapper();
|
||||
String flyover_content();
|
||||
String form_title();
|
||||
String form_subtitle();
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
|
||||
public interface WithAuthenticationManager {
|
||||
AuthenticationManager getAuthenticationManager();
|
||||
}
|
||||
+3
-3
@@ -1,4 +1,4 @@
|
||||
package com.sap.sailing.gwt.home.shared.framework;
|
||||
package com.sap.sse.security.ui.authentication;
|
||||
|
||||
import com.google.gwt.activity.shared.ActivityManager;
|
||||
import com.google.gwt.activity.shared.ActivityMapper;
|
||||
@@ -9,8 +9,8 @@ import com.google.web.bindery.event.shared.Event.Type;
|
||||
import com.google.web.bindery.event.shared.EventBus;
|
||||
import com.google.web.bindery.event.shared.HandlerRegistration;
|
||||
import com.google.web.bindery.event.shared.SimpleEventBus;
|
||||
import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementContextEvent;
|
||||
|
||||
// TODO Refactor to com.sap.sse.gwt if needed
|
||||
public class WrappedPlaceManagementController {
|
||||
|
||||
public interface PlaceManagementConfiguration extends ActivityMapper {
|
||||
@@ -42,7 +42,7 @@ public class WrappedPlaceManagementController {
|
||||
return eventBus.addHandler(type, handler);
|
||||
}
|
||||
|
||||
public void fireEvent(UserManagementContextEvent event) {
|
||||
public void fireEvent(AuthenticationContextEvent event) {
|
||||
eventBus.fireEvent(event);
|
||||
}
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package com.sap.sse.security.ui.authentication.app;
|
||||
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
public interface AuthenticationContext {
|
||||
|
||||
boolean isLoggedIn();
|
||||
|
||||
UserDTO getCurrentUser();
|
||||
|
||||
String getUserTitle();
|
||||
|
||||
String getUserSubtitle();
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
package com.sap.sse.security.ui.authentication.app;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.sap.sse.security.ui.shared.AccountDTO;
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
public class AuthenticationContextImpl implements AuthenticationContext {
|
||||
|
||||
private final UserDTO currentUser;
|
||||
private final static UserDTO ANONYMOUS = new UserDTO("Anonymous", "", "", "", false, new ArrayList<AccountDTO>(),
|
||||
new ArrayList<String>(), new ArrayList<String>());
|
||||
|
||||
public AuthenticationContextImpl() {
|
||||
this.currentUser = ANONYMOUS;
|
||||
}
|
||||
|
||||
public AuthenticationContextImpl(UserDTO currentUser) {
|
||||
if (currentUser == null) {
|
||||
this.currentUser = ANONYMOUS;
|
||||
} else {
|
||||
this.currentUser = currentUser;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLoggedIn() {
|
||||
return (currentUser != ANONYMOUS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserDTO getCurrentUser() {
|
||||
return currentUser;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUserTitle() {
|
||||
final String fullName = currentUser.getFullName();
|
||||
if(fullName != null && !fullName.isEmpty()) {
|
||||
return fullName;
|
||||
}
|
||||
return currentUser.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUserSubtitle() {
|
||||
final String company = currentUser.getCompany();
|
||||
if(company != null && !company.isEmpty()) {
|
||||
return company;
|
||||
}
|
||||
final String email = currentUser.getEmail();
|
||||
if(email != null && !email.isEmpty()) {
|
||||
return email;
|
||||
}
|
||||
return currentUser.getName();
|
||||
}
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
package com.sap.sse.security.ui.authentication.confirm;
|
||||
|
||||
import com.google.gwt.activity.shared.AbstractActivity;
|
||||
import com.google.gwt.event.shared.EventBus;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationClientFactory;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
|
||||
public class ConfirmationInfoActivity extends AbstractActivity implements ConfirmationInfoView.Presenter {
|
||||
|
||||
private final AuthenticationClientFactory clientFactory;
|
||||
private final ConfirmationInfoPlace place;
|
||||
private final StringMessages i18n_sec = StringMessages.INSTANCE;
|
||||
|
||||
public ConfirmationInfoActivity(AuthenticationClientFactory clientFactory, ConfirmationInfoPlace place) {
|
||||
this.clientFactory = clientFactory;
|
||||
this.place = place;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(AcceptsOneWidget panel, EventBus eventBus) {
|
||||
ConfirmationInfoView view = clientFactory.createConfirmationInfoView();
|
||||
panel.setWidget(view);
|
||||
view.setMessage(place.getAction().getMessage(i18n_sec, place.getName()));
|
||||
}
|
||||
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
package com.sap.sse.security.ui.authentication.confirm;
|
||||
|
||||
import com.sap.sse.security.ui.authentication.AbstractAuthenticationPlace;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
|
||||
public class ConfirmationInfoPlace extends AbstractAuthenticationPlace {
|
||||
private final String name;
|
||||
private final Action action;
|
||||
|
||||
public enum Action {
|
||||
ACCOUNT_CREATED {
|
||||
@Override
|
||||
public String getMessage(StringMessages i18n, String name) {
|
||||
return i18n.signedUpSuccessfully(name);
|
||||
}
|
||||
},
|
||||
RESET_REQUESTED {
|
||||
@Override
|
||||
public String getMessage(StringMessages i18n, String name) {
|
||||
return i18n.passwordResetLinkSent(name);
|
||||
}
|
||||
};
|
||||
|
||||
public abstract String getMessage(StringMessages i18n, String name);
|
||||
};
|
||||
|
||||
public ConfirmationInfoPlace(Action action, String name) {
|
||||
this.action = action;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Action getAction() {
|
||||
return action;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ConfirmationInfoPlace [name=" + name + ", action=" + action + "]";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHeaderText() {
|
||||
return StringMessages.INSTANCE.accountConfirmation();
|
||||
}
|
||||
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package com.sap.sse.security.ui.authentication.confirm;
|
||||
|
||||
import com.google.gwt.user.client.ui.IsWidget;
|
||||
|
||||
public interface ConfirmationInfoView extends IsWidget {
|
||||
|
||||
void setMessage(String message);
|
||||
|
||||
public interface Presenter {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package com.sap.sse.security.ui.authentication.confirm;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sse.gwt.common.CommonSharedResources;
|
||||
|
||||
public class ConfirmationInfoViewImpl extends Composite implements ConfirmationInfoView {
|
||||
private static WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class);
|
||||
|
||||
interface WidgetUiBinder extends UiBinder<Widget, ConfirmationInfoViewImpl> {
|
||||
}
|
||||
|
||||
@UiField protected Label messageUi;
|
||||
@UiField(provided = true) final CommonSharedResources res;
|
||||
|
||||
public ConfirmationInfoViewImpl(CommonSharedResources resources) {
|
||||
this.res = resources;
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMessage(String message) {
|
||||
messageUi.setText(message);
|
||||
}
|
||||
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
|
||||
xmlns:g="urn:import:com.google.gwt.user.client.ui">
|
||||
<ui:with field="res" type="com.sap.sse.gwt.common.CommonSharedResources" />
|
||||
<ui:with field="local_res" type="com.sap.sse.security.ui.authentication.UserManagementResources" />
|
||||
<g:Label addStyleNames="{local_res.css.form_description}" ui:field="messageUi"></g:Label>
|
||||
</ui:UiBinder>
|
||||
+124
@@ -0,0 +1,124 @@
|
||||
package com.sap.sse.security.ui.authentication.create;
|
||||
|
||||
import static com.sap.sse.security.shared.UserManagementException.USER_ALREADY_EXISTS;
|
||||
|
||||
import com.google.gwt.activity.shared.AbstractActivity;
|
||||
import com.google.gwt.event.shared.EventBus;
|
||||
import com.google.gwt.place.shared.PlaceController;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.sap.sse.security.shared.UserManagementException;
|
||||
import com.sap.sse.security.ui.authentication.AsyncLoginCallback;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationCallback;
|
||||
import com.sap.sse.security.ui.authentication.AuthenticationClientFactory;
|
||||
import com.sap.sse.security.ui.authentication.confirm.ConfirmationInfoPlace;
|
||||
import com.sap.sse.security.ui.authentication.confirm.ConfirmationInfoPlace.Action;
|
||||
import com.sap.sse.security.ui.authentication.signin.SignInPlace;
|
||||
import com.sap.sse.security.ui.client.component.NewAccountValidator;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
import com.sap.sse.security.ui.shared.UserDTO;
|
||||
|
||||
public class CreateAccountActivity extends AbstractActivity implements CreateAccountView.Presenter {
|
||||
|
||||
private final AuthenticationClientFactory clientFactory;
|
||||
private final PlaceController placeController;
|
||||
private final CreateAccountView view;
|
||||
|
||||
private final StringMessages i18n_sec = StringMessages.INSTANCE;
|
||||
private final CreateAccountFormValues values = new CreateAccountFormValues();
|
||||
private final AuthenticationCallback callback;
|
||||
|
||||
public CreateAccountActivity(AuthenticationClientFactory clientFactory, AuthenticationCallback callback,
|
||||
PlaceController placeController) {
|
||||
this.clientFactory = clientFactory;
|
||||
this.placeController = placeController;
|
||||
this.view = clientFactory.createCreateAccountView();
|
||||
this.callback = callback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(AcceptsOneWidget panel, EventBus eventBus) {
|
||||
view.setPresenter(this);
|
||||
panel.setWidget(view);
|
||||
values.validate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createAccount() {
|
||||
if (values.validate()) {
|
||||
clientFactory.getAuthenticationManager().createAccount(values.username, values.email,
|
||||
values.password, values.fullName, values.company, new AsyncCallback<UserDTO>() {
|
||||
@Override
|
||||
public void onSuccess(final UserDTO result) {
|
||||
clientFactory.getAuthenticationManager().login(result.getName(), values.password,
|
||||
new AsyncLoginCallback(view, callback, false));
|
||||
placeController.goTo(new ConfirmationInfoPlace(Action.ACCOUNT_CREATED, result.getName()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
if (caught instanceof UserManagementException) {
|
||||
if (USER_ALREADY_EXISTS.equals(((UserManagementException) caught).getMessage())) {
|
||||
Window.alert(i18n_sec.userAlreadyExists(values.username));
|
||||
}
|
||||
} else {
|
||||
Window.alert(i18n_sec.errorCreatingUser(values.username, caught.getMessage()));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangeEmail(String newValue) {
|
||||
values.email = newValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangeUsername(String newValue) {
|
||||
values.username = newValue;
|
||||
values.validate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangeFullName(String newValue) {
|
||||
values.fullName = newValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangeCompany(String newValue) {
|
||||
values.company = newValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangePassword(String newValue) {
|
||||
values.password = newValue;
|
||||
values.validate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangePasswordConfirmation(String newValue) {
|
||||
values.passwordConfirmation = newValue;
|
||||
values.validate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void signIn() {
|
||||
placeController.goTo(new SignInPlace());
|
||||
}
|
||||
|
||||
private class CreateAccountFormValues {
|
||||
private final NewAccountValidator validator = new NewAccountValidator(i18n_sec);
|
||||
private String username, fullName, company, email, password, passwordConfirmation;
|
||||
|
||||
private boolean validate() {
|
||||
String errorMessage = validator.validateUsernameAndPassword(username, password, passwordConfirmation);
|
||||
boolean isValid = errorMessage == null || errorMessage.isEmpty();
|
||||
view.setErrorMessage(isValid ? null : errorMessage);
|
||||
view.getCreateAccountControl().setEnabled(isValid);
|
||||
return isValid;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
package com.sap.sse.security.ui.authentication.create;
|
||||
|
||||
import com.sap.sse.security.ui.authentication.AbstractAuthenticationPlace;
|
||||
import com.sap.sse.security.ui.client.i18n.StringMessages;
|
||||
|
||||
public class CreateAccountPlace extends AbstractAuthenticationPlace {
|
||||
|
||||
@Override
|
||||
public String getHeaderText() {
|
||||
return StringMessages.INSTANCE.signUp();
|
||||
}
|
||||
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
package com.sap.sse.security.ui.authentication.create;
|
||||
|
||||
import com.google.gwt.user.client.ui.HasEnabled;
|
||||
import com.google.gwt.user.client.ui.IsWidget;
|
||||
import com.sap.sse.security.ui.authentication.ErrorMessageView;
|
||||
|
||||
public interface CreateAccountView extends ErrorMessageView, IsWidget {
|
||||
|
||||
void setPresenter(Presenter presenter);
|
||||
|
||||
HasEnabled getCreateAccountControl();
|
||||
|
||||
public interface Presenter {
|
||||
|
||||
void onChangeEmail(String newValue);
|
||||
|
||||
void onChangeUsername(String newValue);
|
||||
|
||||
void onChangeFullName(String newValue);
|
||||
|
||||
void onChangeCompany(String newValue);
|
||||
|
||||
void onChangePassword(String newValue);
|
||||
|
||||
void onChangePasswordConfirmation(String newValue);
|
||||
|
||||
void createAccount();
|
||||
|
||||
void signIn();
|
||||
|
||||
}
|
||||
}
|
||||
Loaded 100 of 135 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user