diff --git a/front50-core/front50-core.gradle b/front50-core/front50-core.gradle index 6d59dbe57..307352eff 100644 --- a/front50-core/front50-core.gradle +++ b/front50-core/front50-core.gradle @@ -25,6 +25,8 @@ dependencies { implementation "com.netflix.spinnaker.kork:kork-web" api "com.github.ben-manes.caffeine:guava" + api "com.netflix.spinnaker.kork:kork-plugins" + implementation "com.netflix.spinnaker.kork:kork-core" implementation "com.netflix.spinnaker.kork:kork-exceptions" implementation "com.netflix.spinnaker.kork:kork-hystrix" diff --git a/front50-core/src/main/groovy/com/netflix/spinnaker/front50/validator/HasCanonicalPluginIdValidator.java b/front50-core/src/main/groovy/com/netflix/spinnaker/front50/validator/HasCanonicalPluginIdValidator.java index 655b2d06a..550428c54 100644 --- a/front50-core/src/main/groovy/com/netflix/spinnaker/front50/validator/HasCanonicalPluginIdValidator.java +++ b/front50-core/src/main/groovy/com/netflix/spinnaker/front50/validator/HasCanonicalPluginIdValidator.java @@ -16,18 +16,16 @@ package com.netflix.spinnaker.front50.validator; import com.netflix.spinnaker.front50.model.plugininfo.PluginInfo; -import java.util.regex.Pattern; +import com.netflix.spinnaker.kork.plugins.CanonicalPluginId; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; @Component public class HasCanonicalPluginIdValidator implements PluginInfoValidator { - private final Pattern pattern = Pattern.compile("[\\w]+\\.[\\w]+"); - @Override public void validate(PluginInfo pluginInfo, Errors validationErrors) { - if (!pattern.matcher(pluginInfo.getId()).matches()) { + if (!CanonicalPluginId.Companion.isValid(pluginInfo.getId())) { validationErrors.rejectValue( "id", "pluginInfo.id.invalid", diff --git a/front50-core/src/main/groovy/com/netflix/spinnaker/front50/validator/HasValidRequiresFieldsValidator.java b/front50-core/src/main/groovy/com/netflix/spinnaker/front50/validator/HasValidRequiresFieldsValidator.java index 9d91108d8..2aea62dfe 100644 --- a/front50-core/src/main/groovy/com/netflix/spinnaker/front50/validator/HasValidRequiresFieldsValidator.java +++ b/front50-core/src/main/groovy/com/netflix/spinnaker/front50/validator/HasValidRequiresFieldsValidator.java @@ -15,21 +15,16 @@ */ package com.netflix.spinnaker.front50.validator; -import static com.netflix.spinnaker.front50.model.plugininfo.PluginInfo.Release.SUPPORTS_PATTERN; -import static java.lang.String.format; - import com.netflix.spinnaker.front50.model.plugininfo.PluginInfo; -import java.util.Arrays; -import java.util.List; -import java.util.regex.Matcher; +import com.netflix.spinnaker.kork.plugins.VersionRequirementsParser; +import com.netflix.spinnaker.kork.plugins.VersionRequirementsParser.IllegalVersionRequirementsOperator; +import com.netflix.spinnaker.kork.plugins.VersionRequirementsParser.InvalidPluginVersionRequirementException; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; @Component public class HasValidRequiresFieldsValidator implements PluginInfoValidator { - private static final List VALID_OPERATORS = Arrays.asList("<", ">", ">=", "<="); - @Override public void validate(PluginInfo pluginInfo, Errors validationErrors) { @@ -37,28 +32,17 @@ public void validate(PluginInfo pluginInfo, Errors validationErrors) { .getReleases() .forEach( release -> { - Arrays.stream(release.getRequires().split(",")) - .forEach( - requires -> { - Matcher m = SUPPORTS_PATTERN.matcher(requires.trim()); - if (!m.matches()) { - validationErrors.reject( - "pluginInfo.releases.invalidRequiresFormat", - format( - "Invalid Release requires field formatting (requires '%s')", - SUPPORTS_PATTERN.pattern())); - return; - } - - if (!VALID_OPERATORS.contains( - m.group(PluginInfo.Release.SUPPORTS_PATTERN_OPERATOR_GROUP))) { - validationErrors.reject( - "pluginInfo.releases.invalidRequiresOperator", - format( - "Invalid Release requires comparison operator (requires one of: %s)", - VALID_OPERATORS)); - } - }); + try { + VersionRequirementsParser.INSTANCE.parseAll(release.getRequires()); + } catch (InvalidPluginVersionRequirementException invalidPluginVersionRequirement) { + validationErrors.reject( + "pluginInfo.id.invalidPluginVersionRequirement", + invalidPluginVersionRequirement.getMessage()); + } catch (IllegalVersionRequirementsOperator illegalVersionRequirementOperator) { + validationErrors.reject( + "pluginInfo.id.illegalVersionRequirementOperator", + illegalVersionRequirementOperator.getMessage()); + } }); } }