Merge branch 'design2015-user-management' into design2015

This commit is contained in:
Benjamin Barth committed 2016-01-28 16:23:04 +01:00
commit 1ffc945070
135 files changed
+1891 -1221

No files matched your search

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