Alexander Wels has uploaded a new change for review. Change subject: userportal,webadmin: multiple login messages ......................................................................
userportal,webadmin: multiple login messages - When the backend would return multiple login failure messages (for instance with the password expired). All messages after the first would be discarded. This would lead to configured messages to not be displayed. Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1157773 Change-Id: Idd3bc6b716797583d3fc69fc69746bc3362eb58d Signed-off-by: Alexander Wels <aw...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/aaa/LoginBaseCommand.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractLoginPresenterWidget.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/AbstractLoginFormView.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java M frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/login/view/LoginFormView.ui.xml M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/login/view/LoginFormView.ui.xml 7 files changed, 115 insertions(+), 86 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/22/40222/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/aaa/LoginBaseCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/aaa/LoginBaseCommand.java index b9350f5..072d946 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/aaa/LoginBaseCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/aaa/LoginBaseCommand.java @@ -436,13 +436,15 @@ if (authResult == Authn.AuthResult.CREDENTIALS_EXPIRED) { boolean addedUserPasswordExpiredCDA = false; - if (outputMap.<String> get(Authn.InvokeKeys.CREDENTIALS_CHANGE_URL) != null) { + if (outputMap.<String> get(Authn.InvokeKeys.CREDENTIALS_CHANGE_URL) != null + && !outputMap.<String> get(Authn.InvokeKeys.CREDENTIALS_CHANGE_URL).trim().isEmpty()) { addCanDoActionMessage(VdcBllMessages.USER_PASSWORD_EXPIRED_CHANGE_URL_PROVIDED); addCanDoActionMessageVariable("URL", outputMap.<String>get(Authn.InvokeKeys.CREDENTIALS_CHANGE_URL)); addedUserPasswordExpiredCDA = true; } - if (outputMap.<String> get(Authn.InvokeKeys.USER_MESSAGE) != null) { + if (outputMap.<String> get(Authn.InvokeKeys.USER_MESSAGE) != null + && !outputMap.<String> get(Authn.InvokeKeys.USER_MESSAGE).trim().isEmpty()) { addCanDoActionMessage(VdcBllMessages.USER_PASSWORD_EXPIRED_CHANGE_MSG_PROVIDED); addCanDoActionMessageVariable("MSG", outputMap.<String>get(Authn.InvokeKeys.USER_MESSAGE)); diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractLoginPresenterWidget.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractLoginPresenterWidget.java index 02a5400..3e0c2f7 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractLoginPresenterWidget.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/presenter/AbstractLoginPresenterWidget.java @@ -1,5 +1,7 @@ package org.ovirt.engine.ui.common.presenter; +import java.util.ArrayList; +import java.util.List; import java.util.logging.Logger; import org.ovirt.engine.ui.common.system.ClientStorage; @@ -42,9 +44,9 @@ void resetAndFocus(); - void setErrorMessageHtml(SafeHtml text); + void setErrorMessages(List<SafeHtml> text); - void clearErrorMessage(); + void clearErrorMessages(); HasUiCommandClickHandlers getLoginButton(); @@ -100,7 +102,7 @@ @Override public void eventRaised(Event ev, Object sender, EventArgs args) { lockInteractionManager.hideLoadingIndicator(); - formatAndSetErrorMessage(loginModel.getMessage()); + formatAndSetErrorMessage(loginModel.getMessages()); logger.warning("Login failed for user [" + loginModel.getUserName().getEntity() + "]"); //$NON-NLS-1$ //$NON-NLS-2$ } @@ -168,7 +170,7 @@ protected abstract String getSelectedDomainKey(); protected void onLoggedInEvent(T loginModel) { - getView().clearErrorMessage(); + getView().clearErrorMessages(); saveSelectedDomain(loginModel); } @@ -181,29 +183,31 @@ clientStorage.setLocalItem(getSelectedDomainKey(), selectedItem); } - private void formatAndSetErrorMessage(String message) { - SafeHtml safeMessage = null; - if (message != null) { - SafeHtmlBuilder builder = new SafeHtmlBuilder(); - int urlIndex = message.indexOf("http"); //$NON-NLS-1$ - if (urlIndex != -1) { - String beforeURL = message.substring(0, urlIndex); - int afterUrlMessageIndex = message.indexOf(" ", urlIndex); //$NON-NLS-1$ - int endIndex = afterUrlMessageIndex > -1 ? afterUrlMessageIndex : message.length(); - //Sanitize the URL, returns # if it is not safe. - String url = UriUtils.sanitizeUri(message.substring(urlIndex, endIndex)); - String motdAnchor = getView().getMotdAnchorHtml(url); - builder.appendEscaped(beforeURL).append(SafeHtmlUtils.fromTrustedString(motdAnchor)); - if (endIndex < message.length()) { - //There was a string after the URL append it as well. - builder.appendEscaped(message.substring(endIndex)); + private void formatAndSetErrorMessage(List<String> messages) { + List<SafeHtml> safeMessages = new ArrayList<SafeHtml>(); + if (messages != null) { + for (String message: messages) { + SafeHtmlBuilder builder = new SafeHtmlBuilder(); + int urlIndex = message.indexOf("http"); //$NON-NLS-1$ + if (urlIndex != -1) { + String beforeURL = message.substring(0, urlIndex); + int afterUrlMessageIndex = message.indexOf(" ", urlIndex); //$NON-NLS-1$ + int endIndex = afterUrlMessageIndex > -1 ? afterUrlMessageIndex : message.length(); + //Sanitize the URL, returns # if it is not safe. + String url = UriUtils.sanitizeUri(message.substring(urlIndex, endIndex)); + String motdAnchor = getView().getMotdAnchorHtml(url); + builder.appendEscaped(beforeURL).append(SafeHtmlUtils.fromTrustedString(motdAnchor)); + if (endIndex < message.length()) { + //There was a string after the URL append it as well. + builder.appendEscaped(message.substring(endIndex)); + } + } else { + builder.appendEscaped(message); } - } else { - builder.appendEscaped(message); + safeMessages.add(builder.toSafeHtml()); } - safeMessage = builder.toSafeHtml(); } - getView().setErrorMessageHtml(safeMessage); + getView().setErrorMessages(safeMessages); } @Override diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/AbstractLoginFormView.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/AbstractLoginFormView.java index 239e7c8..1ac0e27 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/AbstractLoginFormView.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/AbstractLoginFormView.java @@ -1,10 +1,11 @@ package org.ovirt.engine.ui.common.view; import java.util.Arrays; +import java.util.List; +import org.gwtbootstrap3.client.ui.Alert; import org.gwtbootstrap3.client.ui.Label; import org.gwtbootstrap3.client.ui.ListBox; -import org.gwtbootstrap3.client.ui.Well; import org.ovirt.engine.ui.common.CommonApplicationResources; import org.ovirt.engine.ui.common.idhandler.WithElementId; import org.ovirt.engine.ui.common.utils.VisibleLocalesInfoData; @@ -23,11 +24,14 @@ import com.google.gwt.event.dom.client.HasKeyPressHandlers; import com.google.gwt.event.shared.EventBus; import com.google.gwt.i18n.client.LocaleInfo; +import com.google.gwt.resources.client.CssResource; import com.google.gwt.safehtml.client.SafeHtmlTemplates; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.FocusPanel; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Panel; /** @@ -40,9 +44,16 @@ SafeHtml anchor(String url, String text); } + public interface Style extends CssResource { + String loginMessageError(); + } + private static final String DEFAULT_LOCALE = "default"; //$NON-NLS-1$ private static MotdAnchorTemplate template; + + @UiField + public Style style; @UiField(provided = true) @Ignore @@ -73,15 +84,11 @@ @UiField @Ignore - public Label errorMessage; - - @UiField - @Ignore public Label informationMessage; @UiField @Ignore - public Well errorMessagePanel; + public Alert errorMessagePanel; @UiField @Ignore @@ -158,27 +165,24 @@ return template; } - protected void setErrorMessageLabel(Label errorMessage, SafeHtml text) { - if (text != null) { - errorMessage.getElement().setInnerSafeHtml(text); - } else { - errorMessage.getElement().setInnerHTML(null); - } - } - public String getMotdAnchorHtml(String url) { return getTemplate().anchor(url, url).asString(); } - public void clearErrorMessage() { - setErrorMessageHtml(null); + public void clearErrorMessages() { + IsWidget errorIconWidget = errorMessagePanel.getWidget(0); + errorMessagePanel.clear(); + errorMessagePanel.add(errorIconWidget); errorMessagePanel.setVisible(false); } - public void setErrorMessageHtml(SafeHtml text) { - setErrorMessageLabel(errorMessage, text); - errorMessage.setVisible(text != null); - if (errorMessage.isVisible()) { + public void setErrorMessages(List<SafeHtml> messages) { + clearErrorMessages(); + for (SafeHtml message: messages) { + HTML messageLabel = new HTML(); + messageLabel.setHTML(message.asString()); + messageLabel.addStyleName(style.loginMessageError()); + errorMessagePanel.add(messageLabel); errorMessagePanel.setVisible(true); } } @@ -186,7 +190,7 @@ public void resetAndFocus() { userNameEditor.asValueBox().selectAll(); userNameEditor.asValueBox().setFocus(true); - clearErrorMessage(); + clearErrorMessages(); } public HasUiCommandClickHandlers getLoginButton() { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java index 35a58bf..a742b19 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/LoginModel.java @@ -1,14 +1,15 @@ package org.ovirt.engine.ui.uicommonweb.models; +import java.util.Arrays; import java.util.Collections; import java.util.List; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.aaa.DbUser; +import org.ovirt.engine.core.common.utils.ObjectUtils; import org.ovirt.engine.ui.frontend.AsyncQuery; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.frontend.INewAsyncCallback; -import org.ovirt.engine.ui.uicommonweb.Linq; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.validation.IValidation; @@ -146,6 +147,21 @@ loginFailedEventDefinition = new EventDefinition("LoginFailed", LoginModel.class); //$NON-NLS-1$ } + private List<String> messages; + + public List<String> getMessages() { + return messages; + } + + public void setMessages(List<String> value) + { + if (!ObjectUtils.objectsEqual(messages, value)) + { + messages = value; + onPropertyChanged(new PropertyChangedEventArgs("Message")); //$NON-NLS-1$ + } + } + public LoginModel() { setLoggedInEvent(new Event(loggedInEventDefinition)); @@ -182,9 +198,9 @@ LoginModel loginModel = (LoginModel) model; if (ReturnValue == null) { - loginModel.setMessage(ConstantsManager.getInstance() + loginModel.setMessages(Arrays.asList(ConstantsManager.getInstance() .getConstants() - .couldNotConnectToOvirtEngineServiceMsg()); + .couldNotConnectToOvirtEngineServiceMsg())); return; } @@ -237,7 +253,7 @@ if (user == null) { loginModel.getPassword().setEntity(""); //$NON-NLS-1$ - loginModel.setMessage(Linq.firstOrDefault(returnValue.getCanDoActionMessages())); + loginModel.setMessages(returnValue.getCanDoActionMessages()); loginModel.getUserName().setIsChangable(true); loginModel.getPassword().setIsChangable(true); loginModel.getProfile().setIsChangable(true); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java index 7b31f71..1a334c3 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalLoginModel.java @@ -16,7 +16,6 @@ import org.ovirt.engine.ui.frontend.AsyncQuery; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.frontend.INewAsyncCallback; -import org.ovirt.engine.ui.uicommonweb.Linq; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.auth.ApplicationGuids; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; @@ -206,7 +205,7 @@ } else { loginModel.getPassword().setEntity(""); //$NON-NLS-1$ if (returnValue != null) { - loginModel.setMessage(Linq.firstOrDefault(returnValue.getCanDoActionMessages())); + loginModel.setMessages(returnValue.getCanDoActionMessages()); } loginModel.getUserName().setIsChangable(true); loginModel.getPassword().setIsChangable(true); diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/login/view/LoginFormView.ui.xml b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/login/view/LoginFormView.ui.xml index 3c985fc..4de4281 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/login/view/LoginFormView.ui.xml +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/java/org/ovirt/engine/ui/userportal/section/login/view/LoginFormView.ui.xml @@ -7,7 +7,7 @@ <ui:with field='resources' type='org.ovirt.engine.ui.userportal.ApplicationResources' /> - <ui:style> + <ui:style type="org.ovirt.engine.ui.common.view.AbstractLoginFormView.Style"> .loginForm:focus { outline: 0; } @@ -29,20 +29,19 @@ color: #0099d3; } - .login-error { - color: #b94a48; - background-color: inherit; - border-color: #b94a48; + .loginMessageError a { + color: #0099d3; } - .login-message-error { - color: #b94a48; - background-color: inherit; + .loginMessageError { + background-color: transparent; word-break: break-word; white-space: normal; + display: block; + text-align: left; } - .information-triangle { + .information-icon { font-size: 20px; } @@ -78,9 +77,12 @@ </div> </div> - <b:Well size="SMALL" addStyleNames="col-sm-11 {style.login-error}" ui:field="errorMessagePanel"> - <b:Label ui:field="errorMessage" addStyleNames="{style.login-message-error} temp-link-color"/> - </b:Well> + <b:Alert type="DANGER" addStyleNames="col-sm-11" ui:field="errorMessagePanel"> + <g:HTMLPanel tag="span" addStyleNames="pficon-layered {style.information-icon}"> + <g:HTMLPanel tag="span" addStyleNames="pficon pficon-error-octagon"></g:HTMLPanel> + <g:HTMLPanel tag="span" addStyleNames="pficon pficon-error-exclamation"></g:HTMLPanel> + </g:HTMLPanel> + </b:Alert> <div class="col-sm-7 col-md-6 col-lg-5 login"> <form class="form-horizontal" role="form"> @@ -111,10 +113,10 @@ <div class="col-sm-5 col-md-6 col-lg-7 details"> <g:HTMLPanel ui:field="informationMessagePanel"> - <span class="pficon-layered {style.information-triangle}"> - <span class="pficon pficon-warning-triangle"></span> - <span class="pficon pficon-warning-exclamation"></span> - </span> + <g:HTMLPanel tag="span" addStyleNames="pficon-layered {style.information-icon}"> + <g:HTMLPanel tag="span" addStyleNames="pficon pficon-warning-triangle"></g:HTMLPanel> + <g:HTMLPanel tag="span" addStyleNames="pficon pficon-warning-exclamation"></g:HTMLPanel> + </g:HTMLPanel> <b:Label ui:field="informationMessage" addStyleNames="{style.label-default} {style.information-message} temp-link-color"/> </g:HTMLPanel> <g:HTMLPanel ui:field="motdPanel" addStyleNames="{style.label-default}"> diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/login/view/LoginFormView.ui.xml b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/login/view/LoginFormView.ui.xml index 3ec6dd2..80f9844 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/login/view/LoginFormView.ui.xml +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/login/view/LoginFormView.ui.xml @@ -7,7 +7,7 @@ <ui:with field='resources' type='org.ovirt.engine.ui.webadmin.ApplicationResources' /> - <ui:style> + <ui:style type="org.ovirt.engine.ui.common.view.AbstractLoginFormView.Style"> .loginForm:focus { outline: 0; } @@ -29,20 +29,19 @@ color: #0099d3; } - .login-error { - color: #b94a48; - background-color: inherit; - border-color: #b94a48; + .loginMessageError a { + color: #0099d3; } - .login-message-error { - color: #b94a48; - background-color: inherit; + .loginMessageError { + background-color: transparent; word-break: break-word; white-space: normal; + display: block; + text-align: left; } - .information-triangle { + .information-icon { font-size: 16px; } @@ -67,9 +66,12 @@ </div> </div> - <b:Well size="SMALL" addStyleNames="col-sm-11 {style.login-error}" ui:field="errorMessagePanel"> - <b:Label ui:field="errorMessage" addStyleNames="{style.login-message-error} temp-link-color"/> - </b:Well> + <b:Alert type="DANGER" addStyleNames="col-sm-11" ui:field="errorMessagePanel"> + <g:HTMLPanel tag="span" addStyleNames="pficon-layered {style.information-icon}"> + <g:HTMLPanel tag="span" addStyleNames="pficon pficon-error-octagon"></g:HTMLPanel> + <g:HTMLPanel tag="span" addStyleNames="pficon pficon-error-exclamation"></g:HTMLPanel> + </g:HTMLPanel> + </b:Alert> <div class="col-sm-7 col-md-6 col-lg-5 login"> <form class="form-horizontal" role="form"> @@ -115,10 +117,10 @@ <div class="col-sm-5 col-md-6 col-lg-7 details"> <g:HTMLPanel ui:field="informationMessagePanel"> - <span class="pficon-layered {style.information-triangle}"> - <span class="pficon pficon-warning-triangle"></span> - <span class="pficon pficon-warning-exclamation"></span> - </span> + <g:HTMLPanel tag="span" addStyleNames="pficon-layered {style.information-icon}"> + <g:HTMLPanel tag="span" addStyleNames="pficon pficon-warning-triangle"></g:HTMLPanel> + <g:HTMLPanel tag="span" addStyleNames="pficon pficon-warning-exclamation"></g:HTMLPanel> + </g:HTMLPanel> <b:Label ui:field="informationMessage" addStyleNames="{style.label-default} {style.information-message} temp-link-color"/> </g:HTMLPanel> </div> @@ -126,4 +128,4 @@ </g:HTMLPanel> </g:FocusPanel> -</ui:UiBinder> + </ui:UiBinder> -- To view, visit https://gerrit.ovirt.org/40222 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Idd3bc6b716797583d3fc69fc69746bc3362eb58d Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Alexander Wels <aw...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches