diff --git a/hawkbit-runtime/hawkbit-update-server/src/main/resources/application-cloudsandbox.properties b/hawkbit-runtime/hawkbit-update-server/src/main/resources/application-cloudsandbox.properties index b0c815e2f..4bd524c5b 100644 --- a/hawkbit-runtime/hawkbit-update-server/src/main/resources/application-cloudsandbox.properties +++ b/hawkbit-runtime/hawkbit-update-server/src/main/resources/application-cloudsandbox.properties @@ -32,5 +32,12 @@ hawkbit.artifact.url.protocols.md5sum-http.ref=${hawkbit.artifact.url.protocols. security.user.name=demo security.user.password=demo -hawkbit.server.ui.demo.password=${security.user.name} hawkbit.server.ui.demo.user=${security.user.name} +hawkbit.server.ui.demo.password=${security.user.name} +hawkbit.server.ui.demo.disclaimer=By signing in, you consent that we store the following data for up to one week: \ + \ +

You are not permitted to store any kind of personal data in this application, since this is a shared account. \ + Furthermore, this sandbox is reset once a week deleting all data.

\ +

Credentials: ${hawkbit.server.ui.demo.user}:${hawkbit.server.ui.demo.password}

+ diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UiProperties.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UiProperties.java index e9efd08b9..e81af6edb 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UiProperties.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UiProperties.java @@ -62,6 +62,8 @@ public class UiProperties implements Serializable { @SuppressWarnings({ "squid:S2068" }) private String password = ""; + private String disclaimer = ""; + public String getPassword() { return password; } @@ -86,6 +88,13 @@ public class UiProperties implements Serializable { this.user = user; } + public String getDisclaimer() { + return disclaimer; + } + + public void setDisclaimer(final String disclaimer) { + this.disclaimer = disclaimer; + } } /** diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/login/AbstractHawkbitLoginUI.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/login/AbstractHawkbitLoginUI.java index 22d136d01..bb7df134c 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/login/AbstractHawkbitLoginUI.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/login/AbstractHawkbitLoginUI.java @@ -15,6 +15,7 @@ import java.util.regex.Pattern; import javax.servlet.http.Cookie; +import com.vaadin.shared.ui.label.ContentMode; import org.eclipse.hawkbit.im.authentication.MultitenancyIndicator; import org.eclipse.hawkbit.im.authentication.TenantUserPasswordAuthenticationToken; import org.eclipse.hawkbit.ui.AbstractHawkbitUI; @@ -76,7 +77,6 @@ public abstract class AbstractHawkbitLoginUI extends UI { private static final String USER_PARAMETER = "user"; private static final String TENANT_PARAMETER = "tenant"; - private static final String DEMO_PARAMETER = "demo"; private static final int HUNDRED_DAYS_IN_SECONDS = Math.toIntExact(TimeUnit.DAYS.toSeconds(100)); private static final String LOGIN_TEXTFIELD = "login-textfield"; @@ -94,12 +94,14 @@ public abstract class AbstractHawkbitLoginUI extends UI { private final transient MultitenancyIndicator multiTenancyIndicator; + private final boolean isDemo; + private boolean useCookie = true; private TextField username; private TextField tenant; private PasswordField password; - private Button signin; + private Button signIn; private MultiValueMap params; @@ -112,6 +114,7 @@ public abstract class AbstractHawkbitLoginUI extends UI { this.i18n = i18n; this.uiProperties = uiProperties; this.multiTenancyIndicator = multiTenancyIndicator; + this.isDemo = !uiProperties.getDemo().getDisclaimer().isEmpty(); } @Override @@ -120,14 +123,9 @@ public abstract class AbstractHawkbitLoginUI extends UI { params = UriComponentsBuilder.fromUri(Page.getCurrent().getLocation()).build().getQueryParams(); - if (params.containsKey(DEMO_PARAMETER)) { - login(uiProperties.getDemo().getTenant(), uiProperties.getDemo().getUser(), - uiProperties.getDemo().getPassword(), false); - } - setContent(buildContent()); - filloutUsernameTenantFields(); + fillOutUsernameTenantFields(); readCookie(); } @@ -155,7 +153,7 @@ public abstract class AbstractHawkbitLoginUI extends UI { final Resource resource = context .getResource("classpath:/VAADIN/themes/" + UI.getCurrent().getTheme() + "/layouts/footer.html"); - try (InputStream resourceStream = resource.getInputStream()) { + try (final InputStream resourceStream = resource.getInputStream()) { final CustomLayout customLayout = new CustomLayout(resourceStream); customLayout.setSizeUndefined(); rootLayout.addComponent(customLayout); @@ -192,7 +190,7 @@ public abstract class AbstractHawkbitLoginUI extends UI { notification.show(Page.getCurrent()); } - private void filloutUsernameTenantFields() { + private void fillOutUsernameTenantFields() { if (tenant != null && params.containsKey(TENANT_PARAMETER) && !params.get(TENANT_PARAMETER).isEmpty()) { tenant.setValue(params.get(TENANT_PARAMETER).get(0)); tenant.setVisible(false); @@ -213,6 +211,9 @@ public abstract class AbstractHawkbitLoginUI extends UI { loginPanel.addStyleName("login-panel"); Responsive.makeResponsive(loginPanel); loginPanel.addComponent(buildFields()); + if (isDemo) { + loginPanel.addComponent(buildDisclaimer()); + } loginPanel.addComponent(buildLinks()); checkBrowserSupport(loginPanel); @@ -224,7 +225,7 @@ public abstract class AbstractHawkbitLoginUI extends UI { // Check if IE browser is not supported ( < IE11 ) if (isUnsupportedBrowser()) { // Disable sign-in button and display a message - signin.setEnabled(Boolean.FALSE); + signIn.setEnabled(Boolean.FALSE); loginPanel.addComponent(buildUnsupportedMessage()); } } @@ -238,20 +239,36 @@ public abstract class AbstractHawkbitLoginUI extends UI { buildPasswordField(); buildSignInButton(); if (multiTenancyIndicator.isMultiTenancySupported()) { - fields.addComponents(tenant, username, password, signin); + fields.addComponents(tenant, username, password, signIn); } else { - fields.addComponents(username, password, signin); + fields.addComponents(username, password, signIn); } - fields.setComponentAlignment(signin, Alignment.BOTTOM_LEFT); - signin.addClickListener(event -> handleLogin()); + fields.setComponentAlignment(signIn, Alignment.BOTTOM_LEFT); + signIn.addClickListener(event -> handleLogin()); + + return fields; + } + + private Component buildDisclaimer() { + final HorizontalLayout fields = new HorizontalLayout(); + fields.setSpacing(true); + fields.addStyleName("disclaimer"); + + final Label disclaimer = new Label(uiProperties.getDemo().getDisclaimer(), ContentMode.HTML); + disclaimer.setCaption(i18n.getMessage("label.login.disclaimer")); + disclaimer.setIcon(FontAwesome.EXCLAMATION_CIRCLE); + disclaimer.setId("login-disclaimer"); + disclaimer.setWidth("525px"); + + fields.addComponent(disclaimer); return fields; } private void handleLogin() { if (multiTenancyIndicator.isMultiTenancySupported()) { - final boolean textFieldsNotEmtpy = hasTenantFieldText() && hasUserFieldText() && hashPasswordFieldText(); - if (textFieldsNotEmtpy) { + final boolean textFieldsNotEmpty = hasTenantFieldText() && hasUserFieldText() && hashPasswordFieldText(); + if (textFieldsNotEmpty) { login(tenant.getValue(), username.getValue(), password.getValue(), true); } } else if (!multiTenancyIndicator.isMultiTenancySupported() && hasUserFieldText() && hashPasswordFieldText()) { @@ -272,11 +289,15 @@ public abstract class AbstractHawkbitLoginUI extends UI { } private void buildSignInButton() { - signin = new Button(i18n.getMessage("button.login.signin")); - signin.addStyleName(ValoTheme.BUTTON_PRIMARY + " " + ValoTheme.BUTTON_SMALL + " " + "login-button"); - signin.setClickShortcut(KeyCode.ENTER); - signin.focus(); - signin.setId("login-signin"); + final String caption = isDemo + ? i18n.getMessage("button.login.agreeandsignin") + : i18n.getMessage("button.login.signin"); + + signIn = new Button(caption); + signIn.addStyleName(ValoTheme.BUTTON_PRIMARY + " " + ValoTheme.BUTTON_SMALL + " " + "login-button"); + signIn.setClickShortcut(KeyCode.ENTER); + signIn.focus(); + signIn.setId("login-signIn"); } private void buildPasswordField() { @@ -285,6 +306,9 @@ public abstract class AbstractHawkbitLoginUI extends UI { password.addStyleName( ValoTheme.TEXTFIELD_INLINE_ICON + " " + ValoTheme.TEXTFIELD_SMALL + " " + LOGIN_TEXTFIELD); password.setId("login-password"); + if(isDemo && !uiProperties.getDemo().getPassword().isEmpty()) { + password.setValue(uiProperties.getDemo().getPassword()); + } } private void buildUserField() { @@ -293,6 +317,9 @@ public abstract class AbstractHawkbitLoginUI extends UI { username.addStyleName( ValoTheme.TEXTFIELD_INLINE_ICON + " " + ValoTheme.TEXTFIELD_SMALL + " " + LOGIN_TEXTFIELD); username.setId("login-username"); + if(isDemo && !uiProperties.getDemo().getUser().isEmpty()) { + username.setValue(uiProperties.getDemo().getUser()); + } } private void buildTenantField() { @@ -321,13 +348,6 @@ public abstract class AbstractHawkbitLoginUI extends UI { docuLink.addStyleName(ValoTheme.LINK_SMALL); } - if (!uiProperties.getDemo().getUser().isEmpty()) { - final Link demoLink = SPUIComponentProvider.getLink(UIComponentIdProvider.LINK_DEMO, - i18n.getMessage("link.demo.name"), "?demo", FontAwesome.DESKTOP, "_top", linkStyle); - links.addComponent(demoLink); - demoLink.addStyleName(ValoTheme.LINK_SMALL); - } - if (!uiProperties.getLinks().getRequestAccount().isEmpty()) { final Link requestAccountLink = SPUIComponentProvider.getLink(UIComponentIdProvider.LINK_REQUESTACCOUNT, i18n.getMessage("link.requestaccount.name"), uiProperties.getLinks().getRequestAccount(), @@ -429,10 +449,10 @@ public abstract class AbstractHawkbitLoginUI extends UI { return null; } - private void login(final String tentant, final String user, final String password, final boolean setCookies) { + private void login(final String tenant, final String user, final String password, final boolean setCookies) { try { if (multiTenancyIndicator.isMultiTenancySupported()) { - vaadinSecurity.login(new TenantUserPasswordAuthenticationToken(tentant, user, password)); + vaadinSecurity.login(new TenantUserPasswordAuthenticationToken(tenant, user, password)); } else { vaadinSecurity.login(new UsernamePasswordAuthenticationToken(user, password)); } diff --git a/hawkbit-ui/src/main/resources/messages.properties b/hawkbit-ui/src/main/resources/messages.properties index 4fa8aa9db..5fc3de45c 100644 --- a/hawkbit-ui/src/main/resources/messages.properties +++ b/hawkbit-ui/src/main/resources/messages.properties @@ -506,7 +506,9 @@ notification.login.failed.credentialsexpired.description=Password has been expir label.login.tenant=Tenant label.login.username=Username label.login.password=Password +label.login.disclaimer=Privacy Notice button.login.signin=Sign in +button.login.agreeandsignin=Agree & Sign in checkbox.login.rememberme=Remember me # Links