From 387f868f461c8bfab69505cb02e768fd155d9548 Mon Sep 17 00:00:00 2001 From: Tomi Virtanen Date: Mon, 23 Sep 2024 15:33:28 +0300 Subject: [PATCH] fix: Validate Control Center feature when used (#20024) * fix: Validate Control Center feature when used Changes production build info to validate Control Center feature only when VaadinActuatorEndpoint is in the class path. Class will be included with `control-center-starter` Vaadin platform dependency. Fixes: #20013 * chore: formatting --- .../flow/plugin/base/BuildFrontendUtil.java | 25 +++++++++++++++---- .../endpoint/VaadinActuatorEndpoint.java | 23 +++++++++++++++++ .../plugin/base/BuildFrontendUtilTest.java | 11 +++++++- 3 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 flow-plugins/flow-plugin-base/src/test/java/com/vaadin/controlcenter/starter/actuate/endpoint/VaadinActuatorEndpoint.java diff --git a/flow-plugins/flow-plugin-base/src/main/java/com/vaadin/flow/plugin/base/BuildFrontendUtil.java b/flow-plugins/flow-plugin-base/src/main/java/com/vaadin/flow/plugin/base/BuildFrontendUtil.java index 82a5a81f4fa..74035613c10 100644 --- a/flow-plugins/flow-plugin-base/src/main/java/com/vaadin/flow/plugin/base/BuildFrontendUtil.java +++ b/flow-plugins/flow-plugin-base/src/main/java/com/vaadin/flow/plugin/base/BuildFrontendUtil.java @@ -766,11 +766,13 @@ public static void updateBuildFile(PluginAdapterBuild adapter, adapter.logInfo("Daily Active User tracking enabled"); buildInfo.put(Constants.DAU_TOKEN, true); } - if (LicenseChecker.isValidLicense("vaadin-commercial-cc-client", - null, BuildType.PRODUCTION)) { - adapter.logInfo("Premium Features are enabled"); - buildInfo.put(Constants.PREMIUM_FEATURES, true); - } + } + if (isControlCenterAvailable(adapter.getClassFinder()) + && LicenseChecker.isValidLicense( + "vaadin-commercial-cc-client", null, + BuildType.PRODUCTION)) { + adapter.logInfo("Premium Features are enabled"); + buildInfo.put(Constants.PREMIUM_FEATURES, true); } FileUtils.write(tokenFile, JsonUtil.stringify(buildInfo, 2) + "\n", @@ -780,6 +782,19 @@ public static void updateBuildFile(PluginAdapterBuild adapter, } } + private static boolean isControlCenterAvailable(ClassFinder classFinder) { + if (classFinder == null) { + return false; + } + try { + classFinder.loadClass( + "com.vaadin.controlcenter.starter.actuate.endpoint.VaadinActuatorEndpoint"); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } + /** * Delete the build token file. This is used with dev-bundle build as token * file should never be added to the package. diff --git a/flow-plugins/flow-plugin-base/src/test/java/com/vaadin/controlcenter/starter/actuate/endpoint/VaadinActuatorEndpoint.java b/flow-plugins/flow-plugin-base/src/test/java/com/vaadin/controlcenter/starter/actuate/endpoint/VaadinActuatorEndpoint.java new file mode 100644 index 00000000000..5f0dcb853ea --- /dev/null +++ b/flow-plugins/flow-plugin-base/src/test/java/com/vaadin/controlcenter/starter/actuate/endpoint/VaadinActuatorEndpoint.java @@ -0,0 +1,23 @@ +/* + * Copyright 2000-2024 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.vaadin.controlcenter.starter.actuate.endpoint; + +/** + * Fake class to have mojo tests see Control Center. + */ +public class VaadinActuatorEndpoint { +} diff --git a/flow-plugins/flow-plugin-base/src/test/java/com/vaadin/flow/plugin/base/BuildFrontendUtilTest.java b/flow-plugins/flow-plugin-base/src/test/java/com/vaadin/flow/plugin/base/BuildFrontendUtilTest.java index a47d539dda6..8e1e2166d56 100644 --- a/flow-plugins/flow-plugin-base/src/test/java/com/vaadin/flow/plugin/base/BuildFrontendUtilTest.java +++ b/flow-plugins/flow-plugin-base/src/test/java/com/vaadin/flow/plugin/base/BuildFrontendUtilTest.java @@ -423,6 +423,14 @@ public void updateBuildFile_tokenExisting_licenseRequiredAndIsPremiumLike_premiu addPremiumFeatureAndDAUFlagTrue(tokenFile); + ClassLoader classLoader = new URLClassLoader( + new URL[] { new File(baseDir, "target/test-classes/").toURI() + .toURL() }, + BuildFrontendUtilTest.class.getClassLoader()); + ClassFinder classFinder = new ClassFinder.DefaultClassFinder( + classLoader); + Mockito.when(adapter.getClassFinder()).thenReturn(classFinder); + withMockedLicenseChecker(true, () -> { BuildFrontendUtil.updateBuildFile(adapter, true); Assert.assertTrue("Token file should still exist", @@ -520,7 +528,8 @@ public void runNodeUpdater_generateFeatureFlagsJsFile() throws Exception { File generatedFeatureFlagsFile = new File(adapter.generatedTsFolder(), FEATURE_FLAGS_FILE_NAME); String featureFlagsJs = Files - .readString(generatedFeatureFlagsFile.toPath()); + .readString(generatedFeatureFlagsFile.toPath()) + .replace("\r\n", "\n"); Assert.assertTrue("Example feature flag is not set", featureFlagsJs.contains(