diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/helper/DurationHelper.java b/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/DurationHelper.java similarity index 76% rename from hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/helper/DurationHelper.java rename to hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/DurationHelper.java index bedda71a6..79f5305c5 100644 --- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/helper/DurationHelper.java +++ b/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/DurationHelper.java @@ -1,4 +1,4 @@ -package org.eclipse.hawkbit.repository.model.helper; +package org.eclipse.hawkbit.tenancy.configuration; import java.time.Duration; import java.time.LocalTime; @@ -36,7 +36,7 @@ public class DurationHelper { } /** - * Converts a formatted Sting into a Duration object. + * Converts a formatted String into a Duration object. * * @param formattedDuration * String in {@link #DURATION_FORMAT} @@ -67,4 +67,22 @@ public class DurationHelper { public Duration getDurationByTimeValues(final long hours, final long minutes, final long seconds) { return Duration.ofHours(hours).plusMinutes(minutes).plusSeconds(seconds); } + + public DurationRangeValidator durationRangeValidator(final Duration min, final Duration max) { + return new DurationRangeValidator(min, max); + } + + public static class DurationRangeValidator { + final Duration min; + final Duration max; + + private DurationRangeValidator(final Duration min, final Duration max) { + this.min = min; + this.max = max; + } + + public boolean isWithinRange(final Duration duration) { + return duration.compareTo(min) > 0 && duration.compareTo(max) < 0; + } + } } diff --git a/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/TenantConfigurationKey.java b/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/TenantConfigurationKey.java index 45d6acf99..701038cb1 100644 --- a/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/TenantConfigurationKey.java +++ b/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/TenantConfigurationKey.java @@ -8,6 +8,12 @@ */ package org.eclipse.hawkbit.tenancy.configuration; +import org.eclipse.hawkbit.tenancy.configuration.validator.BooleanValidator; +import org.eclipse.hawkbit.tenancy.configuration.validator.PollTimeValidator; +import org.eclipse.hawkbit.tenancy.configuration.validator.StringValidator; +import org.eclipse.hawkbit.tenancy.configuration.validator.TenantConfigurationValidator; +import org.springframework.context.ApplicationContext; + /** * An enum which defines the tenant specific configurations which can be * configured for each tenant seperately. @@ -22,54 +28,59 @@ public enum TenantConfigurationKey { * boolean value {@code true} {@code false}. */ AUTHENTICATION_MODE_HEADER_ENABLED("authentication.header.enabled", - "hawkbit.server.controller.security.authentication.header.enabled", Boolean.class, - Boolean.FALSE.toString()), + "hawkbit.server.controller.security.authentication.header.enabled", Boolean.class, Boolean.FALSE.toString(), + BooleanValidator.class), /** * */ AUTHENTICATION_MODE_HEADER_AUTHORITY_NAME("authentication.header.authority", "hawkbit.server.controller.security.authentication.header.authority", Boolean.class, - Boolean.FALSE.toString()), + Boolean.FALSE.toString(), BooleanValidator.class), /** * boolean value {@code true} {@code false}. */ AUTHENTICATION_MODE_TARGET_SECURITY_TOKEN_ENABLED("authentication.targettoken.enabled", "hawkbit.server.controller.security.authentication.targettoken.enabled", Boolean.class, - Boolean.FALSE.toString()), + Boolean.FALSE.toString(), BooleanValidator.class), /** * boolean value {@code true} {@code false}. */ AUTHENTICATION_MODE_GATEWAY_SECURITY_TOKEN_ENABLED("authentication.gatewaytoken.enabled", "hawkbit.server.controller.security.authentication.gatewaytoken.enabled", Boolean.class, - Boolean.FALSE.toString()), + Boolean.FALSE.toString(), BooleanValidator.class), /** * string value which holds the name of the security token key. */ AUTHENTICATION_MODE_GATEWAY_SECURITY_TOKEN_NAME("authentication.gatewaytoken.name", - "hawkbit.server.controller.security.authentication.gatewaytoken.name", String.class, null), + "hawkbit.server.controller.security.authentication.gatewaytoken.name", String.class, null, + StringValidator.class), /** * string value which holds the actual security-key of the gateway security * token. */ AUTHENTICATION_MODE_GATEWAY_SECURITY_TOKEN_KEY("authentication.gatewaytoken.key", - "hawkbit.server.controller.security.authentication.gatewaytoken.key", String.class, null), + "hawkbit.server.controller.security.authentication.gatewaytoken.key", String.class, null, + StringValidator.class), /** * string value which holds the polling time interval in the format HH:mm:ss */ - POLLING_TIME_INTERVAL("pollingOverdueTime", "hawkbit.controller.pollingOverdueTime", String.class, null), + POLLING_TIME_INTERVAL("pollingOverdueTime", "hawkbit.controller.pollingOverdueTime", String.class, null, + PollTimeValidator.class), /** * string value which holds the polling time interval in the format HH:mm:ss */ - POLLING_OVERDUE_TIME_INTERVAL("pollingTime", "hawkbit.controller.pollingTime", String.class, null); + POLLING_OVERDUE_TIME_INTERVAL("pollingTime", "hawkbit.controller.pollingTime", String.class, null, + PollTimeValidator.class); private final String keyName; private final String defaultKeyName; private final Class dataType; private final String defaultValue; + private final Class validator; /** * @param key @@ -78,11 +89,12 @@ public enum TenantConfigurationKey { * the allowed values for this specific key */ private TenantConfigurationKey(final String key, final String defaultKeyName, final Class dataType, - final String defaultValue) { + final String defaultValue, final Class validator) { this.keyName = key; this.dataType = dataType; this.defaultKeyName = defaultKeyName; this.defaultValue = defaultValue; + this.validator = validator; } @@ -114,4 +126,12 @@ public enum TenantConfigurationKey { public Class getDataType() { return dataType; } + + public boolean validate(final ApplicationContext context, final Object value) { + final TenantConfigurationValidator createBean = context.getAutowireCapableBeanFactory().createBean(validator); + final boolean isValid = createBean.validate(value); + context.getAutowireCapableBeanFactory().destroyBean(createBean); + return isValid; + } + } diff --git a/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/validator/BooleanValidator.java b/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/validator/BooleanValidator.java new file mode 100644 index 000000000..208e3d01c --- /dev/null +++ b/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/validator/BooleanValidator.java @@ -0,0 +1,13 @@ +package org.eclipse.hawkbit.tenancy.configuration.validator; + +public class BooleanValidator implements TenantConfigurationValidator { + + @Override + public boolean validate(final Object tenantConfigurationValue) { + if (tenantConfigurationValue instanceof Boolean) { + return true; + } + return false; + } + +} diff --git a/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/validator/PollTimeValidator.java b/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/validator/PollTimeValidator.java new file mode 100644 index 000000000..b2a2ec00b --- /dev/null +++ b/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/validator/PollTimeValidator.java @@ -0,0 +1,47 @@ +package org.eclipse.hawkbit.tenancy.configuration.validator; + +import java.time.Duration; +import java.time.format.DateTimeParseException; + +import org.eclipse.hawkbit.ControllerPollProperties; +import org.eclipse.hawkbit.tenancy.configuration.DurationHelper; +import org.springframework.beans.factory.annotation.Autowired; + +public class PollTimeValidator implements TenantConfigurationValidator { + + // private final ControllerPollProperties properties; + + private final DurationHelper durationHelper = new DurationHelper(); + + private final Duration minDuration; + + private final Duration maxDuration; + + @Autowired + public PollTimeValidator(final ControllerPollProperties properties) { + // this.properties = properties; + + minDuration = durationHelper.formattedStringToDuration(properties.getMinPollingTime()); + maxDuration = durationHelper.formattedStringToDuration(properties.getMaxPollingTime()); + } + + @Override + public boolean validate(final Object tenantConfigurationObject) { + if (!(tenantConfigurationObject instanceof String)) { + return false; + } + + final String tenantConfigurationString = (String) tenantConfigurationObject; + + try { + final Duration tenantConfigurationValue = durationHelper + .formattedStringToDuration(tenantConfigurationString); + + return durationHelper.durationRangeValidator(minDuration, maxDuration) + .isWithinRange(tenantConfigurationValue); + + } catch (final DateTimeParseException ex) { + return false; + } + } +} diff --git a/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/validator/StringValidator.java b/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/validator/StringValidator.java new file mode 100644 index 000000000..925d46cb9 --- /dev/null +++ b/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/validator/StringValidator.java @@ -0,0 +1,13 @@ +package org.eclipse.hawkbit.tenancy.configuration.validator; + +public class StringValidator implements TenantConfigurationValidator { + + @Override + public boolean validate(final Object tenantConfigurationValue) { + if (tenantConfigurationValue instanceof String) { + return true; + } + + return false; + } +} diff --git a/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/validator/TenantConfigurationValidator.java b/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/validator/TenantConfigurationValidator.java new file mode 100644 index 000000000..3d2f0b1c7 --- /dev/null +++ b/hawkbit-core/src/main/java/org/eclipse/hawkbit/tenancy/configuration/validator/TenantConfigurationValidator.java @@ -0,0 +1,6 @@ +package org.eclipse.hawkbit.tenancy.configuration.validator; + +public interface TenantConfigurationValidator { + + boolean validate(Object tenantConfigurationValue); +} diff --git a/hawkbit-rest-api/src/main/java/org/eclipse/hawkbit/rest/resource/model/system/AuthenticationConfigurationRest.java b/hawkbit-rest-api/src/main/java/org/eclipse/hawkbit/rest/resource/model/system/TenantConfigurationRest.java similarity index 96% rename from hawkbit-rest-api/src/main/java/org/eclipse/hawkbit/rest/resource/model/system/AuthenticationConfigurationRest.java rename to hawkbit-rest-api/src/main/java/org/eclipse/hawkbit/rest/resource/model/system/TenantConfigurationRest.java index 1808bbc59..2d31d9f61 100644 --- a/hawkbit-rest-api/src/main/java/org/eclipse/hawkbit/rest/resource/model/system/AuthenticationConfigurationRest.java +++ b/hawkbit-rest-api/src/main/java/org/eclipse/hawkbit/rest/resource/model/system/TenantConfigurationRest.java @@ -18,7 +18,7 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; */ @JsonInclude(Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) -public class AuthenticationConfigurationRest { +public class TenantConfigurationRest { private String key; private String value;