Custom Tenant configuration. (#395)
* Tenant configuration configurable. Signed-off-by: kaizimmerm <kai.zimmermann@bosch-si.com>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -64,6 +64,7 @@
|
||||
margin-left: 1px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
font-size: 14px !important;
|
||||
}
|
||||
|
||||
//Version displayed at bottom of menu *
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
}
|
||||
|
||||
.margin-top-style {
|
||||
margin-top: 10px;
|
||||
margin-top: 10px !important;
|
||||
}
|
||||
|
||||
//confimation dialogue popup - Content margin adjustment
|
||||
|
||||
Reference in New Issue
Block a user