diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/AbstractPageLogin.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/AbstractPageLogin.html new file mode 100644 index 00000000000..4fef49b4544 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/AbstractPageLogin.html @@ -0,0 +1,47 @@ + + + + + + + + +
+
+ +
+
+
+
+ +
+
+
+
+ + + + + This css is used to hide sidebar menu + +
+ + + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/AbstractPageLogin.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/AbstractPageLogin.java new file mode 100644 index 00000000000..6b1a17884e2 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/AbstractPageLogin.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2010-2018 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ + +package com.evolveum.midpoint.web.page.login; + +import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.model.api.authentication.MidpointAuthentication; +import com.evolveum.midpoint.model.api.authentication.ModuleAuthentication; +import com.evolveum.midpoint.model.api.authentication.ModuleWebSecurityConfiguration; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.CommonException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.application.PageDescriptor; +import com.evolveum.midpoint.web.application.Url; +import com.evolveum.midpoint.web.component.form.Form; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; +import com.evolveum.midpoint.web.page.forgetpassword.PageForgotPassword; +import com.evolveum.midpoint.web.security.MidPointApplication; +import com.evolveum.midpoint.web.security.module.authentication.LdapModuleAuthentication; +import com.evolveum.midpoint.web.security.module.authentication.LoginFormModuleAuthentication; +import com.evolveum.midpoint.web.security.util.SecurityUtils; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AuthenticationSequenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.CredentialsPolicyType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RegistrationsPolicyType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityPolicyType; + +import org.apache.commons.lang3.StringUtils; +import org.apache.wicket.AttributeModifier; +import org.apache.wicket.RestartResponseException; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.link.BookmarkablePageLink; +import org.apache.wicket.model.IModel; +import org.apache.wicket.protocol.http.servlet.ServletWebRequest; +import org.apache.wicket.request.cycle.RequestCycle; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.WebAttributes; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import static org.springframework.security.saml.util.StringUtils.stripSlashes; + +/** + * @author lskublik + */ +public abstract class AbstractPageLogin extends PageBase { + private static final long serialVersionUID = 1L; + + private static final Trace LOGGER = TraceManager.getTrace(AbstractPageLogin.class); + + private static final String ID_SEQUENCE = "sequence"; + + public AbstractPageLogin() { + } + + @Override + protected void onInitialize() { + super.onInitialize(); + initLayer(); + } + + private void initLayer() { + Label sequence = new Label(ID_SEQUENCE, createStringResource("AbstractPageLogin.authenticationSequence", getSequenceName())); + sequence.add(new VisibleEnableBehaviour() { + @Override + public boolean isVisible() { + return !StringUtils.isEmpty(getSequenceName()); + } + }); + add(sequence); + initCustomLayer(); + } + + private String getSequenceName() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication instanceof MidpointAuthentication) { + MidpointAuthentication mpAuthentication = (MidpointAuthentication) authentication; + AuthenticationSequenceType sequence = mpAuthentication.getSequence(); + if (sequence != null) { + return sequence.getDisplayName() != null ? sequence.getDisplayName() : sequence.getName(); + } + } + + return null; + } + + protected abstract void initCustomLayer(); + + @Override + protected void onConfigure() { + super.onConfigure(); + + ServletWebRequest req = (ServletWebRequest) RequestCycle.get().getRequest(); + HttpServletRequest httpReq = req.getContainerRequest(); + HttpSession httpSession = httpReq.getSession(); + + Exception ex = (Exception) httpSession.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); + if (ex == null) { + return; + } + + String msg = ex.getMessage(); + if (StringUtils.isEmpty(msg)) { + msg = "web.security.provider.unavailable"; + } + + String[] msgs = msg.split(";"); + for (String message : msgs) { + message = getLocalizationService().translate(message, null, getLocale(), message); + error(message); + } + + httpSession.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); + + clearBreadcrumbs(); + } + + @Override + protected void createBreadcrumb() { + //don't create breadcrumb for login page + } + + @Override + protected void onBeforeRender() { + super.onBeforeRender(); + + if (SecurityUtils.getPrincipalUser() != null) { + MidPointApplication app = getMidpointApplication(); + throw new RestartResponseException(app.getHomePage()); + } + } + + @Override + protected boolean isSideMenuVisible(boolean visibleIfLoggedIn) { + return false; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageAuthenticationBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageAuthenticationBase.java index 1057bbb2e1a..cccd31fd827 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageAuthenticationBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageAuthenticationBase.java @@ -40,7 +40,7 @@ import java.util.ArrayList; import java.util.List; -public abstract class PageAuthenticationBase extends PageBase { +public abstract class PageAuthenticationBase extends AbstractPageLogin { private static final long serialVersionUID = 1L; private static final String DOT_CLASS = PageAuthenticationBase.class.getName() + "."; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageEmailNonse.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageEmailNonse.html index 474493b6cdd..02351b3e1f7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageEmailNonse.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageEmailNonse.html @@ -11,57 +11,30 @@ - -
-
-
-
- -
-
- - -
- -
-
- -
-
-
- -
- - -
- -
-

-
-
+
+
+ + +
+
-
+
+
+
- - - This css is used to hide sidebar menu - +
+ +
+

+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageEmailNonse.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageEmailNonse.java index 96d832ece5a..ad206e7c5f4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageEmailNonse.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageEmailNonse.java @@ -77,10 +77,9 @@ public class PageEmailNonse extends PageAuthenticationBase { private boolean submited; public PageEmailNonse() { - initLayout(); } - private void initLayout() { + protected void initCustomLayer() { Form form = new Form(ID_MAIN_FORM); form.add(new VisibleEnableBehaviour() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageLogin.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageLogin.html index 63b3219ffed..0f3cfd5c2fc 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageLogin.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageLogin.html @@ -11,71 +11,44 @@ - -
-
-
-
- -
-
- - -
- -
-
-
- - -
- -
-
- -
- - - - - - - -
- - - - - -
- -
+
+
+ + +
+ +
+
+
+ + +
+
-
+
- + + + + + - This css is used to hide sidebar menu - + +
+ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageLogin.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageLogin.java index 20479042ca5..8fc27673ead 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageLogin.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageLogin.java @@ -57,7 +57,7 @@ @PageDescriptor(urls = { @Url(mountUrl = "/login", matchUrlForSecurity = "/login") }, permitAll = true, loginPage = true) -public class PageLogin extends PageBase { +public class PageLogin extends AbstractPageLogin { private static final long serialVersionUID = 1L; private static final Trace LOGGER = TraceManager.getTrace(PageLogin.class); @@ -72,7 +72,10 @@ public class PageLogin extends PageBase { private static final String OPERATION_LOAD_REGISTRATION_POLICY = DOT_CLASS + "loadRegistrationPolicy"; public PageLogin() { + } + @Override + protected void initCustomLayer() { Form form = new Form(ID_FORM); form.add(AttributeModifier.replace("action", new IModel() { @Override @@ -114,7 +117,7 @@ public boolean isVisible() { } }); if (securityPolicy != null && securityPolicy.getCredentialsReset() != null - && StringUtils.isNotBlank(securityPolicy.getCredentialsReset().getAuthenticationSequenceName())) { + && StringUtils.isNotBlank(securityPolicy.getCredentialsReset().getAuthenticationSequenceName())) { AuthenticationSequenceType sequence = SecurityUtils.getSequenceByName(securityPolicy.getCredentialsReset().getAuthenticationSequenceName(), securityPolicy.getAuthentication()); if (sequence != null) { // throw new IllegalArgumentException("Couldn't find sequence with name " + securityPolicy.getCredentialsReset().getAuthenticationSequenceName()); @@ -132,14 +135,6 @@ public String getObject() { } form.add(link); -// AjaxLink registration = new AjaxLink(ID_SELF_REGISTRATION) { -// private static final long serialVersionUID = 1L; -// -// @Override -// public void onClick(AjaxRequestTarget target) { -// setResponsePage(PageSelfRegistration.class); -// } -// }; BookmarkablePageLink registration = new BookmarkablePageLink<>(ID_SELF_REGISTRATION, PageSelfRegistration.class); registration.add(new VisibleEnableBehaviour() { private static final long serialVersionUID = 1L; @@ -204,48 +199,4 @@ private String getUrlProcessingLogin() { return "/midpoint/spring_security_login"; } - - @Override - protected void onConfigure() { - super.onConfigure(); - - ServletWebRequest req = (ServletWebRequest) RequestCycle.get().getRequest(); - HttpServletRequest httpReq = req.getContainerRequest(); - HttpSession httpSession = httpReq.getSession(); - - Exception ex = (Exception) httpSession.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); - if (ex == null) { - return; - } - - String msg = ex.getMessage(); - if (StringUtils.isEmpty(msg)) { - msg = "web.security.provider.unavailable"; - } - - String[] msgs = msg.split(";"); - for (String message : msgs) { - message = getLocalizationService().translate(message, null, getLocale(), message); - error(message); - } - - httpSession.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); - - clearBreadcrumbs(); - } - - @Override - protected void createBreadcrumb() { - //don't create breadcrumb for login page - } - - @Override - protected void onBeforeRender() { - super.onBeforeRender(); - - if (SecurityUtils.getPrincipalUser() != null) { - MidPointApplication app = getMidpointApplication(); - throw new RestartResponseException(app.getHomePage()); - } - } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSamlSelect.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSamlSelect.html index 5441d6e773c..c602310121e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSamlSelect.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSamlSelect.html @@ -11,29 +11,10 @@ - -
- +

+
- diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSamlSelect.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSamlSelect.java index 9459ea356fd..e2e7fba8f62 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSamlSelect.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSamlSelect.java @@ -43,12 +43,16 @@ @PageDescriptor(urls = { @Url(mountUrl = "/saml2/select", matchUrlForSecurity = "/saml2/select") }, permitAll = true, loginPage = true) -public class PageSamlSelect extends PageBase implements Serializable { +public class PageSamlSelect extends AbstractPageLogin implements Serializable { private static final long serialVersionUID = 1L; private static final Trace LOGGER = TraceManager.getTrace(PageSamlSelect.class); public PageSamlSelect() { + } + + @Override + protected void initCustomLayer() { List providers = getProviders(); add(new ListView("providers", providers) { @Override @@ -56,7 +60,6 @@ protected void populateItem(ListItem item) { item.add(new ExternalLink("provider", item.getModelObject().getRedirectLink(), item.getModelObject().getLinkText())); } }); - } private List getProviders() { @@ -81,53 +84,4 @@ private List getProviders() { error(getString(key)); return providers; } - - @Override - protected void onConfigure() { - super.onConfigure(); - - ServletWebRequest req = (ServletWebRequest) RequestCycle.get().getRequest(); - HttpServletRequest httpReq = req.getContainerRequest(); - HttpSession httpSession = httpReq.getSession(); - - Exception ex = (Exception) httpSession.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); - if (ex == null) { - return; - } - - String msg = ex.getMessage(); - if (StringUtils.isEmpty(msg)) { - msg = "web.security.provider.unavailable"; - } - - String[] msgs = msg.split(";"); - for (String message : msgs) { - message = getLocalizationService().translate(message, null, getLocale(), message); - error(message); - } - - httpSession.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); - - clearBreadcrumbs(); - } - - @Override - protected void createBreadcrumb() { - //don't create breadcrumb for login page - } - - @Override - protected void onBeforeRender() { - super.onBeforeRender(); - - if (SecurityUtils.getPrincipalUser() != null) { - MidPointApplication app = getMidpointApplication(); - throw new RestartResponseException(app.getHomePage()); - } - } - - @Override - protected boolean isSideMenuVisible(boolean visibleIfLoggedIn) { - return false; - } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSecurityQuestions.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSecurityQuestions.html index df7d26cf85c..fb020e6689a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSecurityQuestions.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSecurityQuestions.html @@ -11,74 +11,47 @@ +
+
+ + +
+ +
+
-
-
-
-
- - -
- - -
- -
-
- -
-
-
- -
- - -
+
+
+
-
- - +
+ + +
-
-

-
-
- -
- -
-
-
- - -
-
- +
+ + + +
+

+
+
+ +
+
+
+ + +
-
- - - - - This css is used to hide sidebar menu - + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSecurityQuestions.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSecurityQuestions.java index bf8408f0348..8ca213f8e05 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSecurityQuestions.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSecurityQuestions.java @@ -115,10 +115,10 @@ public class PageSecurityQuestions extends PageAuthenticationBase { public PageSecurityQuestions() { answerModel = Model.of(); questionsModel = new ListModel(new ArrayList()); - initLayout(); } - private void initLayout() { + @Override + protected void initCustomLayer() { Form form = new Form(ID_MAIN_FORM); form.add(AttributeModifier.replace("action", new IModel() { @Override @@ -410,48 +410,4 @@ private String getUrlProcessingLogin() { error(getString(key)); return "/midpoint/spring_security_login"; } - - @Override - protected void onConfigure() { - super.onConfigure(); - - ServletWebRequest req = (ServletWebRequest) RequestCycle.get().getRequest(); - HttpServletRequest httpReq = req.getContainerRequest(); - HttpSession httpSession = httpReq.getSession(); - - Exception ex = (Exception) httpSession.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); - if (ex == null) { - return; - } - - String msg = ex.getMessage(); - if (StringUtils.isEmpty(msg)) { - msg = "web.security.provider.unavailable"; - } - - String[] msgs = msg.split(";"); - for (String message : msgs) { - message = getLocalizationService().translate(message, null, getLocale(), message); - error(message); - } - - httpSession.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION); - - clearBreadcrumbs(); - } - - @Override - protected void createBreadcrumb() { - //don't create breadcrumb for login page - } - - @Override - protected void onBeforeRender() { - super.onBeforeRender(); - - if (SecurityUtils.getPrincipalUser() != null) { - MidPointApplication app = getMidpointApplication(); - throw new RestartResponseException(app.getHomePage()); - } - } } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/SecurityPolicyUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/SecurityPolicyUtil.java index 56c79f37ee8..da30b7530f6 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/SecurityPolicyUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/SecurityPolicyUtil.java @@ -19,6 +19,7 @@ public class SecurityPolicyUtil { public static final String DEFAULT_MODULE_NAME = "loginForm"; public static final String HTTP_BASIC_MODULE_NAME = "httpBasic"; public static final String DEFAULT_SEQUENCE_NAME = "admin-gui-default"; + public static final String DEFAULT_SEQUENCE_DISPLAY_NAME = "Default gui sequence"; public static final String REST_SEQUENCE_NAME = "rest-default"; public static final String ACTUATOR_SEQUENCE_NAME = "actuator-default"; public static final String PASSWORD_RESET_SEQUENCE_NAME = "password-reset-default"; @@ -206,6 +207,7 @@ public static AuthenticationsPolicyType createDefaultAuthenticationPolicy() { public static AuthenticationSequenceType createDefaultSequence() { AuthenticationSequenceType sequence = new AuthenticationSequenceType(); sequence.name(DEFAULT_SEQUENCE_NAME); + sequence.setDisplayName(DEFAULT_SEQUENCE_DISPLAY_NAME); AuthenticationSequenceChannelType channel = new AuthenticationSequenceChannelType(); channel.setDefault(true); channel.channelId(DEFAULT_CHANNEL); diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-security-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-security-3.xsd index b50a1a7294c..349dd700880 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-security-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-security-3.xsd @@ -1083,6 +1083,13 @@ + + + + Display name of sequence. This is shown for identifying of authentication sequence in GUI. + + + diff --git a/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/AbstractLoginPageTest.java b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/AbstractLoginPageTest.java index 5943b63f5bf..7e1a2d50fd3 100644 --- a/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/AbstractLoginPageTest.java +++ b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/AbstractLoginPageTest.java @@ -6,6 +6,8 @@ */ package com.evolveum.midpoint.testing.schrodinger.page; +import com.codeborne.selenide.Selenide; + import com.evolveum.midpoint.schrodinger.component.common.FeedbackBox; import com.evolveum.midpoint.schrodinger.component.common.PrismForm; import com.evolveum.midpoint.schrodinger.component.configuration.InfrastructureTab; @@ -61,6 +63,7 @@ public void beforeClass() throws IOException{ basicPage.infrastructure(); SystemPage systemPage = new SystemPage(); PrismForm infrastructureForm = systemPage.infrastructureTab().form(); + infrastructureForm.expandContainerPropertiesPanel("Infrastructure"); infrastructureForm.showEmptyAttributes("Infrastructure"); infrastructureForm.addAttributeValue("publicHttpUrlPattern", getConfiguration().getBaseUrl()); File notificationFile = NOTIFICATION_FILE; diff --git a/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/component/common/PrismForm.java b/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/component/common/PrismForm.java index f82bbe42600..e1474d7f807 100644 --- a/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/component/common/PrismForm.java +++ b/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/component/common/PrismForm.java @@ -101,7 +101,7 @@ public PrismForm removeFileAsAttributeValue(String name) { } public PrismForm showEmptyAttributes(String containerName) { - $(Schrodinger.byAncestorPrecedingSiblingDescendantOrSelfElementEnclosedValue("div", "data-s-id", "showEmptyButton", "class", "prism-properties", containerName)) + $(Schrodinger.byAncestorPrecedingSiblingDescendantOrSelfElementEnclosedValue("div", "data-s-id", "showEmptyButton", "data-s-id", "valueContainer", containerName)) .waitUntil(Condition.visible, MidPoint.TIMEOUT_DEFAULT_2_S).click(); return this;