Custom Tenant configuration. (#395)

* Tenant configuration configurable.
Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>
This commit is contained in:
Kai Zimmermann
2016-12-23 07:19:46 +01:00
committed by GitHub
parent 4d35413f71
commit feb3369858
53 changed files with 730 additions and 447 deletions

View File

@@ -13,20 +13,18 @@ import java.io.Serializable;
import org.eclipse.hawkbit.im.authentication.PermissionService;
import org.eclipse.hawkbit.im.authentication.SpPermission;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Bean which contains all SP permissions.
*
*/
@Service
public class SpPermissionChecker implements Serializable {
private static final long serialVersionUID = 2757865286212875704L;
private transient PermissionService permissionService;
protected transient PermissionService permissionService;
@Autowired
SpPermissionChecker(final PermissionService permissionService) {
protected SpPermissionChecker(final PermissionService permissionService) {
this.permissionService = permissionService;
}

View File

@@ -170,7 +170,7 @@ public final class UserDetailsFormatter {
return Optional.ofNullable(userPrincipal.getEmail());
}
private static UserDetails getCurrentUser() {
public static UserDetails getCurrentUser() {
final SecurityContext context = (SecurityContext) VaadinService.getCurrentRequest().getWrappedSession()
.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
return (UserDetails) context.getAuthentication().getPrincipal();

View File

@@ -27,6 +27,8 @@ public abstract class AbstractTextFieldBuilder<E extends AbstractTextField> {
private String id;
private boolean immediate;
private boolean required;
private boolean readOnly;
private boolean enabled = true;
private int maxLengthAllowed;
/**
@@ -69,6 +71,26 @@ public abstract class AbstractTextFieldBuilder<E extends AbstractTextField> {
return this;
}
/**
* @param readOnly
* the readOnly to set
* @return the builder
*/
public AbstractTextFieldBuilder<E> readOnly(final boolean readOnly) {
this.readOnly = readOnly;
return this;
}
/**
* @param enabled
* the enabled to set
* @return the builder
*/
public AbstractTextFieldBuilder<E> enabled(final boolean enabled) {
this.enabled = enabled;
return this;
}
/**
* @param prompt
* the prompt to set
@@ -119,6 +141,8 @@ public abstract class AbstractTextFieldBuilder<E extends AbstractTextField> {
textComponent.setRequired(required);
textComponent.setImmediate(immediate);
textComponent.setReadOnly(readOnly);
textComponent.setEnabled(enabled);
if (StringUtils.isNotEmpty(caption)) {
textComponent.setCaption(caption);

View File

@@ -20,7 +20,12 @@ public class SPUICheckBox extends CheckBox {
SPUICheckBox(final String caption, final String style, final String styleName, final boolean required,
final String data) {
decorate(caption, style, styleName, required, data);
decorate(null, caption, style, styleName, required, data);
}
SPUICheckBox(final String id, final String caption, final String style, final String styleName,
final boolean required, final String data) {
decorate(id, caption, style, styleName, required, data);
}
/**
@@ -37,24 +42,27 @@ public class SPUICheckBox extends CheckBox {
* @param promt
* inputpromt of the CheckBox
*/
private void decorate(final String caption, final String style, final String styleName, final boolean required,
final String data) {
private void decorate(final String id, final String caption, final String style, final String styleName,
final boolean required, final String data) {
// Default settings
setRequired(required);
addStyleName(ValoTheme.CHECKBOX_SMALL);
if (null != caption) {
if (id != null) {
setId(id);
}
if (caption != null) {
setCaption(caption);
}
// Add style
if (null != style) {
if (style != null) {
setStyleName(style);
}
// Add style Name
if (null != styleName) {
if (styleName != null) {
addStyleName(styleName);
}
// Set Data
if (null != data) {
if (data != null) {
setData(data);
}
}

View File

@@ -96,6 +96,28 @@ public final class SPUIComponentProvider {
return new SPUICheckBox(caption, style, styleName, required, data);
}
/**
* Get Label UI component.
*
* @param id
* id of the checkbox
* @param caption
* as caption
* @param style
* combo style to add
* @param styleName
* combo style to set
* @param required
* signifies if combo is mandatory
* @param data
* combo box data
* @return ComboBox
*/
public static CheckBox getCheckBox(final String id, final String caption, final String style,
final String styleName, final boolean required, final String data) {
return new SPUICheckBox(id, caption, style, styleName, required, data);
}
/**
* Get Button - Factory Approach for decoration.
*

View File

@@ -125,7 +125,7 @@ public final class DashboardMenu extends CustomComponent {
return dashboardMenuLayout;
}
private VerticalLayout getMenuLayout() {
private static VerticalLayout getMenuLayout() {
final VerticalLayout menuContent = new VerticalLayout();
menuContent.addStyleName(ValoTheme.MENU_PART);
menuContent.addStyleName("sidebar");
@@ -197,7 +197,7 @@ public final class DashboardMenu extends CustomComponent {
}
private Component buildUserMenu() {
private static Component buildUserMenu() {
final MenuBar settings = new MenuBar();
settings.addStyleName("user-menu");
settings.setHtmlContentAllowed(true);

View File

@@ -25,7 +25,7 @@ public abstract class BaseConfigurationView extends CustomComponent implements C
private final List<ConfigurationItemChangeListener> configurationChangeListeners = new ArrayList<>();
protected void notifyConfigurationChanged() {
configurationChangeListeners.forEach(listener -> listener.configurationHasChanged());
configurationChangeListeners.forEach(ConfigurationItemChangeListener::configurationHasChanged);
}
@Override

View File

@@ -25,4 +25,12 @@ public interface ConfigurationGroup extends Component, ConfigurationItem {
* called to rollback any configuration changes.
*/
void undo();
/**
* @return <code>true</code> if view can be shown (e.g. sufficient
* permissions).
*/
default boolean show() {
return true;
}
}

View File

@@ -14,7 +14,7 @@ import org.eclipse.hawkbit.ControllerPollProperties;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.repository.model.TenantConfigurationValue;
import org.eclipse.hawkbit.tenancy.configuration.DurationHelper;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey;
import org.eclipse.hawkbit.ui.tenantconfiguration.polling.DurationConfigField;
import org.eclipse.hawkbit.ui.utils.I18N;
import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider;
@@ -108,7 +108,7 @@ public class PollingConfigurationView extends BaseConfigurationView
}
}
private void saveDurationConfigurationValue(final TenantConfigurationKey key, final Duration duration) {
private void saveDurationConfigurationValue(final String key, final Duration duration) {
if (duration == null) {
tenantConfigurationManagement.deleteConfiguration(key);
} else {

View File

@@ -8,7 +8,9 @@
*/
package org.eclipse.hawkbit.ui.tenantconfiguration;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct;
@@ -68,6 +70,9 @@ public class TenantConfigurationDashboardView extends CustomComponent implements
private final List<ConfigurationGroup> configurationViews = Lists.newArrayListWithExpectedSize(3);
@Autowired(required = false)
private Collection<ConfigurationGroup> customConfigurationViews;
@Autowired
TenantConfigurationDashboardView(final I18N i18n, final UiProperties uiProperties,
final UINotification uINotification, final SystemManagement systemManagement,
@@ -94,6 +99,10 @@ public class TenantConfigurationDashboardView extends CustomComponent implements
configurationViews.add(defaultDistributionSetTypeLayout);
configurationViews.add(authenticationConfigurationView);
configurationViews.add(pollingConfigurationView);
if (customConfigurationViews != null) {
configurationViews.addAll(
customConfigurationViews.stream().filter(ConfigurationGroup::show).collect(Collectors.toList()));
}
final Panel rootPanel = new Panel();
rootPanel.setStyleName("tenantconfig-root");

View File

@@ -12,7 +12,7 @@ import java.util.ArrayList;
import java.util.List;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
import org.eclipse.hawkbit.repository.model.TenantConfigurationValue;
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
import org.eclipse.hawkbit.ui.utils.I18N;
@@ -28,7 +28,7 @@ abstract class AbstractAuthenticationTenantConfigurationItem extends VerticalLay
private final I18N i18n;
private final TenantConfigurationKey configurationKey;
private final String configurationKey;
private final transient TenantConfigurationManagement tenantConfigurationManagement;
private final List<ConfigurationItemChangeListener> configurationChangeListeners = new ArrayList<>();
@@ -40,7 +40,7 @@ abstract class AbstractAuthenticationTenantConfigurationItem extends VerticalLay
* the tenant configuration management to retrieve the
* configuration value
*/
public AbstractAuthenticationTenantConfigurationItem(final TenantConfigurationKey configurationKey,
public AbstractAuthenticationTenantConfigurationItem(final String configurationKey,
final TenantConfigurationManagement tenantConfigurationManagement, final I18N i18n) {
this.configurationKey = configurationKey;
this.tenantConfigurationManagement = tenantConfigurationManagement;
@@ -57,7 +57,10 @@ abstract class AbstractAuthenticationTenantConfigurationItem extends VerticalLay
@Override
public boolean isConfigEnabled() {
return tenantConfigurationManagement.getConfigurationValue(configurationKey, Boolean.class).getValue();
final TenantConfigurationValue<Boolean> enabled = tenantConfigurationManagement
.getConfigurationValue(configurationKey, Boolean.class);
return enabled.getValue() && !enabled.isGlobal();
}
/**
@@ -70,12 +73,12 @@ abstract class AbstractAuthenticationTenantConfigurationItem extends VerticalLay
/**
* @return the configurationKey
*/
protected TenantConfigurationKey getConfigurationKey() {
protected String getConfigurationKey() {
return configurationKey;
}
protected void notifyConfigurationChanged() {
configurationChangeListeners.forEach(listener -> listener.configurationHasChanged());
configurationChangeListeners.forEach(ConfigurationItemChangeListener::configurationHasChanged);
}
@Override

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.ui.tenantconfiguration.authentication;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey;
import org.eclipse.hawkbit.ui.utils.I18N;
/**

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.ui.tenantconfiguration.authentication;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey;
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
import org.eclipse.hawkbit.ui.utils.I18N;

View File

@@ -8,11 +8,11 @@
*/
package org.eclipse.hawkbit.ui.tenantconfiguration.authentication;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.security.SecurityTokenGenerator;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey;
import org.eclipse.hawkbit.ui.common.builder.LabelBuilder;
import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder;
import org.eclipse.hawkbit.ui.components.SPUIComponentProvider;
import org.eclipse.hawkbit.ui.decorators.SPUIButtonStyleSmall;
import org.eclipse.hawkbit.ui.utils.I18N;
@@ -21,7 +21,6 @@ import com.vaadin.server.FontAwesome;
import com.vaadin.ui.Button;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.ValoTheme;
@@ -35,15 +34,11 @@ public class GatewaySecurityTokenAuthenticationConfigurationItem extends Abstrac
private final transient SecurityTokenGenerator securityTokenGenerator;
private final TextField gatewayTokenNameTextField;
private final Label gatewayTokenkeyLabel;
private boolean configurationEnabled;
private boolean configurationEnabledChange;
private boolean keyNameChanged;
private boolean keyChanged;
private final VerticalLayout detailLayout;
@@ -61,10 +56,6 @@ public class GatewaySecurityTokenAuthenticationConfigurationItem extends Abstrac
detailLayout = new VerticalLayout();
detailLayout.setImmediate(true);
gatewayTokenNameTextField = new TextFieldBuilder().immediate(true).buildTextComponent();
// hide text field until we support multiple gateway tokens for a tenan
gatewayTokenNameTextField.setVisible(false);
gatewayTokenNameTextField.addTextChangeListener(event -> doKeyNameChanged());
final Button gatewaytokenBtn = SPUIComponentProvider.getButton("TODO-ID", "Regenerate Key", "",
ValoTheme.BUTTON_TINY + " " + "redicon", true, null, SPUIButtonStyleSmall.class);
@@ -80,24 +71,17 @@ public class GatewaySecurityTokenAuthenticationConfigurationItem extends Abstrac
keyGenerationLayout.setSpacing(true);
keyGenerationLayout.setImmediate(true);
keyGenerationLayout.addComponent(gatewayTokenNameTextField);
keyGenerationLayout.addComponent(gatewayTokenkeyLabel);
keyGenerationLayout.addComponent(gatewaytokenBtn);
detailLayout.addComponent(keyGenerationLayout);
if (isConfigEnabled()) {
gatewayTokenNameTextField.setValue(getSecurityTokenName());
gatewayTokenkeyLabel.setValue(getSecurityTokenKey());
setDetailVisible(true);
}
}
private void doKeyNameChanged() {
keyNameChanged = true;
notifyConfigurationChanged();
}
private void setDetailVisible(final boolean visible) {
if (visible) {
addComponent(detailLayout);
@@ -122,22 +106,13 @@ public class GatewaySecurityTokenAuthenticationConfigurationItem extends Abstrac
configurationEnabled = true;
setDetailVisible(true);
String gatewayTokenKey = getSecurityTokenKey();
String gatewayTokenName = getSecurityTokenName();
if (gatewayTokenKey == null) {
gatewayTokenName = "GeneratedToken";
keyNameChanged = true;
if (StringUtils.isEmpty(gatewayTokenKey)) {
gatewayTokenKey = securityTokenGenerator.generateToken();
keyChanged = true;
}
gatewayTokenNameTextField.setValue(gatewayTokenName);
gatewayTokenkeyLabel.setValue(gatewayTokenKey);
}
private String getSecurityTokenName() {
return getTenantConfigurationManagement().getConfigurationValue(
TenantConfigurationKey.AUTHENTICATION_MODE_GATEWAY_SECURITY_TOKEN_NAME, String.class).getValue();
}
private String getSecurityTokenKey() {
return getTenantConfigurationManagement().getConfigurationValue(
TenantConfigurationKey.AUTHENTICATION_MODE_GATEWAY_SECURITY_TOKEN_KEY, String.class).getValue();
@@ -159,11 +134,6 @@ public class GatewaySecurityTokenAuthenticationConfigurationItem extends Abstrac
TenantConfigurationKey.AUTHENTICATION_MODE_GATEWAY_SECURITY_TOKEN_ENABLED, configurationEnabled);
}
if (keyNameChanged) {
getTenantConfigurationManagement().addOrUpdateConfiguration(
TenantConfigurationKey.AUTHENTICATION_MODE_GATEWAY_SECURITY_TOKEN_NAME,
gatewayTokenNameTextField.getValue());
}
if (keyChanged) {
getTenantConfigurationManagement().addOrUpdateConfiguration(
TenantConfigurationKey.AUTHENTICATION_MODE_GATEWAY_SECURITY_TOKEN_KEY,
@@ -174,9 +144,7 @@ public class GatewaySecurityTokenAuthenticationConfigurationItem extends Abstrac
@Override
public void undo() {
configurationEnabledChange = false;
keyNameChanged = false;
keyChanged = false;
gatewayTokenNameTextField.setValue(getSecurityTokenName());
gatewayTokenkeyLabel.setValue(getSecurityTokenKey());
}

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.ui.tenantconfiguration.authentication;
import org.eclipse.hawkbit.repository.TenantConfigurationManagement;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey;
import org.eclipse.hawkbit.ui.utils.I18N;
/**

View File

@@ -64,6 +64,7 @@
margin-left: 1px;
position: relative;
z-index: 1;
font-size: 14px !important;
}
//Version displayed at bottom of menu *

View File

@@ -135,7 +135,7 @@
}
.margin-top-style {
margin-top: 10px;
margin-top: 10px !important;
}
//confimation dialogue popup - Content margin adjustment