diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/SharedResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/SharedResources.java index 88dccc20b59..85a124f04dd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/SharedResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/SharedResources.java @@ -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(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/Home.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/Home.gwt.xml index a4bff4e4fc0..838ad027bb7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/Home.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/Home.gwt.xml @@ -12,6 +12,7 @@ + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/DesktopApplicationTopLevelView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/DesktopApplicationTopLevelView.java new file mode 100644 index 00000000000..eb9e08a3504 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/DesktopApplicationTopLevelView.java @@ -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 { + AuthenticationMenuView getAuthenticationMenuView(); +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/DesktopClientFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/DesktopClientFactory.java index 9d6b10895cf..5040d64b75d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/DesktopClientFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/DesktopClientFactory.java @@ -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(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationClientFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationClientFactory.java index 4210978c8e7..169e2838095 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationClientFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationClientFactory.java @@ -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> implements DesktopClientFactory { +public class TabletAndDesktopApplicationClientFactory extends AbstractApplicationClientFactory 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( - 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 diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationView.java index fd84b5d43c9..8c6e6ef3e95 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/app/TabletAndDesktopApplicationView.java @@ -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 { +public class TabletAndDesktopApplicationView extends Composite implements DesktopApplicationTopLevelView { interface TabletAndDesktopApplicationViewUiBinder extends UiBinder { } @@ -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; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java index a485464c88a..64c33a837a1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.java @@ -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 eventsNavigation; private final PlaceNavigation solutionsNavigation; - private final EventBus eventBus; + private final AuthenticationMenuView authenticationMenuView; interface HeaderUiBinder extends UiBinder { } @@ -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; + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeader.java index 328e0359fa5..dba7591a3f5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeader.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/userHeader/UserHeader.java @@ -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()); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.java index 81197e6fa2b..a7d6ec50c86 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.java @@ -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") diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.ui.xml index 19250ade29a..14896529d3f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/useraccountDetails/UserAccountDetails.ui.xml @@ -24,16 +24,28 @@ - + -
+
+ + +
+
+ + + +
+
+
- +
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java index aeba06518eb..9dc3da6ac38 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/TabletAndDesktopUserProfileView.java @@ -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 { private static final ApplicationHistoryMapper historyMapper = GWT. 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); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivity.java index cc6f8ad126a..a5bf1a7e052 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileActivity.java @@ -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() { + @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()); } } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileClientFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileClientFactory.java index 29a80b343d1..bedc9c5a2bf 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileClientFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileClientFactory.java @@ -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 { } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileTabView.java index 4b34d7e2911..3f4b40a37b9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileTabView.java @@ -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 extends TabView { - void setUserManagementContext(UserManagementContext userManagementContext); + void setUserManagementContext(AuthenticationContext userManagementContext); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileView.java index 65519cf1b3a..73637b01952 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/user/profile/UserProfileView.java @@ -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 extends IsWidget { @@ -40,6 +40,6 @@ public interface UserProfileView> 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() { - @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 diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/header/Header.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/header/Header.java index e174ff849b8..23a09a81ca8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/header/Header.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/header/Header.java @@ -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()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.java index a8778e7e165..92aa4a2ff0e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.java @@ -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") diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.ui.xml index a8f3821e4d5..91cb1f22ad9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userdetails/UserDetails.ui.xml @@ -12,23 +12,32 @@
- +
- +
- +
+
+
+ +
+ +
+ + +
- +
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeader.java index ac253f595c1..3b1dc2b1c6d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeader.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/userheader/UserHeader.java @@ -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()); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/authentication/AuthenticationActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/authentication/AuthenticationActivity.java index cf8fcabbe60..b14f5277bfc 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/authentication/AuthenticationActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/authentication/AuthenticationActivity.java @@ -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(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(); + } + } + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsActivity.java index b5ff601cf45..458172c0018 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsActivity.java @@ -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() { + @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()); } }); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsView.java index 4baf10ccf9b..b6ed8fcd083 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsView.java @@ -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 { } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsViewImpl.java index b9d428c389a..9e48ef19867 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsViewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/user/profile/UserProfileDetailsViewImpl.java @@ -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); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/ExperimentalFeatures.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/ExperimentalFeatures.java index 5747976742c..292dc6e5440 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/ExperimentalFeatures.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/ExperimentalFeatures.java @@ -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. */ diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/ClientFactoryWithUserManagementContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/ClientFactoryWithUserManagementContext.java deleted file mode 100644 index 5ebae49f52f..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/ClientFactoryWithUserManagementContext.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.sap.sailing.gwt.home.shared.app; - - - -public interface ClientFactoryWithUserManagementContext { - UserManagementContext getUserManagementContext(); - void resetUserManagementContext(); -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/ClientFactoryWithUserManagementService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/ClientFactoryWithUserManagementService.java deleted file mode 100644 index b9b97b5ad4b..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/ClientFactoryWithUserManagementService.java +++ /dev/null @@ -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); -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/PlaceNavigation.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/PlaceNavigation.java index 0c95476c447..c48992bc1b6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/PlaceNavigation.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/PlaceNavigation.java @@ -106,4 +106,8 @@ public class PlaceNavigation { }); } + public String getFullQualifiedUrl() { + return Window.Location.createUrlBuilder().setHash(getTargetUrl()).buildString(); + } + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/UserManagementContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/UserManagementContext.java deleted file mode 100644 index a1d0eb83e5d..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/UserManagementContext.java +++ /dev/null @@ -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(); -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/UserManagementContextImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/UserManagementContextImpl.java deleted file mode 100644 index ca78d7bccd0..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/app/UserManagementContextImpl.java +++ /dev/null @@ -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(), - new ArrayList(), new ArrayList()); - - 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; - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationActivity.java index 60b86408e78..77222a44625 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationActivity.java @@ -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(new AsyncCallback() { @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; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationActivityProxy.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationActivityProxy.java index 4896a9153fc..22a0d13be92 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationActivityProxy.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationActivityProxy.java @@ -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)); } }); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationClientFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationClientFactory.java index 4bc7f850396..96cfecc4cf2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationClientFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationClientFactory.java @@ -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(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationPlace.java index ae4c2c24657..bc200132f3e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationPlace.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationPlace.java @@ -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) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationView.java index f790434d2f2..8748d3e58dd 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationView.java @@ -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 { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationViewImpl.java index ed315243832..379d7668f7a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationViewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationViewImpl.java @@ -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); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationViewImpl.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationViewImpl.ui.xml index eeb856f3427..e9db68395d2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationViewImpl.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/confirmation/ConfirmationViewImpl.ui.xml @@ -1,17 +1,11 @@ - - -
-
-
-
-

-

-
+ + +
+
+

diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetActivity.java index 8dae659497b..abbb29b8f28 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetActivity.java @@ -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() { - @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() { + @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; + } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetClientFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetClientFactory.java index bf195819f10..fe673aa914b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetClientFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetClientFactory.java @@ -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 getPasswordResettedConfirmationNavigation(String username); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetView.java index bc028fe5928..45d16a0d8c1 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetView.java @@ -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(); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetViewImpl.java index 07ae26438b1..83669c3b12e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetViewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetViewImpl.java @@ -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(); + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetViewImpl.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetViewImpl.ui.xml index ff1afb2a9f0..cbc60f992d7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetViewImpl.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/passwordreset/PasswordResetViewImpl.ui.xml @@ -17,6 +17,7 @@
+
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/AbstractUserManagementPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/AbstractUserManagementPlace.java deleted file mode 100644 index 8cd60d9103f..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/AbstractUserManagementPlace.java +++ /dev/null @@ -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 { - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/AuthenticationCallbackImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/AuthenticationCallbackImpl.java new file mode 100644 index 00000000000..1dca1b0e8f0 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/AuthenticationCallbackImpl.java @@ -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 userProfileNavigation; + private final Runnable signInSuccessfulNavigation; + + public AuthenticationCallbackImpl(PlaceNavigation userProfileNavigation, + Runnable signInSuccessfulNavigation) { + this.signInSuccessfulNavigation = signInSuccessfulNavigation; + this.userProfileNavigation = userProfileNavigation; + } + + @Override + public void handleUserProfileNavigation() { + userProfileNavigation.goToPlace(); + } + + @Override + public void handleSignInSuccess() { + signInSuccessfulNavigation.run(); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/RequiresLoggedInUser.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/RequiresLoggedInUser.java deleted file mode 100644 index e88900ee88b..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/RequiresLoggedInUser.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.sap.sailing.gwt.home.shared.usermanagement; - -public interface RequiresLoggedInUser { -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagementContextEvent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagementContextEvent.java deleted file mode 100644 index c2b56cb8e30..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagementContextEvent.java +++ /dev/null @@ -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 { - public static final Type TYPE = new Type(); - - 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 getAssociatedType() { - return TYPE; - } - - @Override - protected void dispatch(Handler handler) { - handler.onUserChangeEvent(this); - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagementPlaceManagementController.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagementPlaceManagementController.java deleted file mode 100644 index c832078dbb2..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagementPlaceManagementController.java +++ /dev/null @@ -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 - - extends WrappedPlaceManagementController { - - public UserManagementPlaceManagementController(CF clientFactory, - PlaceNavigation createConfirmationNavigation, - PlaceNavigation passwordResetPlaceNav, - PlaceNavigation userProfileNavigation, - UserManagementView userManagementView, EventBus globalEventBus) { - super(new Configuration(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 - - implements PlaceManagementConfiguration { - private final CF clientFactory; - private final PlaceNavigation createConfirmationNavigation; - private final PlaceNavigation userProfileNavigation; - private final UserManagementView userManagementView; - private PlaceController placeController; - private final PlaceNavigation passwordResetPlaceNav; - - public Configuration(CF clientFactory, PlaceNavigation createConfirmationNavigation, - PlaceNavigation passwordResetPlaceNav, - PlaceNavigation 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((PasswordRecoveryPlace) placeToUse, clientFactory, passwordResetPlaceNav, placeController); - } else if (placeToUse instanceof LoggedInUserInfoPlace) { - return new LoggedInUserInfoActivity((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 { - - public static final Type TYPE = new Type<>(); - - public interface Handler extends EventHandler { - public void onSignInSuccessful(SignInSuccessfulEvent event); - } - - @Override - public Type getAssociatedType() { - return TYPE; - } - - @Override - protected void dispatch(Handler handler) { - handler.onSignInSuccessful(this); - } - - } - - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountActivity.java deleted file mode 100644 index fa86fcd46fa..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountActivity.java +++ /dev/null @@ -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 confirmationPlaceNav; - private EventBus eventBus; - - public CreateAccountActivity(CreateAccountPlace place, ClientFactoryWithUserManagementService clientFactory, - PlaceNavigation 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() { - @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()); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountPlace.java deleted file mode 100644 index 6a52777f904..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountPlace.java +++ /dev/null @@ -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(); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountView.java deleted file mode 100644 index 69d70577cba..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountView.java +++ /dev/null @@ -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(); - - } - - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountViewImpl.java deleted file mode 100644 index ff609160d8e..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountViewImpl.java +++ /dev/null @@ -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 { - } - - 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(); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecorator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecorator.java index 6cc7f6ab7ed..70776535623 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecorator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/decorator/AuthorizedContentDecorator.java @@ -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); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoActivity.java deleted file mode 100644 index 26dae97bcf0..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoActivity.java +++ /dev/null @@ -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 - extends AbstractActivity implements LoggedInUserInfoView.Presenter { - - private final CF clientFactory; - private final PlaceNavigation userProfileNavigation; - private final PlaceController placeController; - - public LoggedInUserInfoActivity(LoggedInUserInfoPlace place, CF clientFactory, - PlaceNavigation 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() { - @Override - public void onSuccess(SuccessInfo result) { - clientFactory.resetUserManagementContext(); - } - - @Override - public void onFailure(Throwable caught) { - clientFactory.resetUserManagementContext(); - } - }); - } - - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoPlace.java deleted file mode 100644 index e1ed8213b8b..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoPlace.java +++ /dev/null @@ -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 { - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryActivity.java deleted file mode 100644 index b330427f5a6..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryActivity.java +++ /dev/null @@ -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 extends AbstractActivity implements PasswordRecoveryView.Presenter { - - private final CF clientFactory; - private final PlaceController placeController; - private final PasswordRecoveryView view = new PasswordRecoveryViewImpl(); - private final PlaceNavigation passwordResetPlaceNav; - - public PasswordRecoveryActivity(PasswordRecoveryPlace place, CF clientFactory, - PlaceNavigation 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() { - @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())); - } - } - }); - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryPlace.java deleted file mode 100644 index b1f819c9131..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryPlace.java +++ /dev/null @@ -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(); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInPlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInPlace.java deleted file mode 100644 index 25fd941468f..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInPlace.java +++ /dev/null @@ -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(); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementViewDesktop.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewDesktop.java similarity index 69% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementViewDesktop.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewDesktop.java index 9ec7fa89fa4..8dcf3cb5221 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementViewDesktop.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewDesktop.java @@ -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 { + interface AuthenticationViewUiBinder extends UiBinder { } - 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); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewDesktop.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewDesktop.ui.xml new file mode 100644 index 00000000000..1542a793e6a --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewDesktop.ui.xml @@ -0,0 +1,13 @@ + + + + + + +
+
+ +
+
+
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementViewMobile.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewMobile.java similarity index 64% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementViewMobile.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewMobile.java index fa9dfcd3982..b54bbd4de12 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementViewMobile.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewMobile.java @@ -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 { + interface AuthenticationViewUiBinder extends UiBinder { } - 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)); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementViewMobile.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewMobile.ui.xml similarity index 75% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementViewMobile.ui.xml rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewMobile.ui.xml index 882e0ec03da..9a8fa664647 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementViewMobile.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/AuthenticationViewMobile.ui.xml @@ -2,8 +2,8 @@ - - + + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementViewDesktop.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementViewDesktop.ui.xml deleted file mode 100644 index 801e54cd023..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementViewDesktop.ui.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - -
-
-
- -
-
-
-
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/RegattaOverview.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/RegattaOverview.gwt.xml index 7bde5630361..e08bc338468 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/RegattaOverview.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/RegattaOverview.gwt.xml @@ -6,6 +6,7 @@ + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingClientFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingClientFactory.java index 0ac10ee5dcf..770d1fb5141 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingClientFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingClientFactory.java @@ -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); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaPlayerManagerComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaPlayerManagerComponent.java index b10c5671e99..2fa3ca68307 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaPlayerManagerComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaPlayerManagerComponent.java @@ -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, @Override public boolean allowsEditing() { - return userService.getCurrentUser() != null; + UserDTO currentUser = userService.getCurrentUser(); + return currentUser != null + && currentUser.hasPermission(Permission.MANAGE_MEDIA.getStringPermission(), + SailingPermissionsForRoleProvider.INSTANCE); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SideBySideComponentViewer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SideBySideComponentViewer.java index 6ff63bfde4b..072f39976dc 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SideBySideComponentViewer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SideBySideComponentViewer.java @@ -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> 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> additionalVerticalButtons = new ArrayList>(); additionalVerticalButtons.add(new Pair(mediaSelectionButton, mediaPlayerManagerComponent.getDependentCssClassName())); - if (/* TODO check for correct role; was: user != null */ true) { - additionalVerticalButtons.add(new Pair(mediaManagementButton, - "managemedia")); - } + additionalVerticalButtons.add(new Pair(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()); } /** diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingAnalyticsNotes.html b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingAnalyticsNotes.html index 6c0d43b7814..fce0e73d793 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingAnalyticsNotes.html +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingAnalyticsNotes.html @@ -4,6 +4,17 @@

What's New - SAP Sailing Analytics

+
February 2016
+ +
    + +
+
December 2015
    diff --git a/java/com.sap.sse.gwt/META-INF/MANIFEST.MF b/java/com.sap.sse.gwt/META-INF/MANIFEST.MF index 57d4eaf6321..1ccd8900ecf 100644 --- a/java/com.sap.sse.gwt/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.gwt/META-INF/MANIFEST.MF @@ -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, diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/CommonSharedResources.gwt.xml b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/CommonSharedResources.gwt.xml new file mode 100644 index 00000000000..caf815c031d --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/CommonSharedResources.gwt.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/CommonSharedResources.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/CommonSharedResources.java new file mode 100644 index 00000000000..ac6aea7436a --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/common/CommonSharedResources.java @@ -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 { + } + +} \ No newline at end of file diff --git a/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/SecurityReplicationLeadingToEmailReplicationTest.java b/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/SecurityReplicationLeadingToEmailReplicationTest.java index 4ce7394afad..996e3d46456 100644 --- a/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/SecurityReplicationLeadingToEmailReplicationTest.java +++ b/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/SecurityReplicationLeadingToEmailReplicationTest.java @@ -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"); diff --git a/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/SimpleSecurityReplicationTest.java b/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/SimpleSecurityReplicationTest.java index 3249477de36..97a3fdedb07 100755 --- a/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/SimpleSecurityReplicationTest.java +++ b/java/com.sap.sse.security.replication.test/src/com/sap/sse/security/replication/test/SimpleSecurityReplicationTest.java @@ -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()); + } +} diff --git a/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF b/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF index fb55d40f181..6b1cbd38699 100644 --- a/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.security.ui/META-INF/MANIFEST.MF @@ -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, diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AbstractAuthenticationPlace.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AbstractAuthenticationPlace.java new file mode 100644 index 00000000000..c234b9bf809 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AbstractAuthenticationPlace.java @@ -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(); + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/AsyncLoginCallback.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AsyncLoginCallback.java similarity index 56% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/AsyncLoginCallback.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AsyncLoginCallback.java index 9b3ba08cdbc..7fe0cafbbed 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/AsyncLoginCallback.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AsyncLoginCallback.java @@ -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 { - 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())) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationCallback.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationCallback.java new file mode 100644 index 00000000000..6a73492abb6 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationCallback.java @@ -0,0 +1,9 @@ +package com.sap.sse.security.ui.authentication; + + +public interface AuthenticationCallback { + + void handleSignInSuccess(); + + void handleUserProfileNavigation(); +} \ No newline at end of file diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationClientFactory.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationClientFactory.java new file mode 100644 index 00000000000..87218c1fd53 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationClientFactory.java @@ -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(); + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationClientFactoryImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationClientFactoryImpl.java new file mode 100644 index 00000000000..b23bad735e8 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationClientFactoryImpl.java @@ -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; + } + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationContextEvent.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationContextEvent.java new file mode 100644 index 00000000000..10a9462fa1d --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationContextEvent.java @@ -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 { + public static final Type TYPE = new Type(); + + 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 getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(Handler handler) { + handler.onUserChangeEvent(this); + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManager.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManager.java new file mode 100644 index 00000000000..93c482c8af8 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManager.java @@ -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 callback); + + void reqeustPasswordReset(String username, String eMailAddress, AsyncCallback callback); + + void login(String username, String password, AsyncCallback callback); + + void logout(); + + void refreshUserInfo(); + + AuthenticationContext getAuthenticationContext(); +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java new file mode 100644 index 00000000000..2a427f0328e --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationManagerImpl.java @@ -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 callback) { + clientFactory.getUserManagementService().createSimpleUser(name, email, password, + fullName, company, emailConfirmationUrl, callback); + } + + @Override + public void reqeustPasswordReset(String username, String eMailAddress, AsyncCallback callback) { + clientFactory.getUserManagementService().resetPassword(username, eMailAddress, passwordResetUrl, callback); + } + + @Override + public void login(String username, String password, AsyncCallback 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()); + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationPlaceManagementController.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationPlaceManagementController.java new file mode 100644 index 00000000000..26242696d35 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationPlaceManagementController.java @@ -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() : ""); + } + + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagementRequestEvent.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationRequestEvent.java similarity index 58% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagementRequestEvent.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationRequestEvent.java index a90b6cc50a3..f5b1874d044 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagementRequestEvent.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/AuthenticationRequestEvent.java @@ -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 { - public static final Type TYPE = new Type(); +public class AuthenticationRequestEvent extends GwtEvent { + public static final Type TYPE = new Type(); 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; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/ErrorMessageView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/ErrorMessageView.java similarity index 62% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/ErrorMessageView.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/ErrorMessageView.java index b3913c46b13..f0aa4e1fa67 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/ErrorMessageView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/ErrorMessageView.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.home.shared.usermanagement; +package com.sap.sse.security.ui.authentication; public interface ErrorMessageView { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/RequiresLoggedInUser.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/RequiresLoggedInUser.java new file mode 100644 index 00000000000..72010b7bd51 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/RequiresLoggedInUser.java @@ -0,0 +1,4 @@ +package com.sap.sse.security.ui.authentication; + +public interface RequiresLoggedInUser { +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagement.gss b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagement.gss similarity index 99% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagement.gss rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagement.gss index 240226df8ac..5dce234a6e3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagement.gss +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagement.gss @@ -1,6 +1,8 @@ .flyover { font-size: 1rem; - +} +.flyover_content_wrapper { + padding: 0 1rem; } .flyover_content { width: 24.8em; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagementResources.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagementResources.java similarity index 92% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagementResources.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagementResources.java index ca7782e41ab..f3a2860c022 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/UserManagementResources.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/UserManagementResources.java @@ -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(); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/WithAuthenticationManager.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/WithAuthenticationManager.java new file mode 100644 index 00000000000..4442a8b892e --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/WithAuthenticationManager.java @@ -0,0 +1,6 @@ +package com.sap.sse.security.ui.authentication; + + +public interface WithAuthenticationManager { + AuthenticationManager getAuthenticationManager(); +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/framework/WrappedPlaceManagementController.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/WrappedPlaceManagementController.java similarity index 90% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/framework/WrappedPlaceManagementController.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/WrappedPlaceManagementController.java index 2e0df89cd33..20d13585f12 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/framework/WrappedPlaceManagementController.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/WrappedPlaceManagementController.java @@ -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); } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/app/AuthenticationContext.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/app/AuthenticationContext.java new file mode 100644 index 00000000000..9b48db2712f --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/app/AuthenticationContext.java @@ -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(); +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/app/AuthenticationContextImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/app/AuthenticationContextImpl.java new file mode 100644 index 00000000000..51746acdc27 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/app/AuthenticationContextImpl.java @@ -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(), + new ArrayList(), new ArrayList()); + + 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(); + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoActivity.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoActivity.java new file mode 100644 index 00000000000..05f5e604dce --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoActivity.java @@ -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())); + } + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoPlace.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoPlace.java new file mode 100644 index 00000000000..d78eea4068f --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoPlace.java @@ -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(); + } + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoView.java new file mode 100644 index 00000000000..1c0f3a1b58b --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoView.java @@ -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 { + + } + +} + diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoViewImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoViewImpl.java new file mode 100644 index 00000000000..d3deb42a974 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoViewImpl.java @@ -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 { + } + + @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); + } + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoViewImpl.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoViewImpl.ui.xml new file mode 100644 index 00000000000..048c53c9625 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/confirm/ConfirmationInfoViewImpl.ui.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountActivity.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountActivity.java new file mode 100644 index 00000000000..3bdfc525380 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountActivity.java @@ -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() { + @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; + } + } + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountPlace.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountPlace.java new file mode 100644 index 00000000000..ed5f39ca761 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountPlace.java @@ -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(); + } + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountView.java new file mode 100644 index 00000000000..e1e4fd4bcee --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountView.java @@ -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(); + + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountViewImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountViewImpl.java new file mode 100644 index 00000000000..44973364881 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountViewImpl.java @@ -0,0 +1,143 @@ +package com.sap.sse.security.ui.authentication.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.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; +import com.sap.sse.gwt.common.CommonSharedResources; +import com.sap.sse.security.ui.authentication.UserManagementResources; +import com.sap.sse.security.ui.client.i18n.StringMessages; + +public class CreateAccountViewImpl extends Composite implements CreateAccountView { + + interface CreateAccountViewImplUiBinder extends UiBinder { + } + + private static CreateAccountViewImplUiBinder uiBinder = GWT.create(CreateAccountViewImplUiBinder.class); + + @UiField TextBox emailUi; + @UiField TextBox usernameUi; + @UiField TextBox nameUi; + @UiField TextBox companyUi; + @UiField PasswordTextBox passwordUi; + @UiField PasswordTextBox passwordConfirmationUi; + @UiField Button createAccountUi; + @UiField Button signInUi; + + @UiField DivElement formErrorUi; + + @UiField(provided = true) + final CommonSharedResources res; + + private Presenter presenter; + + public CreateAccountViewImpl(CommonSharedResources resources) { + this.res = resources; + UserManagementResources.INSTANCE.css().ensureInjected(); + initWidget(uiBinder.createAndBindUi(this)); + + StringMessages i18n = StringMessages.INSTANCE; + setPlaceholder(passwordUi, i18n.newPasswordPlaceholder()); + setPlaceholder(passwordConfirmationUi, i18n.passwordRepeatPlaceholder()); + + emailUi.addKeyUpHandler(new FieldKeyUpHandler() { + @Override + void updateFieldValue() { + presenter.onChangeEmail(emailUi.getValue()); + } + }); + usernameUi.addKeyUpHandler(new FieldKeyUpHandler() { + @Override + void updateFieldValue() { + presenter.onChangeUsername(usernameUi.getValue()); + } + }); + nameUi.addKeyUpHandler(new FieldKeyUpHandler() { + @Override + void updateFieldValue() { + presenter.onChangeFullName(nameUi.getValue()); + } + }); + companyUi.addKeyUpHandler(new FieldKeyUpHandler() { + @Override + void updateFieldValue() { + presenter.onChangeCompany(companyUi.getValue()); + } + }); + passwordUi.addKeyUpHandler(new FieldKeyUpHandler() { + @Override + void updateFieldValue() { + presenter.onChangePassword(passwordUi.getValue()); + } + }); + passwordConfirmationUi.addKeyUpHandler(new FieldKeyUpHandler() { + @Override + void updateFieldValue() { + presenter.onChangePasswordConfirmation(passwordConfirmationUi.getValue()); + } + }); + } + + @Override + public HasEnabled getCreateAccountControl() { + return createAccountUi; + } + + @Override + public void setPresenter(Presenter presenter) { + this.presenter = presenter; + } + + @Override + public void setErrorMessage(String errorMessage) { + formErrorUi.setInnerText(errorMessage); + } + + @Override + protected void onLoad() { + selectAll(emailUi); + } + + @UiHandler("createAccountUi") + void onCreateAccountUiControlClicked(ClickEvent event) { + presenter.createAccount(); + } + + @UiHandler("signInUi") + void onSignInControlUiClicked(ClickEvent event) { + presenter.signIn(); + } + + private void setPlaceholder(Widget widget, String placeholderText) { + widget.getElement().setAttribute("placeholder", placeholderText); + } + + private void selectAll(TextBox textBox) { + textBox.setFocus(true); + textBox.selectAll(); + } + + private abstract class FieldKeyUpHandler implements KeyUpHandler { + @Override + public void onKeyUp(KeyUpEvent event) { + if(event.getNativeKeyCode() == KeyCodes.KEY_ENTER) { + presenter.createAccount(); + } else { + updateFieldValue(); + } + } + + abstract void updateFieldValue(); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountViewImpl.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountViewImpl.ui.xml similarity index 67% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountViewImpl.ui.xml rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountViewImpl.ui.xml index 6b6d438e807..ce685d72a73 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/create/CreateAccountViewImpl.ui.xml +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/create/CreateAccountViewImpl.ui.xml @@ -1,10 +1,8 @@ - - + - - + +
    @@ -12,15 +10,19 @@ + + + +
    - - + +
    diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoActivity.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoActivity.java new file mode 100644 index 00000000000..9d691a77fcb --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoActivity.java @@ -0,0 +1,57 @@ +package com.sap.sse.security.ui.authentication.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.ui.AcceptsOneWidget; +import com.sap.sse.security.ui.authentication.AuthenticationCallback; +import com.sap.sse.security.ui.authentication.AuthenticationClientFactory; +import com.sap.sse.security.ui.authentication.AuthenticationContextEvent; +import com.sap.sse.security.ui.authentication.AuthenticationRequestEvent; +import com.sap.sse.security.ui.authentication.signin.SignInPlace; + +public class LoggedInUserInfoActivity extends AbstractActivity implements LoggedInUserInfoView.Presenter { + + private final AuthenticationClientFactory clientFactory; + private final PlaceController placeController; + private final AuthenticationCallback callback; + private EventBus eventBus; + + public LoggedInUserInfoActivity(AuthenticationClientFactory clientFactory, AuthenticationCallback callback, + PlaceController placeController) { + this.clientFactory = clientFactory; + this.placeController = placeController; + this.callback = callback; + } + + @Override + public void start(AcceptsOneWidget panel, EventBus eventBus) { + final LoggedInUserInfoView view = clientFactory.createLoggedInUserInfoView(); + this.eventBus = eventBus; + view.setPresenter(this); + panel.setWidget(view); + view.setUserInfo(clientFactory.getAuthenticationManager().getAuthenticationContext()); + eventBus.addHandler(AuthenticationContextEvent.TYPE, new AuthenticationContextEvent.Handler() { + @Override + public void onUserChangeEvent(AuthenticationContextEvent event) { + if (event.getCtx().isLoggedIn()) { + view.setUserInfo(event.getCtx()); + } else { + placeController.goTo(new SignInPlace()); + } + } + }); + } + + @Override + public void gotoProfileUi() { + eventBus.fireEvent(new AuthenticationRequestEvent()); + callback.handleUserProfileNavigation(); + } + + @Override + public void signOut() { + clientFactory.getAuthenticationManager().logout(); + } + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoPlace.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoPlace.java new file mode 100644 index 00000000000..e6fa6b0fe72 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoPlace.java @@ -0,0 +1,8 @@ +package com.sap.sse.security.ui.authentication.info; + +import com.google.gwt.place.shared.Place; +import com.sap.sse.security.ui.authentication.RequiresLoggedInUser; + +public class LoggedInUserInfoPlace extends Place implements RequiresLoggedInUser { + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoView.java similarity index 56% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoView.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoView.java index af1b7524a43..2b45e23070a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoView.java @@ -1,12 +1,12 @@ -package com.sap.sailing.gwt.home.shared.usermanagement.info; +package com.sap.sse.security.ui.authentication.info; import com.google.gwt.user.client.ui.IsWidget; -import com.sap.sse.security.ui.shared.UserDTO; +import com.sap.sse.security.ui.authentication.app.AuthenticationContext; public interface LoggedInUserInfoView extends IsWidget { void setPresenter(Presenter presenter); - void setUserInfo(UserDTO user); + void setUserInfo(AuthenticationContext userManagementContext); public interface Presenter { void gotoProfileUi(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoViewImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoViewImpl.java similarity index 70% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoViewImpl.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoViewImpl.java index 5a05a1e0ec0..c25c4583356 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoViewImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoViewImpl.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.home.shared.usermanagement.info; +package com.sap.sse.security.ui.authentication.info; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.DivElement; @@ -9,8 +9,9 @@ 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.Widget; -import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementResources; -import com.sap.sse.security.ui.shared.UserDTO; +import com.sap.sse.gwt.common.CommonSharedResources; +import com.sap.sse.security.ui.authentication.UserManagementResources; +import com.sap.sse.security.ui.authentication.app.AuthenticationContext; public class LoggedInUserInfoViewImpl extends Composite implements LoggedInUserInfoView { @@ -25,18 +26,24 @@ public class LoggedInUserInfoViewImpl extends Composite implements LoggedInUserI @UiField Anchor userProfileUi; @UiField Anchor signOutUi; + + @UiField(provided = true) + final CommonSharedResources res; + private Presenter presenter; - public LoggedInUserInfoViewImpl() { + public LoggedInUserInfoViewImpl(CommonSharedResources resources) { + this.res = resources; UserManagementResources.INSTANCE.css().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); } @Override - public void setUserInfo(UserDTO user) { + public void setUserInfo(AuthenticationContext userManagementContext) { userImageUi.getStyle().setBackgroundImage("url('images/home/userdefault.svg')"); - userRealnameUi.setInnerText(user.getName()); - userUsernameUi.setInnerText(user.getEmail()); + + userRealnameUi.setInnerText(userManagementContext.getUserTitle()); + userUsernameUi.setInnerText(userManagementContext.getUserSubtitle()); } @UiHandler("userProfileUi") diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoViewImpl.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoViewImpl.ui.xml similarity index 77% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoViewImpl.ui.xml rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoViewImpl.ui.xml index 702b6c3a4ff..274b8578fec 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/info/LoggedInUserInfoViewImpl.ui.xml +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/info/LoggedInUserInfoViewImpl.ui.xml @@ -1,10 +1,8 @@ - - + - - + +
    diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryActivity.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryActivity.java new file mode 100644 index 00000000000..5b7881ba94d --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryActivity.java @@ -0,0 +1,58 @@ +package com.sap.sse.security.ui.authentication.recover; + +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.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.AcceptsOneWidget; +import com.sap.sse.security.shared.UserManagementException; +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.client.i18n.StringMessages; + +public class PasswordRecoveryActivity extends AbstractActivity implements PasswordRecoveryView.Presenter { + + private final AuthenticationClientFactory clientFactory; + private final PlaceController placeController; + private final PasswordRecoveryView view; + + public PasswordRecoveryActivity(AuthenticationClientFactory clientFactory, PlaceController placeController) { + this.clientFactory = clientFactory; + this.placeController = placeController; + this.view = clientFactory.createPasswordRecoveryView(); + } + + @Override + public void start(AcceptsOneWidget panel, EventBus eventBus) { + view.setPresenter(this); + panel.setWidget(view); + } + + @Override + public void resetPassword(final String email, final String username) { + clientFactory.getAuthenticationManager().reqeustPasswordReset(username, email, new AsyncCallback() { + @Override + public void onSuccess(Void result) { + String name = (username == null || username.isEmpty()) ? email : username; + placeController.goTo(new ConfirmationInfoPlace(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())); + } + } + }); + } +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryPlace.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryPlace.java new file mode 100644 index 00000000000..fdf4650c174 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryPlace.java @@ -0,0 +1,13 @@ +package com.sap.sse.security.ui.authentication.recover; + +import com.sap.sse.security.ui.authentication.AbstractAuthenticationPlace; +import com.sap.sse.security.ui.client.i18n.StringMessages; + +public class PasswordRecoveryPlace extends AbstractAuthenticationPlace { + + @Override + public String getHeaderText() { + return StringMessages.INSTANCE.forgotPassword(); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryView.java similarity index 67% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryView.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryView.java index 200d35d4dc9..90791cf88b6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryView.java @@ -1,7 +1,7 @@ -package com.sap.sailing.gwt.home.shared.usermanagement.recovery; +package com.sap.sse.security.ui.authentication.recover; import com.google.gwt.user.client.ui.IsWidget; -import com.sap.sailing.gwt.home.shared.usermanagement.ErrorMessageView; +import com.sap.sse.security.ui.authentication.ErrorMessageView; public interface PasswordRecoveryView extends ErrorMessageView, IsWidget { @@ -10,5 +10,6 @@ public interface PasswordRecoveryView extends ErrorMessageView, IsWidget { public interface Presenter { void resetPassword(String email, String username); + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryViewImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryViewImpl.java similarity index 85% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryViewImpl.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryViewImpl.java index 38251369575..b68a6d3aaa9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryViewImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryViewImpl.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.home.shared.usermanagement.recovery; +package com.sap.sse.security.ui.authentication.recover; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.DivElement; @@ -11,7 +11,8 @@ import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Composite; 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.gwt.common.CommonSharedResources; +import com.sap.sse.security.ui.authentication.UserManagementResources; public class PasswordRecoveryViewImpl extends Composite implements PasswordRecoveryView { @@ -24,10 +25,14 @@ public class PasswordRecoveryViewImpl extends Composite implements PasswordRecov @UiField TextBox usernameUi; @UiField DivElement formErrorUi; + + @UiField(provided = true) + final CommonSharedResources res; private Presenter presenter; - public PasswordRecoveryViewImpl() { + public PasswordRecoveryViewImpl(CommonSharedResources resources) { + this.res = resources; UserManagementResources.INSTANCE.css().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryViewImpl.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryViewImpl.ui.xml similarity index 74% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryViewImpl.ui.xml rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryViewImpl.ui.xml index aaae4fdc517..fad8a4e2cfd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/recovery/PasswordRecoveryViewImpl.ui.xml +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/recover/PasswordRecoveryViewImpl.ui.xml @@ -1,10 +1,8 @@ - - + - - + +
    diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInActivity.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInActivity.java similarity index 50% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInActivity.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInActivity.java index 09b248661e7..29682129749 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInActivity.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInActivity.java @@ -1,37 +1,39 @@ -package com.sap.sailing.gwt.home.shared.usermanagement.signin; +package com.sap.sse.security.ui.authentication.signin; 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.ui.AcceptsOneWidget; -import com.sap.sailing.gwt.home.shared.app.ClientFactoryWithUserManagementService; -import com.sap.sailing.gwt.home.shared.usermanagement.AsyncLoginCallback; -import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementContextEvent; -import com.sap.sailing.gwt.home.shared.usermanagement.create.CreateAccountPlace; -import com.sap.sailing.gwt.home.shared.usermanagement.info.LoggedInUserInfoPlace; -import com.sap.sailing.gwt.home.shared.usermanagement.recovery.PasswordRecoveryPlace; +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.AuthenticationContextEvent; +import com.sap.sse.security.ui.authentication.create.CreateAccountPlace; +import com.sap.sse.security.ui.authentication.info.LoggedInUserInfoPlace; +import com.sap.sse.security.ui.authentication.recover.PasswordRecoveryPlace; public class SignInActivity extends AbstractActivity implements SignInView.Presenter { - private final ClientFactoryWithUserManagementService clientFactory; + private final AuthenticationClientFactory clientFactory; private final PlaceController placeController; - private final SignInView view = new SignInViewImpl(); - private EventBus eventBus; + private final SignInView view; + private final AuthenticationCallback callback; - public SignInActivity(SignInPlace place, ClientFactoryWithUserManagementService clientFactory, - PlaceController placeController) { + public SignInActivity(AuthenticationClientFactory clientFactory, + AuthenticationCallback callback, PlaceController placeController) { this.clientFactory = clientFactory; this.placeController = placeController; + this.view = clientFactory.createSignInView(); + this.callback = callback; } @Override public void start(AcceptsOneWidget panel, EventBus eventBus) { - this.eventBus = eventBus; view.setPresenter(this); panel.setWidget(view); - 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) { if (event.getCtx().isLoggedIn()) { placeController.goTo(new LoggedInUserInfoPlace()); } @@ -41,8 +43,8 @@ public class SignInActivity extends AbstractActivity implements SignInView.Prese @Override public void login(String loginName, String password) { - clientFactory.getUserManagement().login(loginName, password, - new AsyncLoginCallback(clientFactory, view, eventBus, true)); + clientFactory.getAuthenticationManager().login(loginName, password, + new AsyncLoginCallback(view, callback, true)); } @Override diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInPlace.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInPlace.java new file mode 100644 index 00000000000..a926251677b --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInPlace.java @@ -0,0 +1,13 @@ +package com.sap.sse.security.ui.authentication.signin; + +import com.sap.sse.security.ui.authentication.AbstractAuthenticationPlace; +import com.sap.sse.security.ui.client.i18n.StringMessages; + +public class SignInPlace extends AbstractAuthenticationPlace { + + @Override + public String getHeaderText() { + return StringMessages.INSTANCE.signIn(); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInView.java similarity index 76% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInView.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInView.java index 8922b53067e..b7588f96734 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInView.java @@ -1,7 +1,7 @@ -package com.sap.sailing.gwt.home.shared.usermanagement.signin; +package com.sap.sse.security.ui.authentication.signin; import com.google.gwt.user.client.ui.IsWidget; -import com.sap.sailing.gwt.home.shared.usermanagement.ErrorMessageView; +import com.sap.sse.security.ui.authentication.ErrorMessageView; public interface SignInView extends ErrorMessageView, IsWidget { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInViewImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInViewImpl.java similarity index 86% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInViewImpl.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInViewImpl.java index a2fef3877da..be2bc4f2fd6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInViewImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInViewImpl.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.home.shared.usermanagement.signin; +package com.sap.sse.security.ui.authentication.signin; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.DivElement; @@ -13,8 +13,8 @@ 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.ExperimentalFeatures; -import com.sap.sailing.gwt.home.shared.usermanagement.UserManagementResources; +import com.sap.sse.gwt.common.CommonSharedResources; +import com.sap.sse.security.ui.authentication.UserManagementResources; public class SignInViewImpl extends Composite implements SignInView { @@ -33,16 +33,19 @@ public class SignInViewImpl extends Composite implements SignInView { @UiField DivElement formErrorUi; @UiField DivElement socialLoginUi; + + @UiField(provided = true) + final CommonSharedResources res; private Presenter presenter; - public SignInViewImpl() { + public SignInViewImpl(CommonSharedResources resources) { + this.res = resources; UserManagementResources.INSTANCE.css().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); - if (!ExperimentalFeatures.SHOW_SOCIAL_LOGINS_FOR_USER_MANAGEMENT) { - socialLoginUi.removeFromParent(); - } + // TODO implement social login functionality + socialLoginUi.removeFromParent(); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInViewImpl.ui.xml b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInViewImpl.ui.xml similarity index 83% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInViewImpl.ui.xml rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInViewImpl.ui.xml index 6d18a5b2506..d534afbf4bf 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/signin/SignInViewImpl.ui.xml +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/signin/SignInViewImpl.ui.xml @@ -1,10 +1,8 @@ - - + - - + +
    diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuView.java new file mode 100644 index 00000000000..9c676c32557 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuView.java @@ -0,0 +1,15 @@ +package com.sap.sse.security.ui.authentication.view; + +import com.google.gwt.user.client.ui.IsWidget; + +public interface AuthenticationMenuView extends IsWidget { + + void setPresenter(Presenter presenter); + + void setAuthenticated(boolean authenticated); + + public interface Presenter { + void toggleFlyout(); + } + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuViewImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuViewImpl.java new file mode 100644 index 00000000000..6aeac1878df --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationMenuViewImpl.java @@ -0,0 +1,40 @@ +package com.sap.sse.security.ui.authentication.view; + +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.Widget; + +public class AuthenticationMenuViewImpl implements AuthenticationMenuView { + + private Presenter presenter; + private final Anchor anchor; + private final String loggedInStyle; + + public AuthenticationMenuViewImpl(Anchor anchor, String loggedInStyle) { + this.anchor = anchor; + this.loggedInStyle = loggedInStyle; + anchor.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + presenter.toggleFlyout(); + } + }); + } + + @Override + public Widget asWidget() { + return anchor; + } + + @Override + public void setPresenter(Presenter presenter) { + this.presenter = presenter; + } + + @Override + public void setAuthenticated(boolean authenticated) { + anchor.setStyleName(loggedInStyle, authenticated); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationView.java similarity index 56% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementView.java rename to java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationView.java index 612aab5bf71..462c21a910c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/usermanagement/view/UserManagementView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/AuthenticationView.java @@ -1,9 +1,9 @@ -package com.sap.sailing.gwt.home.shared.usermanagement.view; +package com.sap.sse.security.ui.authentication.view; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.gwt.user.client.ui.IsWidget; -public interface UserManagementView extends AcceptsOneWidget, IsWidget { +public interface AuthenticationView extends AcceptsOneWidget, IsWidget { void setHeading(String heading); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/FlyoutAuthenticationPresenter.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/FlyoutAuthenticationPresenter.java new file mode 100644 index 00000000000..f33f5aba953 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/FlyoutAuthenticationPresenter.java @@ -0,0 +1,48 @@ +package com.sap.sse.security.ui.authentication.view; + +import com.google.web.bindery.event.shared.EventBus; +import com.sap.sse.security.ui.authentication.AuthenticationContextEvent; +import com.sap.sse.security.ui.authentication.AuthenticationRequestEvent; +import com.sap.sse.security.ui.authentication.WrappedPlaceManagementController; + +public class FlyoutAuthenticationPresenter implements AuthenticationMenuView.Presenter { + + private final FlyoutAuthenticationView flyoutAuthenticationView; + private final WrappedPlaceManagementController authenticationPlaceManagementController; + + public FlyoutAuthenticationPresenter(final FlyoutAuthenticationView flyoutAuthenticationView, + final AuthenticationMenuView authenticationMenuView, + WrappedPlaceManagementController authenticationPlaceManagementController, + EventBus eventBus) { + this.flyoutAuthenticationView = flyoutAuthenticationView; + this.authenticationPlaceManagementController = authenticationPlaceManagementController; + + authenticationMenuView.setPresenter(this); + flyoutAuthenticationView.setAutoHidePartner(authenticationMenuView); + + eventBus.addHandler(AuthenticationRequestEvent.TYPE, new AuthenticationRequestEvent.Handler() { + @Override + public void onUserManagementRequestEvent(AuthenticationRequestEvent event) { + toggleFlyout(); + } + }); + + eventBus.addHandler(AuthenticationContextEvent.TYPE, new AuthenticationContextEvent.Handler() { + @Override + public void onUserChangeEvent(AuthenticationContextEvent event) { + authenticationMenuView.setAuthenticated(event.getCtx().isLoggedIn()); + } + }); + } + + @Override + public void toggleFlyout() { + if (flyoutAuthenticationView.isShowing()) { + flyoutAuthenticationView.hide(); + } else { + flyoutAuthenticationView.show(); + authenticationPlaceManagementController.start(); + } + } + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/FlyoutAuthenticationView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/FlyoutAuthenticationView.java new file mode 100644 index 00000000000..558ebb69891 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/authentication/view/FlyoutAuthenticationView.java @@ -0,0 +1,15 @@ +package com.sap.sse.security.ui.authentication.view; + +import com.google.gwt.user.client.ui.IsWidget; + +public interface FlyoutAuthenticationView extends AuthenticationView { + + boolean isShowing(); + + void show(); + + void hide(); + + void setAutoHidePartner(IsWidget autoHidePartner); + +} diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java index 0f4d7ddb0dc..5243d6f70de 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementService.java @@ -21,7 +21,7 @@ public interface UserManagementService extends RemoteService { SuccessInfo login(String username, String password); - UserDTO createSimpleUser(String name, String email, String password, String validationBaseURL) throws UserManagementException, MailException; + UserDTO createSimpleUser(String name, String email, String password, String fullName, String company, String validationBaseURL) throws UserManagementException, MailException; /** * Either oldPassword or passwordResetSecret need to be provided, or the current user needs to have diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java index 273369b509b..07f24a4aec3 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/UserManagementServiceAsync.java @@ -17,7 +17,7 @@ public interface UserManagementServiceAsync { void logout(AsyncCallback callback); - void createSimpleUser(String name, String email, String password, String validationBaseURL, AsyncCallback callback); + void createSimpleUser(String name, String email, String password, String fullName, String company, String validationBaseURL, AsyncCallback callback); void updateSimpleUserPassword(String name, String oldPassword, String passwordResetSecret, String newPassword, AsyncCallback callback); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java index 6bd57708dda..24816d74007 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/CreateUserDialog.java @@ -26,6 +26,7 @@ public class CreateUserDialog extends AbstractUserDialog { userManagementService .createSimpleUser(usernameEmailPassword.getUsername(), usernameEmailPassword.getEmail(), usernameEmailPassword.getPassword(), + /* fullName */ null, /* company */ null, EntryPointLinkFactory.createEmailValidationLink(new HashMap()), new AsyncCallback() { @Override public void onSuccess(UserDTO result) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/NewAccountValidator.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/NewAccountValidator.java index 883d205b8df..792f843b839 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/NewAccountValidator.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/NewAccountValidator.java @@ -33,7 +33,7 @@ public class NewAccountValidator { private String validatePasswords(String password, String passwordRepeat) { final String result; - if (password.length() < MINIMUM_PASSWORD_LENGTH) { + if (password == null || password.length() < MINIMUM_PASSWORD_LENGTH) { result = stringMessages.passwordMustHaveAtLeastNCharacters(MINIMUM_PASSWORD_LENGTH); } else if (!password.equals(passwordRepeat)) { result = stringMessages.passwordsDontMatch(); @@ -45,7 +45,7 @@ public class NewAccountValidator { private String validateUsername(String username) { final String result; - if (username.length() < MINIMUM_USERNAME_LENGTH) { + if (username == null || username.length() < MINIMUM_USERNAME_LENGTH) { result = stringMessages.usernameMustHaveAtLeastNCharacters(MINIMUM_USERNAME_LENGTH); } else { result = null; diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java index 0e5b267a780..42fb1f8e1c1 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.java @@ -6,6 +6,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages { public static final StringMessages INSTANCE = GWT.create(StringMessages.class); String name(); + String company(); String password(); String passwordRepeat(); String loggedIn(String username); @@ -62,6 +63,8 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages { String editEmail(); String errorUpdatingEmail(String message); String successfullyUpdatedEmail(String username, String email); + String errorUpdatingUserProperties(String message); + String successfullyUpdatedUserProperties(String username); String forgotPassword(); String errorDuringPasswordReset(String message); String cannotResetPasswordWithoutValidatedEmail(String username); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties index c7c025f54d2..02a50f83a87 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties @@ -1,4 +1,5 @@ name=Name +company=Company password=Password passwordRepeat=Repeat password loggedIn=Logged in as user {0}! @@ -55,6 +56,8 @@ invalidCredentials=Invalid credentials editEmail=Edit e-mail address errorUpdatingEmail=Error updating e-mail address: {0} successfullyUpdatedEmail=Successfully updated e-mail address for user {0}.\nValidation check sent to {1}. +errorUpdatingUserProperties=Error updating user properties: {0} +successfullyUpdatedUserProperties=Successfully updated properties for user {0}. forgotPassword=Forgot password errorDuringPasswordReset=Error during password reset: {0} cannotResetPasswordWithoutValidatedEmail=Cannot reset password because user {0} does not have a validated e-mail address diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_de.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_de.properties index d86af34f440..fec4bc62901 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_de.properties +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_de.properties @@ -1,4 +1,5 @@ name=Name +company=Unternehmen password=Passwort passwordRepeat=Passwort Wiederholung loggedIn=Angemeldet als Benutzer {0}! @@ -55,6 +56,8 @@ invalidCredentials=Ungültige Zugangsdaten editEmail=e-Mail-Adresse bearbeiten errorUpdatingEmail=Fehler beim Aktualisieren der e-Mail-Adresse: {0} successfullyUpdatedEmail=e-Mail-Adresse für Benutzer {0} erfolgreich aktualisiert.\nBestätigungs-e-Mail an {1} versandt. +errorUpdatingUserProperties=Fehler beim Aktualisieren der Benutzereigenschaften: {0} +successfullyUpdatedUserProperties=Eigenschaften für Benutzer {0} erfolgreich aktualisiert. forgotPassword=Passwort vergessen errorDuringPasswordReset=Fehler beim Zurücksetzen des Passworts: {0} cannotResetPasswordWithoutValidatedEmail=Passwort für Benutzer {0} kann nicht zurückgesetzt werden, da keine validierte e-Mail-Adresse vorliegt diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/LoginPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/LoginPanel.java index dc1f21d1183..98efb04ac7f 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/LoginPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/loginpanel/LoginPanel.java @@ -77,6 +77,7 @@ public class LoginPanel extends HorizontalPanel implements UserStatusEventHandle @Override public void ok(final UserData userData) { userManagementService.createSimpleUser(userData.getUsername(), userData.getEmail(), userData.getPassword(), + /* fullName */ null, /* company */ null, EntryPointLinkFactory.createEmailValidationLink(new HashMap()), new MarkedAsyncCallback(new AsyncCallback() { @Override diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java index cf4272158e8..b4a12c3fa50 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/registration/RegisterView.java @@ -77,6 +77,7 @@ public class RegisterView extends Composite { @UiHandler("signUpButton") void signUpButtonClicked(ClickEvent e) { userManagementService.createSimpleUser(usernameTextBox.getText(), emailTextBox.getText(), passwordTextBox.getText(), + /* fullName */ null, /* company */ null, EntryPointLinkFactory.createEmailValidationLink(new HashMap()), new AsyncCallback() { @Override public void onFailure(Throwable caught) { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java index a0d612137ef..9d3b4579206 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/UserManagementServiceImpl.java @@ -124,10 +124,10 @@ public class UserManagementServiceImpl extends RemoteServiceServlet implements U } @Override - public UserDTO createSimpleUser(String name, String email, String password, String validationBaseURL) throws UserManagementException, MailException { + public UserDTO createSimpleUser(String name, String email, String password, String fullName, String company, String validationBaseURL) throws UserManagementException, MailException { User u = null; try { - u = getSecurityService().createSimpleUser(name, email, password, validationBaseURL); + u = getSecurityService().createSimpleUser(name, email, password, fullName, company, validationBaseURL); } catch (UserManagementException e) { logger.log(Level.SEVERE, "Error creating user "+name, e); throw new UserManagementException(e.getMessage()); diff --git a/java/com.sap.sse.security.ui/src/main/resources/com/sap/sse/security/ui/Authentication.gwt.xml b/java/com.sap.sse.security.ui/src/main/resources/com/sap/sse/security/ui/Authentication.gwt.xml new file mode 100644 index 00000000000..1f631eda9cf --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/resources/com/sap/sse/security/ui/Authentication.gwt.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java index 32d36bbad80..755957a6fa5 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java @@ -51,7 +51,7 @@ public interface SecurityService extends ReplicableWithObjectInputStreamnull, no validation will be attempted */ - User createSimpleUser(String username, String email, String password, String validationBaseURL) throws UserManagementException, MailException; + User createSimpleUser(String username, String email, String password, String fullName, String company, String validationBaseURL) throws UserManagementException, MailException; void updateSimpleUserPassword(String name, String newPassword) throws UserManagementException; diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java index 932c668b127..ecde7ffcbe9 100755 --- a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java @@ -191,7 +191,8 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat if (Util.isEmpty(store.getUsers())) { try { logger.info("No users found, creating default user \"admin\" with password \"admin\""); - createSimpleUser("admin", "nobody@sapsailing.com", "admin", /* validationBaseURL */ null); + createSimpleUser("admin", "nobody@sapsailing.com", "admin", + /* fullName */ null, /* company */ null, /* validationBaseURL */ null); addRoleForUser("admin", DefaultRoles.ADMIN.getRolename()); } catch (UserManagementException | MailException e) { logger.log(Level.SEVERE, "Exception while creating default admin user", e); @@ -322,8 +323,8 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat } @Override - public User createSimpleUser(final String username, final String email, String password, - final String validationBaseURL) throws UserManagementException, MailException { + public User createSimpleUser(final String username, final String email, String password, String fullName, + String company, final String validationBaseURL) throws UserManagementException, MailException { if (store.getUserByName(username) != null) { throw new UserManagementException(UserManagementException.USER_ALREADY_EXISTS); } @@ -337,6 +338,8 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat String hashedPasswordBase64 = hashPassword(password, salt); UsernamePasswordAccount upa = new UsernamePasswordAccount(username, hashedPasswordBase64, salt); final User result = store.createUser(username, email, upa); + result.setFullName(fullName); + result.setCompany(company); final String emailValidationSecret = result.startEmailValidation(); // don't replicate exception handling; replicate only the effect on the user store apply(s->s.internalStoreUser(result));